Jelajahi Sumber

Added access to local url if on local LAN connection

causefx 7 tahun lalu
induk
melakukan
41d5475822
68 mengubah file dengan 15409 tambahan dan 8 penghapusan
  1. 1 0
      .gitignore
  2. 2 1
      api/composer.json
  3. 251 1
      api/composer.lock
  4. 3 1
      api/functions/api-functions.php
  5. 37 0
      api/functions/normal-functions.php
  6. 2 1
      api/functions/organizr-functions.php
  7. 8 0
      api/pages/settings-tab-editor-tabs.php
  8. 2 0
      api/vendor/composer/autoload_files.php
  9. 5 0
      api/vendor/composer/autoload_psr4.php
  10. 30 0
      api/vendor/composer/autoload_static.php
  11. 260 0
      api/vendor/composer/installed.json
  12. 46 0
      api/vendor/layershifter/tld-database/composer.json
  13. TEMPAT SAMPAH
      api/vendor/layershifter/tld-database/logo.png
  14. 8642 0
      api/vendor/layershifter/tld-database/resources/database.php
  15. 19 0
      api/vendor/layershifter/tld-database/src/Exceptions/Exception.php
  16. 19 0
      api/vendor/layershifter/tld-database/src/Exceptions/HttpException.php
  17. 19 0
      api/vendor/layershifter/tld-database/src/Exceptions/IOException.php
  18. 19 0
      api/vendor/layershifter/tld-database/src/Exceptions/ParserException.php
  19. 19 0
      api/vendor/layershifter/tld-database/src/Exceptions/StoreException.php
  20. 19 0
      api/vendor/layershifter/tld-database/src/Exceptions/UpdateException.php
  21. 30 0
      api/vendor/layershifter/tld-database/src/Http/AdapterInterface.php
  22. 66 0
      api/vendor/layershifter/tld-database/src/Http/CurlAdapter.php
  23. 99 0
      api/vendor/layershifter/tld-database/src/Parser.php
  24. 144 0
      api/vendor/layershifter/tld-database/src/Store.php
  25. 119 0
      api/vendor/layershifter/tld-database/src/Update.php
  26. 44 0
      api/vendor/layershifter/tld-extract/composer.json
  27. 19 0
      api/vendor/layershifter/tld-extract/src/Exceptions/Exception.php
  28. 18 0
      api/vendor/layershifter/tld-extract/src/Exceptions/RuntimeException.php
  29. 398 0
      api/vendor/layershifter/tld-extract/src/Extract.php
  30. 67 0
      api/vendor/layershifter/tld-extract/src/IDN.php
  31. 296 0
      api/vendor/layershifter/tld-extract/src/Result.php
  32. 83 0
      api/vendor/layershifter/tld-extract/src/ResultInterface.php
  33. 37 0
      api/vendor/layershifter/tld-extract/src/static.php
  34. 8 0
      api/vendor/layershifter/tld-support/.codeclimate.yml
  35. 8 0
      api/vendor/layershifter/tld-support/.gitignore
  36. 27 0
      api/vendor/layershifter/tld-support/.travis.yml
  37. 201 0
      api/vendor/layershifter/tld-support/LICENSE
  38. 59 0
      api/vendor/layershifter/tld-support/README.md
  39. 32 0
      api/vendor/layershifter/tld-support/composer.json
  40. 26 0
      api/vendor/layershifter/tld-support/phpunit.xml
  41. 55 0
      api/vendor/layershifter/tld-support/src/Helpers/Arr.php
  42. 38 0
      api/vendor/layershifter/tld-support/src/Helpers/IP.php
  43. 25 0
      api/vendor/layershifter/tld-support/src/Helpers/Mixed.php
  44. 122 0
      api/vendor/layershifter/tld-support/src/Helpers/Str.php
  45. 64 0
      api/vendor/layershifter/tld-support/tests/Helpers/ArrTest.php
  46. 81 0
      api/vendor/layershifter/tld-support/tests/Helpers/IPTest.php
  47. 38 0
      api/vendor/layershifter/tld-support/tests/Helpers/Mixed.php
  48. 122 0
      api/vendor/layershifter/tld-support/tests/Helpers/StrTest.php
  49. 11 0
      api/vendor/layershifter/tld-support/tests/bootstrap.php
  50. 19 0
      api/vendor/symfony/polyfill-mbstring/LICENSE
  51. 800 0
      api/vendor/symfony/polyfill-mbstring/Mbstring.php
  52. 13 0
      api/vendor/symfony/polyfill-mbstring/README.md
  53. 1096 0
      api/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php
  54. 4 0
      api/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php
  55. 1104 0
      api/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php
  56. 58 0
      api/vendor/symfony/polyfill-mbstring/bootstrap.php
  57. 34 0
      api/vendor/symfony/polyfill-mbstring/composer.json
  58. 45 0
      api/vendor/true/punycode/CHANGELOG.md
  59. 19 0
      api/vendor/true/punycode/LICENSE
  60. 45 0
      api/vendor/true/punycode/README.md
  61. 26 0
      api/vendor/true/punycode/composer.json
  62. 13 0
      api/vendor/true/punycode/src/Exception/DomainOutOfBoundsException.php
  63. 13 0
      api/vendor/true/punycode/src/Exception/LabelOutOfBoundsException.php
  64. 13 0
      api/vendor/true/punycode/src/Exception/OutOfBoundsException.php
  65. 360 0
      api/vendor/true/punycode/src/Punycode.php
  66. 3 0
      js/custom.js
  67. 0 0
      js/custom.min.js
  68. 4 4
      js/functions.js

+ 1 - 0
.gitignore

@@ -91,6 +91,7 @@ debug.php
 OrganizrV2/*
 orgv2/*
 test.php
+test/*
 organizrLoginLog.json
 organizrLog.json
 api/config/config*

+ 2 - 1
api/composer.json

@@ -9,6 +9,7 @@
     "kryptonit3/couchpotato": "^1.0",
     "kryptonit3/sickrage": "^1.0",
     "pusher/pusher-php-server": "^3.2",
-    "pragmarx/google2fa": "^3.0"
+    "pragmarx/google2fa": "^3.0",
+    "layershifter/tld-extract": "^2.0"
   }
 }

+ 251 - 1
api/composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "content-hash": "0e5ee280433e4a8e418c7b3a14dc39ff",
+    "content-hash": "23e6f5f9beec5ee507e532c3264d3d03",
     "packages": [
         {
             "name": "composer/semver",
@@ -424,6 +424,151 @@
             "description": "PHP Sonarr API Wrapper",
             "time": "2017-06-30T01:25:49+00:00"
         },
+        {
+            "name": "layershifter/tld-database",
+            "version": "1.0.64",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/layershifter/TLDDatabase.git",
+                "reference": "16d9b7cd195eda57c08c64f75e9dbc175320e0cc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/layershifter/TLDDatabase/zipball/16d9b7cd195eda57c08c64f75e9dbc175320e0cc",
+                "reference": "16d9b7cd195eda57c08c64f75e9dbc175320e0cc",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "layershifter/tld-support": "^1.0.0",
+                "php": "^5.5.0 || ^7.0"
+            },
+            "require-dev": {
+                "codeclimate/php-test-reporter": "dev-master",
+                "mikey179/vfsstream": "^1.6",
+                "phpmd/phpmd": "@stable",
+                "phpunit/phpunit": "^4.8 || ^5.0",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "LayerShifter\\TLDDatabase\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alexander Fedyashov",
+                    "email": "a@fedyashov.com"
+                }
+            ],
+            "description": "Database abstraction for Public Suffix List",
+            "keywords": [
+                "PSL",
+                "Public Suffix List",
+                "domain database",
+                "tld database"
+            ],
+            "time": "2018-11-09T09:12:04+00:00"
+        },
+        {
+            "name": "layershifter/tld-extract",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/layershifter/TLDExtract.git",
+                "reference": "236bfa0fd253e70f8db10f896e788e12b58b4a41"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/layershifter/TLDExtract/zipball/236bfa0fd253e70f8db10f896e788e12b58b4a41",
+                "reference": "236bfa0fd253e70f8db10f896e788e12b58b4a41",
+                "shasum": ""
+            },
+            "require": {
+                "layershifter/tld-database": "^1.0",
+                "layershifter/tld-support": "^1.1",
+                "php": "^5.5.0 || ^7.0",
+                "true/punycode": "^2.1.1"
+            },
+            "require-dev": {
+                "phpmd/phpmd": "@stable",
+                "phpunit/phpunit": "^4.8 || ^5.0",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/static.php"
+                ],
+                "psr-4": {
+                    "LayerShifter\\TLDExtract\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alexander Fedyashov",
+                    "email": "a@fedyashov.com"
+                }
+            ],
+            "description": "TLDExtract, library for extracting parts of domain, e.q. domain parser",
+            "keywords": [
+                "TLDExtract",
+                "domain parser"
+            ],
+            "time": "2018-09-28T11:11:20+00:00"
+        },
+        {
+            "name": "layershifter/tld-support",
+            "version": "1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/layershifter/TLDSupport.git",
+                "reference": "9b9eb2350db82239289f4e6eb250a2fe4865b0db"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/layershifter/TLDSupport/zipball/9b9eb2350db82239289f4e6eb250a2fe4865b0db",
+                "reference": "9b9eb2350db82239289f4e6eb250a2fe4865b0db",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5",
+                "symfony/polyfill-mbstring": "^1.2"
+            },
+            "require-dev": {
+                "codeclimate/php-test-reporter": "dev-master",
+                "phpmd/phpmd": "@stable",
+                "phpunit/phpunit": "4.8.*",
+                "squizlabs/php_codesniffer": "2.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "LayerShifter\\TLDSupport\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alexander Fedyashov",
+                    "email": "a@fedyashov.com"
+                }
+            ],
+            "description": "Support package for TLDDatabase and TLDExtract",
+            "time": "2016-06-18T12:28:04+00:00"
+        },
         {
             "name": "lcobucci/jwt",
             "version": "3.2.2",
@@ -998,6 +1143,65 @@
             ],
             "time": "2016-10-13T00:11:37+00:00"
         },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.10.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "c79c051f5b3a46be09205c73b80b346e4153e494"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494",
+                "reference": "c79c051f5b3a46be09205c73b80b346e4153e494",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.9-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "time": "2018-09-21T13:07:52+00:00"
+        },
         {
             "name": "symfony/polyfill-php56",
             "version": "v1.9.0",
@@ -1105,6 +1309,52 @@
                 "shim"
             ],
             "time": "2018-08-06T14:22:27+00:00"
+        },
+        {
+            "name": "true/punycode",
+            "version": "v2.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/true/php-punycode.git",
+                "reference": "a4d0c11a36dd7f4e7cd7096076cab6d3378a071e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/true/php-punycode/zipball/a4d0c11a36dd7f4e7cd7096076cab6d3378a071e",
+                "reference": "a4d0c11a36dd7f4e7cd7096076cab6d3378a071e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "symfony/polyfill-mbstring": "^1.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.7",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "TrueBV\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Renan Gonçalves",
+                    "email": "renan.saddam@gmail.com"
+                }
+            ],
+            "description": "A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)",
+            "homepage": "https://github.com/true/php-punycode",
+            "keywords": [
+                "idna",
+                "punycode"
+            ],
+            "time": "2016-11-16T10:37:54+00:00"
         }
     ],
     "packages-dev": [],

+ 3 - 1
api/functions/api-functions.php

@@ -769,6 +769,7 @@ function editTabs($array)
                     UPDATE tabs SET', [
 					'name' => $array['data']['tabName'],
 					'url' => $array['data']['tabURL'],
+					'url_local' => $array['data']['tabLocalURL'],
 					'ping_url' => $array['data']['pingURL'],
 					'image' => $array['data']['tabImage'],
 				], '
@@ -812,6 +813,7 @@ function editTabs($array)
 					'category_id' => $default,
 					'name' => $array['data']['tabName'],
 					'url' => $array['data']['tabURL'],
+					'url_local' => $array['data']['tabLocalURL'],
 					'ping_url' => $array['data']['pingURL'],
 					'default' => $array['data']['tabDefault'],
 					'enabled' => 1,
@@ -1091,7 +1093,7 @@ function loadTabs()
 			$categories = $connect->fetchAll('SELECT * FROM categories ORDER BY `order` ASC');
 			$all['tabs'] = $tabs;
 			foreach ($tabs as $k => $v) {
-				$v['access_url'] = isset($v['url_local']) && getenv('SERVER_ADDR') == userIP() ? $v['url_local'] : $v['url'];
+				$v['access_url'] = (!empty($v['url_local']) && ($v['url_local'] !== null) && ($v['url_local'] !== 'null') && isLocal() && $v['type'] !== 0) ? $v['url_local'] : $v['url'];
 			}
 			$count = array_map(function ($element) {
 				return $element['category_id'];

+ 37 - 0
api/functions/normal-functions.php

@@ -583,4 +583,41 @@ function gen_uuid()
 function dbExtension($string)
 {
 	return (substr($string, -3) == '.db') ? $string : $string . '.db';
+}
+
+function localIPRanges()
+{
+	return array(
+		array(
+			'from' => '10.0.0.0',
+			'to' => '10.255.255.255'
+		),
+		array(
+			'from' => '172.16.0.0',
+			'to' => '172.31.255.255'
+		),
+		array(
+			'from' => '192.168.0.0',
+			'to' => '192.168.255.255'
+		),
+		array(
+			'from' => '127.0.0.1',
+			'to' => '127.0.0.1'
+		),
+	);
+}
+
+function isLocal($checkIP = null)
+{
+	$isLocal = false;
+	$userIP = ($checkIP) ? ip2long($checkIP) : ip2long(userIP());
+	$range = localIPRanges();
+	foreach ($range as $ip) {
+		$low = ip2long($ip['from']);
+		$high = ip2long($ip['to']);
+		if ($userIP <= $high && $low <= $userIP) {
+			$isLocal = true;
+		}
+	}
+	return $isLocal;
 }

+ 2 - 1
api/functions/organizr-functions.php

@@ -75,7 +75,8 @@ function organizrSpecialSettings()
 		),
 		'user' => array(
 			'agent' => isset($_SERVER ['HTTP_USER_AGENT']) ? $_SERVER ['HTTP_USER_AGENT'] : null,
-			'oAuthLogin' => isset($_COOKIE['oAuth']) ? true : false
+			'oAuthLogin' => isset($_COOKIE['oAuth']) ? true : false,
+			'local' => (isLocal()) ? true : false
 		),
 		'login' => array(
 			'rememberMe' => $GLOBALS['rememberMe'],

+ 8 - 0
api/pages/settings-tab-editor-tabs.php

@@ -72,6 +72,10 @@ allIcons().success(function(data) {
             <label class="control-label" for="new-tab-form-inputURLNew" lang="en">Tab URL</label>
             <input type="text" class="form-control" id="new-tab-form-inputURLNew" name="tabURL"  required="">
         </div>
+        <div class="form-group">
+            <label class="control-label" for="new-tab-form-inputURLLocalNew" lang="en">Tab Local URL</label>
+            <input type="text" class="form-control" id="new-tab-form-inputURLLocalNew" name="tabLocalURL">
+        </div>
         <div class="form-group">
             <label class="control-label" for="new-tab-form-inputPingURLNew" lang="en">Ping URL</label>
             <input type="text" class="form-control" id="new-tab-form-inputPingURLNew" name="pingURL"  placeholder="host/ip:port">
@@ -115,6 +119,10 @@ allIcons().success(function(data) {
             <label class="control-label" for="edit-tab-form-inputURL" lang="en">Tab URL</label>
             <input type="text" class="form-control" id="edit-tab-form-inputURL" name="tabURL"  required="">
         </div>
+        <div class="form-group">
+            <label class="control-label" for="edit-tab-form-inputLocalURL" lang="en">Tab Local URL</label>
+            <input type="text" class="form-control" id="edit-tab-form-inputLocalURL" name="tabLocalURL">
+        </div>
         <div class="form-group">
             <label class="control-label" for="edit-tab-form-pingURL" lang="en">Ping URL</label>
             <input type="text" class="form-control" id="edit-tab-form-pingURL" name="pingURL" placeholder="host/ip:port">

+ 2 - 0
api/vendor/composer/autoload_files.php

@@ -6,10 +6,12 @@ $vendorDir = dirname(dirname(__FILE__));
 $baseDir = dirname($vendorDir);
 
 return array(
+    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
     'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
     'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
     '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
     '3109cb1a231dcd04bee1f9f620d46975' => $vendorDir . '/paragonie/sodium_compat/autoload.php',
     'bd9634f2d41831496de0d3dfe4c94881' => $vendorDir . '/symfony/polyfill-php56/bootstrap.php',
     '0097ca414fcb37c7130ac24b05f485f8' => $vendorDir . '/dibi/dibi/src/loader.php',
+    '98ac7ebbcd4b271b4f101d3af2543920' => $vendorDir . '/layershifter/tld-extract/src/static.php',
 );

+ 5 - 0
api/vendor/composer/autoload_psr4.php

@@ -6,8 +6,10 @@ $vendorDir = dirname(dirname(__FILE__));
 $baseDir = dirname($vendorDir);
 
 return array(
+    'TrueBV\\' => array($vendorDir . '/true/punycode/src'),
     'Symfony\\Polyfill\\Util\\' => array($vendorDir . '/symfony/polyfill-util'),
     'Symfony\\Polyfill\\Php56\\' => array($vendorDir . '/symfony/polyfill-php56'),
+    'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
     'Pusher\\' => array($vendorDir . '/pusher/pusher-php-server/src'),
     'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
     'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
@@ -16,6 +18,9 @@ return array(
     'ParagonIE\\ConstantTime\\' => array($vendorDir . '/paragonie/constant_time_encoding/src'),
     'PHPMailer\\PHPMailer\\' => array($vendorDir . '/phpmailer/phpmailer/src'),
     'Lcobucci\\JWT\\' => array($vendorDir . '/lcobucci/jwt/src'),
+    'LayerShifter\\TLDSupport\\' => array($vendorDir . '/layershifter/tld-support/src'),
+    'LayerShifter\\TLDExtract\\' => array($vendorDir . '/layershifter/tld-extract/src'),
+    'LayerShifter\\TLDDatabase\\' => array($vendorDir . '/layershifter/tld-database/src'),
     'Kryptonit3\\Sonarr\\' => array($vendorDir . '/kryptonit3/sonarr/src'),
     'Kryptonit3\\SickRage\\' => array($vendorDir . '/kryptonit3/sickrage/src'),
     'Kryptonit3\\CouchPotato\\' => array($vendorDir . '/kryptonit3/couchpotato/src'),

+ 30 - 0
api/vendor/composer/autoload_static.php

@@ -7,19 +7,26 @@ namespace Composer\Autoload;
 class ComposerStaticInitcbdc783d76f8e7563dcce7d8af053ecb
 {
     public static $files = array (
+        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
         'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
         'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
         '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
         '3109cb1a231dcd04bee1f9f620d46975' => __DIR__ . '/..' . '/paragonie/sodium_compat/autoload.php',
         'bd9634f2d41831496de0d3dfe4c94881' => __DIR__ . '/..' . '/symfony/polyfill-php56/bootstrap.php',
         '0097ca414fcb37c7130ac24b05f485f8' => __DIR__ . '/..' . '/dibi/dibi/src/loader.php',
+        '98ac7ebbcd4b271b4f101d3af2543920' => __DIR__ . '/..' . '/layershifter/tld-extract/src/static.php',
     );
 
     public static $prefixLengthsPsr4 = array (
+        'T' => 
+        array (
+            'TrueBV\\' => 7,
+        ),
         'S' => 
         array (
             'Symfony\\Polyfill\\Util\\' => 22,
             'Symfony\\Polyfill\\Php56\\' => 23,
+            'Symfony\\Polyfill\\Mbstring\\' => 26,
         ),
         'P' => 
         array (
@@ -34,6 +41,9 @@ class ComposerStaticInitcbdc783d76f8e7563dcce7d8af053ecb
         'L' => 
         array (
             'Lcobucci\\JWT\\' => 13,
+            'LayerShifter\\TLDSupport\\' => 24,
+            'LayerShifter\\TLDExtract\\' => 24,
+            'LayerShifter\\TLDDatabase\\' => 25,
         ),
         'K' => 
         array (
@@ -54,6 +64,10 @@ class ComposerStaticInitcbdc783d76f8e7563dcce7d8af053ecb
     );
 
     public static $prefixDirsPsr4 = array (
+        'TrueBV\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/true/punycode/src',
+        ),
         'Symfony\\Polyfill\\Util\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony/polyfill-util',
@@ -62,6 +76,10 @@ class ComposerStaticInitcbdc783d76f8e7563dcce7d8af053ecb
         array (
             0 => __DIR__ . '/..' . '/symfony/polyfill-php56',
         ),
+        'Symfony\\Polyfill\\Mbstring\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
+        ),
         'Pusher\\' => 
         array (
             0 => __DIR__ . '/..' . '/pusher/pusher-php-server/src',
@@ -94,6 +112,18 @@ class ComposerStaticInitcbdc783d76f8e7563dcce7d8af053ecb
         array (
             0 => __DIR__ . '/..' . '/lcobucci/jwt/src',
         ),
+        'LayerShifter\\TLDSupport\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/layershifter/tld-support/src',
+        ),
+        'LayerShifter\\TLDExtract\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/layershifter/tld-extract/src',
+        ),
+        'LayerShifter\\TLDDatabase\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/layershifter/tld-database/src',
+        ),
         'Kryptonit3\\Sonarr\\' => 
         array (
             0 => __DIR__ . '/..' . '/kryptonit3/sonarr/src',

+ 260 - 0
api/vendor/composer/installed.json

@@ -1138,5 +1138,265 @@
             "sqlite",
             "sqlsrv"
         ]
+    },
+    {
+        "name": "symfony/polyfill-mbstring",
+        "version": "v1.10.0",
+        "version_normalized": "1.10.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/polyfill-mbstring.git",
+            "reference": "c79c051f5b3a46be09205c73b80b346e4153e494"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494",
+            "reference": "c79c051f5b3a46be09205c73b80b346e4153e494",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "suggest": {
+            "ext-mbstring": "For best performance"
+        },
+        "time": "2018-09-21T13:07:52+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.9-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Symfony\\Polyfill\\Mbstring\\": ""
+            },
+            "files": [
+                "bootstrap.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony polyfill for the Mbstring extension",
+        "homepage": "https://symfony.com",
+        "keywords": [
+            "compatibility",
+            "mbstring",
+            "polyfill",
+            "portable",
+            "shim"
+        ]
+    },
+    {
+        "name": "true/punycode",
+        "version": "v2.1.1",
+        "version_normalized": "2.1.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/true/php-punycode.git",
+            "reference": "a4d0c11a36dd7f4e7cd7096076cab6d3378a071e"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/true/php-punycode/zipball/a4d0c11a36dd7f4e7cd7096076cab6d3378a071e",
+            "reference": "a4d0c11a36dd7f4e7cd7096076cab6d3378a071e",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0",
+            "symfony/polyfill-mbstring": "^1.3"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "~4.7",
+            "squizlabs/php_codesniffer": "~2.0"
+        },
+        "time": "2016-11-16T10:37:54+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "TrueBV\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Renan Gonçalves",
+                "email": "renan.saddam@gmail.com"
+            }
+        ],
+        "description": "A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)",
+        "homepage": "https://github.com/true/php-punycode",
+        "keywords": [
+            "idna",
+            "punycode"
+        ]
+    },
+    {
+        "name": "layershifter/tld-support",
+        "version": "1.1.1",
+        "version_normalized": "1.1.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/layershifter/TLDSupport.git",
+            "reference": "9b9eb2350db82239289f4e6eb250a2fe4865b0db"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/layershifter/TLDSupport/zipball/9b9eb2350db82239289f4e6eb250a2fe4865b0db",
+            "reference": "9b9eb2350db82239289f4e6eb250a2fe4865b0db",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.5",
+            "symfony/polyfill-mbstring": "^1.2"
+        },
+        "require-dev": {
+            "codeclimate/php-test-reporter": "dev-master",
+            "phpmd/phpmd": "@stable",
+            "phpunit/phpunit": "4.8.*",
+            "squizlabs/php_codesniffer": "2.*"
+        },
+        "time": "2016-06-18T12:28:04+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "LayerShifter\\TLDSupport\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "Apache-2.0"
+        ],
+        "authors": [
+            {
+                "name": "Alexander Fedyashov",
+                "email": "a@fedyashov.com"
+            }
+        ],
+        "description": "Support package for TLDDatabase and TLDExtract"
+    },
+    {
+        "name": "layershifter/tld-database",
+        "version": "1.0.64",
+        "version_normalized": "1.0.64.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/layershifter/TLDDatabase.git",
+            "reference": "16d9b7cd195eda57c08c64f75e9dbc175320e0cc"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/layershifter/TLDDatabase/zipball/16d9b7cd195eda57c08c64f75e9dbc175320e0cc",
+            "reference": "16d9b7cd195eda57c08c64f75e9dbc175320e0cc",
+            "shasum": ""
+        },
+        "require": {
+            "ext-curl": "*",
+            "layershifter/tld-support": "^1.0.0",
+            "php": "^5.5.0 || ^7.0"
+        },
+        "require-dev": {
+            "codeclimate/php-test-reporter": "dev-master",
+            "mikey179/vfsstream": "^1.6",
+            "phpmd/phpmd": "@stable",
+            "phpunit/phpunit": "^4.8 || ^5.0",
+            "squizlabs/php_codesniffer": "~2.0"
+        },
+        "time": "2018-11-09T09:12:04+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "LayerShifter\\TLDDatabase\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "Apache-2.0"
+        ],
+        "authors": [
+            {
+                "name": "Alexander Fedyashov",
+                "email": "a@fedyashov.com"
+            }
+        ],
+        "description": "Database abstraction for Public Suffix List",
+        "keywords": [
+            "PSL",
+            "Public Suffix List",
+            "domain database",
+            "tld database"
+        ]
+    },
+    {
+        "name": "layershifter/tld-extract",
+        "version": "2.0.0",
+        "version_normalized": "2.0.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/layershifter/TLDExtract.git",
+            "reference": "236bfa0fd253e70f8db10f896e788e12b58b4a41"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/layershifter/TLDExtract/zipball/236bfa0fd253e70f8db10f896e788e12b58b4a41",
+            "reference": "236bfa0fd253e70f8db10f896e788e12b58b4a41",
+            "shasum": ""
+        },
+        "require": {
+            "layershifter/tld-database": "^1.0",
+            "layershifter/tld-support": "^1.1",
+            "php": "^5.5.0 || ^7.0",
+            "true/punycode": "^2.1.1"
+        },
+        "require-dev": {
+            "phpmd/phpmd": "@stable",
+            "phpunit/phpunit": "^4.8 || ^5.0",
+            "squizlabs/php_codesniffer": "~2.0"
+        },
+        "time": "2018-09-28T11:11:20+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "files": [
+                "src/static.php"
+            ],
+            "psr-4": {
+                "LayerShifter\\TLDExtract\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "Apache-2.0"
+        ],
+        "authors": [
+            {
+                "name": "Alexander Fedyashov",
+                "email": "a@fedyashov.com"
+            }
+        ],
+        "description": "TLDExtract, library for extracting parts of domain, e.q. domain parser",
+        "keywords": [
+            "TLDExtract",
+            "domain parser"
+        ]
     }
 ]

+ 46 - 0
api/vendor/layershifter/tld-database/composer.json

@@ -0,0 +1,46 @@
+{
+  "name": "layershifter/tld-database",
+  "description": "Database abstraction for Public Suffix List",
+  "keywords": [
+    "PSL",
+    "Public Suffix List",
+    "domain database",
+    "tld database"
+  ],
+  "minimum-stability": "stable",
+  "license": "Apache-2.0",
+  "authors": [
+    {
+      "name": "Alexander Fedyashov",
+      "email": "a@fedyashov.com"
+    }
+  ],
+  "require": {
+    "layershifter/tld-support": "^1.0.0",
+    "ext-curl": "*",
+    "php": "^5.5.0 || ^7.0"
+  },
+  "require-dev": {
+    "codeclimate/php-test-reporter": "dev-master",
+    "mikey179/vfsStream": "^1.6",
+    "phpmd/phpmd": "@stable",
+    "phpunit/phpunit": "^4.8 || ^5.0",
+    "squizlabs/php_codesniffer": "~2.0"
+  },
+  "autoload": {
+    "psr-4": {
+      "LayerShifter\\TLDDatabase\\": "src/"
+    }
+  },
+  "autoload-dev": {
+    "psr-4": {
+      "LayerShifter\\TLDDatabase\\Tests\\": "tests/"
+    }
+  },
+  "scripts": {
+    "lint": "composer lint:cs && composer lint:md",
+    "lint:cs": "phpcs --standard=psr2 src/",
+    "lint:md": "phpmd src text codesize,controversial,design,naming,unusedcode",
+    "test": "phpunit"
+  }
+}

TEMPAT SAMPAH
api/vendor/layershifter/tld-database/logo.png


+ 8642 - 0
api/vendor/layershifter/tld-database/resources/database.php

@@ -0,0 +1,8642 @@
+<?php
+return array (
+  'ac' => 1,
+  'com.ac' => 1,
+  'edu.ac' => 1,
+  'gov.ac' => 1,
+  'net.ac' => 1,
+  'mil.ac' => 1,
+  'org.ac' => 1,
+  'ad' => 1,
+  'nom.ad' => 1,
+  'ae' => 1,
+  'co.ae' => 1,
+  'net.ae' => 1,
+  'org.ae' => 1,
+  'sch.ae' => 1,
+  'ac.ae' => 1,
+  'gov.ae' => 1,
+  'mil.ae' => 1,
+  'aero' => 1,
+  'accident-investigation.aero' => 1,
+  'accident-prevention.aero' => 1,
+  'aerobatic.aero' => 1,
+  'aeroclub.aero' => 1,
+  'aerodrome.aero' => 1,
+  'agents.aero' => 1,
+  'aircraft.aero' => 1,
+  'airline.aero' => 1,
+  'airport.aero' => 1,
+  'air-surveillance.aero' => 1,
+  'airtraffic.aero' => 1,
+  'air-traffic-control.aero' => 1,
+  'ambulance.aero' => 1,
+  'amusement.aero' => 1,
+  'association.aero' => 1,
+  'author.aero' => 1,
+  'ballooning.aero' => 1,
+  'broker.aero' => 1,
+  'caa.aero' => 1,
+  'cargo.aero' => 1,
+  'catering.aero' => 1,
+  'certification.aero' => 1,
+  'championship.aero' => 1,
+  'charter.aero' => 1,
+  'civilaviation.aero' => 1,
+  'club.aero' => 1,
+  'conference.aero' => 1,
+  'consultant.aero' => 1,
+  'consulting.aero' => 1,
+  'control.aero' => 1,
+  'council.aero' => 1,
+  'crew.aero' => 1,
+  'design.aero' => 1,
+  'dgca.aero' => 1,
+  'educator.aero' => 1,
+  'emergency.aero' => 1,
+  'engine.aero' => 1,
+  'engineer.aero' => 1,
+  'entertainment.aero' => 1,
+  'equipment.aero' => 1,
+  'exchange.aero' => 1,
+  'express.aero' => 1,
+  'federation.aero' => 1,
+  'flight.aero' => 1,
+  'freight.aero' => 1,
+  'fuel.aero' => 1,
+  'gliding.aero' => 1,
+  'government.aero' => 1,
+  'groundhandling.aero' => 1,
+  'group.aero' => 1,
+  'hanggliding.aero' => 1,
+  'homebuilt.aero' => 1,
+  'insurance.aero' => 1,
+  'journal.aero' => 1,
+  'journalist.aero' => 1,
+  'leasing.aero' => 1,
+  'logistics.aero' => 1,
+  'magazine.aero' => 1,
+  'maintenance.aero' => 1,
+  'media.aero' => 1,
+  'microlight.aero' => 1,
+  'modelling.aero' => 1,
+  'navigation.aero' => 1,
+  'parachuting.aero' => 1,
+  'paragliding.aero' => 1,
+  'passenger-association.aero' => 1,
+  'pilot.aero' => 1,
+  'press.aero' => 1,
+  'production.aero' => 1,
+  'recreation.aero' => 1,
+  'repbody.aero' => 1,
+  'res.aero' => 1,
+  'research.aero' => 1,
+  'rotorcraft.aero' => 1,
+  'safety.aero' => 1,
+  'scientist.aero' => 1,
+  'services.aero' => 1,
+  'show.aero' => 1,
+  'skydiving.aero' => 1,
+  'software.aero' => 1,
+  'student.aero' => 1,
+  'trader.aero' => 1,
+  'trading.aero' => 1,
+  'trainer.aero' => 1,
+  'union.aero' => 1,
+  'workinggroup.aero' => 1,
+  'works.aero' => 1,
+  'af' => 1,
+  'gov.af' => 1,
+  'com.af' => 1,
+  'org.af' => 1,
+  'net.af' => 1,
+  'edu.af' => 1,
+  'ag' => 1,
+  'com.ag' => 1,
+  'org.ag' => 1,
+  'net.ag' => 1,
+  'co.ag' => 1,
+  'nom.ag' => 1,
+  'ai' => 1,
+  'off.ai' => 1,
+  'com.ai' => 1,
+  'net.ai' => 1,
+  'org.ai' => 1,
+  'al' => 1,
+  'com.al' => 1,
+  'edu.al' => 1,
+  'gov.al' => 1,
+  'mil.al' => 1,
+  'net.al' => 1,
+  'org.al' => 1,
+  'am' => 1,
+  'ao' => 1,
+  'ed.ao' => 1,
+  'gv.ao' => 1,
+  'og.ao' => 1,
+  'co.ao' => 1,
+  'pb.ao' => 1,
+  'it.ao' => 1,
+  'aq' => 1,
+  'ar' => 1,
+  'com.ar' => 1,
+  'edu.ar' => 1,
+  'gob.ar' => 1,
+  'gov.ar' => 1,
+  'int.ar' => 1,
+  'mil.ar' => 1,
+  'musica.ar' => 1,
+  'net.ar' => 1,
+  'org.ar' => 1,
+  'tur.ar' => 1,
+  'arpa' => 1,
+  'e164.arpa' => 1,
+  'in-addr.arpa' => 1,
+  'ip6.arpa' => 1,
+  'iris.arpa' => 1,
+  'uri.arpa' => 1,
+  'urn.arpa' => 1,
+  'as' => 1,
+  'gov.as' => 1,
+  'asia' => 1,
+  'at' => 1,
+  'ac.at' => 1,
+  'co.at' => 1,
+  'gv.at' => 1,
+  'or.at' => 1,
+  'au' => 1,
+  'com.au' => 1,
+  'net.au' => 1,
+  'org.au' => 1,
+  'edu.au' => 1,
+  'gov.au' => 1,
+  'asn.au' => 1,
+  'id.au' => 1,
+  'info.au' => 1,
+  'conf.au' => 1,
+  'oz.au' => 1,
+  'act.au' => 1,
+  'nsw.au' => 1,
+  'nt.au' => 1,
+  'qld.au' => 1,
+  'sa.au' => 1,
+  'tas.au' => 1,
+  'vic.au' => 1,
+  'wa.au' => 1,
+  'act.edu.au' => 1,
+  'nsw.edu.au' => 1,
+  'nt.edu.au' => 1,
+  'qld.edu.au' => 1,
+  'sa.edu.au' => 1,
+  'tas.edu.au' => 1,
+  'vic.edu.au' => 1,
+  'wa.edu.au' => 1,
+  'qld.gov.au' => 1,
+  'sa.gov.au' => 1,
+  'tas.gov.au' => 1,
+  'vic.gov.au' => 1,
+  'wa.gov.au' => 1,
+  'aw' => 1,
+  'com.aw' => 1,
+  'ax' => 1,
+  'az' => 1,
+  'com.az' => 1,
+  'net.az' => 1,
+  'int.az' => 1,
+  'gov.az' => 1,
+  'org.az' => 1,
+  'edu.az' => 1,
+  'info.az' => 1,
+  'pp.az' => 1,
+  'mil.az' => 1,
+  'name.az' => 1,
+  'pro.az' => 1,
+  'biz.az' => 1,
+  'ba' => 1,
+  'com.ba' => 1,
+  'edu.ba' => 1,
+  'gov.ba' => 1,
+  'mil.ba' => 1,
+  'net.ba' => 1,
+  'org.ba' => 1,
+  'bb' => 1,
+  'biz.bb' => 1,
+  'co.bb' => 1,
+  'com.bb' => 1,
+  'edu.bb' => 1,
+  'gov.bb' => 1,
+  'info.bb' => 1,
+  'net.bb' => 1,
+  'org.bb' => 1,
+  'store.bb' => 1,
+  'tv.bb' => 1,
+  '*.bd' => 1,
+  'be' => 1,
+  'ac.be' => 1,
+  'bf' => 1,
+  'gov.bf' => 1,
+  'bg' => 1,
+  'a.bg' => 1,
+  'b.bg' => 1,
+  'c.bg' => 1,
+  'd.bg' => 1,
+  'e.bg' => 1,
+  'f.bg' => 1,
+  'g.bg' => 1,
+  'h.bg' => 1,
+  'i.bg' => 1,
+  'j.bg' => 1,
+  'k.bg' => 1,
+  'l.bg' => 1,
+  'm.bg' => 1,
+  'n.bg' => 1,
+  'o.bg' => 1,
+  'p.bg' => 1,
+  'q.bg' => 1,
+  'r.bg' => 1,
+  's.bg' => 1,
+  't.bg' => 1,
+  'u.bg' => 1,
+  'v.bg' => 1,
+  'w.bg' => 1,
+  'x.bg' => 1,
+  'y.bg' => 1,
+  'z.bg' => 1,
+  '0.bg' => 1,
+  '1.bg' => 1,
+  '2.bg' => 1,
+  '3.bg' => 1,
+  '4.bg' => 1,
+  '5.bg' => 1,
+  '6.bg' => 1,
+  '7.bg' => 1,
+  '8.bg' => 1,
+  '9.bg' => 1,
+  'bh' => 1,
+  'com.bh' => 1,
+  'edu.bh' => 1,
+  'net.bh' => 1,
+  'org.bh' => 1,
+  'gov.bh' => 1,
+  'bi' => 1,
+  'co.bi' => 1,
+  'com.bi' => 1,
+  'edu.bi' => 1,
+  'or.bi' => 1,
+  'org.bi' => 1,
+  'biz' => 1,
+  'bj' => 1,
+  'asso.bj' => 1,
+  'barreau.bj' => 1,
+  'gouv.bj' => 1,
+  'bm' => 1,
+  'com.bm' => 1,
+  'edu.bm' => 1,
+  'gov.bm' => 1,
+  'net.bm' => 1,
+  'org.bm' => 1,
+  'bn' => 1,
+  'com.bn' => 1,
+  'edu.bn' => 1,
+  'gov.bn' => 1,
+  'net.bn' => 1,
+  'org.bn' => 1,
+  'bo' => 1,
+  'com.bo' => 1,
+  'edu.bo' => 1,
+  'gob.bo' => 1,
+  'int.bo' => 1,
+  'org.bo' => 1,
+  'net.bo' => 1,
+  'mil.bo' => 1,
+  'tv.bo' => 1,
+  'web.bo' => 1,
+  'academia.bo' => 1,
+  'agro.bo' => 1,
+  'arte.bo' => 1,
+  'blog.bo' => 1,
+  'bolivia.bo' => 1,
+  'ciencia.bo' => 1,
+  'cooperativa.bo' => 1,
+  'democracia.bo' => 1,
+  'deporte.bo' => 1,
+  'ecologia.bo' => 1,
+  'economia.bo' => 1,
+  'empresa.bo' => 1,
+  'indigena.bo' => 1,
+  'industria.bo' => 1,
+  'info.bo' => 1,
+  'medicina.bo' => 1,
+  'movimiento.bo' => 1,
+  'musica.bo' => 1,
+  'natural.bo' => 1,
+  'nombre.bo' => 1,
+  'noticias.bo' => 1,
+  'patria.bo' => 1,
+  'politica.bo' => 1,
+  'profesional.bo' => 1,
+  'plurinacional.bo' => 1,
+  'pueblo.bo' => 1,
+  'revista.bo' => 1,
+  'salud.bo' => 1,
+  'tecnologia.bo' => 1,
+  'tksat.bo' => 1,
+  'transporte.bo' => 1,
+  'wiki.bo' => 1,
+  'br' => 1,
+  '9guacu.br' => 1,
+  'abc.br' => 1,
+  'adm.br' => 1,
+  'adv.br' => 1,
+  'agr.br' => 1,
+  'aju.br' => 1,
+  'am.br' => 1,
+  'anani.br' => 1,
+  'aparecida.br' => 1,
+  'arq.br' => 1,
+  'art.br' => 1,
+  'ato.br' => 1,
+  'b.br' => 1,
+  'barueri.br' => 1,
+  'belem.br' => 1,
+  'bhz.br' => 1,
+  'bio.br' => 1,
+  'blog.br' => 1,
+  'bmd.br' => 1,
+  'boavista.br' => 1,
+  'bsb.br' => 1,
+  'campinagrande.br' => 1,
+  'campinas.br' => 1,
+  'caxias.br' => 1,
+  'cim.br' => 1,
+  'cng.br' => 1,
+  'cnt.br' => 1,
+  'com.br' => 1,
+  'contagem.br' => 1,
+  'coop.br' => 1,
+  'cri.br' => 1,
+  'cuiaba.br' => 1,
+  'curitiba.br' => 1,
+  'def.br' => 1,
+  'ecn.br' => 1,
+  'eco.br' => 1,
+  'edu.br' => 1,
+  'emp.br' => 1,
+  'eng.br' => 1,
+  'esp.br' => 1,
+  'etc.br' => 1,
+  'eti.br' => 1,
+  'far.br' => 1,
+  'feira.br' => 1,
+  'flog.br' => 1,
+  'floripa.br' => 1,
+  'fm.br' => 1,
+  'fnd.br' => 1,
+  'fortal.br' => 1,
+  'fot.br' => 1,
+  'foz.br' => 1,
+  'fst.br' => 1,
+  'g12.br' => 1,
+  'ggf.br' => 1,
+  'goiania.br' => 1,
+  'gov.br' => 1,
+  'ac.gov.br' => 1,
+  'al.gov.br' => 1,
+  'am.gov.br' => 1,
+  'ap.gov.br' => 1,
+  'ba.gov.br' => 1,
+  'ce.gov.br' => 1,
+  'df.gov.br' => 1,
+  'es.gov.br' => 1,
+  'go.gov.br' => 1,
+  'ma.gov.br' => 1,
+  'mg.gov.br' => 1,
+  'ms.gov.br' => 1,
+  'mt.gov.br' => 1,
+  'pa.gov.br' => 1,
+  'pb.gov.br' => 1,
+  'pe.gov.br' => 1,
+  'pi.gov.br' => 1,
+  'pr.gov.br' => 1,
+  'rj.gov.br' => 1,
+  'rn.gov.br' => 1,
+  'ro.gov.br' => 1,
+  'rr.gov.br' => 1,
+  'rs.gov.br' => 1,
+  'sc.gov.br' => 1,
+  'se.gov.br' => 1,
+  'sp.gov.br' => 1,
+  'to.gov.br' => 1,
+  'gru.br' => 1,
+  'imb.br' => 1,
+  'ind.br' => 1,
+  'inf.br' => 1,
+  'jab.br' => 1,
+  'jampa.br' => 1,
+  'jdf.br' => 1,
+  'joinville.br' => 1,
+  'jor.br' => 1,
+  'jus.br' => 1,
+  'leg.br' => 1,
+  'lel.br' => 1,
+  'londrina.br' => 1,
+  'macapa.br' => 1,
+  'maceio.br' => 1,
+  'manaus.br' => 1,
+  'maringa.br' => 1,
+  'mat.br' => 1,
+  'med.br' => 1,
+  'mil.br' => 1,
+  'morena.br' => 1,
+  'mp.br' => 1,
+  'mus.br' => 1,
+  'natal.br' => 1,
+  'net.br' => 1,
+  'niteroi.br' => 1,
+  '*.nom.br' => 1,
+  'not.br' => 1,
+  'ntr.br' => 1,
+  'odo.br' => 1,
+  'ong.br' => 1,
+  'org.br' => 1,
+  'osasco.br' => 1,
+  'palmas.br' => 1,
+  'poa.br' => 1,
+  'ppg.br' => 1,
+  'pro.br' => 1,
+  'psc.br' => 1,
+  'psi.br' => 1,
+  'pvh.br' => 1,
+  'qsl.br' => 1,
+  'radio.br' => 1,
+  'rec.br' => 1,
+  'recife.br' => 1,
+  'ribeirao.br' => 1,
+  'rio.br' => 1,
+  'riobranco.br' => 1,
+  'riopreto.br' => 1,
+  'salvador.br' => 1,
+  'sampa.br' => 1,
+  'santamaria.br' => 1,
+  'santoandre.br' => 1,
+  'saobernardo.br' => 1,
+  'saogonca.br' => 1,
+  'sjc.br' => 1,
+  'slg.br' => 1,
+  'slz.br' => 1,
+  'sorocaba.br' => 1,
+  'srv.br' => 1,
+  'taxi.br' => 1,
+  'teo.br' => 1,
+  'the.br' => 1,
+  'tmp.br' => 1,
+  'trd.br' => 1,
+  'tur.br' => 1,
+  'tv.br' => 1,
+  'udi.br' => 1,
+  'vet.br' => 1,
+  'vix.br' => 1,
+  'vlog.br' => 1,
+  'wiki.br' => 1,
+  'zlg.br' => 1,
+  'bs' => 1,
+  'com.bs' => 1,
+  'net.bs' => 1,
+  'org.bs' => 1,
+  'edu.bs' => 1,
+  'gov.bs' => 1,
+  'bt' => 1,
+  'com.bt' => 1,
+  'edu.bt' => 1,
+  'gov.bt' => 1,
+  'net.bt' => 1,
+  'org.bt' => 1,
+  'bv' => 1,
+  'bw' => 1,
+  'co.bw' => 1,
+  'org.bw' => 1,
+  'by' => 1,
+  'gov.by' => 1,
+  'mil.by' => 1,
+  'com.by' => 1,
+  'of.by' => 1,
+  'bz' => 1,
+  'com.bz' => 1,
+  'net.bz' => 1,
+  'org.bz' => 1,
+  'edu.bz' => 1,
+  'gov.bz' => 1,
+  'ca' => 1,
+  'ab.ca' => 1,
+  'bc.ca' => 1,
+  'mb.ca' => 1,
+  'nb.ca' => 1,
+  'nf.ca' => 1,
+  'nl.ca' => 1,
+  'ns.ca' => 1,
+  'nt.ca' => 1,
+  'nu.ca' => 1,
+  'on.ca' => 1,
+  'pe.ca' => 1,
+  'qc.ca' => 1,
+  'sk.ca' => 1,
+  'yk.ca' => 1,
+  'gc.ca' => 1,
+  'cat' => 1,
+  'cc' => 1,
+  'cd' => 1,
+  'gov.cd' => 1,
+  'cf' => 1,
+  'cg' => 1,
+  'ch' => 1,
+  'ci' => 1,
+  'org.ci' => 1,
+  'or.ci' => 1,
+  'com.ci' => 1,
+  'co.ci' => 1,
+  'edu.ci' => 1,
+  'ed.ci' => 1,
+  'ac.ci' => 1,
+  'net.ci' => 1,
+  'go.ci' => 1,
+  'asso.ci' => 1,
+  'aéroport.ci' => 1,
+  'int.ci' => 1,
+  'presse.ci' => 1,
+  'md.ci' => 1,
+  'gouv.ci' => 1,
+  '*.ck' => 1,
+  '!www.ck' => 1,
+  'cl' => 1,
+  'gov.cl' => 1,
+  'gob.cl' => 1,
+  'co.cl' => 1,
+  'mil.cl' => 1,
+  'cm' => 1,
+  'co.cm' => 1,
+  'com.cm' => 1,
+  'gov.cm' => 1,
+  'net.cm' => 1,
+  'cn' => 1,
+  'ac.cn' => 1,
+  'com.cn' => 1,
+  'edu.cn' => 1,
+  'gov.cn' => 1,
+  'net.cn' => 1,
+  'org.cn' => 1,
+  'mil.cn' => 1,
+  '公司.cn' => 1,
+  '网络.cn' => 1,
+  '網絡.cn' => 1,
+  'ah.cn' => 1,
+  'bj.cn' => 1,
+  'cq.cn' => 1,
+  'fj.cn' => 1,
+  'gd.cn' => 1,
+  'gs.cn' => 1,
+  'gz.cn' => 1,
+  'gx.cn' => 1,
+  'ha.cn' => 1,
+  'hb.cn' => 1,
+  'he.cn' => 1,
+  'hi.cn' => 1,
+  'hl.cn' => 1,
+  'hn.cn' => 1,
+  'jl.cn' => 1,
+  'js.cn' => 1,
+  'jx.cn' => 1,
+  'ln.cn' => 1,
+  'nm.cn' => 1,
+  'nx.cn' => 1,
+  'qh.cn' => 1,
+  'sc.cn' => 1,
+  'sd.cn' => 1,
+  'sh.cn' => 1,
+  'sn.cn' => 1,
+  'sx.cn' => 1,
+  'tj.cn' => 1,
+  'xj.cn' => 1,
+  'xz.cn' => 1,
+  'yn.cn' => 1,
+  'zj.cn' => 1,
+  'hk.cn' => 1,
+  'mo.cn' => 1,
+  'tw.cn' => 1,
+  'co' => 1,
+  'arts.co' => 1,
+  'com.co' => 1,
+  'edu.co' => 1,
+  'firm.co' => 1,
+  'gov.co' => 1,
+  'info.co' => 1,
+  'int.co' => 1,
+  'mil.co' => 1,
+  'net.co' => 1,
+  'nom.co' => 1,
+  'org.co' => 1,
+  'rec.co' => 1,
+  'web.co' => 1,
+  'com' => 1,
+  'coop' => 1,
+  'cr' => 1,
+  'ac.cr' => 1,
+  'co.cr' => 1,
+  'ed.cr' => 1,
+  'fi.cr' => 1,
+  'go.cr' => 1,
+  'or.cr' => 1,
+  'sa.cr' => 1,
+  'cu' => 1,
+  'com.cu' => 1,
+  'edu.cu' => 1,
+  'org.cu' => 1,
+  'net.cu' => 1,
+  'gov.cu' => 1,
+  'inf.cu' => 1,
+  'cv' => 1,
+  'cw' => 1,
+  'com.cw' => 1,
+  'edu.cw' => 1,
+  'net.cw' => 1,
+  'org.cw' => 1,
+  'cx' => 1,
+  'gov.cx' => 1,
+  'cy' => 1,
+  'ac.cy' => 1,
+  'biz.cy' => 1,
+  'com.cy' => 1,
+  'ekloges.cy' => 1,
+  'gov.cy' => 1,
+  'ltd.cy' => 1,
+  'name.cy' => 1,
+  'net.cy' => 1,
+  'org.cy' => 1,
+  'parliament.cy' => 1,
+  'press.cy' => 1,
+  'pro.cy' => 1,
+  'tm.cy' => 1,
+  'cz' => 1,
+  'de' => 1,
+  'dj' => 1,
+  'dk' => 1,
+  'dm' => 1,
+  'com.dm' => 1,
+  'net.dm' => 1,
+  'org.dm' => 1,
+  'edu.dm' => 1,
+  'gov.dm' => 1,
+  'do' => 1,
+  'art.do' => 1,
+  'com.do' => 1,
+  'edu.do' => 1,
+  'gob.do' => 1,
+  'gov.do' => 1,
+  'mil.do' => 1,
+  'net.do' => 1,
+  'org.do' => 1,
+  'sld.do' => 1,
+  'web.do' => 1,
+  'dz' => 1,
+  'com.dz' => 1,
+  'org.dz' => 1,
+  'net.dz' => 1,
+  'gov.dz' => 1,
+  'edu.dz' => 1,
+  'asso.dz' => 1,
+  'pol.dz' => 1,
+  'art.dz' => 1,
+  'ec' => 1,
+  'com.ec' => 1,
+  'info.ec' => 1,
+  'net.ec' => 1,
+  'fin.ec' => 1,
+  'k12.ec' => 1,
+  'med.ec' => 1,
+  'pro.ec' => 1,
+  'org.ec' => 1,
+  'edu.ec' => 1,
+  'gov.ec' => 1,
+  'gob.ec' => 1,
+  'mil.ec' => 1,
+  'edu' => 1,
+  'ee' => 1,
+  'edu.ee' => 1,
+  'gov.ee' => 1,
+  'riik.ee' => 1,
+  'lib.ee' => 1,
+  'med.ee' => 1,
+  'com.ee' => 1,
+  'pri.ee' => 1,
+  'aip.ee' => 1,
+  'org.ee' => 1,
+  'fie.ee' => 1,
+  'eg' => 1,
+  'com.eg' => 1,
+  'edu.eg' => 1,
+  'eun.eg' => 1,
+  'gov.eg' => 1,
+  'mil.eg' => 1,
+  'name.eg' => 1,
+  'net.eg' => 1,
+  'org.eg' => 1,
+  'sci.eg' => 1,
+  '*.er' => 1,
+  'es' => 1,
+  'com.es' => 1,
+  'nom.es' => 1,
+  'org.es' => 1,
+  'gob.es' => 1,
+  'edu.es' => 1,
+  'et' => 1,
+  'com.et' => 1,
+  'gov.et' => 1,
+  'org.et' => 1,
+  'edu.et' => 1,
+  'biz.et' => 1,
+  'name.et' => 1,
+  'info.et' => 1,
+  'net.et' => 1,
+  'eu' => 1,
+  'fi' => 1,
+  'aland.fi' => 1,
+  '*.fj' => 1,
+  '*.fk' => 1,
+  'fm' => 1,
+  'fo' => 1,
+  'fr' => 1,
+  'com.fr' => 1,
+  'asso.fr' => 1,
+  'nom.fr' => 1,
+  'prd.fr' => 1,
+  'presse.fr' => 1,
+  'tm.fr' => 1,
+  'aeroport.fr' => 1,
+  'assedic.fr' => 1,
+  'avocat.fr' => 1,
+  'avoues.fr' => 1,
+  'cci.fr' => 1,
+  'chambagri.fr' => 1,
+  'chirurgiens-dentistes.fr' => 1,
+  'experts-comptables.fr' => 1,
+  'geometre-expert.fr' => 1,
+  'gouv.fr' => 1,
+  'greta.fr' => 1,
+  'huissier-justice.fr' => 1,
+  'medecin.fr' => 1,
+  'notaires.fr' => 1,
+  'pharmacien.fr' => 1,
+  'port.fr' => 1,
+  'veterinaire.fr' => 1,
+  'ga' => 1,
+  'gb' => 1,
+  'gd' => 1,
+  'ge' => 1,
+  'com.ge' => 1,
+  'edu.ge' => 1,
+  'gov.ge' => 1,
+  'org.ge' => 1,
+  'mil.ge' => 1,
+  'net.ge' => 1,
+  'pvt.ge' => 1,
+  'gf' => 1,
+  'gg' => 1,
+  'co.gg' => 1,
+  'net.gg' => 1,
+  'org.gg' => 1,
+  'gh' => 1,
+  'com.gh' => 1,
+  'edu.gh' => 1,
+  'gov.gh' => 1,
+  'org.gh' => 1,
+  'mil.gh' => 1,
+  'gi' => 1,
+  'com.gi' => 1,
+  'ltd.gi' => 1,
+  'gov.gi' => 1,
+  'mod.gi' => 1,
+  'edu.gi' => 1,
+  'org.gi' => 1,
+  'gl' => 1,
+  'co.gl' => 1,
+  'com.gl' => 1,
+  'edu.gl' => 1,
+  'net.gl' => 1,
+  'org.gl' => 1,
+  'gm' => 1,
+  'gn' => 1,
+  'ac.gn' => 1,
+  'com.gn' => 1,
+  'edu.gn' => 1,
+  'gov.gn' => 1,
+  'org.gn' => 1,
+  'net.gn' => 1,
+  'gov' => 1,
+  'gp' => 1,
+  'com.gp' => 1,
+  'net.gp' => 1,
+  'mobi.gp' => 1,
+  'edu.gp' => 1,
+  'org.gp' => 1,
+  'asso.gp' => 1,
+  'gq' => 1,
+  'gr' => 1,
+  'com.gr' => 1,
+  'edu.gr' => 1,
+  'net.gr' => 1,
+  'org.gr' => 1,
+  'gov.gr' => 1,
+  'gs' => 1,
+  'gt' => 1,
+  'com.gt' => 1,
+  'edu.gt' => 1,
+  'gob.gt' => 1,
+  'ind.gt' => 1,
+  'mil.gt' => 1,
+  'net.gt' => 1,
+  'org.gt' => 1,
+  'gu' => 1,
+  'com.gu' => 1,
+  'edu.gu' => 1,
+  'gov.gu' => 1,
+  'guam.gu' => 1,
+  'info.gu' => 1,
+  'net.gu' => 1,
+  'org.gu' => 1,
+  'web.gu' => 1,
+  'gw' => 1,
+  'gy' => 1,
+  'co.gy' => 1,
+  'com.gy' => 1,
+  'edu.gy' => 1,
+  'gov.gy' => 1,
+  'net.gy' => 1,
+  'org.gy' => 1,
+  'hk' => 1,
+  'com.hk' => 1,
+  'edu.hk' => 1,
+  'gov.hk' => 1,
+  'idv.hk' => 1,
+  'net.hk' => 1,
+  'org.hk' => 1,
+  '公司.hk' => 1,
+  '教育.hk' => 1,
+  '敎育.hk' => 1,
+  '政府.hk' => 1,
+  '個人.hk' => 1,
+  '个人.hk' => 1,
+  '箇人.hk' => 1,
+  '網络.hk' => 1,
+  '网络.hk' => 1,
+  '组織.hk' => 1,
+  '網絡.hk' => 1,
+  '网絡.hk' => 1,
+  '组织.hk' => 1,
+  '組織.hk' => 1,
+  '組织.hk' => 1,
+  'hm' => 1,
+  'hn' => 1,
+  'com.hn' => 1,
+  'edu.hn' => 1,
+  'org.hn' => 1,
+  'net.hn' => 1,
+  'mil.hn' => 1,
+  'gob.hn' => 1,
+  'hr' => 1,
+  'iz.hr' => 1,
+  'from.hr' => 1,
+  'name.hr' => 1,
+  'com.hr' => 1,
+  'ht' => 1,
+  'com.ht' => 1,
+  'shop.ht' => 1,
+  'firm.ht' => 1,
+  'info.ht' => 1,
+  'adult.ht' => 1,
+  'net.ht' => 1,
+  'pro.ht' => 1,
+  'org.ht' => 1,
+  'med.ht' => 1,
+  'art.ht' => 1,
+  'coop.ht' => 1,
+  'pol.ht' => 1,
+  'asso.ht' => 1,
+  'edu.ht' => 1,
+  'rel.ht' => 1,
+  'gouv.ht' => 1,
+  'perso.ht' => 1,
+  'hu' => 1,
+  'co.hu' => 1,
+  'info.hu' => 1,
+  'org.hu' => 1,
+  'priv.hu' => 1,
+  'sport.hu' => 1,
+  'tm.hu' => 1,
+  '2000.hu' => 1,
+  'agrar.hu' => 1,
+  'bolt.hu' => 1,
+  'casino.hu' => 1,
+  'city.hu' => 1,
+  'erotica.hu' => 1,
+  'erotika.hu' => 1,
+  'film.hu' => 1,
+  'forum.hu' => 1,
+  'games.hu' => 1,
+  'hotel.hu' => 1,
+  'ingatlan.hu' => 1,
+  'jogasz.hu' => 1,
+  'konyvelo.hu' => 1,
+  'lakas.hu' => 1,
+  'media.hu' => 1,
+  'news.hu' => 1,
+  'reklam.hu' => 1,
+  'sex.hu' => 1,
+  'shop.hu' => 1,
+  'suli.hu' => 1,
+  'szex.hu' => 1,
+  'tozsde.hu' => 1,
+  'utazas.hu' => 1,
+  'video.hu' => 1,
+  'id' => 1,
+  'ac.id' => 1,
+  'biz.id' => 1,
+  'co.id' => 1,
+  'desa.id' => 1,
+  'go.id' => 1,
+  'mil.id' => 1,
+  'my.id' => 1,
+  'net.id' => 1,
+  'or.id' => 1,
+  'ponpes.id' => 1,
+  'sch.id' => 1,
+  'web.id' => 1,
+  'ie' => 1,
+  'gov.ie' => 1,
+  'il' => 1,
+  'ac.il' => 1,
+  'co.il' => 1,
+  'gov.il' => 1,
+  'idf.il' => 1,
+  'k12.il' => 1,
+  'muni.il' => 1,
+  'net.il' => 1,
+  'org.il' => 1,
+  'im' => 1,
+  'ac.im' => 1,
+  'co.im' => 1,
+  'com.im' => 1,
+  'ltd.co.im' => 1,
+  'net.im' => 1,
+  'org.im' => 1,
+  'plc.co.im' => 1,
+  'tt.im' => 1,
+  'tv.im' => 1,
+  'in' => 1,
+  'co.in' => 1,
+  'firm.in' => 1,
+  'net.in' => 1,
+  'org.in' => 1,
+  'gen.in' => 1,
+  'ind.in' => 1,
+  'nic.in' => 1,
+  'ac.in' => 1,
+  'edu.in' => 1,
+  'res.in' => 1,
+  'gov.in' => 1,
+  'mil.in' => 1,
+  'info' => 1,
+  'int' => 1,
+  'eu.int' => 1,
+  'io' => 1,
+  'com.io' => 1,
+  'iq' => 1,
+  'gov.iq' => 1,
+  'edu.iq' => 1,
+  'mil.iq' => 1,
+  'com.iq' => 1,
+  'org.iq' => 1,
+  'net.iq' => 1,
+  'ir' => 1,
+  'ac.ir' => 1,
+  'co.ir' => 1,
+  'gov.ir' => 1,
+  'id.ir' => 1,
+  'net.ir' => 1,
+  'org.ir' => 1,
+  'sch.ir' => 1,
+  'ایران.ir' => 1,
+  'ايران.ir' => 1,
+  'is' => 1,
+  'net.is' => 1,
+  'com.is' => 1,
+  'edu.is' => 1,
+  'gov.is' => 1,
+  'org.is' => 1,
+  'int.is' => 1,
+  'it' => 1,
+  'gov.it' => 1,
+  'edu.it' => 1,
+  'abr.it' => 1,
+  'abruzzo.it' => 1,
+  'aosta-valley.it' => 1,
+  'aostavalley.it' => 1,
+  'bas.it' => 1,
+  'basilicata.it' => 1,
+  'cal.it' => 1,
+  'calabria.it' => 1,
+  'cam.it' => 1,
+  'campania.it' => 1,
+  'emilia-romagna.it' => 1,
+  'emiliaromagna.it' => 1,
+  'emr.it' => 1,
+  'friuli-v-giulia.it' => 1,
+  'friuli-ve-giulia.it' => 1,
+  'friuli-vegiulia.it' => 1,
+  'friuli-venezia-giulia.it' => 1,
+  'friuli-veneziagiulia.it' => 1,
+  'friuli-vgiulia.it' => 1,
+  'friuliv-giulia.it' => 1,
+  'friulive-giulia.it' => 1,
+  'friulivegiulia.it' => 1,
+  'friulivenezia-giulia.it' => 1,
+  'friuliveneziagiulia.it' => 1,
+  'friulivgiulia.it' => 1,
+  'fvg.it' => 1,
+  'laz.it' => 1,
+  'lazio.it' => 1,
+  'lig.it' => 1,
+  'liguria.it' => 1,
+  'lom.it' => 1,
+  'lombardia.it' => 1,
+  'lombardy.it' => 1,
+  'lucania.it' => 1,
+  'mar.it' => 1,
+  'marche.it' => 1,
+  'mol.it' => 1,
+  'molise.it' => 1,
+  'piedmont.it' => 1,
+  'piemonte.it' => 1,
+  'pmn.it' => 1,
+  'pug.it' => 1,
+  'puglia.it' => 1,
+  'sar.it' => 1,
+  'sardegna.it' => 1,
+  'sardinia.it' => 1,
+  'sic.it' => 1,
+  'sicilia.it' => 1,
+  'sicily.it' => 1,
+  'taa.it' => 1,
+  'tos.it' => 1,
+  'toscana.it' => 1,
+  'trentin-sud-tirol.it' => 1,
+  'trentin-süd-tirol.it' => 1,
+  'trentin-sudtirol.it' => 1,
+  'trentin-südtirol.it' => 1,
+  'trentin-sued-tirol.it' => 1,
+  'trentin-suedtirol.it' => 1,
+  'trentino-a-adige.it' => 1,
+  'trentino-aadige.it' => 1,
+  'trentino-alto-adige.it' => 1,
+  'trentino-altoadige.it' => 1,
+  'trentino-s-tirol.it' => 1,
+  'trentino-stirol.it' => 1,
+  'trentino-sud-tirol.it' => 1,
+  'trentino-süd-tirol.it' => 1,
+  'trentino-sudtirol.it' => 1,
+  'trentino-südtirol.it' => 1,
+  'trentino-sued-tirol.it' => 1,
+  'trentino-suedtirol.it' => 1,
+  'trentino.it' => 1,
+  'trentinoa-adige.it' => 1,
+  'trentinoaadige.it' => 1,
+  'trentinoalto-adige.it' => 1,
+  'trentinoaltoadige.it' => 1,
+  'trentinos-tirol.it' => 1,
+  'trentinostirol.it' => 1,
+  'trentinosud-tirol.it' => 1,
+  'trentinosüd-tirol.it' => 1,
+  'trentinosudtirol.it' => 1,
+  'trentinosüdtirol.it' => 1,
+  'trentinosued-tirol.it' => 1,
+  'trentinosuedtirol.it' => 1,
+  'trentinsud-tirol.it' => 1,
+  'trentinsüd-tirol.it' => 1,
+  'trentinsudtirol.it' => 1,
+  'trentinsüdtirol.it' => 1,
+  'trentinsued-tirol.it' => 1,
+  'trentinsuedtirol.it' => 1,
+  'tuscany.it' => 1,
+  'umb.it' => 1,
+  'umbria.it' => 1,
+  'val-d-aosta.it' => 1,
+  'val-daosta.it' => 1,
+  'vald-aosta.it' => 1,
+  'valdaosta.it' => 1,
+  'valle-aosta.it' => 1,
+  'valle-d-aosta.it' => 1,
+  'valle-daosta.it' => 1,
+  'valleaosta.it' => 1,
+  'valled-aosta.it' => 1,
+  'valledaosta.it' => 1,
+  'vallee-aoste.it' => 1,
+  'vallée-aoste.it' => 1,
+  'vallee-d-aoste.it' => 1,
+  'vallée-d-aoste.it' => 1,
+  'valleeaoste.it' => 1,
+  'valléeaoste.it' => 1,
+  'valleedaoste.it' => 1,
+  'valléedaoste.it' => 1,
+  'vao.it' => 1,
+  'vda.it' => 1,
+  'ven.it' => 1,
+  'veneto.it' => 1,
+  'ag.it' => 1,
+  'agrigento.it' => 1,
+  'al.it' => 1,
+  'alessandria.it' => 1,
+  'alto-adige.it' => 1,
+  'altoadige.it' => 1,
+  'an.it' => 1,
+  'ancona.it' => 1,
+  'andria-barletta-trani.it' => 1,
+  'andria-trani-barletta.it' => 1,
+  'andriabarlettatrani.it' => 1,
+  'andriatranibarletta.it' => 1,
+  'ao.it' => 1,
+  'aosta.it' => 1,
+  'aoste.it' => 1,
+  'ap.it' => 1,
+  'aq.it' => 1,
+  'aquila.it' => 1,
+  'ar.it' => 1,
+  'arezzo.it' => 1,
+  'ascoli-piceno.it' => 1,
+  'ascolipiceno.it' => 1,
+  'asti.it' => 1,
+  'at.it' => 1,
+  'av.it' => 1,
+  'avellino.it' => 1,
+  'ba.it' => 1,
+  'balsan-sudtirol.it' => 1,
+  'balsan-südtirol.it' => 1,
+  'balsan-suedtirol.it' => 1,
+  'balsan.it' => 1,
+  'bari.it' => 1,
+  'barletta-trani-andria.it' => 1,
+  'barlettatraniandria.it' => 1,
+  'belluno.it' => 1,
+  'benevento.it' => 1,
+  'bergamo.it' => 1,
+  'bg.it' => 1,
+  'bi.it' => 1,
+  'biella.it' => 1,
+  'bl.it' => 1,
+  'bn.it' => 1,
+  'bo.it' => 1,
+  'bologna.it' => 1,
+  'bolzano-altoadige.it' => 1,
+  'bolzano.it' => 1,
+  'bozen-sudtirol.it' => 1,
+  'bozen-südtirol.it' => 1,
+  'bozen-suedtirol.it' => 1,
+  'bozen.it' => 1,
+  'br.it' => 1,
+  'brescia.it' => 1,
+  'brindisi.it' => 1,
+  'bs.it' => 1,
+  'bt.it' => 1,
+  'bulsan-sudtirol.it' => 1,
+  'bulsan-südtirol.it' => 1,
+  'bulsan-suedtirol.it' => 1,
+  'bulsan.it' => 1,
+  'bz.it' => 1,
+  'ca.it' => 1,
+  'cagliari.it' => 1,
+  'caltanissetta.it' => 1,
+  'campidano-medio.it' => 1,
+  'campidanomedio.it' => 1,
+  'campobasso.it' => 1,
+  'carbonia-iglesias.it' => 1,
+  'carboniaiglesias.it' => 1,
+  'carrara-massa.it' => 1,
+  'carraramassa.it' => 1,
+  'caserta.it' => 1,
+  'catania.it' => 1,
+  'catanzaro.it' => 1,
+  'cb.it' => 1,
+  'ce.it' => 1,
+  'cesena-forli.it' => 1,
+  'cesena-forlì.it' => 1,
+  'cesenaforli.it' => 1,
+  'cesenaforlì.it' => 1,
+  'ch.it' => 1,
+  'chieti.it' => 1,
+  'ci.it' => 1,
+  'cl.it' => 1,
+  'cn.it' => 1,
+  'co.it' => 1,
+  'como.it' => 1,
+  'cosenza.it' => 1,
+  'cr.it' => 1,
+  'cremona.it' => 1,
+  'crotone.it' => 1,
+  'cs.it' => 1,
+  'ct.it' => 1,
+  'cuneo.it' => 1,
+  'cz.it' => 1,
+  'dell-ogliastra.it' => 1,
+  'dellogliastra.it' => 1,
+  'en.it' => 1,
+  'enna.it' => 1,
+  'fc.it' => 1,
+  'fe.it' => 1,
+  'fermo.it' => 1,
+  'ferrara.it' => 1,
+  'fg.it' => 1,
+  'fi.it' => 1,
+  'firenze.it' => 1,
+  'florence.it' => 1,
+  'fm.it' => 1,
+  'foggia.it' => 1,
+  'forli-cesena.it' => 1,
+  'forlì-cesena.it' => 1,
+  'forlicesena.it' => 1,
+  'forlìcesena.it' => 1,
+  'fr.it' => 1,
+  'frosinone.it' => 1,
+  'ge.it' => 1,
+  'genoa.it' => 1,
+  'genova.it' => 1,
+  'go.it' => 1,
+  'gorizia.it' => 1,
+  'gr.it' => 1,
+  'grosseto.it' => 1,
+  'iglesias-carbonia.it' => 1,
+  'iglesiascarbonia.it' => 1,
+  'im.it' => 1,
+  'imperia.it' => 1,
+  'is.it' => 1,
+  'isernia.it' => 1,
+  'kr.it' => 1,
+  'la-spezia.it' => 1,
+  'laquila.it' => 1,
+  'laspezia.it' => 1,
+  'latina.it' => 1,
+  'lc.it' => 1,
+  'le.it' => 1,
+  'lecce.it' => 1,
+  'lecco.it' => 1,
+  'li.it' => 1,
+  'livorno.it' => 1,
+  'lo.it' => 1,
+  'lodi.it' => 1,
+  'lt.it' => 1,
+  'lu.it' => 1,
+  'lucca.it' => 1,
+  'macerata.it' => 1,
+  'mantova.it' => 1,
+  'massa-carrara.it' => 1,
+  'massacarrara.it' => 1,
+  'matera.it' => 1,
+  'mb.it' => 1,
+  'mc.it' => 1,
+  'me.it' => 1,
+  'medio-campidano.it' => 1,
+  'mediocampidano.it' => 1,
+  'messina.it' => 1,
+  'mi.it' => 1,
+  'milan.it' => 1,
+  'milano.it' => 1,
+  'mn.it' => 1,
+  'mo.it' => 1,
+  'modena.it' => 1,
+  'monza-brianza.it' => 1,
+  'monza-e-della-brianza.it' => 1,
+  'monza.it' => 1,
+  'monzabrianza.it' => 1,
+  'monzaebrianza.it' => 1,
+  'monzaedellabrianza.it' => 1,
+  'ms.it' => 1,
+  'mt.it' => 1,
+  'na.it' => 1,
+  'naples.it' => 1,
+  'napoli.it' => 1,
+  'no.it' => 1,
+  'novara.it' => 1,
+  'nu.it' => 1,
+  'nuoro.it' => 1,
+  'og.it' => 1,
+  'ogliastra.it' => 1,
+  'olbia-tempio.it' => 1,
+  'olbiatempio.it' => 1,
+  'or.it' => 1,
+  'oristano.it' => 1,
+  'ot.it' => 1,
+  'pa.it' => 1,
+  'padova.it' => 1,
+  'padua.it' => 1,
+  'palermo.it' => 1,
+  'parma.it' => 1,
+  'pavia.it' => 1,
+  'pc.it' => 1,
+  'pd.it' => 1,
+  'pe.it' => 1,
+  'perugia.it' => 1,
+  'pesaro-urbino.it' => 1,
+  'pesarourbino.it' => 1,
+  'pescara.it' => 1,
+  'pg.it' => 1,
+  'pi.it' => 1,
+  'piacenza.it' => 1,
+  'pisa.it' => 1,
+  'pistoia.it' => 1,
+  'pn.it' => 1,
+  'po.it' => 1,
+  'pordenone.it' => 1,
+  'potenza.it' => 1,
+  'pr.it' => 1,
+  'prato.it' => 1,
+  'pt.it' => 1,
+  'pu.it' => 1,
+  'pv.it' => 1,
+  'pz.it' => 1,
+  'ra.it' => 1,
+  'ragusa.it' => 1,
+  'ravenna.it' => 1,
+  'rc.it' => 1,
+  're.it' => 1,
+  'reggio-calabria.it' => 1,
+  'reggio-emilia.it' => 1,
+  'reggiocalabria.it' => 1,
+  'reggioemilia.it' => 1,
+  'rg.it' => 1,
+  'ri.it' => 1,
+  'rieti.it' => 1,
+  'rimini.it' => 1,
+  'rm.it' => 1,
+  'rn.it' => 1,
+  'ro.it' => 1,
+  'roma.it' => 1,
+  'rome.it' => 1,
+  'rovigo.it' => 1,
+  'sa.it' => 1,
+  'salerno.it' => 1,
+  'sassari.it' => 1,
+  'savona.it' => 1,
+  'si.it' => 1,
+  'siena.it' => 1,
+  'siracusa.it' => 1,
+  'so.it' => 1,
+  'sondrio.it' => 1,
+  'sp.it' => 1,
+  'sr.it' => 1,
+  'ss.it' => 1,
+  'suedtirol.it' => 1,
+  'südtirol.it' => 1,
+  'sv.it' => 1,
+  'ta.it' => 1,
+  'taranto.it' => 1,
+  'te.it' => 1,
+  'tempio-olbia.it' => 1,
+  'tempioolbia.it' => 1,
+  'teramo.it' => 1,
+  'terni.it' => 1,
+  'tn.it' => 1,
+  'to.it' => 1,
+  'torino.it' => 1,
+  'tp.it' => 1,
+  'tr.it' => 1,
+  'trani-andria-barletta.it' => 1,
+  'trani-barletta-andria.it' => 1,
+  'traniandriabarletta.it' => 1,
+  'tranibarlettaandria.it' => 1,
+  'trapani.it' => 1,
+  'trento.it' => 1,
+  'treviso.it' => 1,
+  'trieste.it' => 1,
+  'ts.it' => 1,
+  'turin.it' => 1,
+  'tv.it' => 1,
+  'ud.it' => 1,
+  'udine.it' => 1,
+  'urbino-pesaro.it' => 1,
+  'urbinopesaro.it' => 1,
+  'va.it' => 1,
+  'varese.it' => 1,
+  'vb.it' => 1,
+  'vc.it' => 1,
+  've.it' => 1,
+  'venezia.it' => 1,
+  'venice.it' => 1,
+  'verbania.it' => 1,
+  'vercelli.it' => 1,
+  'verona.it' => 1,
+  'vi.it' => 1,
+  'vibo-valentia.it' => 1,
+  'vibovalentia.it' => 1,
+  'vicenza.it' => 1,
+  'viterbo.it' => 1,
+  'vr.it' => 1,
+  'vs.it' => 1,
+  'vt.it' => 1,
+  'vv.it' => 1,
+  'je' => 1,
+  'co.je' => 1,
+  'net.je' => 1,
+  'org.je' => 1,
+  '*.jm' => 1,
+  'jo' => 1,
+  'com.jo' => 1,
+  'org.jo' => 1,
+  'net.jo' => 1,
+  'edu.jo' => 1,
+  'sch.jo' => 1,
+  'gov.jo' => 1,
+  'mil.jo' => 1,
+  'name.jo' => 1,
+  'jobs' => 1,
+  'jp' => 1,
+  'ac.jp' => 1,
+  'ad.jp' => 1,
+  'co.jp' => 1,
+  'ed.jp' => 1,
+  'go.jp' => 1,
+  'gr.jp' => 1,
+  'lg.jp' => 1,
+  'ne.jp' => 1,
+  'or.jp' => 1,
+  'aichi.jp' => 1,
+  'akita.jp' => 1,
+  'aomori.jp' => 1,
+  'chiba.jp' => 1,
+  'ehime.jp' => 1,
+  'fukui.jp' => 1,
+  'fukuoka.jp' => 1,
+  'fukushima.jp' => 1,
+  'gifu.jp' => 1,
+  'gunma.jp' => 1,
+  'hiroshima.jp' => 1,
+  'hokkaido.jp' => 1,
+  'hyogo.jp' => 1,
+  'ibaraki.jp' => 1,
+  'ishikawa.jp' => 1,
+  'iwate.jp' => 1,
+  'kagawa.jp' => 1,
+  'kagoshima.jp' => 1,
+  'kanagawa.jp' => 1,
+  'kochi.jp' => 1,
+  'kumamoto.jp' => 1,
+  'kyoto.jp' => 1,
+  'mie.jp' => 1,
+  'miyagi.jp' => 1,
+  'miyazaki.jp' => 1,
+  'nagano.jp' => 1,
+  'nagasaki.jp' => 1,
+  'nara.jp' => 1,
+  'niigata.jp' => 1,
+  'oita.jp' => 1,
+  'okayama.jp' => 1,
+  'okinawa.jp' => 1,
+  'osaka.jp' => 1,
+  'saga.jp' => 1,
+  'saitama.jp' => 1,
+  'shiga.jp' => 1,
+  'shimane.jp' => 1,
+  'shizuoka.jp' => 1,
+  'tochigi.jp' => 1,
+  'tokushima.jp' => 1,
+  'tokyo.jp' => 1,
+  'tottori.jp' => 1,
+  'toyama.jp' => 1,
+  'wakayama.jp' => 1,
+  'yamagata.jp' => 1,
+  'yamaguchi.jp' => 1,
+  'yamanashi.jp' => 1,
+  '栃木.jp' => 1,
+  '愛知.jp' => 1,
+  '愛媛.jp' => 1,
+  '兵庫.jp' => 1,
+  '熊本.jp' => 1,
+  '茨城.jp' => 1,
+  '北海道.jp' => 1,
+  '千葉.jp' => 1,
+  '和歌山.jp' => 1,
+  '長崎.jp' => 1,
+  '長野.jp' => 1,
+  '新潟.jp' => 1,
+  '青森.jp' => 1,
+  '静岡.jp' => 1,
+  '東京.jp' => 1,
+  '石川.jp' => 1,
+  '埼玉.jp' => 1,
+  '三重.jp' => 1,
+  '京都.jp' => 1,
+  '佐賀.jp' => 1,
+  '大分.jp' => 1,
+  '大阪.jp' => 1,
+  '奈良.jp' => 1,
+  '宮城.jp' => 1,
+  '宮崎.jp' => 1,
+  '富山.jp' => 1,
+  '山口.jp' => 1,
+  '山形.jp' => 1,
+  '山梨.jp' => 1,
+  '岩手.jp' => 1,
+  '岐阜.jp' => 1,
+  '岡山.jp' => 1,
+  '島根.jp' => 1,
+  '広島.jp' => 1,
+  '徳島.jp' => 1,
+  '沖縄.jp' => 1,
+  '滋賀.jp' => 1,
+  '神奈川.jp' => 1,
+  '福井.jp' => 1,
+  '福岡.jp' => 1,
+  '福島.jp' => 1,
+  '秋田.jp' => 1,
+  '群馬.jp' => 1,
+  '香川.jp' => 1,
+  '高知.jp' => 1,
+  '鳥取.jp' => 1,
+  '鹿児島.jp' => 1,
+  '*.kawasaki.jp' => 1,
+  '*.kitakyushu.jp' => 1,
+  '*.kobe.jp' => 1,
+  '*.nagoya.jp' => 1,
+  '*.sapporo.jp' => 1,
+  '*.sendai.jp' => 1,
+  '*.yokohama.jp' => 1,
+  '!city.kawasaki.jp' => 1,
+  '!city.kitakyushu.jp' => 1,
+  '!city.kobe.jp' => 1,
+  '!city.nagoya.jp' => 1,
+  '!city.sapporo.jp' => 1,
+  '!city.sendai.jp' => 1,
+  '!city.yokohama.jp' => 1,
+  'aisai.aichi.jp' => 1,
+  'ama.aichi.jp' => 1,
+  'anjo.aichi.jp' => 1,
+  'asuke.aichi.jp' => 1,
+  'chiryu.aichi.jp' => 1,
+  'chita.aichi.jp' => 1,
+  'fuso.aichi.jp' => 1,
+  'gamagori.aichi.jp' => 1,
+  'handa.aichi.jp' => 1,
+  'hazu.aichi.jp' => 1,
+  'hekinan.aichi.jp' => 1,
+  'higashiura.aichi.jp' => 1,
+  'ichinomiya.aichi.jp' => 1,
+  'inazawa.aichi.jp' => 1,
+  'inuyama.aichi.jp' => 1,
+  'isshiki.aichi.jp' => 1,
+  'iwakura.aichi.jp' => 1,
+  'kanie.aichi.jp' => 1,
+  'kariya.aichi.jp' => 1,
+  'kasugai.aichi.jp' => 1,
+  'kira.aichi.jp' => 1,
+  'kiyosu.aichi.jp' => 1,
+  'komaki.aichi.jp' => 1,
+  'konan.aichi.jp' => 1,
+  'kota.aichi.jp' => 1,
+  'mihama.aichi.jp' => 1,
+  'miyoshi.aichi.jp' => 1,
+  'nishio.aichi.jp' => 1,
+  'nisshin.aichi.jp' => 1,
+  'obu.aichi.jp' => 1,
+  'oguchi.aichi.jp' => 1,
+  'oharu.aichi.jp' => 1,
+  'okazaki.aichi.jp' => 1,
+  'owariasahi.aichi.jp' => 1,
+  'seto.aichi.jp' => 1,
+  'shikatsu.aichi.jp' => 1,
+  'shinshiro.aichi.jp' => 1,
+  'shitara.aichi.jp' => 1,
+  'tahara.aichi.jp' => 1,
+  'takahama.aichi.jp' => 1,
+  'tobishima.aichi.jp' => 1,
+  'toei.aichi.jp' => 1,
+  'togo.aichi.jp' => 1,
+  'tokai.aichi.jp' => 1,
+  'tokoname.aichi.jp' => 1,
+  'toyoake.aichi.jp' => 1,
+  'toyohashi.aichi.jp' => 1,
+  'toyokawa.aichi.jp' => 1,
+  'toyone.aichi.jp' => 1,
+  'toyota.aichi.jp' => 1,
+  'tsushima.aichi.jp' => 1,
+  'yatomi.aichi.jp' => 1,
+  'akita.akita.jp' => 1,
+  'daisen.akita.jp' => 1,
+  'fujisato.akita.jp' => 1,
+  'gojome.akita.jp' => 1,
+  'hachirogata.akita.jp' => 1,
+  'happou.akita.jp' => 1,
+  'higashinaruse.akita.jp' => 1,
+  'honjo.akita.jp' => 1,
+  'honjyo.akita.jp' => 1,
+  'ikawa.akita.jp' => 1,
+  'kamikoani.akita.jp' => 1,
+  'kamioka.akita.jp' => 1,
+  'katagami.akita.jp' => 1,
+  'kazuno.akita.jp' => 1,
+  'kitaakita.akita.jp' => 1,
+  'kosaka.akita.jp' => 1,
+  'kyowa.akita.jp' => 1,
+  'misato.akita.jp' => 1,
+  'mitane.akita.jp' => 1,
+  'moriyoshi.akita.jp' => 1,
+  'nikaho.akita.jp' => 1,
+  'noshiro.akita.jp' => 1,
+  'odate.akita.jp' => 1,
+  'oga.akita.jp' => 1,
+  'ogata.akita.jp' => 1,
+  'semboku.akita.jp' => 1,
+  'yokote.akita.jp' => 1,
+  'yurihonjo.akita.jp' => 1,
+  'aomori.aomori.jp' => 1,
+  'gonohe.aomori.jp' => 1,
+  'hachinohe.aomori.jp' => 1,
+  'hashikami.aomori.jp' => 1,
+  'hiranai.aomori.jp' => 1,
+  'hirosaki.aomori.jp' => 1,
+  'itayanagi.aomori.jp' => 1,
+  'kuroishi.aomori.jp' => 1,
+  'misawa.aomori.jp' => 1,
+  'mutsu.aomori.jp' => 1,
+  'nakadomari.aomori.jp' => 1,
+  'noheji.aomori.jp' => 1,
+  'oirase.aomori.jp' => 1,
+  'owani.aomori.jp' => 1,
+  'rokunohe.aomori.jp' => 1,
+  'sannohe.aomori.jp' => 1,
+  'shichinohe.aomori.jp' => 1,
+  'shingo.aomori.jp' => 1,
+  'takko.aomori.jp' => 1,
+  'towada.aomori.jp' => 1,
+  'tsugaru.aomori.jp' => 1,
+  'tsuruta.aomori.jp' => 1,
+  'abiko.chiba.jp' => 1,
+  'asahi.chiba.jp' => 1,
+  'chonan.chiba.jp' => 1,
+  'chosei.chiba.jp' => 1,
+  'choshi.chiba.jp' => 1,
+  'chuo.chiba.jp' => 1,
+  'funabashi.chiba.jp' => 1,
+  'futtsu.chiba.jp' => 1,
+  'hanamigawa.chiba.jp' => 1,
+  'ichihara.chiba.jp' => 1,
+  'ichikawa.chiba.jp' => 1,
+  'ichinomiya.chiba.jp' => 1,
+  'inzai.chiba.jp' => 1,
+  'isumi.chiba.jp' => 1,
+  'kamagaya.chiba.jp' => 1,
+  'kamogawa.chiba.jp' => 1,
+  'kashiwa.chiba.jp' => 1,
+  'katori.chiba.jp' => 1,
+  'katsuura.chiba.jp' => 1,
+  'kimitsu.chiba.jp' => 1,
+  'kisarazu.chiba.jp' => 1,
+  'kozaki.chiba.jp' => 1,
+  'kujukuri.chiba.jp' => 1,
+  'kyonan.chiba.jp' => 1,
+  'matsudo.chiba.jp' => 1,
+  'midori.chiba.jp' => 1,
+  'mihama.chiba.jp' => 1,
+  'minamiboso.chiba.jp' => 1,
+  'mobara.chiba.jp' => 1,
+  'mutsuzawa.chiba.jp' => 1,
+  'nagara.chiba.jp' => 1,
+  'nagareyama.chiba.jp' => 1,
+  'narashino.chiba.jp' => 1,
+  'narita.chiba.jp' => 1,
+  'noda.chiba.jp' => 1,
+  'oamishirasato.chiba.jp' => 1,
+  'omigawa.chiba.jp' => 1,
+  'onjuku.chiba.jp' => 1,
+  'otaki.chiba.jp' => 1,
+  'sakae.chiba.jp' => 1,
+  'sakura.chiba.jp' => 1,
+  'shimofusa.chiba.jp' => 1,
+  'shirako.chiba.jp' => 1,
+  'shiroi.chiba.jp' => 1,
+  'shisui.chiba.jp' => 1,
+  'sodegaura.chiba.jp' => 1,
+  'sosa.chiba.jp' => 1,
+  'tako.chiba.jp' => 1,
+  'tateyama.chiba.jp' => 1,
+  'togane.chiba.jp' => 1,
+  'tohnosho.chiba.jp' => 1,
+  'tomisato.chiba.jp' => 1,
+  'urayasu.chiba.jp' => 1,
+  'yachimata.chiba.jp' => 1,
+  'yachiyo.chiba.jp' => 1,
+  'yokaichiba.chiba.jp' => 1,
+  'yokoshibahikari.chiba.jp' => 1,
+  'yotsukaido.chiba.jp' => 1,
+  'ainan.ehime.jp' => 1,
+  'honai.ehime.jp' => 1,
+  'ikata.ehime.jp' => 1,
+  'imabari.ehime.jp' => 1,
+  'iyo.ehime.jp' => 1,
+  'kamijima.ehime.jp' => 1,
+  'kihoku.ehime.jp' => 1,
+  'kumakogen.ehime.jp' => 1,
+  'masaki.ehime.jp' => 1,
+  'matsuno.ehime.jp' => 1,
+  'matsuyama.ehime.jp' => 1,
+  'namikata.ehime.jp' => 1,
+  'niihama.ehime.jp' => 1,
+  'ozu.ehime.jp' => 1,
+  'saijo.ehime.jp' => 1,
+  'seiyo.ehime.jp' => 1,
+  'shikokuchuo.ehime.jp' => 1,
+  'tobe.ehime.jp' => 1,
+  'toon.ehime.jp' => 1,
+  'uchiko.ehime.jp' => 1,
+  'uwajima.ehime.jp' => 1,
+  'yawatahama.ehime.jp' => 1,
+  'echizen.fukui.jp' => 1,
+  'eiheiji.fukui.jp' => 1,
+  'fukui.fukui.jp' => 1,
+  'ikeda.fukui.jp' => 1,
+  'katsuyama.fukui.jp' => 1,
+  'mihama.fukui.jp' => 1,
+  'minamiechizen.fukui.jp' => 1,
+  'obama.fukui.jp' => 1,
+  'ohi.fukui.jp' => 1,
+  'ono.fukui.jp' => 1,
+  'sabae.fukui.jp' => 1,
+  'sakai.fukui.jp' => 1,
+  'takahama.fukui.jp' => 1,
+  'tsuruga.fukui.jp' => 1,
+  'wakasa.fukui.jp' => 1,
+  'ashiya.fukuoka.jp' => 1,
+  'buzen.fukuoka.jp' => 1,
+  'chikugo.fukuoka.jp' => 1,
+  'chikuho.fukuoka.jp' => 1,
+  'chikujo.fukuoka.jp' => 1,
+  'chikushino.fukuoka.jp' => 1,
+  'chikuzen.fukuoka.jp' => 1,
+  'chuo.fukuoka.jp' => 1,
+  'dazaifu.fukuoka.jp' => 1,
+  'fukuchi.fukuoka.jp' => 1,
+  'hakata.fukuoka.jp' => 1,
+  'higashi.fukuoka.jp' => 1,
+  'hirokawa.fukuoka.jp' => 1,
+  'hisayama.fukuoka.jp' => 1,
+  'iizuka.fukuoka.jp' => 1,
+  'inatsuki.fukuoka.jp' => 1,
+  'kaho.fukuoka.jp' => 1,
+  'kasuga.fukuoka.jp' => 1,
+  'kasuya.fukuoka.jp' => 1,
+  'kawara.fukuoka.jp' => 1,
+  'keisen.fukuoka.jp' => 1,
+  'koga.fukuoka.jp' => 1,
+  'kurate.fukuoka.jp' => 1,
+  'kurogi.fukuoka.jp' => 1,
+  'kurume.fukuoka.jp' => 1,
+  'minami.fukuoka.jp' => 1,
+  'miyako.fukuoka.jp' => 1,
+  'miyama.fukuoka.jp' => 1,
+  'miyawaka.fukuoka.jp' => 1,
+  'mizumaki.fukuoka.jp' => 1,
+  'munakata.fukuoka.jp' => 1,
+  'nakagawa.fukuoka.jp' => 1,
+  'nakama.fukuoka.jp' => 1,
+  'nishi.fukuoka.jp' => 1,
+  'nogata.fukuoka.jp' => 1,
+  'ogori.fukuoka.jp' => 1,
+  'okagaki.fukuoka.jp' => 1,
+  'okawa.fukuoka.jp' => 1,
+  'oki.fukuoka.jp' => 1,
+  'omuta.fukuoka.jp' => 1,
+  'onga.fukuoka.jp' => 1,
+  'onojo.fukuoka.jp' => 1,
+  'oto.fukuoka.jp' => 1,
+  'saigawa.fukuoka.jp' => 1,
+  'sasaguri.fukuoka.jp' => 1,
+  'shingu.fukuoka.jp' => 1,
+  'shinyoshitomi.fukuoka.jp' => 1,
+  'shonai.fukuoka.jp' => 1,
+  'soeda.fukuoka.jp' => 1,
+  'sue.fukuoka.jp' => 1,
+  'tachiarai.fukuoka.jp' => 1,
+  'tagawa.fukuoka.jp' => 1,
+  'takata.fukuoka.jp' => 1,
+  'toho.fukuoka.jp' => 1,
+  'toyotsu.fukuoka.jp' => 1,
+  'tsuiki.fukuoka.jp' => 1,
+  'ukiha.fukuoka.jp' => 1,
+  'umi.fukuoka.jp' => 1,
+  'usui.fukuoka.jp' => 1,
+  'yamada.fukuoka.jp' => 1,
+  'yame.fukuoka.jp' => 1,
+  'yanagawa.fukuoka.jp' => 1,
+  'yukuhashi.fukuoka.jp' => 1,
+  'aizubange.fukushima.jp' => 1,
+  'aizumisato.fukushima.jp' => 1,
+  'aizuwakamatsu.fukushima.jp' => 1,
+  'asakawa.fukushima.jp' => 1,
+  'bandai.fukushima.jp' => 1,
+  'date.fukushima.jp' => 1,
+  'fukushima.fukushima.jp' => 1,
+  'furudono.fukushima.jp' => 1,
+  'futaba.fukushima.jp' => 1,
+  'hanawa.fukushima.jp' => 1,
+  'higashi.fukushima.jp' => 1,
+  'hirata.fukushima.jp' => 1,
+  'hirono.fukushima.jp' => 1,
+  'iitate.fukushima.jp' => 1,
+  'inawashiro.fukushima.jp' => 1,
+  'ishikawa.fukushima.jp' => 1,
+  'iwaki.fukushima.jp' => 1,
+  'izumizaki.fukushima.jp' => 1,
+  'kagamiishi.fukushima.jp' => 1,
+  'kaneyama.fukushima.jp' => 1,
+  'kawamata.fukushima.jp' => 1,
+  'kitakata.fukushima.jp' => 1,
+  'kitashiobara.fukushima.jp' => 1,
+  'koori.fukushima.jp' => 1,
+  'koriyama.fukushima.jp' => 1,
+  'kunimi.fukushima.jp' => 1,
+  'miharu.fukushima.jp' => 1,
+  'mishima.fukushima.jp' => 1,
+  'namie.fukushima.jp' => 1,
+  'nango.fukushima.jp' => 1,
+  'nishiaizu.fukushima.jp' => 1,
+  'nishigo.fukushima.jp' => 1,
+  'okuma.fukushima.jp' => 1,
+  'omotego.fukushima.jp' => 1,
+  'ono.fukushima.jp' => 1,
+  'otama.fukushima.jp' => 1,
+  'samegawa.fukushima.jp' => 1,
+  'shimogo.fukushima.jp' => 1,
+  'shirakawa.fukushima.jp' => 1,
+  'showa.fukushima.jp' => 1,
+  'soma.fukushima.jp' => 1,
+  'sukagawa.fukushima.jp' => 1,
+  'taishin.fukushima.jp' => 1,
+  'tamakawa.fukushima.jp' => 1,
+  'tanagura.fukushima.jp' => 1,
+  'tenei.fukushima.jp' => 1,
+  'yabuki.fukushima.jp' => 1,
+  'yamato.fukushima.jp' => 1,
+  'yamatsuri.fukushima.jp' => 1,
+  'yanaizu.fukushima.jp' => 1,
+  'yugawa.fukushima.jp' => 1,
+  'anpachi.gifu.jp' => 1,
+  'ena.gifu.jp' => 1,
+  'gifu.gifu.jp' => 1,
+  'ginan.gifu.jp' => 1,
+  'godo.gifu.jp' => 1,
+  'gujo.gifu.jp' => 1,
+  'hashima.gifu.jp' => 1,
+  'hichiso.gifu.jp' => 1,
+  'hida.gifu.jp' => 1,
+  'higashishirakawa.gifu.jp' => 1,
+  'ibigawa.gifu.jp' => 1,
+  'ikeda.gifu.jp' => 1,
+  'kakamigahara.gifu.jp' => 1,
+  'kani.gifu.jp' => 1,
+  'kasahara.gifu.jp' => 1,
+  'kasamatsu.gifu.jp' => 1,
+  'kawaue.gifu.jp' => 1,
+  'kitagata.gifu.jp' => 1,
+  'mino.gifu.jp' => 1,
+  'minokamo.gifu.jp' => 1,
+  'mitake.gifu.jp' => 1,
+  'mizunami.gifu.jp' => 1,
+  'motosu.gifu.jp' => 1,
+  'nakatsugawa.gifu.jp' => 1,
+  'ogaki.gifu.jp' => 1,
+  'sakahogi.gifu.jp' => 1,
+  'seki.gifu.jp' => 1,
+  'sekigahara.gifu.jp' => 1,
+  'shirakawa.gifu.jp' => 1,
+  'tajimi.gifu.jp' => 1,
+  'takayama.gifu.jp' => 1,
+  'tarui.gifu.jp' => 1,
+  'toki.gifu.jp' => 1,
+  'tomika.gifu.jp' => 1,
+  'wanouchi.gifu.jp' => 1,
+  'yamagata.gifu.jp' => 1,
+  'yaotsu.gifu.jp' => 1,
+  'yoro.gifu.jp' => 1,
+  'annaka.gunma.jp' => 1,
+  'chiyoda.gunma.jp' => 1,
+  'fujioka.gunma.jp' => 1,
+  'higashiagatsuma.gunma.jp' => 1,
+  'isesaki.gunma.jp' => 1,
+  'itakura.gunma.jp' => 1,
+  'kanna.gunma.jp' => 1,
+  'kanra.gunma.jp' => 1,
+  'katashina.gunma.jp' => 1,
+  'kawaba.gunma.jp' => 1,
+  'kiryu.gunma.jp' => 1,
+  'kusatsu.gunma.jp' => 1,
+  'maebashi.gunma.jp' => 1,
+  'meiwa.gunma.jp' => 1,
+  'midori.gunma.jp' => 1,
+  'minakami.gunma.jp' => 1,
+  'naganohara.gunma.jp' => 1,
+  'nakanojo.gunma.jp' => 1,
+  'nanmoku.gunma.jp' => 1,
+  'numata.gunma.jp' => 1,
+  'oizumi.gunma.jp' => 1,
+  'ora.gunma.jp' => 1,
+  'ota.gunma.jp' => 1,
+  'shibukawa.gunma.jp' => 1,
+  'shimonita.gunma.jp' => 1,
+  'shinto.gunma.jp' => 1,
+  'showa.gunma.jp' => 1,
+  'takasaki.gunma.jp' => 1,
+  'takayama.gunma.jp' => 1,
+  'tamamura.gunma.jp' => 1,
+  'tatebayashi.gunma.jp' => 1,
+  'tomioka.gunma.jp' => 1,
+  'tsukiyono.gunma.jp' => 1,
+  'tsumagoi.gunma.jp' => 1,
+  'ueno.gunma.jp' => 1,
+  'yoshioka.gunma.jp' => 1,
+  'asaminami.hiroshima.jp' => 1,
+  'daiwa.hiroshima.jp' => 1,
+  'etajima.hiroshima.jp' => 1,
+  'fuchu.hiroshima.jp' => 1,
+  'fukuyama.hiroshima.jp' => 1,
+  'hatsukaichi.hiroshima.jp' => 1,
+  'higashihiroshima.hiroshima.jp' => 1,
+  'hongo.hiroshima.jp' => 1,
+  'jinsekikogen.hiroshima.jp' => 1,
+  'kaita.hiroshima.jp' => 1,
+  'kui.hiroshima.jp' => 1,
+  'kumano.hiroshima.jp' => 1,
+  'kure.hiroshima.jp' => 1,
+  'mihara.hiroshima.jp' => 1,
+  'miyoshi.hiroshima.jp' => 1,
+  'naka.hiroshima.jp' => 1,
+  'onomichi.hiroshima.jp' => 1,
+  'osakikamijima.hiroshima.jp' => 1,
+  'otake.hiroshima.jp' => 1,
+  'saka.hiroshima.jp' => 1,
+  'sera.hiroshima.jp' => 1,
+  'seranishi.hiroshima.jp' => 1,
+  'shinichi.hiroshima.jp' => 1,
+  'shobara.hiroshima.jp' => 1,
+  'takehara.hiroshima.jp' => 1,
+  'abashiri.hokkaido.jp' => 1,
+  'abira.hokkaido.jp' => 1,
+  'aibetsu.hokkaido.jp' => 1,
+  'akabira.hokkaido.jp' => 1,
+  'akkeshi.hokkaido.jp' => 1,
+  'asahikawa.hokkaido.jp' => 1,
+  'ashibetsu.hokkaido.jp' => 1,
+  'ashoro.hokkaido.jp' => 1,
+  'assabu.hokkaido.jp' => 1,
+  'atsuma.hokkaido.jp' => 1,
+  'bibai.hokkaido.jp' => 1,
+  'biei.hokkaido.jp' => 1,
+  'bifuka.hokkaido.jp' => 1,
+  'bihoro.hokkaido.jp' => 1,
+  'biratori.hokkaido.jp' => 1,
+  'chippubetsu.hokkaido.jp' => 1,
+  'chitose.hokkaido.jp' => 1,
+  'date.hokkaido.jp' => 1,
+  'ebetsu.hokkaido.jp' => 1,
+  'embetsu.hokkaido.jp' => 1,
+  'eniwa.hokkaido.jp' => 1,
+  'erimo.hokkaido.jp' => 1,
+  'esan.hokkaido.jp' => 1,
+  'esashi.hokkaido.jp' => 1,
+  'fukagawa.hokkaido.jp' => 1,
+  'fukushima.hokkaido.jp' => 1,
+  'furano.hokkaido.jp' => 1,
+  'furubira.hokkaido.jp' => 1,
+  'haboro.hokkaido.jp' => 1,
+  'hakodate.hokkaido.jp' => 1,
+  'hamatonbetsu.hokkaido.jp' => 1,
+  'hidaka.hokkaido.jp' => 1,
+  'higashikagura.hokkaido.jp' => 1,
+  'higashikawa.hokkaido.jp' => 1,
+  'hiroo.hokkaido.jp' => 1,
+  'hokuryu.hokkaido.jp' => 1,
+  'hokuto.hokkaido.jp' => 1,
+  'honbetsu.hokkaido.jp' => 1,
+  'horokanai.hokkaido.jp' => 1,
+  'horonobe.hokkaido.jp' => 1,
+  'ikeda.hokkaido.jp' => 1,
+  'imakane.hokkaido.jp' => 1,
+  'ishikari.hokkaido.jp' => 1,
+  'iwamizawa.hokkaido.jp' => 1,
+  'iwanai.hokkaido.jp' => 1,
+  'kamifurano.hokkaido.jp' => 1,
+  'kamikawa.hokkaido.jp' => 1,
+  'kamishihoro.hokkaido.jp' => 1,
+  'kamisunagawa.hokkaido.jp' => 1,
+  'kamoenai.hokkaido.jp' => 1,
+  'kayabe.hokkaido.jp' => 1,
+  'kembuchi.hokkaido.jp' => 1,
+  'kikonai.hokkaido.jp' => 1,
+  'kimobetsu.hokkaido.jp' => 1,
+  'kitahiroshima.hokkaido.jp' => 1,
+  'kitami.hokkaido.jp' => 1,
+  'kiyosato.hokkaido.jp' => 1,
+  'koshimizu.hokkaido.jp' => 1,
+  'kunneppu.hokkaido.jp' => 1,
+  'kuriyama.hokkaido.jp' => 1,
+  'kuromatsunai.hokkaido.jp' => 1,
+  'kushiro.hokkaido.jp' => 1,
+  'kutchan.hokkaido.jp' => 1,
+  'kyowa.hokkaido.jp' => 1,
+  'mashike.hokkaido.jp' => 1,
+  'matsumae.hokkaido.jp' => 1,
+  'mikasa.hokkaido.jp' => 1,
+  'minamifurano.hokkaido.jp' => 1,
+  'mombetsu.hokkaido.jp' => 1,
+  'moseushi.hokkaido.jp' => 1,
+  'mukawa.hokkaido.jp' => 1,
+  'muroran.hokkaido.jp' => 1,
+  'naie.hokkaido.jp' => 1,
+  'nakagawa.hokkaido.jp' => 1,
+  'nakasatsunai.hokkaido.jp' => 1,
+  'nakatombetsu.hokkaido.jp' => 1,
+  'nanae.hokkaido.jp' => 1,
+  'nanporo.hokkaido.jp' => 1,
+  'nayoro.hokkaido.jp' => 1,
+  'nemuro.hokkaido.jp' => 1,
+  'niikappu.hokkaido.jp' => 1,
+  'niki.hokkaido.jp' => 1,
+  'nishiokoppe.hokkaido.jp' => 1,
+  'noboribetsu.hokkaido.jp' => 1,
+  'numata.hokkaido.jp' => 1,
+  'obihiro.hokkaido.jp' => 1,
+  'obira.hokkaido.jp' => 1,
+  'oketo.hokkaido.jp' => 1,
+  'okoppe.hokkaido.jp' => 1,
+  'otaru.hokkaido.jp' => 1,
+  'otobe.hokkaido.jp' => 1,
+  'otofuke.hokkaido.jp' => 1,
+  'otoineppu.hokkaido.jp' => 1,
+  'oumu.hokkaido.jp' => 1,
+  'ozora.hokkaido.jp' => 1,
+  'pippu.hokkaido.jp' => 1,
+  'rankoshi.hokkaido.jp' => 1,
+  'rebun.hokkaido.jp' => 1,
+  'rikubetsu.hokkaido.jp' => 1,
+  'rishiri.hokkaido.jp' => 1,
+  'rishirifuji.hokkaido.jp' => 1,
+  'saroma.hokkaido.jp' => 1,
+  'sarufutsu.hokkaido.jp' => 1,
+  'shakotan.hokkaido.jp' => 1,
+  'shari.hokkaido.jp' => 1,
+  'shibecha.hokkaido.jp' => 1,
+  'shibetsu.hokkaido.jp' => 1,
+  'shikabe.hokkaido.jp' => 1,
+  'shikaoi.hokkaido.jp' => 1,
+  'shimamaki.hokkaido.jp' => 1,
+  'shimizu.hokkaido.jp' => 1,
+  'shimokawa.hokkaido.jp' => 1,
+  'shinshinotsu.hokkaido.jp' => 1,
+  'shintoku.hokkaido.jp' => 1,
+  'shiranuka.hokkaido.jp' => 1,
+  'shiraoi.hokkaido.jp' => 1,
+  'shiriuchi.hokkaido.jp' => 1,
+  'sobetsu.hokkaido.jp' => 1,
+  'sunagawa.hokkaido.jp' => 1,
+  'taiki.hokkaido.jp' => 1,
+  'takasu.hokkaido.jp' => 1,
+  'takikawa.hokkaido.jp' => 1,
+  'takinoue.hokkaido.jp' => 1,
+  'teshikaga.hokkaido.jp' => 1,
+  'tobetsu.hokkaido.jp' => 1,
+  'tohma.hokkaido.jp' => 1,
+  'tomakomai.hokkaido.jp' => 1,
+  'tomari.hokkaido.jp' => 1,
+  'toya.hokkaido.jp' => 1,
+  'toyako.hokkaido.jp' => 1,
+  'toyotomi.hokkaido.jp' => 1,
+  'toyoura.hokkaido.jp' => 1,
+  'tsubetsu.hokkaido.jp' => 1,
+  'tsukigata.hokkaido.jp' => 1,
+  'urakawa.hokkaido.jp' => 1,
+  'urausu.hokkaido.jp' => 1,
+  'uryu.hokkaido.jp' => 1,
+  'utashinai.hokkaido.jp' => 1,
+  'wakkanai.hokkaido.jp' => 1,
+  'wassamu.hokkaido.jp' => 1,
+  'yakumo.hokkaido.jp' => 1,
+  'yoichi.hokkaido.jp' => 1,
+  'aioi.hyogo.jp' => 1,
+  'akashi.hyogo.jp' => 1,
+  'ako.hyogo.jp' => 1,
+  'amagasaki.hyogo.jp' => 1,
+  'aogaki.hyogo.jp' => 1,
+  'asago.hyogo.jp' => 1,
+  'ashiya.hyogo.jp' => 1,
+  'awaji.hyogo.jp' => 1,
+  'fukusaki.hyogo.jp' => 1,
+  'goshiki.hyogo.jp' => 1,
+  'harima.hyogo.jp' => 1,
+  'himeji.hyogo.jp' => 1,
+  'ichikawa.hyogo.jp' => 1,
+  'inagawa.hyogo.jp' => 1,
+  'itami.hyogo.jp' => 1,
+  'kakogawa.hyogo.jp' => 1,
+  'kamigori.hyogo.jp' => 1,
+  'kamikawa.hyogo.jp' => 1,
+  'kasai.hyogo.jp' => 1,
+  'kasuga.hyogo.jp' => 1,
+  'kawanishi.hyogo.jp' => 1,
+  'miki.hyogo.jp' => 1,
+  'minamiawaji.hyogo.jp' => 1,
+  'nishinomiya.hyogo.jp' => 1,
+  'nishiwaki.hyogo.jp' => 1,
+  'ono.hyogo.jp' => 1,
+  'sanda.hyogo.jp' => 1,
+  'sannan.hyogo.jp' => 1,
+  'sasayama.hyogo.jp' => 1,
+  'sayo.hyogo.jp' => 1,
+  'shingu.hyogo.jp' => 1,
+  'shinonsen.hyogo.jp' => 1,
+  'shiso.hyogo.jp' => 1,
+  'sumoto.hyogo.jp' => 1,
+  'taishi.hyogo.jp' => 1,
+  'taka.hyogo.jp' => 1,
+  'takarazuka.hyogo.jp' => 1,
+  'takasago.hyogo.jp' => 1,
+  'takino.hyogo.jp' => 1,
+  'tamba.hyogo.jp' => 1,
+  'tatsuno.hyogo.jp' => 1,
+  'toyooka.hyogo.jp' => 1,
+  'yabu.hyogo.jp' => 1,
+  'yashiro.hyogo.jp' => 1,
+  'yoka.hyogo.jp' => 1,
+  'yokawa.hyogo.jp' => 1,
+  'ami.ibaraki.jp' => 1,
+  'asahi.ibaraki.jp' => 1,
+  'bando.ibaraki.jp' => 1,
+  'chikusei.ibaraki.jp' => 1,
+  'daigo.ibaraki.jp' => 1,
+  'fujishiro.ibaraki.jp' => 1,
+  'hitachi.ibaraki.jp' => 1,
+  'hitachinaka.ibaraki.jp' => 1,
+  'hitachiomiya.ibaraki.jp' => 1,
+  'hitachiota.ibaraki.jp' => 1,
+  'ibaraki.ibaraki.jp' => 1,
+  'ina.ibaraki.jp' => 1,
+  'inashiki.ibaraki.jp' => 1,
+  'itako.ibaraki.jp' => 1,
+  'iwama.ibaraki.jp' => 1,
+  'joso.ibaraki.jp' => 1,
+  'kamisu.ibaraki.jp' => 1,
+  'kasama.ibaraki.jp' => 1,
+  'kashima.ibaraki.jp' => 1,
+  'kasumigaura.ibaraki.jp' => 1,
+  'koga.ibaraki.jp' => 1,
+  'miho.ibaraki.jp' => 1,
+  'mito.ibaraki.jp' => 1,
+  'moriya.ibaraki.jp' => 1,
+  'naka.ibaraki.jp' => 1,
+  'namegata.ibaraki.jp' => 1,
+  'oarai.ibaraki.jp' => 1,
+  'ogawa.ibaraki.jp' => 1,
+  'omitama.ibaraki.jp' => 1,
+  'ryugasaki.ibaraki.jp' => 1,
+  'sakai.ibaraki.jp' => 1,
+  'sakuragawa.ibaraki.jp' => 1,
+  'shimodate.ibaraki.jp' => 1,
+  'shimotsuma.ibaraki.jp' => 1,
+  'shirosato.ibaraki.jp' => 1,
+  'sowa.ibaraki.jp' => 1,
+  'suifu.ibaraki.jp' => 1,
+  'takahagi.ibaraki.jp' => 1,
+  'tamatsukuri.ibaraki.jp' => 1,
+  'tokai.ibaraki.jp' => 1,
+  'tomobe.ibaraki.jp' => 1,
+  'tone.ibaraki.jp' => 1,
+  'toride.ibaraki.jp' => 1,
+  'tsuchiura.ibaraki.jp' => 1,
+  'tsukuba.ibaraki.jp' => 1,
+  'uchihara.ibaraki.jp' => 1,
+  'ushiku.ibaraki.jp' => 1,
+  'yachiyo.ibaraki.jp' => 1,
+  'yamagata.ibaraki.jp' => 1,
+  'yawara.ibaraki.jp' => 1,
+  'yuki.ibaraki.jp' => 1,
+  'anamizu.ishikawa.jp' => 1,
+  'hakui.ishikawa.jp' => 1,
+  'hakusan.ishikawa.jp' => 1,
+  'kaga.ishikawa.jp' => 1,
+  'kahoku.ishikawa.jp' => 1,
+  'kanazawa.ishikawa.jp' => 1,
+  'kawakita.ishikawa.jp' => 1,
+  'komatsu.ishikawa.jp' => 1,
+  'nakanoto.ishikawa.jp' => 1,
+  'nanao.ishikawa.jp' => 1,
+  'nomi.ishikawa.jp' => 1,
+  'nonoichi.ishikawa.jp' => 1,
+  'noto.ishikawa.jp' => 1,
+  'shika.ishikawa.jp' => 1,
+  'suzu.ishikawa.jp' => 1,
+  'tsubata.ishikawa.jp' => 1,
+  'tsurugi.ishikawa.jp' => 1,
+  'uchinada.ishikawa.jp' => 1,
+  'wajima.ishikawa.jp' => 1,
+  'fudai.iwate.jp' => 1,
+  'fujisawa.iwate.jp' => 1,
+  'hanamaki.iwate.jp' => 1,
+  'hiraizumi.iwate.jp' => 1,
+  'hirono.iwate.jp' => 1,
+  'ichinohe.iwate.jp' => 1,
+  'ichinoseki.iwate.jp' => 1,
+  'iwaizumi.iwate.jp' => 1,
+  'iwate.iwate.jp' => 1,
+  'joboji.iwate.jp' => 1,
+  'kamaishi.iwate.jp' => 1,
+  'kanegasaki.iwate.jp' => 1,
+  'karumai.iwate.jp' => 1,
+  'kawai.iwate.jp' => 1,
+  'kitakami.iwate.jp' => 1,
+  'kuji.iwate.jp' => 1,
+  'kunohe.iwate.jp' => 1,
+  'kuzumaki.iwate.jp' => 1,
+  'miyako.iwate.jp' => 1,
+  'mizusawa.iwate.jp' => 1,
+  'morioka.iwate.jp' => 1,
+  'ninohe.iwate.jp' => 1,
+  'noda.iwate.jp' => 1,
+  'ofunato.iwate.jp' => 1,
+  'oshu.iwate.jp' => 1,
+  'otsuchi.iwate.jp' => 1,
+  'rikuzentakata.iwate.jp' => 1,
+  'shiwa.iwate.jp' => 1,
+  'shizukuishi.iwate.jp' => 1,
+  'sumita.iwate.jp' => 1,
+  'tanohata.iwate.jp' => 1,
+  'tono.iwate.jp' => 1,
+  'yahaba.iwate.jp' => 1,
+  'yamada.iwate.jp' => 1,
+  'ayagawa.kagawa.jp' => 1,
+  'higashikagawa.kagawa.jp' => 1,
+  'kanonji.kagawa.jp' => 1,
+  'kotohira.kagawa.jp' => 1,
+  'manno.kagawa.jp' => 1,
+  'marugame.kagawa.jp' => 1,
+  'mitoyo.kagawa.jp' => 1,
+  'naoshima.kagawa.jp' => 1,
+  'sanuki.kagawa.jp' => 1,
+  'tadotsu.kagawa.jp' => 1,
+  'takamatsu.kagawa.jp' => 1,
+  'tonosho.kagawa.jp' => 1,
+  'uchinomi.kagawa.jp' => 1,
+  'utazu.kagawa.jp' => 1,
+  'zentsuji.kagawa.jp' => 1,
+  'akune.kagoshima.jp' => 1,
+  'amami.kagoshima.jp' => 1,
+  'hioki.kagoshima.jp' => 1,
+  'isa.kagoshima.jp' => 1,
+  'isen.kagoshima.jp' => 1,
+  'izumi.kagoshima.jp' => 1,
+  'kagoshima.kagoshima.jp' => 1,
+  'kanoya.kagoshima.jp' => 1,
+  'kawanabe.kagoshima.jp' => 1,
+  'kinko.kagoshima.jp' => 1,
+  'kouyama.kagoshima.jp' => 1,
+  'makurazaki.kagoshima.jp' => 1,
+  'matsumoto.kagoshima.jp' => 1,
+  'minamitane.kagoshima.jp' => 1,
+  'nakatane.kagoshima.jp' => 1,
+  'nishinoomote.kagoshima.jp' => 1,
+  'satsumasendai.kagoshima.jp' => 1,
+  'soo.kagoshima.jp' => 1,
+  'tarumizu.kagoshima.jp' => 1,
+  'yusui.kagoshima.jp' => 1,
+  'aikawa.kanagawa.jp' => 1,
+  'atsugi.kanagawa.jp' => 1,
+  'ayase.kanagawa.jp' => 1,
+  'chigasaki.kanagawa.jp' => 1,
+  'ebina.kanagawa.jp' => 1,
+  'fujisawa.kanagawa.jp' => 1,
+  'hadano.kanagawa.jp' => 1,
+  'hakone.kanagawa.jp' => 1,
+  'hiratsuka.kanagawa.jp' => 1,
+  'isehara.kanagawa.jp' => 1,
+  'kaisei.kanagawa.jp' => 1,
+  'kamakura.kanagawa.jp' => 1,
+  'kiyokawa.kanagawa.jp' => 1,
+  'matsuda.kanagawa.jp' => 1,
+  'minamiashigara.kanagawa.jp' => 1,
+  'miura.kanagawa.jp' => 1,
+  'nakai.kanagawa.jp' => 1,
+  'ninomiya.kanagawa.jp' => 1,
+  'odawara.kanagawa.jp' => 1,
+  'oi.kanagawa.jp' => 1,
+  'oiso.kanagawa.jp' => 1,
+  'sagamihara.kanagawa.jp' => 1,
+  'samukawa.kanagawa.jp' => 1,
+  'tsukui.kanagawa.jp' => 1,
+  'yamakita.kanagawa.jp' => 1,
+  'yamato.kanagawa.jp' => 1,
+  'yokosuka.kanagawa.jp' => 1,
+  'yugawara.kanagawa.jp' => 1,
+  'zama.kanagawa.jp' => 1,
+  'zushi.kanagawa.jp' => 1,
+  'aki.kochi.jp' => 1,
+  'geisei.kochi.jp' => 1,
+  'hidaka.kochi.jp' => 1,
+  'higashitsuno.kochi.jp' => 1,
+  'ino.kochi.jp' => 1,
+  'kagami.kochi.jp' => 1,
+  'kami.kochi.jp' => 1,
+  'kitagawa.kochi.jp' => 1,
+  'kochi.kochi.jp' => 1,
+  'mihara.kochi.jp' => 1,
+  'motoyama.kochi.jp' => 1,
+  'muroto.kochi.jp' => 1,
+  'nahari.kochi.jp' => 1,
+  'nakamura.kochi.jp' => 1,
+  'nankoku.kochi.jp' => 1,
+  'nishitosa.kochi.jp' => 1,
+  'niyodogawa.kochi.jp' => 1,
+  'ochi.kochi.jp' => 1,
+  'okawa.kochi.jp' => 1,
+  'otoyo.kochi.jp' => 1,
+  'otsuki.kochi.jp' => 1,
+  'sakawa.kochi.jp' => 1,
+  'sukumo.kochi.jp' => 1,
+  'susaki.kochi.jp' => 1,
+  'tosa.kochi.jp' => 1,
+  'tosashimizu.kochi.jp' => 1,
+  'toyo.kochi.jp' => 1,
+  'tsuno.kochi.jp' => 1,
+  'umaji.kochi.jp' => 1,
+  'yasuda.kochi.jp' => 1,
+  'yusuhara.kochi.jp' => 1,
+  'amakusa.kumamoto.jp' => 1,
+  'arao.kumamoto.jp' => 1,
+  'aso.kumamoto.jp' => 1,
+  'choyo.kumamoto.jp' => 1,
+  'gyokuto.kumamoto.jp' => 1,
+  'kamiamakusa.kumamoto.jp' => 1,
+  'kikuchi.kumamoto.jp' => 1,
+  'kumamoto.kumamoto.jp' => 1,
+  'mashiki.kumamoto.jp' => 1,
+  'mifune.kumamoto.jp' => 1,
+  'minamata.kumamoto.jp' => 1,
+  'minamioguni.kumamoto.jp' => 1,
+  'nagasu.kumamoto.jp' => 1,
+  'nishihara.kumamoto.jp' => 1,
+  'oguni.kumamoto.jp' => 1,
+  'ozu.kumamoto.jp' => 1,
+  'sumoto.kumamoto.jp' => 1,
+  'takamori.kumamoto.jp' => 1,
+  'uki.kumamoto.jp' => 1,
+  'uto.kumamoto.jp' => 1,
+  'yamaga.kumamoto.jp' => 1,
+  'yamato.kumamoto.jp' => 1,
+  'yatsushiro.kumamoto.jp' => 1,
+  'ayabe.kyoto.jp' => 1,
+  'fukuchiyama.kyoto.jp' => 1,
+  'higashiyama.kyoto.jp' => 1,
+  'ide.kyoto.jp' => 1,
+  'ine.kyoto.jp' => 1,
+  'joyo.kyoto.jp' => 1,
+  'kameoka.kyoto.jp' => 1,
+  'kamo.kyoto.jp' => 1,
+  'kita.kyoto.jp' => 1,
+  'kizu.kyoto.jp' => 1,
+  'kumiyama.kyoto.jp' => 1,
+  'kyotamba.kyoto.jp' => 1,
+  'kyotanabe.kyoto.jp' => 1,
+  'kyotango.kyoto.jp' => 1,
+  'maizuru.kyoto.jp' => 1,
+  'minami.kyoto.jp' => 1,
+  'minamiyamashiro.kyoto.jp' => 1,
+  'miyazu.kyoto.jp' => 1,
+  'muko.kyoto.jp' => 1,
+  'nagaokakyo.kyoto.jp' => 1,
+  'nakagyo.kyoto.jp' => 1,
+  'nantan.kyoto.jp' => 1,
+  'oyamazaki.kyoto.jp' => 1,
+  'sakyo.kyoto.jp' => 1,
+  'seika.kyoto.jp' => 1,
+  'tanabe.kyoto.jp' => 1,
+  'uji.kyoto.jp' => 1,
+  'ujitawara.kyoto.jp' => 1,
+  'wazuka.kyoto.jp' => 1,
+  'yamashina.kyoto.jp' => 1,
+  'yawata.kyoto.jp' => 1,
+  'asahi.mie.jp' => 1,
+  'inabe.mie.jp' => 1,
+  'ise.mie.jp' => 1,
+  'kameyama.mie.jp' => 1,
+  'kawagoe.mie.jp' => 1,
+  'kiho.mie.jp' => 1,
+  'kisosaki.mie.jp' => 1,
+  'kiwa.mie.jp' => 1,
+  'komono.mie.jp' => 1,
+  'kumano.mie.jp' => 1,
+  'kuwana.mie.jp' => 1,
+  'matsusaka.mie.jp' => 1,
+  'meiwa.mie.jp' => 1,
+  'mihama.mie.jp' => 1,
+  'minamiise.mie.jp' => 1,
+  'misugi.mie.jp' => 1,
+  'miyama.mie.jp' => 1,
+  'nabari.mie.jp' => 1,
+  'shima.mie.jp' => 1,
+  'suzuka.mie.jp' => 1,
+  'tado.mie.jp' => 1,
+  'taiki.mie.jp' => 1,
+  'taki.mie.jp' => 1,
+  'tamaki.mie.jp' => 1,
+  'toba.mie.jp' => 1,
+  'tsu.mie.jp' => 1,
+  'udono.mie.jp' => 1,
+  'ureshino.mie.jp' => 1,
+  'watarai.mie.jp' => 1,
+  'yokkaichi.mie.jp' => 1,
+  'furukawa.miyagi.jp' => 1,
+  'higashimatsushima.miyagi.jp' => 1,
+  'ishinomaki.miyagi.jp' => 1,
+  'iwanuma.miyagi.jp' => 1,
+  'kakuda.miyagi.jp' => 1,
+  'kami.miyagi.jp' => 1,
+  'kawasaki.miyagi.jp' => 1,
+  'marumori.miyagi.jp' => 1,
+  'matsushima.miyagi.jp' => 1,
+  'minamisanriku.miyagi.jp' => 1,
+  'misato.miyagi.jp' => 1,
+  'murata.miyagi.jp' => 1,
+  'natori.miyagi.jp' => 1,
+  'ogawara.miyagi.jp' => 1,
+  'ohira.miyagi.jp' => 1,
+  'onagawa.miyagi.jp' => 1,
+  'osaki.miyagi.jp' => 1,
+  'rifu.miyagi.jp' => 1,
+  'semine.miyagi.jp' => 1,
+  'shibata.miyagi.jp' => 1,
+  'shichikashuku.miyagi.jp' => 1,
+  'shikama.miyagi.jp' => 1,
+  'shiogama.miyagi.jp' => 1,
+  'shiroishi.miyagi.jp' => 1,
+  'tagajo.miyagi.jp' => 1,
+  'taiwa.miyagi.jp' => 1,
+  'tome.miyagi.jp' => 1,
+  'tomiya.miyagi.jp' => 1,
+  'wakuya.miyagi.jp' => 1,
+  'watari.miyagi.jp' => 1,
+  'yamamoto.miyagi.jp' => 1,
+  'zao.miyagi.jp' => 1,
+  'aya.miyazaki.jp' => 1,
+  'ebino.miyazaki.jp' => 1,
+  'gokase.miyazaki.jp' => 1,
+  'hyuga.miyazaki.jp' => 1,
+  'kadogawa.miyazaki.jp' => 1,
+  'kawaminami.miyazaki.jp' => 1,
+  'kijo.miyazaki.jp' => 1,
+  'kitagawa.miyazaki.jp' => 1,
+  'kitakata.miyazaki.jp' => 1,
+  'kitaura.miyazaki.jp' => 1,
+  'kobayashi.miyazaki.jp' => 1,
+  'kunitomi.miyazaki.jp' => 1,
+  'kushima.miyazaki.jp' => 1,
+  'mimata.miyazaki.jp' => 1,
+  'miyakonojo.miyazaki.jp' => 1,
+  'miyazaki.miyazaki.jp' => 1,
+  'morotsuka.miyazaki.jp' => 1,
+  'nichinan.miyazaki.jp' => 1,
+  'nishimera.miyazaki.jp' => 1,
+  'nobeoka.miyazaki.jp' => 1,
+  'saito.miyazaki.jp' => 1,
+  'shiiba.miyazaki.jp' => 1,
+  'shintomi.miyazaki.jp' => 1,
+  'takaharu.miyazaki.jp' => 1,
+  'takanabe.miyazaki.jp' => 1,
+  'takazaki.miyazaki.jp' => 1,
+  'tsuno.miyazaki.jp' => 1,
+  'achi.nagano.jp' => 1,
+  'agematsu.nagano.jp' => 1,
+  'anan.nagano.jp' => 1,
+  'aoki.nagano.jp' => 1,
+  'asahi.nagano.jp' => 1,
+  'azumino.nagano.jp' => 1,
+  'chikuhoku.nagano.jp' => 1,
+  'chikuma.nagano.jp' => 1,
+  'chino.nagano.jp' => 1,
+  'fujimi.nagano.jp' => 1,
+  'hakuba.nagano.jp' => 1,
+  'hara.nagano.jp' => 1,
+  'hiraya.nagano.jp' => 1,
+  'iida.nagano.jp' => 1,
+  'iijima.nagano.jp' => 1,
+  'iiyama.nagano.jp' => 1,
+  'iizuna.nagano.jp' => 1,
+  'ikeda.nagano.jp' => 1,
+  'ikusaka.nagano.jp' => 1,
+  'ina.nagano.jp' => 1,
+  'karuizawa.nagano.jp' => 1,
+  'kawakami.nagano.jp' => 1,
+  'kiso.nagano.jp' => 1,
+  'kisofukushima.nagano.jp' => 1,
+  'kitaaiki.nagano.jp' => 1,
+  'komagane.nagano.jp' => 1,
+  'komoro.nagano.jp' => 1,
+  'matsukawa.nagano.jp' => 1,
+  'matsumoto.nagano.jp' => 1,
+  'miasa.nagano.jp' => 1,
+  'minamiaiki.nagano.jp' => 1,
+  'minamimaki.nagano.jp' => 1,
+  'minamiminowa.nagano.jp' => 1,
+  'minowa.nagano.jp' => 1,
+  'miyada.nagano.jp' => 1,
+  'miyota.nagano.jp' => 1,
+  'mochizuki.nagano.jp' => 1,
+  'nagano.nagano.jp' => 1,
+  'nagawa.nagano.jp' => 1,
+  'nagiso.nagano.jp' => 1,
+  'nakagawa.nagano.jp' => 1,
+  'nakano.nagano.jp' => 1,
+  'nozawaonsen.nagano.jp' => 1,
+  'obuse.nagano.jp' => 1,
+  'ogawa.nagano.jp' => 1,
+  'okaya.nagano.jp' => 1,
+  'omachi.nagano.jp' => 1,
+  'omi.nagano.jp' => 1,
+  'ookuwa.nagano.jp' => 1,
+  'ooshika.nagano.jp' => 1,
+  'otaki.nagano.jp' => 1,
+  'otari.nagano.jp' => 1,
+  'sakae.nagano.jp' => 1,
+  'sakaki.nagano.jp' => 1,
+  'saku.nagano.jp' => 1,
+  'sakuho.nagano.jp' => 1,
+  'shimosuwa.nagano.jp' => 1,
+  'shinanomachi.nagano.jp' => 1,
+  'shiojiri.nagano.jp' => 1,
+  'suwa.nagano.jp' => 1,
+  'suzaka.nagano.jp' => 1,
+  'takagi.nagano.jp' => 1,
+  'takamori.nagano.jp' => 1,
+  'takayama.nagano.jp' => 1,
+  'tateshina.nagano.jp' => 1,
+  'tatsuno.nagano.jp' => 1,
+  'togakushi.nagano.jp' => 1,
+  'togura.nagano.jp' => 1,
+  'tomi.nagano.jp' => 1,
+  'ueda.nagano.jp' => 1,
+  'wada.nagano.jp' => 1,
+  'yamagata.nagano.jp' => 1,
+  'yamanouchi.nagano.jp' => 1,
+  'yasaka.nagano.jp' => 1,
+  'yasuoka.nagano.jp' => 1,
+  'chijiwa.nagasaki.jp' => 1,
+  'futsu.nagasaki.jp' => 1,
+  'goto.nagasaki.jp' => 1,
+  'hasami.nagasaki.jp' => 1,
+  'hirado.nagasaki.jp' => 1,
+  'iki.nagasaki.jp' => 1,
+  'isahaya.nagasaki.jp' => 1,
+  'kawatana.nagasaki.jp' => 1,
+  'kuchinotsu.nagasaki.jp' => 1,
+  'matsuura.nagasaki.jp' => 1,
+  'nagasaki.nagasaki.jp' => 1,
+  'obama.nagasaki.jp' => 1,
+  'omura.nagasaki.jp' => 1,
+  'oseto.nagasaki.jp' => 1,
+  'saikai.nagasaki.jp' => 1,
+  'sasebo.nagasaki.jp' => 1,
+  'seihi.nagasaki.jp' => 1,
+  'shimabara.nagasaki.jp' => 1,
+  'shinkamigoto.nagasaki.jp' => 1,
+  'togitsu.nagasaki.jp' => 1,
+  'tsushima.nagasaki.jp' => 1,
+  'unzen.nagasaki.jp' => 1,
+  'ando.nara.jp' => 1,
+  'gose.nara.jp' => 1,
+  'heguri.nara.jp' => 1,
+  'higashiyoshino.nara.jp' => 1,
+  'ikaruga.nara.jp' => 1,
+  'ikoma.nara.jp' => 1,
+  'kamikitayama.nara.jp' => 1,
+  'kanmaki.nara.jp' => 1,
+  'kashiba.nara.jp' => 1,
+  'kashihara.nara.jp' => 1,
+  'katsuragi.nara.jp' => 1,
+  'kawai.nara.jp' => 1,
+  'kawakami.nara.jp' => 1,
+  'kawanishi.nara.jp' => 1,
+  'koryo.nara.jp' => 1,
+  'kurotaki.nara.jp' => 1,
+  'mitsue.nara.jp' => 1,
+  'miyake.nara.jp' => 1,
+  'nara.nara.jp' => 1,
+  'nosegawa.nara.jp' => 1,
+  'oji.nara.jp' => 1,
+  'ouda.nara.jp' => 1,
+  'oyodo.nara.jp' => 1,
+  'sakurai.nara.jp' => 1,
+  'sango.nara.jp' => 1,
+  'shimoichi.nara.jp' => 1,
+  'shimokitayama.nara.jp' => 1,
+  'shinjo.nara.jp' => 1,
+  'soni.nara.jp' => 1,
+  'takatori.nara.jp' => 1,
+  'tawaramoto.nara.jp' => 1,
+  'tenkawa.nara.jp' => 1,
+  'tenri.nara.jp' => 1,
+  'uda.nara.jp' => 1,
+  'yamatokoriyama.nara.jp' => 1,
+  'yamatotakada.nara.jp' => 1,
+  'yamazoe.nara.jp' => 1,
+  'yoshino.nara.jp' => 1,
+  'aga.niigata.jp' => 1,
+  'agano.niigata.jp' => 1,
+  'gosen.niigata.jp' => 1,
+  'itoigawa.niigata.jp' => 1,
+  'izumozaki.niigata.jp' => 1,
+  'joetsu.niigata.jp' => 1,
+  'kamo.niigata.jp' => 1,
+  'kariwa.niigata.jp' => 1,
+  'kashiwazaki.niigata.jp' => 1,
+  'minamiuonuma.niigata.jp' => 1,
+  'mitsuke.niigata.jp' => 1,
+  'muika.niigata.jp' => 1,
+  'murakami.niigata.jp' => 1,
+  'myoko.niigata.jp' => 1,
+  'nagaoka.niigata.jp' => 1,
+  'niigata.niigata.jp' => 1,
+  'ojiya.niigata.jp' => 1,
+  'omi.niigata.jp' => 1,
+  'sado.niigata.jp' => 1,
+  'sanjo.niigata.jp' => 1,
+  'seiro.niigata.jp' => 1,
+  'seirou.niigata.jp' => 1,
+  'sekikawa.niigata.jp' => 1,
+  'shibata.niigata.jp' => 1,
+  'tagami.niigata.jp' => 1,
+  'tainai.niigata.jp' => 1,
+  'tochio.niigata.jp' => 1,
+  'tokamachi.niigata.jp' => 1,
+  'tsubame.niigata.jp' => 1,
+  'tsunan.niigata.jp' => 1,
+  'uonuma.niigata.jp' => 1,
+  'yahiko.niigata.jp' => 1,
+  'yoita.niigata.jp' => 1,
+  'yuzawa.niigata.jp' => 1,
+  'beppu.oita.jp' => 1,
+  'bungoono.oita.jp' => 1,
+  'bungotakada.oita.jp' => 1,
+  'hasama.oita.jp' => 1,
+  'hiji.oita.jp' => 1,
+  'himeshima.oita.jp' => 1,
+  'hita.oita.jp' => 1,
+  'kamitsue.oita.jp' => 1,
+  'kokonoe.oita.jp' => 1,
+  'kuju.oita.jp' => 1,
+  'kunisaki.oita.jp' => 1,
+  'kusu.oita.jp' => 1,
+  'oita.oita.jp' => 1,
+  'saiki.oita.jp' => 1,
+  'taketa.oita.jp' => 1,
+  'tsukumi.oita.jp' => 1,
+  'usa.oita.jp' => 1,
+  'usuki.oita.jp' => 1,
+  'yufu.oita.jp' => 1,
+  'akaiwa.okayama.jp' => 1,
+  'asakuchi.okayama.jp' => 1,
+  'bizen.okayama.jp' => 1,
+  'hayashima.okayama.jp' => 1,
+  'ibara.okayama.jp' => 1,
+  'kagamino.okayama.jp' => 1,
+  'kasaoka.okayama.jp' => 1,
+  'kibichuo.okayama.jp' => 1,
+  'kumenan.okayama.jp' => 1,
+  'kurashiki.okayama.jp' => 1,
+  'maniwa.okayama.jp' => 1,
+  'misaki.okayama.jp' => 1,
+  'nagi.okayama.jp' => 1,
+  'niimi.okayama.jp' => 1,
+  'nishiawakura.okayama.jp' => 1,
+  'okayama.okayama.jp' => 1,
+  'satosho.okayama.jp' => 1,
+  'setouchi.okayama.jp' => 1,
+  'shinjo.okayama.jp' => 1,
+  'shoo.okayama.jp' => 1,
+  'soja.okayama.jp' => 1,
+  'takahashi.okayama.jp' => 1,
+  'tamano.okayama.jp' => 1,
+  'tsuyama.okayama.jp' => 1,
+  'wake.okayama.jp' => 1,
+  'yakage.okayama.jp' => 1,
+  'aguni.okinawa.jp' => 1,
+  'ginowan.okinawa.jp' => 1,
+  'ginoza.okinawa.jp' => 1,
+  'gushikami.okinawa.jp' => 1,
+  'haebaru.okinawa.jp' => 1,
+  'higashi.okinawa.jp' => 1,
+  'hirara.okinawa.jp' => 1,
+  'iheya.okinawa.jp' => 1,
+  'ishigaki.okinawa.jp' => 1,
+  'ishikawa.okinawa.jp' => 1,
+  'itoman.okinawa.jp' => 1,
+  'izena.okinawa.jp' => 1,
+  'kadena.okinawa.jp' => 1,
+  'kin.okinawa.jp' => 1,
+  'kitadaito.okinawa.jp' => 1,
+  'kitanakagusuku.okinawa.jp' => 1,
+  'kumejima.okinawa.jp' => 1,
+  'kunigami.okinawa.jp' => 1,
+  'minamidaito.okinawa.jp' => 1,
+  'motobu.okinawa.jp' => 1,
+  'nago.okinawa.jp' => 1,
+  'naha.okinawa.jp' => 1,
+  'nakagusuku.okinawa.jp' => 1,
+  'nakijin.okinawa.jp' => 1,
+  'nanjo.okinawa.jp' => 1,
+  'nishihara.okinawa.jp' => 1,
+  'ogimi.okinawa.jp' => 1,
+  'okinawa.okinawa.jp' => 1,
+  'onna.okinawa.jp' => 1,
+  'shimoji.okinawa.jp' => 1,
+  'taketomi.okinawa.jp' => 1,
+  'tarama.okinawa.jp' => 1,
+  'tokashiki.okinawa.jp' => 1,
+  'tomigusuku.okinawa.jp' => 1,
+  'tonaki.okinawa.jp' => 1,
+  'urasoe.okinawa.jp' => 1,
+  'uruma.okinawa.jp' => 1,
+  'yaese.okinawa.jp' => 1,
+  'yomitan.okinawa.jp' => 1,
+  'yonabaru.okinawa.jp' => 1,
+  'yonaguni.okinawa.jp' => 1,
+  'zamami.okinawa.jp' => 1,
+  'abeno.osaka.jp' => 1,
+  'chihayaakasaka.osaka.jp' => 1,
+  'chuo.osaka.jp' => 1,
+  'daito.osaka.jp' => 1,
+  'fujiidera.osaka.jp' => 1,
+  'habikino.osaka.jp' => 1,
+  'hannan.osaka.jp' => 1,
+  'higashiosaka.osaka.jp' => 1,
+  'higashisumiyoshi.osaka.jp' => 1,
+  'higashiyodogawa.osaka.jp' => 1,
+  'hirakata.osaka.jp' => 1,
+  'ibaraki.osaka.jp' => 1,
+  'ikeda.osaka.jp' => 1,
+  'izumi.osaka.jp' => 1,
+  'izumiotsu.osaka.jp' => 1,
+  'izumisano.osaka.jp' => 1,
+  'kadoma.osaka.jp' => 1,
+  'kaizuka.osaka.jp' => 1,
+  'kanan.osaka.jp' => 1,
+  'kashiwara.osaka.jp' => 1,
+  'katano.osaka.jp' => 1,
+  'kawachinagano.osaka.jp' => 1,
+  'kishiwada.osaka.jp' => 1,
+  'kita.osaka.jp' => 1,
+  'kumatori.osaka.jp' => 1,
+  'matsubara.osaka.jp' => 1,
+  'minato.osaka.jp' => 1,
+  'minoh.osaka.jp' => 1,
+  'misaki.osaka.jp' => 1,
+  'moriguchi.osaka.jp' => 1,
+  'neyagawa.osaka.jp' => 1,
+  'nishi.osaka.jp' => 1,
+  'nose.osaka.jp' => 1,
+  'osakasayama.osaka.jp' => 1,
+  'sakai.osaka.jp' => 1,
+  'sayama.osaka.jp' => 1,
+  'sennan.osaka.jp' => 1,
+  'settsu.osaka.jp' => 1,
+  'shijonawate.osaka.jp' => 1,
+  'shimamoto.osaka.jp' => 1,
+  'suita.osaka.jp' => 1,
+  'tadaoka.osaka.jp' => 1,
+  'taishi.osaka.jp' => 1,
+  'tajiri.osaka.jp' => 1,
+  'takaishi.osaka.jp' => 1,
+  'takatsuki.osaka.jp' => 1,
+  'tondabayashi.osaka.jp' => 1,
+  'toyonaka.osaka.jp' => 1,
+  'toyono.osaka.jp' => 1,
+  'yao.osaka.jp' => 1,
+  'ariake.saga.jp' => 1,
+  'arita.saga.jp' => 1,
+  'fukudomi.saga.jp' => 1,
+  'genkai.saga.jp' => 1,
+  'hamatama.saga.jp' => 1,
+  'hizen.saga.jp' => 1,
+  'imari.saga.jp' => 1,
+  'kamimine.saga.jp' => 1,
+  'kanzaki.saga.jp' => 1,
+  'karatsu.saga.jp' => 1,
+  'kashima.saga.jp' => 1,
+  'kitagata.saga.jp' => 1,
+  'kitahata.saga.jp' => 1,
+  'kiyama.saga.jp' => 1,
+  'kouhoku.saga.jp' => 1,
+  'kyuragi.saga.jp' => 1,
+  'nishiarita.saga.jp' => 1,
+  'ogi.saga.jp' => 1,
+  'omachi.saga.jp' => 1,
+  'ouchi.saga.jp' => 1,
+  'saga.saga.jp' => 1,
+  'shiroishi.saga.jp' => 1,
+  'taku.saga.jp' => 1,
+  'tara.saga.jp' => 1,
+  'tosu.saga.jp' => 1,
+  'yoshinogari.saga.jp' => 1,
+  'arakawa.saitama.jp' => 1,
+  'asaka.saitama.jp' => 1,
+  'chichibu.saitama.jp' => 1,
+  'fujimi.saitama.jp' => 1,
+  'fujimino.saitama.jp' => 1,
+  'fukaya.saitama.jp' => 1,
+  'hanno.saitama.jp' => 1,
+  'hanyu.saitama.jp' => 1,
+  'hasuda.saitama.jp' => 1,
+  'hatogaya.saitama.jp' => 1,
+  'hatoyama.saitama.jp' => 1,
+  'hidaka.saitama.jp' => 1,
+  'higashichichibu.saitama.jp' => 1,
+  'higashimatsuyama.saitama.jp' => 1,
+  'honjo.saitama.jp' => 1,
+  'ina.saitama.jp' => 1,
+  'iruma.saitama.jp' => 1,
+  'iwatsuki.saitama.jp' => 1,
+  'kamiizumi.saitama.jp' => 1,
+  'kamikawa.saitama.jp' => 1,
+  'kamisato.saitama.jp' => 1,
+  'kasukabe.saitama.jp' => 1,
+  'kawagoe.saitama.jp' => 1,
+  'kawaguchi.saitama.jp' => 1,
+  'kawajima.saitama.jp' => 1,
+  'kazo.saitama.jp' => 1,
+  'kitamoto.saitama.jp' => 1,
+  'koshigaya.saitama.jp' => 1,
+  'kounosu.saitama.jp' => 1,
+  'kuki.saitama.jp' => 1,
+  'kumagaya.saitama.jp' => 1,
+  'matsubushi.saitama.jp' => 1,
+  'minano.saitama.jp' => 1,
+  'misato.saitama.jp' => 1,
+  'miyashiro.saitama.jp' => 1,
+  'miyoshi.saitama.jp' => 1,
+  'moroyama.saitama.jp' => 1,
+  'nagatoro.saitama.jp' => 1,
+  'namegawa.saitama.jp' => 1,
+  'niiza.saitama.jp' => 1,
+  'ogano.saitama.jp' => 1,
+  'ogawa.saitama.jp' => 1,
+  'ogose.saitama.jp' => 1,
+  'okegawa.saitama.jp' => 1,
+  'omiya.saitama.jp' => 1,
+  'otaki.saitama.jp' => 1,
+  'ranzan.saitama.jp' => 1,
+  'ryokami.saitama.jp' => 1,
+  'saitama.saitama.jp' => 1,
+  'sakado.saitama.jp' => 1,
+  'satte.saitama.jp' => 1,
+  'sayama.saitama.jp' => 1,
+  'shiki.saitama.jp' => 1,
+  'shiraoka.saitama.jp' => 1,
+  'soka.saitama.jp' => 1,
+  'sugito.saitama.jp' => 1,
+  'toda.saitama.jp' => 1,
+  'tokigawa.saitama.jp' => 1,
+  'tokorozawa.saitama.jp' => 1,
+  'tsurugashima.saitama.jp' => 1,
+  'urawa.saitama.jp' => 1,
+  'warabi.saitama.jp' => 1,
+  'yashio.saitama.jp' => 1,
+  'yokoze.saitama.jp' => 1,
+  'yono.saitama.jp' => 1,
+  'yorii.saitama.jp' => 1,
+  'yoshida.saitama.jp' => 1,
+  'yoshikawa.saitama.jp' => 1,
+  'yoshimi.saitama.jp' => 1,
+  'aisho.shiga.jp' => 1,
+  'gamo.shiga.jp' => 1,
+  'higashiomi.shiga.jp' => 1,
+  'hikone.shiga.jp' => 1,
+  'koka.shiga.jp' => 1,
+  'konan.shiga.jp' => 1,
+  'kosei.shiga.jp' => 1,
+  'koto.shiga.jp' => 1,
+  'kusatsu.shiga.jp' => 1,
+  'maibara.shiga.jp' => 1,
+  'moriyama.shiga.jp' => 1,
+  'nagahama.shiga.jp' => 1,
+  'nishiazai.shiga.jp' => 1,
+  'notogawa.shiga.jp' => 1,
+  'omihachiman.shiga.jp' => 1,
+  'otsu.shiga.jp' => 1,
+  'ritto.shiga.jp' => 1,
+  'ryuoh.shiga.jp' => 1,
+  'takashima.shiga.jp' => 1,
+  'takatsuki.shiga.jp' => 1,
+  'torahime.shiga.jp' => 1,
+  'toyosato.shiga.jp' => 1,
+  'yasu.shiga.jp' => 1,
+  'akagi.shimane.jp' => 1,
+  'ama.shimane.jp' => 1,
+  'gotsu.shimane.jp' => 1,
+  'hamada.shimane.jp' => 1,
+  'higashiizumo.shimane.jp' => 1,
+  'hikawa.shimane.jp' => 1,
+  'hikimi.shimane.jp' => 1,
+  'izumo.shimane.jp' => 1,
+  'kakinoki.shimane.jp' => 1,
+  'masuda.shimane.jp' => 1,
+  'matsue.shimane.jp' => 1,
+  'misato.shimane.jp' => 1,
+  'nishinoshima.shimane.jp' => 1,
+  'ohda.shimane.jp' => 1,
+  'okinoshima.shimane.jp' => 1,
+  'okuizumo.shimane.jp' => 1,
+  'shimane.shimane.jp' => 1,
+  'tamayu.shimane.jp' => 1,
+  'tsuwano.shimane.jp' => 1,
+  'unnan.shimane.jp' => 1,
+  'yakumo.shimane.jp' => 1,
+  'yasugi.shimane.jp' => 1,
+  'yatsuka.shimane.jp' => 1,
+  'arai.shizuoka.jp' => 1,
+  'atami.shizuoka.jp' => 1,
+  'fuji.shizuoka.jp' => 1,
+  'fujieda.shizuoka.jp' => 1,
+  'fujikawa.shizuoka.jp' => 1,
+  'fujinomiya.shizuoka.jp' => 1,
+  'fukuroi.shizuoka.jp' => 1,
+  'gotemba.shizuoka.jp' => 1,
+  'haibara.shizuoka.jp' => 1,
+  'hamamatsu.shizuoka.jp' => 1,
+  'higashiizu.shizuoka.jp' => 1,
+  'ito.shizuoka.jp' => 1,
+  'iwata.shizuoka.jp' => 1,
+  'izu.shizuoka.jp' => 1,
+  'izunokuni.shizuoka.jp' => 1,
+  'kakegawa.shizuoka.jp' => 1,
+  'kannami.shizuoka.jp' => 1,
+  'kawanehon.shizuoka.jp' => 1,
+  'kawazu.shizuoka.jp' => 1,
+  'kikugawa.shizuoka.jp' => 1,
+  'kosai.shizuoka.jp' => 1,
+  'makinohara.shizuoka.jp' => 1,
+  'matsuzaki.shizuoka.jp' => 1,
+  'minamiizu.shizuoka.jp' => 1,
+  'mishima.shizuoka.jp' => 1,
+  'morimachi.shizuoka.jp' => 1,
+  'nishiizu.shizuoka.jp' => 1,
+  'numazu.shizuoka.jp' => 1,
+  'omaezaki.shizuoka.jp' => 1,
+  'shimada.shizuoka.jp' => 1,
+  'shimizu.shizuoka.jp' => 1,
+  'shimoda.shizuoka.jp' => 1,
+  'shizuoka.shizuoka.jp' => 1,
+  'susono.shizuoka.jp' => 1,
+  'yaizu.shizuoka.jp' => 1,
+  'yoshida.shizuoka.jp' => 1,
+  'ashikaga.tochigi.jp' => 1,
+  'bato.tochigi.jp' => 1,
+  'haga.tochigi.jp' => 1,
+  'ichikai.tochigi.jp' => 1,
+  'iwafune.tochigi.jp' => 1,
+  'kaminokawa.tochigi.jp' => 1,
+  'kanuma.tochigi.jp' => 1,
+  'karasuyama.tochigi.jp' => 1,
+  'kuroiso.tochigi.jp' => 1,
+  'mashiko.tochigi.jp' => 1,
+  'mibu.tochigi.jp' => 1,
+  'moka.tochigi.jp' => 1,
+  'motegi.tochigi.jp' => 1,
+  'nasu.tochigi.jp' => 1,
+  'nasushiobara.tochigi.jp' => 1,
+  'nikko.tochigi.jp' => 1,
+  'nishikata.tochigi.jp' => 1,
+  'nogi.tochigi.jp' => 1,
+  'ohira.tochigi.jp' => 1,
+  'ohtawara.tochigi.jp' => 1,
+  'oyama.tochigi.jp' => 1,
+  'sakura.tochigi.jp' => 1,
+  'sano.tochigi.jp' => 1,
+  'shimotsuke.tochigi.jp' => 1,
+  'shioya.tochigi.jp' => 1,
+  'takanezawa.tochigi.jp' => 1,
+  'tochigi.tochigi.jp' => 1,
+  'tsuga.tochigi.jp' => 1,
+  'ujiie.tochigi.jp' => 1,
+  'utsunomiya.tochigi.jp' => 1,
+  'yaita.tochigi.jp' => 1,
+  'aizumi.tokushima.jp' => 1,
+  'anan.tokushima.jp' => 1,
+  'ichiba.tokushima.jp' => 1,
+  'itano.tokushima.jp' => 1,
+  'kainan.tokushima.jp' => 1,
+  'komatsushima.tokushima.jp' => 1,
+  'matsushige.tokushima.jp' => 1,
+  'mima.tokushima.jp' => 1,
+  'minami.tokushima.jp' => 1,
+  'miyoshi.tokushima.jp' => 1,
+  'mugi.tokushima.jp' => 1,
+  'nakagawa.tokushima.jp' => 1,
+  'naruto.tokushima.jp' => 1,
+  'sanagochi.tokushima.jp' => 1,
+  'shishikui.tokushima.jp' => 1,
+  'tokushima.tokushima.jp' => 1,
+  'wajiki.tokushima.jp' => 1,
+  'adachi.tokyo.jp' => 1,
+  'akiruno.tokyo.jp' => 1,
+  'akishima.tokyo.jp' => 1,
+  'aogashima.tokyo.jp' => 1,
+  'arakawa.tokyo.jp' => 1,
+  'bunkyo.tokyo.jp' => 1,
+  'chiyoda.tokyo.jp' => 1,
+  'chofu.tokyo.jp' => 1,
+  'chuo.tokyo.jp' => 1,
+  'edogawa.tokyo.jp' => 1,
+  'fuchu.tokyo.jp' => 1,
+  'fussa.tokyo.jp' => 1,
+  'hachijo.tokyo.jp' => 1,
+  'hachioji.tokyo.jp' => 1,
+  'hamura.tokyo.jp' => 1,
+  'higashikurume.tokyo.jp' => 1,
+  'higashimurayama.tokyo.jp' => 1,
+  'higashiyamato.tokyo.jp' => 1,
+  'hino.tokyo.jp' => 1,
+  'hinode.tokyo.jp' => 1,
+  'hinohara.tokyo.jp' => 1,
+  'inagi.tokyo.jp' => 1,
+  'itabashi.tokyo.jp' => 1,
+  'katsushika.tokyo.jp' => 1,
+  'kita.tokyo.jp' => 1,
+  'kiyose.tokyo.jp' => 1,
+  'kodaira.tokyo.jp' => 1,
+  'koganei.tokyo.jp' => 1,
+  'kokubunji.tokyo.jp' => 1,
+  'komae.tokyo.jp' => 1,
+  'koto.tokyo.jp' => 1,
+  'kouzushima.tokyo.jp' => 1,
+  'kunitachi.tokyo.jp' => 1,
+  'machida.tokyo.jp' => 1,
+  'meguro.tokyo.jp' => 1,
+  'minato.tokyo.jp' => 1,
+  'mitaka.tokyo.jp' => 1,
+  'mizuho.tokyo.jp' => 1,
+  'musashimurayama.tokyo.jp' => 1,
+  'musashino.tokyo.jp' => 1,
+  'nakano.tokyo.jp' => 1,
+  'nerima.tokyo.jp' => 1,
+  'ogasawara.tokyo.jp' => 1,
+  'okutama.tokyo.jp' => 1,
+  'ome.tokyo.jp' => 1,
+  'oshima.tokyo.jp' => 1,
+  'ota.tokyo.jp' => 1,
+  'setagaya.tokyo.jp' => 1,
+  'shibuya.tokyo.jp' => 1,
+  'shinagawa.tokyo.jp' => 1,
+  'shinjuku.tokyo.jp' => 1,
+  'suginami.tokyo.jp' => 1,
+  'sumida.tokyo.jp' => 1,
+  'tachikawa.tokyo.jp' => 1,
+  'taito.tokyo.jp' => 1,
+  'tama.tokyo.jp' => 1,
+  'toshima.tokyo.jp' => 1,
+  'chizu.tottori.jp' => 1,
+  'hino.tottori.jp' => 1,
+  'kawahara.tottori.jp' => 1,
+  'koge.tottori.jp' => 1,
+  'kotoura.tottori.jp' => 1,
+  'misasa.tottori.jp' => 1,
+  'nanbu.tottori.jp' => 1,
+  'nichinan.tottori.jp' => 1,
+  'sakaiminato.tottori.jp' => 1,
+  'tottori.tottori.jp' => 1,
+  'wakasa.tottori.jp' => 1,
+  'yazu.tottori.jp' => 1,
+  'yonago.tottori.jp' => 1,
+  'asahi.toyama.jp' => 1,
+  'fuchu.toyama.jp' => 1,
+  'fukumitsu.toyama.jp' => 1,
+  'funahashi.toyama.jp' => 1,
+  'himi.toyama.jp' => 1,
+  'imizu.toyama.jp' => 1,
+  'inami.toyama.jp' => 1,
+  'johana.toyama.jp' => 1,
+  'kamiichi.toyama.jp' => 1,
+  'kurobe.toyama.jp' => 1,
+  'nakaniikawa.toyama.jp' => 1,
+  'namerikawa.toyama.jp' => 1,
+  'nanto.toyama.jp' => 1,
+  'nyuzen.toyama.jp' => 1,
+  'oyabe.toyama.jp' => 1,
+  'taira.toyama.jp' => 1,
+  'takaoka.toyama.jp' => 1,
+  'tateyama.toyama.jp' => 1,
+  'toga.toyama.jp' => 1,
+  'tonami.toyama.jp' => 1,
+  'toyama.toyama.jp' => 1,
+  'unazuki.toyama.jp' => 1,
+  'uozu.toyama.jp' => 1,
+  'yamada.toyama.jp' => 1,
+  'arida.wakayama.jp' => 1,
+  'aridagawa.wakayama.jp' => 1,
+  'gobo.wakayama.jp' => 1,
+  'hashimoto.wakayama.jp' => 1,
+  'hidaka.wakayama.jp' => 1,
+  'hirogawa.wakayama.jp' => 1,
+  'inami.wakayama.jp' => 1,
+  'iwade.wakayama.jp' => 1,
+  'kainan.wakayama.jp' => 1,
+  'kamitonda.wakayama.jp' => 1,
+  'katsuragi.wakayama.jp' => 1,
+  'kimino.wakayama.jp' => 1,
+  'kinokawa.wakayama.jp' => 1,
+  'kitayama.wakayama.jp' => 1,
+  'koya.wakayama.jp' => 1,
+  'koza.wakayama.jp' => 1,
+  'kozagawa.wakayama.jp' => 1,
+  'kudoyama.wakayama.jp' => 1,
+  'kushimoto.wakayama.jp' => 1,
+  'mihama.wakayama.jp' => 1,
+  'misato.wakayama.jp' => 1,
+  'nachikatsuura.wakayama.jp' => 1,
+  'shingu.wakayama.jp' => 1,
+  'shirahama.wakayama.jp' => 1,
+  'taiji.wakayama.jp' => 1,
+  'tanabe.wakayama.jp' => 1,
+  'wakayama.wakayama.jp' => 1,
+  'yuasa.wakayama.jp' => 1,
+  'yura.wakayama.jp' => 1,
+  'asahi.yamagata.jp' => 1,
+  'funagata.yamagata.jp' => 1,
+  'higashine.yamagata.jp' => 1,
+  'iide.yamagata.jp' => 1,
+  'kahoku.yamagata.jp' => 1,
+  'kaminoyama.yamagata.jp' => 1,
+  'kaneyama.yamagata.jp' => 1,
+  'kawanishi.yamagata.jp' => 1,
+  'mamurogawa.yamagata.jp' => 1,
+  'mikawa.yamagata.jp' => 1,
+  'murayama.yamagata.jp' => 1,
+  'nagai.yamagata.jp' => 1,
+  'nakayama.yamagata.jp' => 1,
+  'nanyo.yamagata.jp' => 1,
+  'nishikawa.yamagata.jp' => 1,
+  'obanazawa.yamagata.jp' => 1,
+  'oe.yamagata.jp' => 1,
+  'oguni.yamagata.jp' => 1,
+  'ohkura.yamagata.jp' => 1,
+  'oishida.yamagata.jp' => 1,
+  'sagae.yamagata.jp' => 1,
+  'sakata.yamagata.jp' => 1,
+  'sakegawa.yamagata.jp' => 1,
+  'shinjo.yamagata.jp' => 1,
+  'shirataka.yamagata.jp' => 1,
+  'shonai.yamagata.jp' => 1,
+  'takahata.yamagata.jp' => 1,
+  'tendo.yamagata.jp' => 1,
+  'tozawa.yamagata.jp' => 1,
+  'tsuruoka.yamagata.jp' => 1,
+  'yamagata.yamagata.jp' => 1,
+  'yamanobe.yamagata.jp' => 1,
+  'yonezawa.yamagata.jp' => 1,
+  'yuza.yamagata.jp' => 1,
+  'abu.yamaguchi.jp' => 1,
+  'hagi.yamaguchi.jp' => 1,
+  'hikari.yamaguchi.jp' => 1,
+  'hofu.yamaguchi.jp' => 1,
+  'iwakuni.yamaguchi.jp' => 1,
+  'kudamatsu.yamaguchi.jp' => 1,
+  'mitou.yamaguchi.jp' => 1,
+  'nagato.yamaguchi.jp' => 1,
+  'oshima.yamaguchi.jp' => 1,
+  'shimonoseki.yamaguchi.jp' => 1,
+  'shunan.yamaguchi.jp' => 1,
+  'tabuse.yamaguchi.jp' => 1,
+  'tokuyama.yamaguchi.jp' => 1,
+  'toyota.yamaguchi.jp' => 1,
+  'ube.yamaguchi.jp' => 1,
+  'yuu.yamaguchi.jp' => 1,
+  'chuo.yamanashi.jp' => 1,
+  'doshi.yamanashi.jp' => 1,
+  'fuefuki.yamanashi.jp' => 1,
+  'fujikawa.yamanashi.jp' => 1,
+  'fujikawaguchiko.yamanashi.jp' => 1,
+  'fujiyoshida.yamanashi.jp' => 1,
+  'hayakawa.yamanashi.jp' => 1,
+  'hokuto.yamanashi.jp' => 1,
+  'ichikawamisato.yamanashi.jp' => 1,
+  'kai.yamanashi.jp' => 1,
+  'kofu.yamanashi.jp' => 1,
+  'koshu.yamanashi.jp' => 1,
+  'kosuge.yamanashi.jp' => 1,
+  'minami-alps.yamanashi.jp' => 1,
+  'minobu.yamanashi.jp' => 1,
+  'nakamichi.yamanashi.jp' => 1,
+  'nanbu.yamanashi.jp' => 1,
+  'narusawa.yamanashi.jp' => 1,
+  'nirasaki.yamanashi.jp' => 1,
+  'nishikatsura.yamanashi.jp' => 1,
+  'oshino.yamanashi.jp' => 1,
+  'otsuki.yamanashi.jp' => 1,
+  'showa.yamanashi.jp' => 1,
+  'tabayama.yamanashi.jp' => 1,
+  'tsuru.yamanashi.jp' => 1,
+  'uenohara.yamanashi.jp' => 1,
+  'yamanakako.yamanashi.jp' => 1,
+  'yamanashi.yamanashi.jp' => 1,
+  'ke' => 1,
+  'ac.ke' => 1,
+  'co.ke' => 1,
+  'go.ke' => 1,
+  'info.ke' => 1,
+  'me.ke' => 1,
+  'mobi.ke' => 1,
+  'ne.ke' => 1,
+  'or.ke' => 1,
+  'sc.ke' => 1,
+  'kg' => 1,
+  'org.kg' => 1,
+  'net.kg' => 1,
+  'com.kg' => 1,
+  'edu.kg' => 1,
+  'gov.kg' => 1,
+  'mil.kg' => 1,
+  '*.kh' => 1,
+  'ki' => 1,
+  'edu.ki' => 1,
+  'biz.ki' => 1,
+  'net.ki' => 1,
+  'org.ki' => 1,
+  'gov.ki' => 1,
+  'info.ki' => 1,
+  'com.ki' => 1,
+  'km' => 1,
+  'org.km' => 1,
+  'nom.km' => 1,
+  'gov.km' => 1,
+  'prd.km' => 1,
+  'tm.km' => 1,
+  'edu.km' => 1,
+  'mil.km' => 1,
+  'ass.km' => 1,
+  'com.km' => 1,
+  'coop.km' => 1,
+  'asso.km' => 1,
+  'presse.km' => 1,
+  'medecin.km' => 1,
+  'notaires.km' => 1,
+  'pharmaciens.km' => 1,
+  'veterinaire.km' => 1,
+  'gouv.km' => 1,
+  'kn' => 1,
+  'net.kn' => 1,
+  'org.kn' => 1,
+  'edu.kn' => 1,
+  'gov.kn' => 1,
+  'kp' => 1,
+  'com.kp' => 1,
+  'edu.kp' => 1,
+  'gov.kp' => 1,
+  'org.kp' => 1,
+  'rep.kp' => 1,
+  'tra.kp' => 1,
+  'kr' => 1,
+  'ac.kr' => 1,
+  'co.kr' => 1,
+  'es.kr' => 1,
+  'go.kr' => 1,
+  'hs.kr' => 1,
+  'kg.kr' => 1,
+  'mil.kr' => 1,
+  'ms.kr' => 1,
+  'ne.kr' => 1,
+  'or.kr' => 1,
+  'pe.kr' => 1,
+  're.kr' => 1,
+  'sc.kr' => 1,
+  'busan.kr' => 1,
+  'chungbuk.kr' => 1,
+  'chungnam.kr' => 1,
+  'daegu.kr' => 1,
+  'daejeon.kr' => 1,
+  'gangwon.kr' => 1,
+  'gwangju.kr' => 1,
+  'gyeongbuk.kr' => 1,
+  'gyeonggi.kr' => 1,
+  'gyeongnam.kr' => 1,
+  'incheon.kr' => 1,
+  'jeju.kr' => 1,
+  'jeonbuk.kr' => 1,
+  'jeonnam.kr' => 1,
+  'seoul.kr' => 1,
+  'ulsan.kr' => 1,
+  'kw' => 1,
+  'com.kw' => 1,
+  'edu.kw' => 1,
+  'emb.kw' => 1,
+  'gov.kw' => 1,
+  'ind.kw' => 1,
+  'net.kw' => 1,
+  'org.kw' => 1,
+  'ky' => 1,
+  'edu.ky' => 1,
+  'gov.ky' => 1,
+  'com.ky' => 1,
+  'org.ky' => 1,
+  'net.ky' => 1,
+  'kz' => 1,
+  'org.kz' => 1,
+  'edu.kz' => 1,
+  'net.kz' => 1,
+  'gov.kz' => 1,
+  'mil.kz' => 1,
+  'com.kz' => 1,
+  'la' => 1,
+  'int.la' => 1,
+  'net.la' => 1,
+  'info.la' => 1,
+  'edu.la' => 1,
+  'gov.la' => 1,
+  'per.la' => 1,
+  'com.la' => 1,
+  'org.la' => 1,
+  'lb' => 1,
+  'com.lb' => 1,
+  'edu.lb' => 1,
+  'gov.lb' => 1,
+  'net.lb' => 1,
+  'org.lb' => 1,
+  'lc' => 1,
+  'com.lc' => 1,
+  'net.lc' => 1,
+  'co.lc' => 1,
+  'org.lc' => 1,
+  'edu.lc' => 1,
+  'gov.lc' => 1,
+  'li' => 1,
+  'lk' => 1,
+  'gov.lk' => 1,
+  'sch.lk' => 1,
+  'net.lk' => 1,
+  'int.lk' => 1,
+  'com.lk' => 1,
+  'org.lk' => 1,
+  'edu.lk' => 1,
+  'ngo.lk' => 1,
+  'soc.lk' => 1,
+  'web.lk' => 1,
+  'ltd.lk' => 1,
+  'assn.lk' => 1,
+  'grp.lk' => 1,
+  'hotel.lk' => 1,
+  'ac.lk' => 1,
+  'lr' => 1,
+  'com.lr' => 1,
+  'edu.lr' => 1,
+  'gov.lr' => 1,
+  'org.lr' => 1,
+  'net.lr' => 1,
+  'ls' => 1,
+  'ac.ls' => 1,
+  'biz.ls' => 1,
+  'co.ls' => 1,
+  'edu.ls' => 1,
+  'gov.ls' => 1,
+  'info.ls' => 1,
+  'net.ls' => 1,
+  'org.ls' => 1,
+  'sc.ls' => 1,
+  'lt' => 1,
+  'gov.lt' => 1,
+  'lu' => 1,
+  'lv' => 1,
+  'com.lv' => 1,
+  'edu.lv' => 1,
+  'gov.lv' => 1,
+  'org.lv' => 1,
+  'mil.lv' => 1,
+  'id.lv' => 1,
+  'net.lv' => 1,
+  'asn.lv' => 1,
+  'conf.lv' => 1,
+  'ly' => 1,
+  'com.ly' => 1,
+  'net.ly' => 1,
+  'gov.ly' => 1,
+  'plc.ly' => 1,
+  'edu.ly' => 1,
+  'sch.ly' => 1,
+  'med.ly' => 1,
+  'org.ly' => 1,
+  'id.ly' => 1,
+  'ma' => 1,
+  'co.ma' => 1,
+  'net.ma' => 1,
+  'gov.ma' => 1,
+  'org.ma' => 1,
+  'ac.ma' => 1,
+  'press.ma' => 1,
+  'mc' => 1,
+  'tm.mc' => 1,
+  'asso.mc' => 1,
+  'md' => 1,
+  'me' => 1,
+  'co.me' => 1,
+  'net.me' => 1,
+  'org.me' => 1,
+  'edu.me' => 1,
+  'ac.me' => 1,
+  'gov.me' => 1,
+  'its.me' => 1,
+  'priv.me' => 1,
+  'mg' => 1,
+  'org.mg' => 1,
+  'nom.mg' => 1,
+  'gov.mg' => 1,
+  'prd.mg' => 1,
+  'tm.mg' => 1,
+  'edu.mg' => 1,
+  'mil.mg' => 1,
+  'com.mg' => 1,
+  'co.mg' => 1,
+  'mh' => 1,
+  'mil' => 1,
+  'mk' => 1,
+  'com.mk' => 1,
+  'org.mk' => 1,
+  'net.mk' => 1,
+  'edu.mk' => 1,
+  'gov.mk' => 1,
+  'inf.mk' => 1,
+  'name.mk' => 1,
+  'ml' => 1,
+  'com.ml' => 1,
+  'edu.ml' => 1,
+  'gouv.ml' => 1,
+  'gov.ml' => 1,
+  'net.ml' => 1,
+  'org.ml' => 1,
+  'presse.ml' => 1,
+  '*.mm' => 1,
+  'mn' => 1,
+  'gov.mn' => 1,
+  'edu.mn' => 1,
+  'org.mn' => 1,
+  'mo' => 1,
+  'com.mo' => 1,
+  'net.mo' => 1,
+  'org.mo' => 1,
+  'edu.mo' => 1,
+  'gov.mo' => 1,
+  'mobi' => 1,
+  'mp' => 1,
+  'mq' => 1,
+  'mr' => 1,
+  'gov.mr' => 1,
+  'ms' => 1,
+  'com.ms' => 1,
+  'edu.ms' => 1,
+  'gov.ms' => 1,
+  'net.ms' => 1,
+  'org.ms' => 1,
+  'mt' => 1,
+  'com.mt' => 1,
+  'edu.mt' => 1,
+  'net.mt' => 1,
+  'org.mt' => 1,
+  'mu' => 1,
+  'com.mu' => 1,
+  'net.mu' => 1,
+  'org.mu' => 1,
+  'gov.mu' => 1,
+  'ac.mu' => 1,
+  'co.mu' => 1,
+  'or.mu' => 1,
+  'museum' => 1,
+  'academy.museum' => 1,
+  'agriculture.museum' => 1,
+  'air.museum' => 1,
+  'airguard.museum' => 1,
+  'alabama.museum' => 1,
+  'alaska.museum' => 1,
+  'amber.museum' => 1,
+  'ambulance.museum' => 1,
+  'american.museum' => 1,
+  'americana.museum' => 1,
+  'americanantiques.museum' => 1,
+  'americanart.museum' => 1,
+  'amsterdam.museum' => 1,
+  'and.museum' => 1,
+  'annefrank.museum' => 1,
+  'anthro.museum' => 1,
+  'anthropology.museum' => 1,
+  'antiques.museum' => 1,
+  'aquarium.museum' => 1,
+  'arboretum.museum' => 1,
+  'archaeological.museum' => 1,
+  'archaeology.museum' => 1,
+  'architecture.museum' => 1,
+  'art.museum' => 1,
+  'artanddesign.museum' => 1,
+  'artcenter.museum' => 1,
+  'artdeco.museum' => 1,
+  'arteducation.museum' => 1,
+  'artgallery.museum' => 1,
+  'arts.museum' => 1,
+  'artsandcrafts.museum' => 1,
+  'asmatart.museum' => 1,
+  'assassination.museum' => 1,
+  'assisi.museum' => 1,
+  'association.museum' => 1,
+  'astronomy.museum' => 1,
+  'atlanta.museum' => 1,
+  'austin.museum' => 1,
+  'australia.museum' => 1,
+  'automotive.museum' => 1,
+  'aviation.museum' => 1,
+  'axis.museum' => 1,
+  'badajoz.museum' => 1,
+  'baghdad.museum' => 1,
+  'bahn.museum' => 1,
+  'bale.museum' => 1,
+  'baltimore.museum' => 1,
+  'barcelona.museum' => 1,
+  'baseball.museum' => 1,
+  'basel.museum' => 1,
+  'baths.museum' => 1,
+  'bauern.museum' => 1,
+  'beauxarts.museum' => 1,
+  'beeldengeluid.museum' => 1,
+  'bellevue.museum' => 1,
+  'bergbau.museum' => 1,
+  'berkeley.museum' => 1,
+  'berlin.museum' => 1,
+  'bern.museum' => 1,
+  'bible.museum' => 1,
+  'bilbao.museum' => 1,
+  'bill.museum' => 1,
+  'birdart.museum' => 1,
+  'birthplace.museum' => 1,
+  'bonn.museum' => 1,
+  'boston.museum' => 1,
+  'botanical.museum' => 1,
+  'botanicalgarden.museum' => 1,
+  'botanicgarden.museum' => 1,
+  'botany.museum' => 1,
+  'brandywinevalley.museum' => 1,
+  'brasil.museum' => 1,
+  'bristol.museum' => 1,
+  'british.museum' => 1,
+  'britishcolumbia.museum' => 1,
+  'broadcast.museum' => 1,
+  'brunel.museum' => 1,
+  'brussel.museum' => 1,
+  'brussels.museum' => 1,
+  'bruxelles.museum' => 1,
+  'building.museum' => 1,
+  'burghof.museum' => 1,
+  'bus.museum' => 1,
+  'bushey.museum' => 1,
+  'cadaques.museum' => 1,
+  'california.museum' => 1,
+  'cambridge.museum' => 1,
+  'can.museum' => 1,
+  'canada.museum' => 1,
+  'capebreton.museum' => 1,
+  'carrier.museum' => 1,
+  'cartoonart.museum' => 1,
+  'casadelamoneda.museum' => 1,
+  'castle.museum' => 1,
+  'castres.museum' => 1,
+  'celtic.museum' => 1,
+  'center.museum' => 1,
+  'chattanooga.museum' => 1,
+  'cheltenham.museum' => 1,
+  'chesapeakebay.museum' => 1,
+  'chicago.museum' => 1,
+  'children.museum' => 1,
+  'childrens.museum' => 1,
+  'childrensgarden.museum' => 1,
+  'chiropractic.museum' => 1,
+  'chocolate.museum' => 1,
+  'christiansburg.museum' => 1,
+  'cincinnati.museum' => 1,
+  'cinema.museum' => 1,
+  'circus.museum' => 1,
+  'civilisation.museum' => 1,
+  'civilization.museum' => 1,
+  'civilwar.museum' => 1,
+  'clinton.museum' => 1,
+  'clock.museum' => 1,
+  'coal.museum' => 1,
+  'coastaldefence.museum' => 1,
+  'cody.museum' => 1,
+  'coldwar.museum' => 1,
+  'collection.museum' => 1,
+  'colonialwilliamsburg.museum' => 1,
+  'coloradoplateau.museum' => 1,
+  'columbia.museum' => 1,
+  'columbus.museum' => 1,
+  'communication.museum' => 1,
+  'communications.museum' => 1,
+  'community.museum' => 1,
+  'computer.museum' => 1,
+  'computerhistory.museum' => 1,
+  'comunicações.museum' => 1,
+  'contemporary.museum' => 1,
+  'contemporaryart.museum' => 1,
+  'convent.museum' => 1,
+  'copenhagen.museum' => 1,
+  'corporation.museum' => 1,
+  'correios-e-telecomunicações.museum' => 1,
+  'corvette.museum' => 1,
+  'costume.museum' => 1,
+  'countryestate.museum' => 1,
+  'county.museum' => 1,
+  'crafts.museum' => 1,
+  'cranbrook.museum' => 1,
+  'creation.museum' => 1,
+  'cultural.museum' => 1,
+  'culturalcenter.museum' => 1,
+  'culture.museum' => 1,
+  'cyber.museum' => 1,
+  'cymru.museum' => 1,
+  'dali.museum' => 1,
+  'dallas.museum' => 1,
+  'database.museum' => 1,
+  'ddr.museum' => 1,
+  'decorativearts.museum' => 1,
+  'delaware.museum' => 1,
+  'delmenhorst.museum' => 1,
+  'denmark.museum' => 1,
+  'depot.museum' => 1,
+  'design.museum' => 1,
+  'detroit.museum' => 1,
+  'dinosaur.museum' => 1,
+  'discovery.museum' => 1,
+  'dolls.museum' => 1,
+  'donostia.museum' => 1,
+  'durham.museum' => 1,
+  'eastafrica.museum' => 1,
+  'eastcoast.museum' => 1,
+  'education.museum' => 1,
+  'educational.museum' => 1,
+  'egyptian.museum' => 1,
+  'eisenbahn.museum' => 1,
+  'elburg.museum' => 1,
+  'elvendrell.museum' => 1,
+  'embroidery.museum' => 1,
+  'encyclopedic.museum' => 1,
+  'england.museum' => 1,
+  'entomology.museum' => 1,
+  'environment.museum' => 1,
+  'environmentalconservation.museum' => 1,
+  'epilepsy.museum' => 1,
+  'essex.museum' => 1,
+  'estate.museum' => 1,
+  'ethnology.museum' => 1,
+  'exeter.museum' => 1,
+  'exhibition.museum' => 1,
+  'family.museum' => 1,
+  'farm.museum' => 1,
+  'farmequipment.museum' => 1,
+  'farmers.museum' => 1,
+  'farmstead.museum' => 1,
+  'field.museum' => 1,
+  'figueres.museum' => 1,
+  'filatelia.museum' => 1,
+  'film.museum' => 1,
+  'fineart.museum' => 1,
+  'finearts.museum' => 1,
+  'finland.museum' => 1,
+  'flanders.museum' => 1,
+  'florida.museum' => 1,
+  'force.museum' => 1,
+  'fortmissoula.museum' => 1,
+  'fortworth.museum' => 1,
+  'foundation.museum' => 1,
+  'francaise.museum' => 1,
+  'frankfurt.museum' => 1,
+  'franziskaner.museum' => 1,
+  'freemasonry.museum' => 1,
+  'freiburg.museum' => 1,
+  'fribourg.museum' => 1,
+  'frog.museum' => 1,
+  'fundacio.museum' => 1,
+  'furniture.museum' => 1,
+  'gallery.museum' => 1,
+  'garden.museum' => 1,
+  'gateway.museum' => 1,
+  'geelvinck.museum' => 1,
+  'gemological.museum' => 1,
+  'geology.museum' => 1,
+  'georgia.museum' => 1,
+  'giessen.museum' => 1,
+  'glas.museum' => 1,
+  'glass.museum' => 1,
+  'gorge.museum' => 1,
+  'grandrapids.museum' => 1,
+  'graz.museum' => 1,
+  'guernsey.museum' => 1,
+  'halloffame.museum' => 1,
+  'hamburg.museum' => 1,
+  'handson.museum' => 1,
+  'harvestcelebration.museum' => 1,
+  'hawaii.museum' => 1,
+  'health.museum' => 1,
+  'heimatunduhren.museum' => 1,
+  'hellas.museum' => 1,
+  'helsinki.museum' => 1,
+  'hembygdsforbund.museum' => 1,
+  'heritage.museum' => 1,
+  'histoire.museum' => 1,
+  'historical.museum' => 1,
+  'historicalsociety.museum' => 1,
+  'historichouses.museum' => 1,
+  'historisch.museum' => 1,
+  'historisches.museum' => 1,
+  'history.museum' => 1,
+  'historyofscience.museum' => 1,
+  'horology.museum' => 1,
+  'house.museum' => 1,
+  'humanities.museum' => 1,
+  'illustration.museum' => 1,
+  'imageandsound.museum' => 1,
+  'indian.museum' => 1,
+  'indiana.museum' => 1,
+  'indianapolis.museum' => 1,
+  'indianmarket.museum' => 1,
+  'intelligence.museum' => 1,
+  'interactive.museum' => 1,
+  'iraq.museum' => 1,
+  'iron.museum' => 1,
+  'isleofman.museum' => 1,
+  'jamison.museum' => 1,
+  'jefferson.museum' => 1,
+  'jerusalem.museum' => 1,
+  'jewelry.museum' => 1,
+  'jewish.museum' => 1,
+  'jewishart.museum' => 1,
+  'jfk.museum' => 1,
+  'journalism.museum' => 1,
+  'judaica.museum' => 1,
+  'judygarland.museum' => 1,
+  'juedisches.museum' => 1,
+  'juif.museum' => 1,
+  'karate.museum' => 1,
+  'karikatur.museum' => 1,
+  'kids.museum' => 1,
+  'koebenhavn.museum' => 1,
+  'koeln.museum' => 1,
+  'kunst.museum' => 1,
+  'kunstsammlung.museum' => 1,
+  'kunstunddesign.museum' => 1,
+  'labor.museum' => 1,
+  'labour.museum' => 1,
+  'lajolla.museum' => 1,
+  'lancashire.museum' => 1,
+  'landes.museum' => 1,
+  'lans.museum' => 1,
+  'läns.museum' => 1,
+  'larsson.museum' => 1,
+  'lewismiller.museum' => 1,
+  'lincoln.museum' => 1,
+  'linz.museum' => 1,
+  'living.museum' => 1,
+  'livinghistory.museum' => 1,
+  'localhistory.museum' => 1,
+  'london.museum' => 1,
+  'losangeles.museum' => 1,
+  'louvre.museum' => 1,
+  'loyalist.museum' => 1,
+  'lucerne.museum' => 1,
+  'luxembourg.museum' => 1,
+  'luzern.museum' => 1,
+  'mad.museum' => 1,
+  'madrid.museum' => 1,
+  'mallorca.museum' => 1,
+  'manchester.museum' => 1,
+  'mansion.museum' => 1,
+  'mansions.museum' => 1,
+  'manx.museum' => 1,
+  'marburg.museum' => 1,
+  'maritime.museum' => 1,
+  'maritimo.museum' => 1,
+  'maryland.museum' => 1,
+  'marylhurst.museum' => 1,
+  'media.museum' => 1,
+  'medical.museum' => 1,
+  'medizinhistorisches.museum' => 1,
+  'meeres.museum' => 1,
+  'memorial.museum' => 1,
+  'mesaverde.museum' => 1,
+  'michigan.museum' => 1,
+  'midatlantic.museum' => 1,
+  'military.museum' => 1,
+  'mill.museum' => 1,
+  'miners.museum' => 1,
+  'mining.museum' => 1,
+  'minnesota.museum' => 1,
+  'missile.museum' => 1,
+  'missoula.museum' => 1,
+  'modern.museum' => 1,
+  'moma.museum' => 1,
+  'money.museum' => 1,
+  'monmouth.museum' => 1,
+  'monticello.museum' => 1,
+  'montreal.museum' => 1,
+  'moscow.museum' => 1,
+  'motorcycle.museum' => 1,
+  'muenchen.museum' => 1,
+  'muenster.museum' => 1,
+  'mulhouse.museum' => 1,
+  'muncie.museum' => 1,
+  'museet.museum' => 1,
+  'museumcenter.museum' => 1,
+  'museumvereniging.museum' => 1,
+  'music.museum' => 1,
+  'national.museum' => 1,
+  'nationalfirearms.museum' => 1,
+  'nationalheritage.museum' => 1,
+  'nativeamerican.museum' => 1,
+  'naturalhistory.museum' => 1,
+  'naturalhistorymuseum.museum' => 1,
+  'naturalsciences.museum' => 1,
+  'nature.museum' => 1,
+  'naturhistorisches.museum' => 1,
+  'natuurwetenschappen.museum' => 1,
+  'naumburg.museum' => 1,
+  'naval.museum' => 1,
+  'nebraska.museum' => 1,
+  'neues.museum' => 1,
+  'newhampshire.museum' => 1,
+  'newjersey.museum' => 1,
+  'newmexico.museum' => 1,
+  'newport.museum' => 1,
+  'newspaper.museum' => 1,
+  'newyork.museum' => 1,
+  'niepce.museum' => 1,
+  'norfolk.museum' => 1,
+  'north.museum' => 1,
+  'nrw.museum' => 1,
+  'nuernberg.museum' => 1,
+  'nuremberg.museum' => 1,
+  'nyc.museum' => 1,
+  'nyny.museum' => 1,
+  'oceanographic.museum' => 1,
+  'oceanographique.museum' => 1,
+  'omaha.museum' => 1,
+  'online.museum' => 1,
+  'ontario.museum' => 1,
+  'openair.museum' => 1,
+  'oregon.museum' => 1,
+  'oregontrail.museum' => 1,
+  'otago.museum' => 1,
+  'oxford.museum' => 1,
+  'pacific.museum' => 1,
+  'paderborn.museum' => 1,
+  'palace.museum' => 1,
+  'paleo.museum' => 1,
+  'palmsprings.museum' => 1,
+  'panama.museum' => 1,
+  'paris.museum' => 1,
+  'pasadena.museum' => 1,
+  'pharmacy.museum' => 1,
+  'philadelphia.museum' => 1,
+  'philadelphiaarea.museum' => 1,
+  'philately.museum' => 1,
+  'phoenix.museum' => 1,
+  'photography.museum' => 1,
+  'pilots.museum' => 1,
+  'pittsburgh.museum' => 1,
+  'planetarium.museum' => 1,
+  'plantation.museum' => 1,
+  'plants.museum' => 1,
+  'plaza.museum' => 1,
+  'portal.museum' => 1,
+  'portland.museum' => 1,
+  'portlligat.museum' => 1,
+  'posts-and-telecommunications.museum' => 1,
+  'preservation.museum' => 1,
+  'presidio.museum' => 1,
+  'press.museum' => 1,
+  'project.museum' => 1,
+  'public.museum' => 1,
+  'pubol.museum' => 1,
+  'quebec.museum' => 1,
+  'railroad.museum' => 1,
+  'railway.museum' => 1,
+  'research.museum' => 1,
+  'resistance.museum' => 1,
+  'riodejaneiro.museum' => 1,
+  'rochester.museum' => 1,
+  'rockart.museum' => 1,
+  'roma.museum' => 1,
+  'russia.museum' => 1,
+  'saintlouis.museum' => 1,
+  'salem.museum' => 1,
+  'salvadordali.museum' => 1,
+  'salzburg.museum' => 1,
+  'sandiego.museum' => 1,
+  'sanfrancisco.museum' => 1,
+  'santabarbara.museum' => 1,
+  'santacruz.museum' => 1,
+  'santafe.museum' => 1,
+  'saskatchewan.museum' => 1,
+  'satx.museum' => 1,
+  'savannahga.museum' => 1,
+  'schlesisches.museum' => 1,
+  'schoenbrunn.museum' => 1,
+  'schokoladen.museum' => 1,
+  'school.museum' => 1,
+  'schweiz.museum' => 1,
+  'science.museum' => 1,
+  'scienceandhistory.museum' => 1,
+  'scienceandindustry.museum' => 1,
+  'sciencecenter.museum' => 1,
+  'sciencecenters.museum' => 1,
+  'science-fiction.museum' => 1,
+  'sciencehistory.museum' => 1,
+  'sciences.museum' => 1,
+  'sciencesnaturelles.museum' => 1,
+  'scotland.museum' => 1,
+  'seaport.museum' => 1,
+  'settlement.museum' => 1,
+  'settlers.museum' => 1,
+  'shell.museum' => 1,
+  'sherbrooke.museum' => 1,
+  'sibenik.museum' => 1,
+  'silk.museum' => 1,
+  'ski.museum' => 1,
+  'skole.museum' => 1,
+  'society.museum' => 1,
+  'sologne.museum' => 1,
+  'soundandvision.museum' => 1,
+  'southcarolina.museum' => 1,
+  'southwest.museum' => 1,
+  'space.museum' => 1,
+  'spy.museum' => 1,
+  'square.museum' => 1,
+  'stadt.museum' => 1,
+  'stalbans.museum' => 1,
+  'starnberg.museum' => 1,
+  'state.museum' => 1,
+  'stateofdelaware.museum' => 1,
+  'station.museum' => 1,
+  'steam.museum' => 1,
+  'steiermark.museum' => 1,
+  'stjohn.museum' => 1,
+  'stockholm.museum' => 1,
+  'stpetersburg.museum' => 1,
+  'stuttgart.museum' => 1,
+  'suisse.museum' => 1,
+  'surgeonshall.museum' => 1,
+  'surrey.museum' => 1,
+  'svizzera.museum' => 1,
+  'sweden.museum' => 1,
+  'sydney.museum' => 1,
+  'tank.museum' => 1,
+  'tcm.museum' => 1,
+  'technology.museum' => 1,
+  'telekommunikation.museum' => 1,
+  'television.museum' => 1,
+  'texas.museum' => 1,
+  'textile.museum' => 1,
+  'theater.museum' => 1,
+  'time.museum' => 1,
+  'timekeeping.museum' => 1,
+  'topology.museum' => 1,
+  'torino.museum' => 1,
+  'touch.museum' => 1,
+  'town.museum' => 1,
+  'transport.museum' => 1,
+  'tree.museum' => 1,
+  'trolley.museum' => 1,
+  'trust.museum' => 1,
+  'trustee.museum' => 1,
+  'uhren.museum' => 1,
+  'ulm.museum' => 1,
+  'undersea.museum' => 1,
+  'university.museum' => 1,
+  'usa.museum' => 1,
+  'usantiques.museum' => 1,
+  'usarts.museum' => 1,
+  'uscountryestate.museum' => 1,
+  'usculture.museum' => 1,
+  'usdecorativearts.museum' => 1,
+  'usgarden.museum' => 1,
+  'ushistory.museum' => 1,
+  'ushuaia.museum' => 1,
+  'uslivinghistory.museum' => 1,
+  'utah.museum' => 1,
+  'uvic.museum' => 1,
+  'valley.museum' => 1,
+  'vantaa.museum' => 1,
+  'versailles.museum' => 1,
+  'viking.museum' => 1,
+  'village.museum' => 1,
+  'virginia.museum' => 1,
+  'virtual.museum' => 1,
+  'virtuel.museum' => 1,
+  'vlaanderen.museum' => 1,
+  'volkenkunde.museum' => 1,
+  'wales.museum' => 1,
+  'wallonie.museum' => 1,
+  'war.museum' => 1,
+  'washingtondc.museum' => 1,
+  'watchandclock.museum' => 1,
+  'watch-and-clock.museum' => 1,
+  'western.museum' => 1,
+  'westfalen.museum' => 1,
+  'whaling.museum' => 1,
+  'wildlife.museum' => 1,
+  'williamsburg.museum' => 1,
+  'windmill.museum' => 1,
+  'workshop.museum' => 1,
+  'york.museum' => 1,
+  'yorkshire.museum' => 1,
+  'yosemite.museum' => 1,
+  'youth.museum' => 1,
+  'zoological.museum' => 1,
+  'zoology.museum' => 1,
+  'ירושלים.museum' => 1,
+  'иком.museum' => 1,
+  'mv' => 1,
+  'aero.mv' => 1,
+  'biz.mv' => 1,
+  'com.mv' => 1,
+  'coop.mv' => 1,
+  'edu.mv' => 1,
+  'gov.mv' => 1,
+  'info.mv' => 1,
+  'int.mv' => 1,
+  'mil.mv' => 1,
+  'museum.mv' => 1,
+  'name.mv' => 1,
+  'net.mv' => 1,
+  'org.mv' => 1,
+  'pro.mv' => 1,
+  'mw' => 1,
+  'ac.mw' => 1,
+  'biz.mw' => 1,
+  'co.mw' => 1,
+  'com.mw' => 1,
+  'coop.mw' => 1,
+  'edu.mw' => 1,
+  'gov.mw' => 1,
+  'int.mw' => 1,
+  'museum.mw' => 1,
+  'net.mw' => 1,
+  'org.mw' => 1,
+  'mx' => 1,
+  'com.mx' => 1,
+  'org.mx' => 1,
+  'gob.mx' => 1,
+  'edu.mx' => 1,
+  'net.mx' => 1,
+  'my' => 1,
+  'com.my' => 1,
+  'net.my' => 1,
+  'org.my' => 1,
+  'gov.my' => 1,
+  'edu.my' => 1,
+  'mil.my' => 1,
+  'name.my' => 1,
+  'mz' => 1,
+  'ac.mz' => 1,
+  'adv.mz' => 1,
+  'co.mz' => 1,
+  'edu.mz' => 1,
+  'gov.mz' => 1,
+  'mil.mz' => 1,
+  'net.mz' => 1,
+  'org.mz' => 1,
+  'na' => 1,
+  'info.na' => 1,
+  'pro.na' => 1,
+  'name.na' => 1,
+  'school.na' => 1,
+  'or.na' => 1,
+  'dr.na' => 1,
+  'us.na' => 1,
+  'mx.na' => 1,
+  'ca.na' => 1,
+  'in.na' => 1,
+  'cc.na' => 1,
+  'tv.na' => 1,
+  'ws.na' => 1,
+  'mobi.na' => 1,
+  'co.na' => 1,
+  'com.na' => 1,
+  'org.na' => 1,
+  'name' => 1,
+  'nc' => 1,
+  'asso.nc' => 1,
+  'nom.nc' => 1,
+  'ne' => 1,
+  'net' => 1,
+  'nf' => 1,
+  'com.nf' => 1,
+  'net.nf' => 1,
+  'per.nf' => 1,
+  'rec.nf' => 1,
+  'web.nf' => 1,
+  'arts.nf' => 1,
+  'firm.nf' => 1,
+  'info.nf' => 1,
+  'other.nf' => 1,
+  'store.nf' => 1,
+  'ng' => 1,
+  'com.ng' => 1,
+  'edu.ng' => 1,
+  'gov.ng' => 1,
+  'i.ng' => 1,
+  'mil.ng' => 1,
+  'mobi.ng' => 1,
+  'name.ng' => 1,
+  'net.ng' => 1,
+  'org.ng' => 1,
+  'sch.ng' => 1,
+  'ni' => 1,
+  'ac.ni' => 1,
+  'biz.ni' => 1,
+  'co.ni' => 1,
+  'com.ni' => 1,
+  'edu.ni' => 1,
+  'gob.ni' => 1,
+  'in.ni' => 1,
+  'info.ni' => 1,
+  'int.ni' => 1,
+  'mil.ni' => 1,
+  'net.ni' => 1,
+  'nom.ni' => 1,
+  'org.ni' => 1,
+  'web.ni' => 1,
+  'nl' => 1,
+  'bv.nl' => 1,
+  'no' => 1,
+  'fhs.no' => 1,
+  'vgs.no' => 1,
+  'fylkesbibl.no' => 1,
+  'folkebibl.no' => 1,
+  'museum.no' => 1,
+  'idrett.no' => 1,
+  'priv.no' => 1,
+  'mil.no' => 1,
+  'stat.no' => 1,
+  'dep.no' => 1,
+  'kommune.no' => 1,
+  'herad.no' => 1,
+  'aa.no' => 1,
+  'ah.no' => 1,
+  'bu.no' => 1,
+  'fm.no' => 1,
+  'hl.no' => 1,
+  'hm.no' => 1,
+  'jan-mayen.no' => 1,
+  'mr.no' => 1,
+  'nl.no' => 1,
+  'nt.no' => 1,
+  'of.no' => 1,
+  'ol.no' => 1,
+  'oslo.no' => 1,
+  'rl.no' => 1,
+  'sf.no' => 1,
+  'st.no' => 1,
+  'svalbard.no' => 1,
+  'tm.no' => 1,
+  'tr.no' => 1,
+  'va.no' => 1,
+  'vf.no' => 1,
+  'gs.aa.no' => 1,
+  'gs.ah.no' => 1,
+  'gs.bu.no' => 1,
+  'gs.fm.no' => 1,
+  'gs.hl.no' => 1,
+  'gs.hm.no' => 1,
+  'gs.jan-mayen.no' => 1,
+  'gs.mr.no' => 1,
+  'gs.nl.no' => 1,
+  'gs.nt.no' => 1,
+  'gs.of.no' => 1,
+  'gs.ol.no' => 1,
+  'gs.oslo.no' => 1,
+  'gs.rl.no' => 1,
+  'gs.sf.no' => 1,
+  'gs.st.no' => 1,
+  'gs.svalbard.no' => 1,
+  'gs.tm.no' => 1,
+  'gs.tr.no' => 1,
+  'gs.va.no' => 1,
+  'gs.vf.no' => 1,
+  'akrehamn.no' => 1,
+  'åkrehamn.no' => 1,
+  'algard.no' => 1,
+  'ålgård.no' => 1,
+  'arna.no' => 1,
+  'brumunddal.no' => 1,
+  'bryne.no' => 1,
+  'bronnoysund.no' => 1,
+  'brønnøysund.no' => 1,
+  'drobak.no' => 1,
+  'drøbak.no' => 1,
+  'egersund.no' => 1,
+  'fetsund.no' => 1,
+  'floro.no' => 1,
+  'florø.no' => 1,
+  'fredrikstad.no' => 1,
+  'hokksund.no' => 1,
+  'honefoss.no' => 1,
+  'hønefoss.no' => 1,
+  'jessheim.no' => 1,
+  'jorpeland.no' => 1,
+  'jørpeland.no' => 1,
+  'kirkenes.no' => 1,
+  'kopervik.no' => 1,
+  'krokstadelva.no' => 1,
+  'langevag.no' => 1,
+  'langevåg.no' => 1,
+  'leirvik.no' => 1,
+  'mjondalen.no' => 1,
+  'mjøndalen.no' => 1,
+  'mo-i-rana.no' => 1,
+  'mosjoen.no' => 1,
+  'mosjøen.no' => 1,
+  'nesoddtangen.no' => 1,
+  'orkanger.no' => 1,
+  'osoyro.no' => 1,
+  'osøyro.no' => 1,
+  'raholt.no' => 1,
+  'råholt.no' => 1,
+  'sandnessjoen.no' => 1,
+  'sandnessjøen.no' => 1,
+  'skedsmokorset.no' => 1,
+  'slattum.no' => 1,
+  'spjelkavik.no' => 1,
+  'stathelle.no' => 1,
+  'stavern.no' => 1,
+  'stjordalshalsen.no' => 1,
+  'stjørdalshalsen.no' => 1,
+  'tananger.no' => 1,
+  'tranby.no' => 1,
+  'vossevangen.no' => 1,
+  'afjord.no' => 1,
+  'åfjord.no' => 1,
+  'agdenes.no' => 1,
+  'al.no' => 1,
+  'ål.no' => 1,
+  'alesund.no' => 1,
+  'ålesund.no' => 1,
+  'alstahaug.no' => 1,
+  'alta.no' => 1,
+  'áltá.no' => 1,
+  'alaheadju.no' => 1,
+  'álaheadju.no' => 1,
+  'alvdal.no' => 1,
+  'amli.no' => 1,
+  'åmli.no' => 1,
+  'amot.no' => 1,
+  'åmot.no' => 1,
+  'andebu.no' => 1,
+  'andoy.no' => 1,
+  'andøy.no' => 1,
+  'andasuolo.no' => 1,
+  'ardal.no' => 1,
+  'årdal.no' => 1,
+  'aremark.no' => 1,
+  'arendal.no' => 1,
+  'ås.no' => 1,
+  'aseral.no' => 1,
+  'åseral.no' => 1,
+  'asker.no' => 1,
+  'askim.no' => 1,
+  'askvoll.no' => 1,
+  'askoy.no' => 1,
+  'askøy.no' => 1,
+  'asnes.no' => 1,
+  'åsnes.no' => 1,
+  'audnedaln.no' => 1,
+  'aukra.no' => 1,
+  'aure.no' => 1,
+  'aurland.no' => 1,
+  'aurskog-holand.no' => 1,
+  'aurskog-høland.no' => 1,
+  'austevoll.no' => 1,
+  'austrheim.no' => 1,
+  'averoy.no' => 1,
+  'averøy.no' => 1,
+  'balestrand.no' => 1,
+  'ballangen.no' => 1,
+  'balat.no' => 1,
+  'bálát.no' => 1,
+  'balsfjord.no' => 1,
+  'bahccavuotna.no' => 1,
+  'báhccavuotna.no' => 1,
+  'bamble.no' => 1,
+  'bardu.no' => 1,
+  'beardu.no' => 1,
+  'beiarn.no' => 1,
+  'bajddar.no' => 1,
+  'bájddar.no' => 1,
+  'baidar.no' => 1,
+  'báidár.no' => 1,
+  'berg.no' => 1,
+  'bergen.no' => 1,
+  'berlevag.no' => 1,
+  'berlevåg.no' => 1,
+  'bearalvahki.no' => 1,
+  'bearalváhki.no' => 1,
+  'bindal.no' => 1,
+  'birkenes.no' => 1,
+  'bjarkoy.no' => 1,
+  'bjarkøy.no' => 1,
+  'bjerkreim.no' => 1,
+  'bjugn.no' => 1,
+  'bodo.no' => 1,
+  'bodø.no' => 1,
+  'badaddja.no' => 1,
+  'bådåddjå.no' => 1,
+  'budejju.no' => 1,
+  'bokn.no' => 1,
+  'bremanger.no' => 1,
+  'bronnoy.no' => 1,
+  'brønnøy.no' => 1,
+  'bygland.no' => 1,
+  'bykle.no' => 1,
+  'barum.no' => 1,
+  'bærum.no' => 1,
+  'bo.telemark.no' => 1,
+  'bø.telemark.no' => 1,
+  'bo.nordland.no' => 1,
+  'bø.nordland.no' => 1,
+  'bievat.no' => 1,
+  'bievát.no' => 1,
+  'bomlo.no' => 1,
+  'bømlo.no' => 1,
+  'batsfjord.no' => 1,
+  'båtsfjord.no' => 1,
+  'bahcavuotna.no' => 1,
+  'báhcavuotna.no' => 1,
+  'dovre.no' => 1,
+  'drammen.no' => 1,
+  'drangedal.no' => 1,
+  'dyroy.no' => 1,
+  'dyrøy.no' => 1,
+  'donna.no' => 1,
+  'dønna.no' => 1,
+  'eid.no' => 1,
+  'eidfjord.no' => 1,
+  'eidsberg.no' => 1,
+  'eidskog.no' => 1,
+  'eidsvoll.no' => 1,
+  'eigersund.no' => 1,
+  'elverum.no' => 1,
+  'enebakk.no' => 1,
+  'engerdal.no' => 1,
+  'etne.no' => 1,
+  'etnedal.no' => 1,
+  'evenes.no' => 1,
+  'evenassi.no' => 1,
+  'evenášši.no' => 1,
+  'evje-og-hornnes.no' => 1,
+  'farsund.no' => 1,
+  'fauske.no' => 1,
+  'fuossko.no' => 1,
+  'fuoisku.no' => 1,
+  'fedje.no' => 1,
+  'fet.no' => 1,
+  'finnoy.no' => 1,
+  'finnøy.no' => 1,
+  'fitjar.no' => 1,
+  'fjaler.no' => 1,
+  'fjell.no' => 1,
+  'flakstad.no' => 1,
+  'flatanger.no' => 1,
+  'flekkefjord.no' => 1,
+  'flesberg.no' => 1,
+  'flora.no' => 1,
+  'fla.no' => 1,
+  'flå.no' => 1,
+  'folldal.no' => 1,
+  'forsand.no' => 1,
+  'fosnes.no' => 1,
+  'frei.no' => 1,
+  'frogn.no' => 1,
+  'froland.no' => 1,
+  'frosta.no' => 1,
+  'frana.no' => 1,
+  'fræna.no' => 1,
+  'froya.no' => 1,
+  'frøya.no' => 1,
+  'fusa.no' => 1,
+  'fyresdal.no' => 1,
+  'forde.no' => 1,
+  'førde.no' => 1,
+  'gamvik.no' => 1,
+  'gangaviika.no' => 1,
+  'gáŋgaviika.no' => 1,
+  'gaular.no' => 1,
+  'gausdal.no' => 1,
+  'gildeskal.no' => 1,
+  'gildeskål.no' => 1,
+  'giske.no' => 1,
+  'gjemnes.no' => 1,
+  'gjerdrum.no' => 1,
+  'gjerstad.no' => 1,
+  'gjesdal.no' => 1,
+  'gjovik.no' => 1,
+  'gjøvik.no' => 1,
+  'gloppen.no' => 1,
+  'gol.no' => 1,
+  'gran.no' => 1,
+  'grane.no' => 1,
+  'granvin.no' => 1,
+  'gratangen.no' => 1,
+  'grimstad.no' => 1,
+  'grong.no' => 1,
+  'kraanghke.no' => 1,
+  'kråanghke.no' => 1,
+  'grue.no' => 1,
+  'gulen.no' => 1,
+  'hadsel.no' => 1,
+  'halden.no' => 1,
+  'halsa.no' => 1,
+  'hamar.no' => 1,
+  'hamaroy.no' => 1,
+  'habmer.no' => 1,
+  'hábmer.no' => 1,
+  'hapmir.no' => 1,
+  'hápmir.no' => 1,
+  'hammerfest.no' => 1,
+  'hammarfeasta.no' => 1,
+  'hámmárfeasta.no' => 1,
+  'haram.no' => 1,
+  'hareid.no' => 1,
+  'harstad.no' => 1,
+  'hasvik.no' => 1,
+  'aknoluokta.no' => 1,
+  'ákŋoluokta.no' => 1,
+  'hattfjelldal.no' => 1,
+  'aarborte.no' => 1,
+  'haugesund.no' => 1,
+  'hemne.no' => 1,
+  'hemnes.no' => 1,
+  'hemsedal.no' => 1,
+  'heroy.more-og-romsdal.no' => 1,
+  'herøy.møre-og-romsdal.no' => 1,
+  'heroy.nordland.no' => 1,
+  'herøy.nordland.no' => 1,
+  'hitra.no' => 1,
+  'hjartdal.no' => 1,
+  'hjelmeland.no' => 1,
+  'hobol.no' => 1,
+  'hobøl.no' => 1,
+  'hof.no' => 1,
+  'hol.no' => 1,
+  'hole.no' => 1,
+  'holmestrand.no' => 1,
+  'holtalen.no' => 1,
+  'holtålen.no' => 1,
+  'hornindal.no' => 1,
+  'horten.no' => 1,
+  'hurdal.no' => 1,
+  'hurum.no' => 1,
+  'hvaler.no' => 1,
+  'hyllestad.no' => 1,
+  'hagebostad.no' => 1,
+  'hægebostad.no' => 1,
+  'hoyanger.no' => 1,
+  'høyanger.no' => 1,
+  'hoylandet.no' => 1,
+  'høylandet.no' => 1,
+  'ha.no' => 1,
+  'hå.no' => 1,
+  'ibestad.no' => 1,
+  'inderoy.no' => 1,
+  'inderøy.no' => 1,
+  'iveland.no' => 1,
+  'jevnaker.no' => 1,
+  'jondal.no' => 1,
+  'jolster.no' => 1,
+  'jølster.no' => 1,
+  'karasjok.no' => 1,
+  'karasjohka.no' => 1,
+  'kárášjohka.no' => 1,
+  'karlsoy.no' => 1,
+  'galsa.no' => 1,
+  'gálsá.no' => 1,
+  'karmoy.no' => 1,
+  'karmøy.no' => 1,
+  'kautokeino.no' => 1,
+  'guovdageaidnu.no' => 1,
+  'klepp.no' => 1,
+  'klabu.no' => 1,
+  'klæbu.no' => 1,
+  'kongsberg.no' => 1,
+  'kongsvinger.no' => 1,
+  'kragero.no' => 1,
+  'kragerø.no' => 1,
+  'kristiansand.no' => 1,
+  'kristiansund.no' => 1,
+  'krodsherad.no' => 1,
+  'krødsherad.no' => 1,
+  'kvalsund.no' => 1,
+  'rahkkeravju.no' => 1,
+  'ráhkkerávju.no' => 1,
+  'kvam.no' => 1,
+  'kvinesdal.no' => 1,
+  'kvinnherad.no' => 1,
+  'kviteseid.no' => 1,
+  'kvitsoy.no' => 1,
+  'kvitsøy.no' => 1,
+  'kvafjord.no' => 1,
+  'kvæfjord.no' => 1,
+  'giehtavuoatna.no' => 1,
+  'kvanangen.no' => 1,
+  'kvænangen.no' => 1,
+  'navuotna.no' => 1,
+  'návuotna.no' => 1,
+  'kafjord.no' => 1,
+  'kåfjord.no' => 1,
+  'gaivuotna.no' => 1,
+  'gáivuotna.no' => 1,
+  'larvik.no' => 1,
+  'lavangen.no' => 1,
+  'lavagis.no' => 1,
+  'loabat.no' => 1,
+  'loabát.no' => 1,
+  'lebesby.no' => 1,
+  'davvesiida.no' => 1,
+  'leikanger.no' => 1,
+  'leirfjord.no' => 1,
+  'leka.no' => 1,
+  'leksvik.no' => 1,
+  'lenvik.no' => 1,
+  'leangaviika.no' => 1,
+  'leaŋgaviika.no' => 1,
+  'lesja.no' => 1,
+  'levanger.no' => 1,
+  'lier.no' => 1,
+  'lierne.no' => 1,
+  'lillehammer.no' => 1,
+  'lillesand.no' => 1,
+  'lindesnes.no' => 1,
+  'lindas.no' => 1,
+  'lindås.no' => 1,
+  'lom.no' => 1,
+  'loppa.no' => 1,
+  'lahppi.no' => 1,
+  'láhppi.no' => 1,
+  'lund.no' => 1,
+  'lunner.no' => 1,
+  'luroy.no' => 1,
+  'lurøy.no' => 1,
+  'luster.no' => 1,
+  'lyngdal.no' => 1,
+  'lyngen.no' => 1,
+  'ivgu.no' => 1,
+  'lardal.no' => 1,
+  'lerdal.no' => 1,
+  'lærdal.no' => 1,
+  'lodingen.no' => 1,
+  'lødingen.no' => 1,
+  'lorenskog.no' => 1,
+  'lørenskog.no' => 1,
+  'loten.no' => 1,
+  'løten.no' => 1,
+  'malvik.no' => 1,
+  'masoy.no' => 1,
+  'måsøy.no' => 1,
+  'muosat.no' => 1,
+  'muosát.no' => 1,
+  'mandal.no' => 1,
+  'marker.no' => 1,
+  'marnardal.no' => 1,
+  'masfjorden.no' => 1,
+  'meland.no' => 1,
+  'meldal.no' => 1,
+  'melhus.no' => 1,
+  'meloy.no' => 1,
+  'meløy.no' => 1,
+  'meraker.no' => 1,
+  'meråker.no' => 1,
+  'moareke.no' => 1,
+  'moåreke.no' => 1,
+  'midsund.no' => 1,
+  'midtre-gauldal.no' => 1,
+  'modalen.no' => 1,
+  'modum.no' => 1,
+  'molde.no' => 1,
+  'moskenes.no' => 1,
+  'moss.no' => 1,
+  'mosvik.no' => 1,
+  'malselv.no' => 1,
+  'målselv.no' => 1,
+  'malatvuopmi.no' => 1,
+  'málatvuopmi.no' => 1,
+  'namdalseid.no' => 1,
+  'aejrie.no' => 1,
+  'namsos.no' => 1,
+  'namsskogan.no' => 1,
+  'naamesjevuemie.no' => 1,
+  'nååmesjevuemie.no' => 1,
+  'laakesvuemie.no' => 1,
+  'nannestad.no' => 1,
+  'narvik.no' => 1,
+  'narviika.no' => 1,
+  'naustdal.no' => 1,
+  'nedre-eiker.no' => 1,
+  'nes.akershus.no' => 1,
+  'nes.buskerud.no' => 1,
+  'nesna.no' => 1,
+  'nesodden.no' => 1,
+  'nesseby.no' => 1,
+  'unjarga.no' => 1,
+  'unjárga.no' => 1,
+  'nesset.no' => 1,
+  'nissedal.no' => 1,
+  'nittedal.no' => 1,
+  'nord-aurdal.no' => 1,
+  'nord-fron.no' => 1,
+  'nord-odal.no' => 1,
+  'norddal.no' => 1,
+  'nordkapp.no' => 1,
+  'davvenjarga.no' => 1,
+  'davvenjárga.no' => 1,
+  'nordre-land.no' => 1,
+  'nordreisa.no' => 1,
+  'raisa.no' => 1,
+  'ráisa.no' => 1,
+  'nore-og-uvdal.no' => 1,
+  'notodden.no' => 1,
+  'naroy.no' => 1,
+  'nærøy.no' => 1,
+  'notteroy.no' => 1,
+  'nøtterøy.no' => 1,
+  'odda.no' => 1,
+  'oksnes.no' => 1,
+  'øksnes.no' => 1,
+  'oppdal.no' => 1,
+  'oppegard.no' => 1,
+  'oppegård.no' => 1,
+  'orkdal.no' => 1,
+  'orland.no' => 1,
+  'ørland.no' => 1,
+  'orskog.no' => 1,
+  'ørskog.no' => 1,
+  'orsta.no' => 1,
+  'ørsta.no' => 1,
+  'os.hedmark.no' => 1,
+  'os.hordaland.no' => 1,
+  'osen.no' => 1,
+  'osteroy.no' => 1,
+  'osterøy.no' => 1,
+  'ostre-toten.no' => 1,
+  'østre-toten.no' => 1,
+  'overhalla.no' => 1,
+  'ovre-eiker.no' => 1,
+  'øvre-eiker.no' => 1,
+  'oyer.no' => 1,
+  'øyer.no' => 1,
+  'oygarden.no' => 1,
+  'øygarden.no' => 1,
+  'oystre-slidre.no' => 1,
+  'øystre-slidre.no' => 1,
+  'porsanger.no' => 1,
+  'porsangu.no' => 1,
+  'porsáŋgu.no' => 1,
+  'porsgrunn.no' => 1,
+  'radoy.no' => 1,
+  'radøy.no' => 1,
+  'rakkestad.no' => 1,
+  'rana.no' => 1,
+  'ruovat.no' => 1,
+  'randaberg.no' => 1,
+  'rauma.no' => 1,
+  'rendalen.no' => 1,
+  'rennebu.no' => 1,
+  'rennesoy.no' => 1,
+  'rennesøy.no' => 1,
+  'rindal.no' => 1,
+  'ringebu.no' => 1,
+  'ringerike.no' => 1,
+  'ringsaker.no' => 1,
+  'rissa.no' => 1,
+  'risor.no' => 1,
+  'risør.no' => 1,
+  'roan.no' => 1,
+  'rollag.no' => 1,
+  'rygge.no' => 1,
+  'ralingen.no' => 1,
+  'rælingen.no' => 1,
+  'rodoy.no' => 1,
+  'rødøy.no' => 1,
+  'romskog.no' => 1,
+  'rømskog.no' => 1,
+  'roros.no' => 1,
+  'røros.no' => 1,
+  'rost.no' => 1,
+  'røst.no' => 1,
+  'royken.no' => 1,
+  'røyken.no' => 1,
+  'royrvik.no' => 1,
+  'røyrvik.no' => 1,
+  'rade.no' => 1,
+  'råde.no' => 1,
+  'salangen.no' => 1,
+  'siellak.no' => 1,
+  'saltdal.no' => 1,
+  'salat.no' => 1,
+  'sálát.no' => 1,
+  'sálat.no' => 1,
+  'samnanger.no' => 1,
+  'sande.more-og-romsdal.no' => 1,
+  'sande.møre-og-romsdal.no' => 1,
+  'sande.vestfold.no' => 1,
+  'sandefjord.no' => 1,
+  'sandnes.no' => 1,
+  'sandoy.no' => 1,
+  'sandøy.no' => 1,
+  'sarpsborg.no' => 1,
+  'sauda.no' => 1,
+  'sauherad.no' => 1,
+  'sel.no' => 1,
+  'selbu.no' => 1,
+  'selje.no' => 1,
+  'seljord.no' => 1,
+  'sigdal.no' => 1,
+  'siljan.no' => 1,
+  'sirdal.no' => 1,
+  'skaun.no' => 1,
+  'skedsmo.no' => 1,
+  'ski.no' => 1,
+  'skien.no' => 1,
+  'skiptvet.no' => 1,
+  'skjervoy.no' => 1,
+  'skjervøy.no' => 1,
+  'skierva.no' => 1,
+  'skiervá.no' => 1,
+  'skjak.no' => 1,
+  'skjåk.no' => 1,
+  'skodje.no' => 1,
+  'skanland.no' => 1,
+  'skånland.no' => 1,
+  'skanit.no' => 1,
+  'skánit.no' => 1,
+  'smola.no' => 1,
+  'smøla.no' => 1,
+  'snillfjord.no' => 1,
+  'snasa.no' => 1,
+  'snåsa.no' => 1,
+  'snoasa.no' => 1,
+  'snaase.no' => 1,
+  'snåase.no' => 1,
+  'sogndal.no' => 1,
+  'sokndal.no' => 1,
+  'sola.no' => 1,
+  'solund.no' => 1,
+  'songdalen.no' => 1,
+  'sortland.no' => 1,
+  'spydeberg.no' => 1,
+  'stange.no' => 1,
+  'stavanger.no' => 1,
+  'steigen.no' => 1,
+  'steinkjer.no' => 1,
+  'stjordal.no' => 1,
+  'stjørdal.no' => 1,
+  'stokke.no' => 1,
+  'stor-elvdal.no' => 1,
+  'stord.no' => 1,
+  'stordal.no' => 1,
+  'storfjord.no' => 1,
+  'omasvuotna.no' => 1,
+  'strand.no' => 1,
+  'stranda.no' => 1,
+  'stryn.no' => 1,
+  'sula.no' => 1,
+  'suldal.no' => 1,
+  'sund.no' => 1,
+  'sunndal.no' => 1,
+  'surnadal.no' => 1,
+  'sveio.no' => 1,
+  'svelvik.no' => 1,
+  'sykkylven.no' => 1,
+  'sogne.no' => 1,
+  'søgne.no' => 1,
+  'somna.no' => 1,
+  'sømna.no' => 1,
+  'sondre-land.no' => 1,
+  'søndre-land.no' => 1,
+  'sor-aurdal.no' => 1,
+  'sør-aurdal.no' => 1,
+  'sor-fron.no' => 1,
+  'sør-fron.no' => 1,
+  'sor-odal.no' => 1,
+  'sør-odal.no' => 1,
+  'sor-varanger.no' => 1,
+  'sør-varanger.no' => 1,
+  'matta-varjjat.no' => 1,
+  'mátta-várjjat.no' => 1,
+  'sorfold.no' => 1,
+  'sørfold.no' => 1,
+  'sorreisa.no' => 1,
+  'sørreisa.no' => 1,
+  'sorum.no' => 1,
+  'sørum.no' => 1,
+  'tana.no' => 1,
+  'deatnu.no' => 1,
+  'time.no' => 1,
+  'tingvoll.no' => 1,
+  'tinn.no' => 1,
+  'tjeldsund.no' => 1,
+  'dielddanuorri.no' => 1,
+  'tjome.no' => 1,
+  'tjøme.no' => 1,
+  'tokke.no' => 1,
+  'tolga.no' => 1,
+  'torsken.no' => 1,
+  'tranoy.no' => 1,
+  'tranøy.no' => 1,
+  'tromso.no' => 1,
+  'tromsø.no' => 1,
+  'tromsa.no' => 1,
+  'romsa.no' => 1,
+  'trondheim.no' => 1,
+  'troandin.no' => 1,
+  'trysil.no' => 1,
+  'trana.no' => 1,
+  'træna.no' => 1,
+  'trogstad.no' => 1,
+  'trøgstad.no' => 1,
+  'tvedestrand.no' => 1,
+  'tydal.no' => 1,
+  'tynset.no' => 1,
+  'tysfjord.no' => 1,
+  'divtasvuodna.no' => 1,
+  'divttasvuotna.no' => 1,
+  'tysnes.no' => 1,
+  'tysvar.no' => 1,
+  'tysvær.no' => 1,
+  'tonsberg.no' => 1,
+  'tønsberg.no' => 1,
+  'ullensaker.no' => 1,
+  'ullensvang.no' => 1,
+  'ulvik.no' => 1,
+  'utsira.no' => 1,
+  'vadso.no' => 1,
+  'vadsø.no' => 1,
+  'cahcesuolo.no' => 1,
+  'čáhcesuolo.no' => 1,
+  'vaksdal.no' => 1,
+  'valle.no' => 1,
+  'vang.no' => 1,
+  'vanylven.no' => 1,
+  'vardo.no' => 1,
+  'vardø.no' => 1,
+  'varggat.no' => 1,
+  'várggát.no' => 1,
+  'vefsn.no' => 1,
+  'vaapste.no' => 1,
+  'vega.no' => 1,
+  'vegarshei.no' => 1,
+  'vegårshei.no' => 1,
+  'vennesla.no' => 1,
+  'verdal.no' => 1,
+  'verran.no' => 1,
+  'vestby.no' => 1,
+  'vestnes.no' => 1,
+  'vestre-slidre.no' => 1,
+  'vestre-toten.no' => 1,
+  'vestvagoy.no' => 1,
+  'vestvågøy.no' => 1,
+  'vevelstad.no' => 1,
+  'vik.no' => 1,
+  'vikna.no' => 1,
+  'vindafjord.no' => 1,
+  'volda.no' => 1,
+  'voss.no' => 1,
+  'varoy.no' => 1,
+  'værøy.no' => 1,
+  'vagan.no' => 1,
+  'vågan.no' => 1,
+  'voagat.no' => 1,
+  'vagsoy.no' => 1,
+  'vågsøy.no' => 1,
+  'vaga.no' => 1,
+  'vågå.no' => 1,
+  'valer.ostfold.no' => 1,
+  'våler.østfold.no' => 1,
+  'valer.hedmark.no' => 1,
+  'våler.hedmark.no' => 1,
+  '*.np' => 1,
+  'nr' => 1,
+  'biz.nr' => 1,
+  'info.nr' => 1,
+  'gov.nr' => 1,
+  'edu.nr' => 1,
+  'org.nr' => 1,
+  'net.nr' => 1,
+  'com.nr' => 1,
+  'nu' => 1,
+  'nz' => 1,
+  'ac.nz' => 1,
+  'co.nz' => 1,
+  'cri.nz' => 1,
+  'geek.nz' => 1,
+  'gen.nz' => 1,
+  'govt.nz' => 1,
+  'health.nz' => 1,
+  'iwi.nz' => 1,
+  'kiwi.nz' => 1,
+  'maori.nz' => 1,
+  'mil.nz' => 1,
+  'māori.nz' => 1,
+  'net.nz' => 1,
+  'org.nz' => 1,
+  'parliament.nz' => 1,
+  'school.nz' => 1,
+  'om' => 1,
+  'co.om' => 1,
+  'com.om' => 1,
+  'edu.om' => 1,
+  'gov.om' => 1,
+  'med.om' => 1,
+  'museum.om' => 1,
+  'net.om' => 1,
+  'org.om' => 1,
+  'pro.om' => 1,
+  'onion' => 1,
+  'org' => 1,
+  'pa' => 1,
+  'ac.pa' => 1,
+  'gob.pa' => 1,
+  'com.pa' => 1,
+  'org.pa' => 1,
+  'sld.pa' => 1,
+  'edu.pa' => 1,
+  'net.pa' => 1,
+  'ing.pa' => 1,
+  'abo.pa' => 1,
+  'med.pa' => 1,
+  'nom.pa' => 1,
+  'pe' => 1,
+  'edu.pe' => 1,
+  'gob.pe' => 1,
+  'nom.pe' => 1,
+  'mil.pe' => 1,
+  'org.pe' => 1,
+  'com.pe' => 1,
+  'net.pe' => 1,
+  'pf' => 1,
+  'com.pf' => 1,
+  'org.pf' => 1,
+  'edu.pf' => 1,
+  '*.pg' => 1,
+  'ph' => 1,
+  'com.ph' => 1,
+  'net.ph' => 1,
+  'org.ph' => 1,
+  'gov.ph' => 1,
+  'edu.ph' => 1,
+  'ngo.ph' => 1,
+  'mil.ph' => 1,
+  'i.ph' => 1,
+  'pk' => 1,
+  'com.pk' => 1,
+  'net.pk' => 1,
+  'edu.pk' => 1,
+  'org.pk' => 1,
+  'fam.pk' => 1,
+  'biz.pk' => 1,
+  'web.pk' => 1,
+  'gov.pk' => 1,
+  'gob.pk' => 1,
+  'gok.pk' => 1,
+  'gon.pk' => 1,
+  'gop.pk' => 1,
+  'gos.pk' => 1,
+  'info.pk' => 1,
+  'pl' => 1,
+  'com.pl' => 1,
+  'net.pl' => 1,
+  'org.pl' => 1,
+  'aid.pl' => 1,
+  'agro.pl' => 1,
+  'atm.pl' => 1,
+  'auto.pl' => 1,
+  'biz.pl' => 1,
+  'edu.pl' => 1,
+  'gmina.pl' => 1,
+  'gsm.pl' => 1,
+  'info.pl' => 1,
+  'mail.pl' => 1,
+  'miasta.pl' => 1,
+  'media.pl' => 1,
+  'mil.pl' => 1,
+  'nieruchomosci.pl' => 1,
+  'nom.pl' => 1,
+  'pc.pl' => 1,
+  'powiat.pl' => 1,
+  'priv.pl' => 1,
+  'realestate.pl' => 1,
+  'rel.pl' => 1,
+  'sex.pl' => 1,
+  'shop.pl' => 1,
+  'sklep.pl' => 1,
+  'sos.pl' => 1,
+  'szkola.pl' => 1,
+  'targi.pl' => 1,
+  'tm.pl' => 1,
+  'tourism.pl' => 1,
+  'travel.pl' => 1,
+  'turystyka.pl' => 1,
+  'gov.pl' => 1,
+  'ap.gov.pl' => 1,
+  'ic.gov.pl' => 1,
+  'is.gov.pl' => 1,
+  'us.gov.pl' => 1,
+  'kmpsp.gov.pl' => 1,
+  'kppsp.gov.pl' => 1,
+  'kwpsp.gov.pl' => 1,
+  'psp.gov.pl' => 1,
+  'wskr.gov.pl' => 1,
+  'kwp.gov.pl' => 1,
+  'mw.gov.pl' => 1,
+  'ug.gov.pl' => 1,
+  'um.gov.pl' => 1,
+  'umig.gov.pl' => 1,
+  'ugim.gov.pl' => 1,
+  'upow.gov.pl' => 1,
+  'uw.gov.pl' => 1,
+  'starostwo.gov.pl' => 1,
+  'pa.gov.pl' => 1,
+  'po.gov.pl' => 1,
+  'psse.gov.pl' => 1,
+  'pup.gov.pl' => 1,
+  'rzgw.gov.pl' => 1,
+  'sa.gov.pl' => 1,
+  'so.gov.pl' => 1,
+  'sr.gov.pl' => 1,
+  'wsa.gov.pl' => 1,
+  'sko.gov.pl' => 1,
+  'uzs.gov.pl' => 1,
+  'wiih.gov.pl' => 1,
+  'winb.gov.pl' => 1,
+  'pinb.gov.pl' => 1,
+  'wios.gov.pl' => 1,
+  'witd.gov.pl' => 1,
+  'wzmiuw.gov.pl' => 1,
+  'piw.gov.pl' => 1,
+  'wiw.gov.pl' => 1,
+  'griw.gov.pl' => 1,
+  'wif.gov.pl' => 1,
+  'oum.gov.pl' => 1,
+  'sdn.gov.pl' => 1,
+  'zp.gov.pl' => 1,
+  'uppo.gov.pl' => 1,
+  'mup.gov.pl' => 1,
+  'wuoz.gov.pl' => 1,
+  'konsulat.gov.pl' => 1,
+  'oirm.gov.pl' => 1,
+  'augustow.pl' => 1,
+  'babia-gora.pl' => 1,
+  'bedzin.pl' => 1,
+  'beskidy.pl' => 1,
+  'bialowieza.pl' => 1,
+  'bialystok.pl' => 1,
+  'bielawa.pl' => 1,
+  'bieszczady.pl' => 1,
+  'boleslawiec.pl' => 1,
+  'bydgoszcz.pl' => 1,
+  'bytom.pl' => 1,
+  'cieszyn.pl' => 1,
+  'czeladz.pl' => 1,
+  'czest.pl' => 1,
+  'dlugoleka.pl' => 1,
+  'elblag.pl' => 1,
+  'elk.pl' => 1,
+  'glogow.pl' => 1,
+  'gniezno.pl' => 1,
+  'gorlice.pl' => 1,
+  'grajewo.pl' => 1,
+  'ilawa.pl' => 1,
+  'jaworzno.pl' => 1,
+  'jelenia-gora.pl' => 1,
+  'jgora.pl' => 1,
+  'kalisz.pl' => 1,
+  'kazimierz-dolny.pl' => 1,
+  'karpacz.pl' => 1,
+  'kartuzy.pl' => 1,
+  'kaszuby.pl' => 1,
+  'katowice.pl' => 1,
+  'kepno.pl' => 1,
+  'ketrzyn.pl' => 1,
+  'klodzko.pl' => 1,
+  'kobierzyce.pl' => 1,
+  'kolobrzeg.pl' => 1,
+  'konin.pl' => 1,
+  'konskowola.pl' => 1,
+  'kutno.pl' => 1,
+  'lapy.pl' => 1,
+  'lebork.pl' => 1,
+  'legnica.pl' => 1,
+  'lezajsk.pl' => 1,
+  'limanowa.pl' => 1,
+  'lomza.pl' => 1,
+  'lowicz.pl' => 1,
+  'lubin.pl' => 1,
+  'lukow.pl' => 1,
+  'malbork.pl' => 1,
+  'malopolska.pl' => 1,
+  'mazowsze.pl' => 1,
+  'mazury.pl' => 1,
+  'mielec.pl' => 1,
+  'mielno.pl' => 1,
+  'mragowo.pl' => 1,
+  'naklo.pl' => 1,
+  'nowaruda.pl' => 1,
+  'nysa.pl' => 1,
+  'olawa.pl' => 1,
+  'olecko.pl' => 1,
+  'olkusz.pl' => 1,
+  'olsztyn.pl' => 1,
+  'opoczno.pl' => 1,
+  'opole.pl' => 1,
+  'ostroda.pl' => 1,
+  'ostroleka.pl' => 1,
+  'ostrowiec.pl' => 1,
+  'ostrowwlkp.pl' => 1,
+  'pila.pl' => 1,
+  'pisz.pl' => 1,
+  'podhale.pl' => 1,
+  'podlasie.pl' => 1,
+  'polkowice.pl' => 1,
+  'pomorze.pl' => 1,
+  'pomorskie.pl' => 1,
+  'prochowice.pl' => 1,
+  'pruszkow.pl' => 1,
+  'przeworsk.pl' => 1,
+  'pulawy.pl' => 1,
+  'radom.pl' => 1,
+  'rawa-maz.pl' => 1,
+  'rybnik.pl' => 1,
+  'rzeszow.pl' => 1,
+  'sanok.pl' => 1,
+  'sejny.pl' => 1,
+  'slask.pl' => 1,
+  'slupsk.pl' => 1,
+  'sosnowiec.pl' => 1,
+  'stalowa-wola.pl' => 1,
+  'skoczow.pl' => 1,
+  'starachowice.pl' => 1,
+  'stargard.pl' => 1,
+  'suwalki.pl' => 1,
+  'swidnica.pl' => 1,
+  'swiebodzin.pl' => 1,
+  'swinoujscie.pl' => 1,
+  'szczecin.pl' => 1,
+  'szczytno.pl' => 1,
+  'tarnobrzeg.pl' => 1,
+  'tgory.pl' => 1,
+  'turek.pl' => 1,
+  'tychy.pl' => 1,
+  'ustka.pl' => 1,
+  'walbrzych.pl' => 1,
+  'warmia.pl' => 1,
+  'warszawa.pl' => 1,
+  'waw.pl' => 1,
+  'wegrow.pl' => 1,
+  'wielun.pl' => 1,
+  'wlocl.pl' => 1,
+  'wloclawek.pl' => 1,
+  'wodzislaw.pl' => 1,
+  'wolomin.pl' => 1,
+  'wroclaw.pl' => 1,
+  'zachpomor.pl' => 1,
+  'zagan.pl' => 1,
+  'zarow.pl' => 1,
+  'zgora.pl' => 1,
+  'zgorzelec.pl' => 1,
+  'pm' => 1,
+  'pn' => 1,
+  'gov.pn' => 1,
+  'co.pn' => 1,
+  'org.pn' => 1,
+  'edu.pn' => 1,
+  'net.pn' => 1,
+  'post' => 1,
+  'pr' => 1,
+  'com.pr' => 1,
+  'net.pr' => 1,
+  'org.pr' => 1,
+  'gov.pr' => 1,
+  'edu.pr' => 1,
+  'isla.pr' => 1,
+  'pro.pr' => 1,
+  'biz.pr' => 1,
+  'info.pr' => 1,
+  'name.pr' => 1,
+  'est.pr' => 1,
+  'prof.pr' => 1,
+  'ac.pr' => 1,
+  'pro' => 1,
+  'aaa.pro' => 1,
+  'aca.pro' => 1,
+  'acct.pro' => 1,
+  'avocat.pro' => 1,
+  'bar.pro' => 1,
+  'cpa.pro' => 1,
+  'eng.pro' => 1,
+  'jur.pro' => 1,
+  'law.pro' => 1,
+  'med.pro' => 1,
+  'recht.pro' => 1,
+  'ps' => 1,
+  'edu.ps' => 1,
+  'gov.ps' => 1,
+  'sec.ps' => 1,
+  'plo.ps' => 1,
+  'com.ps' => 1,
+  'org.ps' => 1,
+  'net.ps' => 1,
+  'pt' => 1,
+  'net.pt' => 1,
+  'gov.pt' => 1,
+  'org.pt' => 1,
+  'edu.pt' => 1,
+  'int.pt' => 1,
+  'publ.pt' => 1,
+  'com.pt' => 1,
+  'nome.pt' => 1,
+  'pw' => 1,
+  'co.pw' => 1,
+  'ne.pw' => 1,
+  'or.pw' => 1,
+  'ed.pw' => 1,
+  'go.pw' => 1,
+  'belau.pw' => 1,
+  'py' => 1,
+  'com.py' => 1,
+  'coop.py' => 1,
+  'edu.py' => 1,
+  'gov.py' => 1,
+  'mil.py' => 1,
+  'net.py' => 1,
+  'org.py' => 1,
+  'qa' => 1,
+  'com.qa' => 1,
+  'edu.qa' => 1,
+  'gov.qa' => 1,
+  'mil.qa' => 1,
+  'name.qa' => 1,
+  'net.qa' => 1,
+  'org.qa' => 1,
+  'sch.qa' => 1,
+  're' => 1,
+  'asso.re' => 1,
+  'com.re' => 1,
+  'nom.re' => 1,
+  'ro' => 1,
+  'arts.ro' => 1,
+  'com.ro' => 1,
+  'firm.ro' => 1,
+  'info.ro' => 1,
+  'nom.ro' => 1,
+  'nt.ro' => 1,
+  'org.ro' => 1,
+  'rec.ro' => 1,
+  'store.ro' => 1,
+  'tm.ro' => 1,
+  'www.ro' => 1,
+  'rs' => 1,
+  'ac.rs' => 1,
+  'co.rs' => 1,
+  'edu.rs' => 1,
+  'gov.rs' => 1,
+  'in.rs' => 1,
+  'org.rs' => 1,
+  'ru' => 1,
+  'ac.ru' => 1,
+  'edu.ru' => 1,
+  'gov.ru' => 1,
+  'int.ru' => 1,
+  'mil.ru' => 1,
+  'test.ru' => 1,
+  'rw' => 1,
+  'gov.rw' => 1,
+  'net.rw' => 1,
+  'edu.rw' => 1,
+  'ac.rw' => 1,
+  'com.rw' => 1,
+  'co.rw' => 1,
+  'int.rw' => 1,
+  'mil.rw' => 1,
+  'gouv.rw' => 1,
+  'sa' => 1,
+  'com.sa' => 1,
+  'net.sa' => 1,
+  'org.sa' => 1,
+  'gov.sa' => 1,
+  'med.sa' => 1,
+  'pub.sa' => 1,
+  'edu.sa' => 1,
+  'sch.sa' => 1,
+  'sb' => 1,
+  'com.sb' => 1,
+  'edu.sb' => 1,
+  'gov.sb' => 1,
+  'net.sb' => 1,
+  'org.sb' => 1,
+  'sc' => 1,
+  'com.sc' => 1,
+  'gov.sc' => 1,
+  'net.sc' => 1,
+  'org.sc' => 1,
+  'edu.sc' => 1,
+  'sd' => 1,
+  'com.sd' => 1,
+  'net.sd' => 1,
+  'org.sd' => 1,
+  'edu.sd' => 1,
+  'med.sd' => 1,
+  'tv.sd' => 1,
+  'gov.sd' => 1,
+  'info.sd' => 1,
+  'se' => 1,
+  'a.se' => 1,
+  'ac.se' => 1,
+  'b.se' => 1,
+  'bd.se' => 1,
+  'brand.se' => 1,
+  'c.se' => 1,
+  'd.se' => 1,
+  'e.se' => 1,
+  'f.se' => 1,
+  'fh.se' => 1,
+  'fhsk.se' => 1,
+  'fhv.se' => 1,
+  'g.se' => 1,
+  'h.se' => 1,
+  'i.se' => 1,
+  'k.se' => 1,
+  'komforb.se' => 1,
+  'kommunalforbund.se' => 1,
+  'komvux.se' => 1,
+  'l.se' => 1,
+  'lanbib.se' => 1,
+  'm.se' => 1,
+  'n.se' => 1,
+  'naturbruksgymn.se' => 1,
+  'o.se' => 1,
+  'org.se' => 1,
+  'p.se' => 1,
+  'parti.se' => 1,
+  'pp.se' => 1,
+  'press.se' => 1,
+  'r.se' => 1,
+  's.se' => 1,
+  't.se' => 1,
+  'tm.se' => 1,
+  'u.se' => 1,
+  'w.se' => 1,
+  'x.se' => 1,
+  'y.se' => 1,
+  'z.se' => 1,
+  'sg' => 1,
+  'com.sg' => 1,
+  'net.sg' => 1,
+  'org.sg' => 1,
+  'gov.sg' => 1,
+  'edu.sg' => 1,
+  'per.sg' => 1,
+  'sh' => 1,
+  'com.sh' => 1,
+  'net.sh' => 1,
+  'gov.sh' => 1,
+  'org.sh' => 1,
+  'mil.sh' => 1,
+  'si' => 1,
+  'sj' => 1,
+  'sk' => 1,
+  'sl' => 1,
+  'com.sl' => 1,
+  'net.sl' => 1,
+  'edu.sl' => 1,
+  'gov.sl' => 1,
+  'org.sl' => 1,
+  'sm' => 1,
+  'sn' => 1,
+  'art.sn' => 1,
+  'com.sn' => 1,
+  'edu.sn' => 1,
+  'gouv.sn' => 1,
+  'org.sn' => 1,
+  'perso.sn' => 1,
+  'univ.sn' => 1,
+  'so' => 1,
+  'com.so' => 1,
+  'net.so' => 1,
+  'org.so' => 1,
+  'sr' => 1,
+  'st' => 1,
+  'co.st' => 1,
+  'com.st' => 1,
+  'consulado.st' => 1,
+  'edu.st' => 1,
+  'embaixada.st' => 1,
+  'gov.st' => 1,
+  'mil.st' => 1,
+  'net.st' => 1,
+  'org.st' => 1,
+  'principe.st' => 1,
+  'saotome.st' => 1,
+  'store.st' => 1,
+  'su' => 1,
+  'sv' => 1,
+  'com.sv' => 1,
+  'edu.sv' => 1,
+  'gob.sv' => 1,
+  'org.sv' => 1,
+  'red.sv' => 1,
+  'sx' => 1,
+  'gov.sx' => 1,
+  'sy' => 1,
+  'edu.sy' => 1,
+  'gov.sy' => 1,
+  'net.sy' => 1,
+  'mil.sy' => 1,
+  'com.sy' => 1,
+  'org.sy' => 1,
+  'sz' => 1,
+  'co.sz' => 1,
+  'ac.sz' => 1,
+  'org.sz' => 1,
+  'tc' => 1,
+  'td' => 1,
+  'tel' => 1,
+  'tf' => 1,
+  'tg' => 1,
+  'th' => 1,
+  'ac.th' => 1,
+  'co.th' => 1,
+  'go.th' => 1,
+  'in.th' => 1,
+  'mi.th' => 1,
+  'net.th' => 1,
+  'or.th' => 1,
+  'tj' => 1,
+  'ac.tj' => 1,
+  'biz.tj' => 1,
+  'co.tj' => 1,
+  'com.tj' => 1,
+  'edu.tj' => 1,
+  'go.tj' => 1,
+  'gov.tj' => 1,
+  'int.tj' => 1,
+  'mil.tj' => 1,
+  'name.tj' => 1,
+  'net.tj' => 1,
+  'nic.tj' => 1,
+  'org.tj' => 1,
+  'test.tj' => 1,
+  'web.tj' => 1,
+  'tk' => 1,
+  'tl' => 1,
+  'gov.tl' => 1,
+  'tm' => 1,
+  'com.tm' => 1,
+  'co.tm' => 1,
+  'org.tm' => 1,
+  'net.tm' => 1,
+  'nom.tm' => 1,
+  'gov.tm' => 1,
+  'mil.tm' => 1,
+  'edu.tm' => 1,
+  'tn' => 1,
+  'com.tn' => 1,
+  'ens.tn' => 1,
+  'fin.tn' => 1,
+  'gov.tn' => 1,
+  'ind.tn' => 1,
+  'intl.tn' => 1,
+  'nat.tn' => 1,
+  'net.tn' => 1,
+  'org.tn' => 1,
+  'info.tn' => 1,
+  'perso.tn' => 1,
+  'tourism.tn' => 1,
+  'edunet.tn' => 1,
+  'rnrt.tn' => 1,
+  'rns.tn' => 1,
+  'rnu.tn' => 1,
+  'mincom.tn' => 1,
+  'agrinet.tn' => 1,
+  'defense.tn' => 1,
+  'turen.tn' => 1,
+  'to' => 1,
+  'com.to' => 1,
+  'gov.to' => 1,
+  'net.to' => 1,
+  'org.to' => 1,
+  'edu.to' => 1,
+  'mil.to' => 1,
+  'tr' => 1,
+  'com.tr' => 1,
+  'info.tr' => 1,
+  'biz.tr' => 1,
+  'net.tr' => 1,
+  'org.tr' => 1,
+  'web.tr' => 1,
+  'gen.tr' => 1,
+  'tv.tr' => 1,
+  'av.tr' => 1,
+  'dr.tr' => 1,
+  'bbs.tr' => 1,
+  'name.tr' => 1,
+  'tel.tr' => 1,
+  'gov.tr' => 1,
+  'bel.tr' => 1,
+  'pol.tr' => 1,
+  'mil.tr' => 1,
+  'k12.tr' => 1,
+  'edu.tr' => 1,
+  'kep.tr' => 1,
+  'nc.tr' => 1,
+  'gov.nc.tr' => 1,
+  'tt' => 1,
+  'co.tt' => 1,
+  'com.tt' => 1,
+  'org.tt' => 1,
+  'net.tt' => 1,
+  'biz.tt' => 1,
+  'info.tt' => 1,
+  'pro.tt' => 1,
+  'int.tt' => 1,
+  'coop.tt' => 1,
+  'jobs.tt' => 1,
+  'mobi.tt' => 1,
+  'travel.tt' => 1,
+  'museum.tt' => 1,
+  'aero.tt' => 1,
+  'name.tt' => 1,
+  'gov.tt' => 1,
+  'edu.tt' => 1,
+  'tv' => 1,
+  'tw' => 1,
+  'edu.tw' => 1,
+  'gov.tw' => 1,
+  'mil.tw' => 1,
+  'com.tw' => 1,
+  'net.tw' => 1,
+  'org.tw' => 1,
+  'idv.tw' => 1,
+  'game.tw' => 1,
+  'ebiz.tw' => 1,
+  'club.tw' => 1,
+  '網路.tw' => 1,
+  '組織.tw' => 1,
+  '商業.tw' => 1,
+  'tz' => 1,
+  'ac.tz' => 1,
+  'co.tz' => 1,
+  'go.tz' => 1,
+  'hotel.tz' => 1,
+  'info.tz' => 1,
+  'me.tz' => 1,
+  'mil.tz' => 1,
+  'mobi.tz' => 1,
+  'ne.tz' => 1,
+  'or.tz' => 1,
+  'sc.tz' => 1,
+  'tv.tz' => 1,
+  'ua' => 1,
+  'com.ua' => 1,
+  'edu.ua' => 1,
+  'gov.ua' => 1,
+  'in.ua' => 1,
+  'net.ua' => 1,
+  'org.ua' => 1,
+  'cherkassy.ua' => 1,
+  'cherkasy.ua' => 1,
+  'chernigov.ua' => 1,
+  'chernihiv.ua' => 1,
+  'chernivtsi.ua' => 1,
+  'chernovtsy.ua' => 1,
+  'ck.ua' => 1,
+  'cn.ua' => 1,
+  'cr.ua' => 1,
+  'crimea.ua' => 1,
+  'cv.ua' => 1,
+  'dn.ua' => 1,
+  'dnepropetrovsk.ua' => 1,
+  'dnipropetrovsk.ua' => 1,
+  'dominic.ua' => 1,
+  'donetsk.ua' => 1,
+  'dp.ua' => 1,
+  'if.ua' => 1,
+  'ivano-frankivsk.ua' => 1,
+  'kh.ua' => 1,
+  'kharkiv.ua' => 1,
+  'kharkov.ua' => 1,
+  'kherson.ua' => 1,
+  'khmelnitskiy.ua' => 1,
+  'khmelnytskyi.ua' => 1,
+  'kiev.ua' => 1,
+  'kirovograd.ua' => 1,
+  'km.ua' => 1,
+  'kr.ua' => 1,
+  'krym.ua' => 1,
+  'ks.ua' => 1,
+  'kv.ua' => 1,
+  'kyiv.ua' => 1,
+  'lg.ua' => 1,
+  'lt.ua' => 1,
+  'lugansk.ua' => 1,
+  'lutsk.ua' => 1,
+  'lv.ua' => 1,
+  'lviv.ua' => 1,
+  'mk.ua' => 1,
+  'mykolaiv.ua' => 1,
+  'nikolaev.ua' => 1,
+  'od.ua' => 1,
+  'odesa.ua' => 1,
+  'odessa.ua' => 1,
+  'pl.ua' => 1,
+  'poltava.ua' => 1,
+  'rivne.ua' => 1,
+  'rovno.ua' => 1,
+  'rv.ua' => 1,
+  'sb.ua' => 1,
+  'sebastopol.ua' => 1,
+  'sevastopol.ua' => 1,
+  'sm.ua' => 1,
+  'sumy.ua' => 1,
+  'te.ua' => 1,
+  'ternopil.ua' => 1,
+  'uz.ua' => 1,
+  'uzhgorod.ua' => 1,
+  'vinnica.ua' => 1,
+  'vinnytsia.ua' => 1,
+  'vn.ua' => 1,
+  'volyn.ua' => 1,
+  'yalta.ua' => 1,
+  'zaporizhzhe.ua' => 1,
+  'zaporizhzhia.ua' => 1,
+  'zhitomir.ua' => 1,
+  'zhytomyr.ua' => 1,
+  'zp.ua' => 1,
+  'zt.ua' => 1,
+  'ug' => 1,
+  'co.ug' => 1,
+  'or.ug' => 1,
+  'ac.ug' => 1,
+  'sc.ug' => 1,
+  'go.ug' => 1,
+  'ne.ug' => 1,
+  'com.ug' => 1,
+  'org.ug' => 1,
+  'uk' => 1,
+  'ac.uk' => 1,
+  'co.uk' => 1,
+  'gov.uk' => 1,
+  'ltd.uk' => 1,
+  'me.uk' => 1,
+  'net.uk' => 1,
+  'nhs.uk' => 1,
+  'org.uk' => 1,
+  'plc.uk' => 1,
+  'police.uk' => 1,
+  '*.sch.uk' => 1,
+  'us' => 1,
+  'dni.us' => 1,
+  'fed.us' => 1,
+  'isa.us' => 1,
+  'kids.us' => 1,
+  'nsn.us' => 1,
+  'ak.us' => 1,
+  'al.us' => 1,
+  'ar.us' => 1,
+  'as.us' => 1,
+  'az.us' => 1,
+  'ca.us' => 1,
+  'co.us' => 1,
+  'ct.us' => 1,
+  'dc.us' => 1,
+  'de.us' => 1,
+  'fl.us' => 1,
+  'ga.us' => 1,
+  'gu.us' => 1,
+  'hi.us' => 1,
+  'ia.us' => 1,
+  'id.us' => 1,
+  'il.us' => 1,
+  'in.us' => 1,
+  'ks.us' => 1,
+  'ky.us' => 1,
+  'la.us' => 1,
+  'ma.us' => 1,
+  'md.us' => 1,
+  'me.us' => 1,
+  'mi.us' => 1,
+  'mn.us' => 1,
+  'mo.us' => 1,
+  'ms.us' => 1,
+  'mt.us' => 1,
+  'nc.us' => 1,
+  'nd.us' => 1,
+  'ne.us' => 1,
+  'nh.us' => 1,
+  'nj.us' => 1,
+  'nm.us' => 1,
+  'nv.us' => 1,
+  'ny.us' => 1,
+  'oh.us' => 1,
+  'ok.us' => 1,
+  'or.us' => 1,
+  'pa.us' => 1,
+  'pr.us' => 1,
+  'ri.us' => 1,
+  'sc.us' => 1,
+  'sd.us' => 1,
+  'tn.us' => 1,
+  'tx.us' => 1,
+  'ut.us' => 1,
+  'vi.us' => 1,
+  'vt.us' => 1,
+  'va.us' => 1,
+  'wa.us' => 1,
+  'wi.us' => 1,
+  'wv.us' => 1,
+  'wy.us' => 1,
+  'k12.ak.us' => 1,
+  'k12.al.us' => 1,
+  'k12.ar.us' => 1,
+  'k12.as.us' => 1,
+  'k12.az.us' => 1,
+  'k12.ca.us' => 1,
+  'k12.co.us' => 1,
+  'k12.ct.us' => 1,
+  'k12.dc.us' => 1,
+  'k12.de.us' => 1,
+  'k12.fl.us' => 1,
+  'k12.ga.us' => 1,
+  'k12.gu.us' => 1,
+  'k12.ia.us' => 1,
+  'k12.id.us' => 1,
+  'k12.il.us' => 1,
+  'k12.in.us' => 1,
+  'k12.ks.us' => 1,
+  'k12.ky.us' => 1,
+  'k12.la.us' => 1,
+  'k12.ma.us' => 1,
+  'k12.md.us' => 1,
+  'k12.me.us' => 1,
+  'k12.mi.us' => 1,
+  'k12.mn.us' => 1,
+  'k12.mo.us' => 1,
+  'k12.ms.us' => 1,
+  'k12.mt.us' => 1,
+  'k12.nc.us' => 1,
+  'k12.ne.us' => 1,
+  'k12.nh.us' => 1,
+  'k12.nj.us' => 1,
+  'k12.nm.us' => 1,
+  'k12.nv.us' => 1,
+  'k12.ny.us' => 1,
+  'k12.oh.us' => 1,
+  'k12.ok.us' => 1,
+  'k12.or.us' => 1,
+  'k12.pa.us' => 1,
+  'k12.pr.us' => 1,
+  'k12.ri.us' => 1,
+  'k12.sc.us' => 1,
+  'k12.tn.us' => 1,
+  'k12.tx.us' => 1,
+  'k12.ut.us' => 1,
+  'k12.vi.us' => 1,
+  'k12.vt.us' => 1,
+  'k12.va.us' => 1,
+  'k12.wa.us' => 1,
+  'k12.wi.us' => 1,
+  'k12.wy.us' => 1,
+  'cc.ak.us' => 1,
+  'cc.al.us' => 1,
+  'cc.ar.us' => 1,
+  'cc.as.us' => 1,
+  'cc.az.us' => 1,
+  'cc.ca.us' => 1,
+  'cc.co.us' => 1,
+  'cc.ct.us' => 1,
+  'cc.dc.us' => 1,
+  'cc.de.us' => 1,
+  'cc.fl.us' => 1,
+  'cc.ga.us' => 1,
+  'cc.gu.us' => 1,
+  'cc.hi.us' => 1,
+  'cc.ia.us' => 1,
+  'cc.id.us' => 1,
+  'cc.il.us' => 1,
+  'cc.in.us' => 1,
+  'cc.ks.us' => 1,
+  'cc.ky.us' => 1,
+  'cc.la.us' => 1,
+  'cc.ma.us' => 1,
+  'cc.md.us' => 1,
+  'cc.me.us' => 1,
+  'cc.mi.us' => 1,
+  'cc.mn.us' => 1,
+  'cc.mo.us' => 1,
+  'cc.ms.us' => 1,
+  'cc.mt.us' => 1,
+  'cc.nc.us' => 1,
+  'cc.nd.us' => 1,
+  'cc.ne.us' => 1,
+  'cc.nh.us' => 1,
+  'cc.nj.us' => 1,
+  'cc.nm.us' => 1,
+  'cc.nv.us' => 1,
+  'cc.ny.us' => 1,
+  'cc.oh.us' => 1,
+  'cc.ok.us' => 1,
+  'cc.or.us' => 1,
+  'cc.pa.us' => 1,
+  'cc.pr.us' => 1,
+  'cc.ri.us' => 1,
+  'cc.sc.us' => 1,
+  'cc.sd.us' => 1,
+  'cc.tn.us' => 1,
+  'cc.tx.us' => 1,
+  'cc.ut.us' => 1,
+  'cc.vi.us' => 1,
+  'cc.vt.us' => 1,
+  'cc.va.us' => 1,
+  'cc.wa.us' => 1,
+  'cc.wi.us' => 1,
+  'cc.wv.us' => 1,
+  'cc.wy.us' => 1,
+  'lib.ak.us' => 1,
+  'lib.al.us' => 1,
+  'lib.ar.us' => 1,
+  'lib.as.us' => 1,
+  'lib.az.us' => 1,
+  'lib.ca.us' => 1,
+  'lib.co.us' => 1,
+  'lib.ct.us' => 1,
+  'lib.dc.us' => 1,
+  'lib.fl.us' => 1,
+  'lib.ga.us' => 1,
+  'lib.gu.us' => 1,
+  'lib.hi.us' => 1,
+  'lib.ia.us' => 1,
+  'lib.id.us' => 1,
+  'lib.il.us' => 1,
+  'lib.in.us' => 1,
+  'lib.ks.us' => 1,
+  'lib.ky.us' => 1,
+  'lib.la.us' => 1,
+  'lib.ma.us' => 1,
+  'lib.md.us' => 1,
+  'lib.me.us' => 1,
+  'lib.mi.us' => 1,
+  'lib.mn.us' => 1,
+  'lib.mo.us' => 1,
+  'lib.ms.us' => 1,
+  'lib.mt.us' => 1,
+  'lib.nc.us' => 1,
+  'lib.nd.us' => 1,
+  'lib.ne.us' => 1,
+  'lib.nh.us' => 1,
+  'lib.nj.us' => 1,
+  'lib.nm.us' => 1,
+  'lib.nv.us' => 1,
+  'lib.ny.us' => 1,
+  'lib.oh.us' => 1,
+  'lib.ok.us' => 1,
+  'lib.or.us' => 1,
+  'lib.pa.us' => 1,
+  'lib.pr.us' => 1,
+  'lib.ri.us' => 1,
+  'lib.sc.us' => 1,
+  'lib.sd.us' => 1,
+  'lib.tn.us' => 1,
+  'lib.tx.us' => 1,
+  'lib.ut.us' => 1,
+  'lib.vi.us' => 1,
+  'lib.vt.us' => 1,
+  'lib.va.us' => 1,
+  'lib.wa.us' => 1,
+  'lib.wi.us' => 1,
+  'lib.wy.us' => 1,
+  'pvt.k12.ma.us' => 1,
+  'chtr.k12.ma.us' => 1,
+  'paroch.k12.ma.us' => 1,
+  'ann-arbor.mi.us' => 1,
+  'cog.mi.us' => 1,
+  'dst.mi.us' => 1,
+  'eaton.mi.us' => 1,
+  'gen.mi.us' => 1,
+  'mus.mi.us' => 1,
+  'tec.mi.us' => 1,
+  'washtenaw.mi.us' => 1,
+  'uy' => 1,
+  'com.uy' => 1,
+  'edu.uy' => 1,
+  'gub.uy' => 1,
+  'mil.uy' => 1,
+  'net.uy' => 1,
+  'org.uy' => 1,
+  'uz' => 1,
+  'co.uz' => 1,
+  'com.uz' => 1,
+  'net.uz' => 1,
+  'org.uz' => 1,
+  'va' => 1,
+  'vc' => 1,
+  'com.vc' => 1,
+  'net.vc' => 1,
+  'org.vc' => 1,
+  'gov.vc' => 1,
+  'mil.vc' => 1,
+  'edu.vc' => 1,
+  've' => 1,
+  'arts.ve' => 1,
+  'co.ve' => 1,
+  'com.ve' => 1,
+  'e12.ve' => 1,
+  'edu.ve' => 1,
+  'firm.ve' => 1,
+  'gob.ve' => 1,
+  'gov.ve' => 1,
+  'info.ve' => 1,
+  'int.ve' => 1,
+  'mil.ve' => 1,
+  'net.ve' => 1,
+  'org.ve' => 1,
+  'rec.ve' => 1,
+  'store.ve' => 1,
+  'tec.ve' => 1,
+  'web.ve' => 1,
+  'vg' => 1,
+  'vi' => 1,
+  'co.vi' => 1,
+  'com.vi' => 1,
+  'k12.vi' => 1,
+  'net.vi' => 1,
+  'org.vi' => 1,
+  'vn' => 1,
+  'com.vn' => 1,
+  'net.vn' => 1,
+  'org.vn' => 1,
+  'edu.vn' => 1,
+  'gov.vn' => 1,
+  'int.vn' => 1,
+  'ac.vn' => 1,
+  'biz.vn' => 1,
+  'info.vn' => 1,
+  'name.vn' => 1,
+  'pro.vn' => 1,
+  'health.vn' => 1,
+  'vu' => 1,
+  'com.vu' => 1,
+  'edu.vu' => 1,
+  'net.vu' => 1,
+  'org.vu' => 1,
+  'wf' => 1,
+  'ws' => 1,
+  'com.ws' => 1,
+  'net.ws' => 1,
+  'org.ws' => 1,
+  'gov.ws' => 1,
+  'edu.ws' => 1,
+  'yt' => 1,
+  'امارات' => 1,
+  'հայ' => 1,
+  'বাংলা' => 1,
+  'бг' => 1,
+  'бел' => 1,
+  '中国' => 1,
+  '中國' => 1,
+  'الجزائر' => 1,
+  'مصر' => 1,
+  'ею' => 1,
+  'გე' => 1,
+  'ελ' => 1,
+  '香港' => 1,
+  '公司.香港' => 1,
+  '教育.香港' => 1,
+  '政府.香港' => 1,
+  '個人.香港' => 1,
+  '網絡.香港' => 1,
+  '組織.香港' => 1,
+  'ಭಾರತ' => 1,
+  'ଭାରତ' => 1,
+  'ভাৰত' => 1,
+  'भारतम्' => 1,
+  'भारोत' => 1,
+  'ڀارت' => 1,
+  'ഭാരതം' => 1,
+  'भारत' => 1,
+  'بارت' => 1,
+  'بھارت' => 1,
+  'భారత్' => 1,
+  'ભારત' => 1,
+  'ਭਾਰਤ' => 1,
+  'ভারত' => 1,
+  'இந்தியா' => 1,
+  'ایران' => 1,
+  'ايران' => 1,
+  'عراق' => 1,
+  'الاردن' => 1,
+  '한국' => 1,
+  'қаз' => 1,
+  'ලංකා' => 1,
+  'இலங்கை' => 1,
+  'المغرب' => 1,
+  'мкд' => 1,
+  'мон' => 1,
+  '澳門' => 1,
+  '澳门' => 1,
+  'مليسيا' => 1,
+  'عمان' => 1,
+  'پاکستان' => 1,
+  'پاكستان' => 1,
+  'فلسطين' => 1,
+  'срб' => 1,
+  'пр.срб' => 1,
+  'орг.срб' => 1,
+  'обр.срб' => 1,
+  'од.срб' => 1,
+  'упр.срб' => 1,
+  'ак.срб' => 1,
+  'рф' => 1,
+  'قطر' => 1,
+  'السعودية' => 1,
+  'السعودیة' => 1,
+  'السعودیۃ' => 1,
+  'السعوديه' => 1,
+  'سودان' => 1,
+  '新加坡' => 1,
+  'சிங்கப்பூர்' => 1,
+  'سورية' => 1,
+  'سوريا' => 1,
+  'ไทย' => 1,
+  'ศึกษา.ไทย' => 1,
+  'ธุรกิจ.ไทย' => 1,
+  'รัฐบาล.ไทย' => 1,
+  'ทหาร.ไทย' => 1,
+  'เน็ต.ไทย' => 1,
+  'องค์กร.ไทย' => 1,
+  'تونس' => 1,
+  '台灣' => 1,
+  '台湾' => 1,
+  '臺灣' => 1,
+  'укр' => 1,
+  'اليمن' => 1,
+  'xxx' => 1,
+  '*.ye' => 1,
+  'ac.za' => 1,
+  'agric.za' => 1,
+  'alt.za' => 1,
+  'co.za' => 1,
+  'edu.za' => 1,
+  'gov.za' => 1,
+  'grondar.za' => 1,
+  'law.za' => 1,
+  'mil.za' => 1,
+  'net.za' => 1,
+  'ngo.za' => 1,
+  'nis.za' => 1,
+  'nom.za' => 1,
+  'org.za' => 1,
+  'school.za' => 1,
+  'tm.za' => 1,
+  'web.za' => 1,
+  'zm' => 1,
+  'ac.zm' => 1,
+  'biz.zm' => 1,
+  'co.zm' => 1,
+  'com.zm' => 1,
+  'edu.zm' => 1,
+  'gov.zm' => 1,
+  'info.zm' => 1,
+  'mil.zm' => 1,
+  'net.zm' => 1,
+  'org.zm' => 1,
+  'sch.zm' => 1,
+  'zw' => 1,
+  'ac.zw' => 1,
+  'co.zw' => 1,
+  'gov.zw' => 1,
+  'mil.zw' => 1,
+  'org.zw' => 1,
+  'aaa' => 1,
+  'aarp' => 1,
+  'abarth' => 1,
+  'abb' => 1,
+  'abbott' => 1,
+  'abbvie' => 1,
+  'abc' => 1,
+  'able' => 1,
+  'abogado' => 1,
+  'abudhabi' => 1,
+  'academy' => 1,
+  'accenture' => 1,
+  'accountant' => 1,
+  'accountants' => 1,
+  'aco' => 1,
+  'active' => 1,
+  'actor' => 1,
+  'adac' => 1,
+  'ads' => 1,
+  'adult' => 1,
+  'aeg' => 1,
+  'aetna' => 1,
+  'afamilycompany' => 1,
+  'afl' => 1,
+  'africa' => 1,
+  'agakhan' => 1,
+  'agency' => 1,
+  'aig' => 1,
+  'aigo' => 1,
+  'airbus' => 1,
+  'airforce' => 1,
+  'airtel' => 1,
+  'akdn' => 1,
+  'alfaromeo' => 1,
+  'alibaba' => 1,
+  'alipay' => 1,
+  'allfinanz' => 1,
+  'allstate' => 1,
+  'ally' => 1,
+  'alsace' => 1,
+  'alstom' => 1,
+  'americanexpress' => 1,
+  'americanfamily' => 1,
+  'amex' => 1,
+  'amfam' => 1,
+  'amica' => 1,
+  'amsterdam' => 1,
+  'analytics' => 1,
+  'android' => 1,
+  'anquan' => 1,
+  'anz' => 1,
+  'aol' => 1,
+  'apartments' => 1,
+  'app' => 1,
+  'apple' => 1,
+  'aquarelle' => 1,
+  'arab' => 1,
+  'aramco' => 1,
+  'archi' => 1,
+  'army' => 1,
+  'art' => 1,
+  'arte' => 1,
+  'asda' => 1,
+  'associates' => 1,
+  'athleta' => 1,
+  'attorney' => 1,
+  'auction' => 1,
+  'audi' => 1,
+  'audible' => 1,
+  'audio' => 1,
+  'auspost' => 1,
+  'author' => 1,
+  'auto' => 1,
+  'autos' => 1,
+  'avianca' => 1,
+  'aws' => 1,
+  'axa' => 1,
+  'azure' => 1,
+  'baby' => 1,
+  'baidu' => 1,
+  'banamex' => 1,
+  'bananarepublic' => 1,
+  'band' => 1,
+  'bank' => 1,
+  'bar' => 1,
+  'barcelona' => 1,
+  'barclaycard' => 1,
+  'barclays' => 1,
+  'barefoot' => 1,
+  'bargains' => 1,
+  'baseball' => 1,
+  'basketball' => 1,
+  'bauhaus' => 1,
+  'bayern' => 1,
+  'bbc' => 1,
+  'bbt' => 1,
+  'bbva' => 1,
+  'bcg' => 1,
+  'bcn' => 1,
+  'beats' => 1,
+  'beauty' => 1,
+  'beer' => 1,
+  'bentley' => 1,
+  'berlin' => 1,
+  'best' => 1,
+  'bestbuy' => 1,
+  'bet' => 1,
+  'bharti' => 1,
+  'bible' => 1,
+  'bid' => 1,
+  'bike' => 1,
+  'bing' => 1,
+  'bingo' => 1,
+  'bio' => 1,
+  'black' => 1,
+  'blackfriday' => 1,
+  'blanco' => 1,
+  'blockbuster' => 1,
+  'blog' => 1,
+  'bloomberg' => 1,
+  'blue' => 1,
+  'bms' => 1,
+  'bmw' => 1,
+  'bnl' => 1,
+  'bnpparibas' => 1,
+  'boats' => 1,
+  'boehringer' => 1,
+  'bofa' => 1,
+  'bom' => 1,
+  'bond' => 1,
+  'boo' => 1,
+  'book' => 1,
+  'booking' => 1,
+  'bosch' => 1,
+  'bostik' => 1,
+  'boston' => 1,
+  'bot' => 1,
+  'boutique' => 1,
+  'box' => 1,
+  'bradesco' => 1,
+  'bridgestone' => 1,
+  'broadway' => 1,
+  'broker' => 1,
+  'brother' => 1,
+  'brussels' => 1,
+  'budapest' => 1,
+  'bugatti' => 1,
+  'build' => 1,
+  'builders' => 1,
+  'business' => 1,
+  'buy' => 1,
+  'buzz' => 1,
+  'bzh' => 1,
+  'cab' => 1,
+  'cafe' => 1,
+  'cal' => 1,
+  'call' => 1,
+  'calvinklein' => 1,
+  'cam' => 1,
+  'camera' => 1,
+  'camp' => 1,
+  'cancerresearch' => 1,
+  'canon' => 1,
+  'capetown' => 1,
+  'capital' => 1,
+  'capitalone' => 1,
+  'car' => 1,
+  'caravan' => 1,
+  'cards' => 1,
+  'care' => 1,
+  'career' => 1,
+  'careers' => 1,
+  'cars' => 1,
+  'cartier' => 1,
+  'casa' => 1,
+  'case' => 1,
+  'caseih' => 1,
+  'cash' => 1,
+  'casino' => 1,
+  'catering' => 1,
+  'catholic' => 1,
+  'cba' => 1,
+  'cbn' => 1,
+  'cbre' => 1,
+  'cbs' => 1,
+  'ceb' => 1,
+  'center' => 1,
+  'ceo' => 1,
+  'cern' => 1,
+  'cfa' => 1,
+  'cfd' => 1,
+  'chanel' => 1,
+  'channel' => 1,
+  'charity' => 1,
+  'chase' => 1,
+  'chat' => 1,
+  'cheap' => 1,
+  'chintai' => 1,
+  'christmas' => 1,
+  'chrome' => 1,
+  'chrysler' => 1,
+  'church' => 1,
+  'cipriani' => 1,
+  'circle' => 1,
+  'cisco' => 1,
+  'citadel' => 1,
+  'citi' => 1,
+  'citic' => 1,
+  'city' => 1,
+  'cityeats' => 1,
+  'claims' => 1,
+  'cleaning' => 1,
+  'click' => 1,
+  'clinic' => 1,
+  'clinique' => 1,
+  'clothing' => 1,
+  'cloud' => 1,
+  'club' => 1,
+  'clubmed' => 1,
+  'coach' => 1,
+  'codes' => 1,
+  'coffee' => 1,
+  'college' => 1,
+  'cologne' => 1,
+  'comcast' => 1,
+  'commbank' => 1,
+  'community' => 1,
+  'company' => 1,
+  'compare' => 1,
+  'computer' => 1,
+  'comsec' => 1,
+  'condos' => 1,
+  'construction' => 1,
+  'consulting' => 1,
+  'contact' => 1,
+  'contractors' => 1,
+  'cooking' => 1,
+  'cookingchannel' => 1,
+  'cool' => 1,
+  'corsica' => 1,
+  'country' => 1,
+  'coupon' => 1,
+  'coupons' => 1,
+  'courses' => 1,
+  'credit' => 1,
+  'creditcard' => 1,
+  'creditunion' => 1,
+  'cricket' => 1,
+  'crown' => 1,
+  'crs' => 1,
+  'cruise' => 1,
+  'cruises' => 1,
+  'csc' => 1,
+  'cuisinella' => 1,
+  'cymru' => 1,
+  'cyou' => 1,
+  'dabur' => 1,
+  'dad' => 1,
+  'dance' => 1,
+  'data' => 1,
+  'date' => 1,
+  'dating' => 1,
+  'datsun' => 1,
+  'day' => 1,
+  'dclk' => 1,
+  'dds' => 1,
+  'deal' => 1,
+  'dealer' => 1,
+  'deals' => 1,
+  'degree' => 1,
+  'delivery' => 1,
+  'dell' => 1,
+  'deloitte' => 1,
+  'delta' => 1,
+  'democrat' => 1,
+  'dental' => 1,
+  'dentist' => 1,
+  'desi' => 1,
+  'design' => 1,
+  'dev' => 1,
+  'dhl' => 1,
+  'diamonds' => 1,
+  'diet' => 1,
+  'digital' => 1,
+  'direct' => 1,
+  'directory' => 1,
+  'discount' => 1,
+  'discover' => 1,
+  'dish' => 1,
+  'diy' => 1,
+  'dnp' => 1,
+  'docs' => 1,
+  'doctor' => 1,
+  'dodge' => 1,
+  'dog' => 1,
+  'doha' => 1,
+  'domains' => 1,
+  'dot' => 1,
+  'download' => 1,
+  'drive' => 1,
+  'dtv' => 1,
+  'dubai' => 1,
+  'duck' => 1,
+  'dunlop' => 1,
+  'duns' => 1,
+  'dupont' => 1,
+  'durban' => 1,
+  'dvag' => 1,
+  'dvr' => 1,
+  'earth' => 1,
+  'eat' => 1,
+  'eco' => 1,
+  'edeka' => 1,
+  'education' => 1,
+  'email' => 1,
+  'emerck' => 1,
+  'energy' => 1,
+  'engineer' => 1,
+  'engineering' => 1,
+  'enterprises' => 1,
+  'epost' => 1,
+  'epson' => 1,
+  'equipment' => 1,
+  'ericsson' => 1,
+  'erni' => 1,
+  'esq' => 1,
+  'estate' => 1,
+  'esurance' => 1,
+  'etisalat' => 1,
+  'eurovision' => 1,
+  'eus' => 1,
+  'events' => 1,
+  'everbank' => 1,
+  'exchange' => 1,
+  'expert' => 1,
+  'exposed' => 1,
+  'express' => 1,
+  'extraspace' => 1,
+  'fage' => 1,
+  'fail' => 1,
+  'fairwinds' => 1,
+  'faith' => 1,
+  'family' => 1,
+  'fan' => 1,
+  'fans' => 1,
+  'farm' => 1,
+  'farmers' => 1,
+  'fashion' => 1,
+  'fast' => 1,
+  'fedex' => 1,
+  'feedback' => 1,
+  'ferrari' => 1,
+  'ferrero' => 1,
+  'fiat' => 1,
+  'fidelity' => 1,
+  'fido' => 1,
+  'film' => 1,
+  'final' => 1,
+  'finance' => 1,
+  'financial' => 1,
+  'fire' => 1,
+  'firestone' => 1,
+  'firmdale' => 1,
+  'fish' => 1,
+  'fishing' => 1,
+  'fit' => 1,
+  'fitness' => 1,
+  'flickr' => 1,
+  'flights' => 1,
+  'flir' => 1,
+  'florist' => 1,
+  'flowers' => 1,
+  'fly' => 1,
+  'foo' => 1,
+  'food' => 1,
+  'foodnetwork' => 1,
+  'football' => 1,
+  'ford' => 1,
+  'forex' => 1,
+  'forsale' => 1,
+  'forum' => 1,
+  'foundation' => 1,
+  'fox' => 1,
+  'free' => 1,
+  'fresenius' => 1,
+  'frl' => 1,
+  'frogans' => 1,
+  'frontdoor' => 1,
+  'frontier' => 1,
+  'ftr' => 1,
+  'fujitsu' => 1,
+  'fujixerox' => 1,
+  'fun' => 1,
+  'fund' => 1,
+  'furniture' => 1,
+  'futbol' => 1,
+  'fyi' => 1,
+  'gal' => 1,
+  'gallery' => 1,
+  'gallo' => 1,
+  'gallup' => 1,
+  'game' => 1,
+  'games' => 1,
+  'gap' => 1,
+  'garden' => 1,
+  'gbiz' => 1,
+  'gdn' => 1,
+  'gea' => 1,
+  'gent' => 1,
+  'genting' => 1,
+  'george' => 1,
+  'ggee' => 1,
+  'gift' => 1,
+  'gifts' => 1,
+  'gives' => 1,
+  'giving' => 1,
+  'glade' => 1,
+  'glass' => 1,
+  'gle' => 1,
+  'global' => 1,
+  'globo' => 1,
+  'gmail' => 1,
+  'gmbh' => 1,
+  'gmo' => 1,
+  'gmx' => 1,
+  'godaddy' => 1,
+  'gold' => 1,
+  'goldpoint' => 1,
+  'golf' => 1,
+  'goo' => 1,
+  'goodyear' => 1,
+  'goog' => 1,
+  'google' => 1,
+  'gop' => 1,
+  'got' => 1,
+  'grainger' => 1,
+  'graphics' => 1,
+  'gratis' => 1,
+  'green' => 1,
+  'gripe' => 1,
+  'grocery' => 1,
+  'group' => 1,
+  'guardian' => 1,
+  'gucci' => 1,
+  'guge' => 1,
+  'guide' => 1,
+  'guitars' => 1,
+  'guru' => 1,
+  'hair' => 1,
+  'hamburg' => 1,
+  'hangout' => 1,
+  'haus' => 1,
+  'hbo' => 1,
+  'hdfc' => 1,
+  'hdfcbank' => 1,
+  'health' => 1,
+  'healthcare' => 1,
+  'help' => 1,
+  'helsinki' => 1,
+  'here' => 1,
+  'hermes' => 1,
+  'hgtv' => 1,
+  'hiphop' => 1,
+  'hisamitsu' => 1,
+  'hitachi' => 1,
+  'hiv' => 1,
+  'hkt' => 1,
+  'hockey' => 1,
+  'holdings' => 1,
+  'holiday' => 1,
+  'homedepot' => 1,
+  'homegoods' => 1,
+  'homes' => 1,
+  'homesense' => 1,
+  'honda' => 1,
+  'honeywell' => 1,
+  'horse' => 1,
+  'hospital' => 1,
+  'host' => 1,
+  'hosting' => 1,
+  'hot' => 1,
+  'hoteles' => 1,
+  'hotels' => 1,
+  'hotmail' => 1,
+  'house' => 1,
+  'how' => 1,
+  'hsbc' => 1,
+  'hughes' => 1,
+  'hyatt' => 1,
+  'hyundai' => 1,
+  'ibm' => 1,
+  'icbc' => 1,
+  'ice' => 1,
+  'icu' => 1,
+  'ieee' => 1,
+  'ifm' => 1,
+  'ikano' => 1,
+  'imamat' => 1,
+  'imdb' => 1,
+  'immo' => 1,
+  'immobilien' => 1,
+  'inc' => 1,
+  'industries' => 1,
+  'infiniti' => 1,
+  'ing' => 1,
+  'ink' => 1,
+  'institute' => 1,
+  'insurance' => 1,
+  'insure' => 1,
+  'intel' => 1,
+  'international' => 1,
+  'intuit' => 1,
+  'investments' => 1,
+  'ipiranga' => 1,
+  'irish' => 1,
+  'iselect' => 1,
+  'ismaili' => 1,
+  'ist' => 1,
+  'istanbul' => 1,
+  'itau' => 1,
+  'itv' => 1,
+  'iveco' => 1,
+  'jaguar' => 1,
+  'java' => 1,
+  'jcb' => 1,
+  'jcp' => 1,
+  'jeep' => 1,
+  'jetzt' => 1,
+  'jewelry' => 1,
+  'jio' => 1,
+  'jll' => 1,
+  'jmp' => 1,
+  'jnj' => 1,
+  'joburg' => 1,
+  'jot' => 1,
+  'joy' => 1,
+  'jpmorgan' => 1,
+  'jprs' => 1,
+  'juegos' => 1,
+  'juniper' => 1,
+  'kaufen' => 1,
+  'kddi' => 1,
+  'kerryhotels' => 1,
+  'kerrylogistics' => 1,
+  'kerryproperties' => 1,
+  'kfh' => 1,
+  'kia' => 1,
+  'kim' => 1,
+  'kinder' => 1,
+  'kindle' => 1,
+  'kitchen' => 1,
+  'kiwi' => 1,
+  'koeln' => 1,
+  'komatsu' => 1,
+  'kosher' => 1,
+  'kpmg' => 1,
+  'kpn' => 1,
+  'krd' => 1,
+  'kred' => 1,
+  'kuokgroup' => 1,
+  'kyoto' => 1,
+  'lacaixa' => 1,
+  'ladbrokes' => 1,
+  'lamborghini' => 1,
+  'lamer' => 1,
+  'lancaster' => 1,
+  'lancia' => 1,
+  'lancome' => 1,
+  'land' => 1,
+  'landrover' => 1,
+  'lanxess' => 1,
+  'lasalle' => 1,
+  'lat' => 1,
+  'latino' => 1,
+  'latrobe' => 1,
+  'law' => 1,
+  'lawyer' => 1,
+  'lds' => 1,
+  'lease' => 1,
+  'leclerc' => 1,
+  'lefrak' => 1,
+  'legal' => 1,
+  'lego' => 1,
+  'lexus' => 1,
+  'lgbt' => 1,
+  'liaison' => 1,
+  'lidl' => 1,
+  'life' => 1,
+  'lifeinsurance' => 1,
+  'lifestyle' => 1,
+  'lighting' => 1,
+  'like' => 1,
+  'lilly' => 1,
+  'limited' => 1,
+  'limo' => 1,
+  'lincoln' => 1,
+  'linde' => 1,
+  'link' => 1,
+  'lipsy' => 1,
+  'live' => 1,
+  'living' => 1,
+  'lixil' => 1,
+  'llc' => 1,
+  'loan' => 1,
+  'loans' => 1,
+  'locker' => 1,
+  'locus' => 1,
+  'loft' => 1,
+  'lol' => 1,
+  'london' => 1,
+  'lotte' => 1,
+  'lotto' => 1,
+  'love' => 1,
+  'lpl' => 1,
+  'lplfinancial' => 1,
+  'ltd' => 1,
+  'ltda' => 1,
+  'lundbeck' => 1,
+  'lupin' => 1,
+  'luxe' => 1,
+  'luxury' => 1,
+  'macys' => 1,
+  'madrid' => 1,
+  'maif' => 1,
+  'maison' => 1,
+  'makeup' => 1,
+  'man' => 1,
+  'management' => 1,
+  'mango' => 1,
+  'map' => 1,
+  'market' => 1,
+  'marketing' => 1,
+  'markets' => 1,
+  'marriott' => 1,
+  'marshalls' => 1,
+  'maserati' => 1,
+  'mattel' => 1,
+  'mba' => 1,
+  'mckinsey' => 1,
+  'med' => 1,
+  'media' => 1,
+  'meet' => 1,
+  'melbourne' => 1,
+  'meme' => 1,
+  'memorial' => 1,
+  'men' => 1,
+  'menu' => 1,
+  'merckmsd' => 1,
+  'metlife' => 1,
+  'miami' => 1,
+  'microsoft' => 1,
+  'mini' => 1,
+  'mint' => 1,
+  'mit' => 1,
+  'mitsubishi' => 1,
+  'mlb' => 1,
+  'mls' => 1,
+  'mma' => 1,
+  'mobile' => 1,
+  'mobily' => 1,
+  'moda' => 1,
+  'moe' => 1,
+  'moi' => 1,
+  'mom' => 1,
+  'monash' => 1,
+  'money' => 1,
+  'monster' => 1,
+  'mopar' => 1,
+  'mormon' => 1,
+  'mortgage' => 1,
+  'moscow' => 1,
+  'moto' => 1,
+  'motorcycles' => 1,
+  'mov' => 1,
+  'movie' => 1,
+  'movistar' => 1,
+  'msd' => 1,
+  'mtn' => 1,
+  'mtr' => 1,
+  'mutual' => 1,
+  'nab' => 1,
+  'nadex' => 1,
+  'nagoya' => 1,
+  'nationwide' => 1,
+  'natura' => 1,
+  'navy' => 1,
+  'nba' => 1,
+  'nec' => 1,
+  'netbank' => 1,
+  'netflix' => 1,
+  'network' => 1,
+  'neustar' => 1,
+  'new' => 1,
+  'newholland' => 1,
+  'news' => 1,
+  'next' => 1,
+  'nextdirect' => 1,
+  'nexus' => 1,
+  'nfl' => 1,
+  'ngo' => 1,
+  'nhk' => 1,
+  'nico' => 1,
+  'nike' => 1,
+  'nikon' => 1,
+  'ninja' => 1,
+  'nissan' => 1,
+  'nissay' => 1,
+  'nokia' => 1,
+  'northwesternmutual' => 1,
+  'norton' => 1,
+  'now' => 1,
+  'nowruz' => 1,
+  'nowtv' => 1,
+  'nra' => 1,
+  'nrw' => 1,
+  'ntt' => 1,
+  'nyc' => 1,
+  'obi' => 1,
+  'observer' => 1,
+  'off' => 1,
+  'office' => 1,
+  'okinawa' => 1,
+  'olayan' => 1,
+  'olayangroup' => 1,
+  'oldnavy' => 1,
+  'ollo' => 1,
+  'omega' => 1,
+  'one' => 1,
+  'ong' => 1,
+  'onl' => 1,
+  'online' => 1,
+  'onyourside' => 1,
+  'ooo' => 1,
+  'open' => 1,
+  'oracle' => 1,
+  'orange' => 1,
+  'organic' => 1,
+  'origins' => 1,
+  'osaka' => 1,
+  'otsuka' => 1,
+  'ott' => 1,
+  'ovh' => 1,
+  'page' => 1,
+  'panasonic' => 1,
+  'paris' => 1,
+  'pars' => 1,
+  'partners' => 1,
+  'parts' => 1,
+  'party' => 1,
+  'passagens' => 1,
+  'pay' => 1,
+  'pccw' => 1,
+  'pet' => 1,
+  'pfizer' => 1,
+  'pharmacy' => 1,
+  'phd' => 1,
+  'philips' => 1,
+  'phone' => 1,
+  'photo' => 1,
+  'photography' => 1,
+  'photos' => 1,
+  'physio' => 1,
+  'piaget' => 1,
+  'pics' => 1,
+  'pictet' => 1,
+  'pictures' => 1,
+  'pid' => 1,
+  'pin' => 1,
+  'ping' => 1,
+  'pink' => 1,
+  'pioneer' => 1,
+  'pizza' => 1,
+  'place' => 1,
+  'play' => 1,
+  'playstation' => 1,
+  'plumbing' => 1,
+  'plus' => 1,
+  'pnc' => 1,
+  'pohl' => 1,
+  'poker' => 1,
+  'politie' => 1,
+  'porn' => 1,
+  'pramerica' => 1,
+  'praxi' => 1,
+  'press' => 1,
+  'prime' => 1,
+  'prod' => 1,
+  'productions' => 1,
+  'prof' => 1,
+  'progressive' => 1,
+  'promo' => 1,
+  'properties' => 1,
+  'property' => 1,
+  'protection' => 1,
+  'pru' => 1,
+  'prudential' => 1,
+  'pub' => 1,
+  'pwc' => 1,
+  'qpon' => 1,
+  'quebec' => 1,
+  'quest' => 1,
+  'qvc' => 1,
+  'racing' => 1,
+  'radio' => 1,
+  'raid' => 1,
+  'read' => 1,
+  'realestate' => 1,
+  'realtor' => 1,
+  'realty' => 1,
+  'recipes' => 1,
+  'red' => 1,
+  'redstone' => 1,
+  'redumbrella' => 1,
+  'rehab' => 1,
+  'reise' => 1,
+  'reisen' => 1,
+  'reit' => 1,
+  'reliance' => 1,
+  'ren' => 1,
+  'rent' => 1,
+  'rentals' => 1,
+  'repair' => 1,
+  'report' => 1,
+  'republican' => 1,
+  'rest' => 1,
+  'restaurant' => 1,
+  'review' => 1,
+  'reviews' => 1,
+  'rexroth' => 1,
+  'rich' => 1,
+  'richardli' => 1,
+  'ricoh' => 1,
+  'rightathome' => 1,
+  'ril' => 1,
+  'rio' => 1,
+  'rip' => 1,
+  'rmit' => 1,
+  'rocher' => 1,
+  'rocks' => 1,
+  'rodeo' => 1,
+  'rogers' => 1,
+  'room' => 1,
+  'rsvp' => 1,
+  'rugby' => 1,
+  'ruhr' => 1,
+  'run' => 1,
+  'rwe' => 1,
+  'ryukyu' => 1,
+  'saarland' => 1,
+  'safe' => 1,
+  'safety' => 1,
+  'sakura' => 1,
+  'sale' => 1,
+  'salon' => 1,
+  'samsclub' => 1,
+  'samsung' => 1,
+  'sandvik' => 1,
+  'sandvikcoromant' => 1,
+  'sanofi' => 1,
+  'sap' => 1,
+  'sarl' => 1,
+  'sas' => 1,
+  'save' => 1,
+  'saxo' => 1,
+  'sbi' => 1,
+  'sbs' => 1,
+  'sca' => 1,
+  'scb' => 1,
+  'schaeffler' => 1,
+  'schmidt' => 1,
+  'scholarships' => 1,
+  'school' => 1,
+  'schule' => 1,
+  'schwarz' => 1,
+  'science' => 1,
+  'scjohnson' => 1,
+  'scor' => 1,
+  'scot' => 1,
+  'search' => 1,
+  'seat' => 1,
+  'secure' => 1,
+  'security' => 1,
+  'seek' => 1,
+  'select' => 1,
+  'sener' => 1,
+  'services' => 1,
+  'ses' => 1,
+  'seven' => 1,
+  'sew' => 1,
+  'sex' => 1,
+  'sexy' => 1,
+  'sfr' => 1,
+  'shangrila' => 1,
+  'sharp' => 1,
+  'shaw' => 1,
+  'shell' => 1,
+  'shia' => 1,
+  'shiksha' => 1,
+  'shoes' => 1,
+  'shop' => 1,
+  'shopping' => 1,
+  'shouji' => 1,
+  'show' => 1,
+  'showtime' => 1,
+  'shriram' => 1,
+  'silk' => 1,
+  'sina' => 1,
+  'singles' => 1,
+  'site' => 1,
+  'ski' => 1,
+  'skin' => 1,
+  'sky' => 1,
+  'skype' => 1,
+  'sling' => 1,
+  'smart' => 1,
+  'smile' => 1,
+  'sncf' => 1,
+  'soccer' => 1,
+  'social' => 1,
+  'softbank' => 1,
+  'software' => 1,
+  'sohu' => 1,
+  'solar' => 1,
+  'solutions' => 1,
+  'song' => 1,
+  'sony' => 1,
+  'soy' => 1,
+  'space' => 1,
+  'spiegel' => 1,
+  'sport' => 1,
+  'spot' => 1,
+  'spreadbetting' => 1,
+  'srl' => 1,
+  'srt' => 1,
+  'stada' => 1,
+  'staples' => 1,
+  'star' => 1,
+  'starhub' => 1,
+  'statebank' => 1,
+  'statefarm' => 1,
+  'stc' => 1,
+  'stcgroup' => 1,
+  'stockholm' => 1,
+  'storage' => 1,
+  'store' => 1,
+  'stream' => 1,
+  'studio' => 1,
+  'study' => 1,
+  'style' => 1,
+  'sucks' => 1,
+  'supplies' => 1,
+  'supply' => 1,
+  'support' => 1,
+  'surf' => 1,
+  'surgery' => 1,
+  'suzuki' => 1,
+  'swatch' => 1,
+  'swiftcover' => 1,
+  'swiss' => 1,
+  'sydney' => 1,
+  'symantec' => 1,
+  'systems' => 1,
+  'tab' => 1,
+  'taipei' => 1,
+  'talk' => 1,
+  'taobao' => 1,
+  'target' => 1,
+  'tatamotors' => 1,
+  'tatar' => 1,
+  'tattoo' => 1,
+  'tax' => 1,
+  'taxi' => 1,
+  'tci' => 1,
+  'tdk' => 1,
+  'team' => 1,
+  'tech' => 1,
+  'technology' => 1,
+  'telefonica' => 1,
+  'temasek' => 1,
+  'tennis' => 1,
+  'teva' => 1,
+  'thd' => 1,
+  'theater' => 1,
+  'theatre' => 1,
+  'tiaa' => 1,
+  'tickets' => 1,
+  'tienda' => 1,
+  'tiffany' => 1,
+  'tips' => 1,
+  'tires' => 1,
+  'tirol' => 1,
+  'tjmaxx' => 1,
+  'tjx' => 1,
+  'tkmaxx' => 1,
+  'tmall' => 1,
+  'today' => 1,
+  'tokyo' => 1,
+  'tools' => 1,
+  'top' => 1,
+  'toray' => 1,
+  'toshiba' => 1,
+  'total' => 1,
+  'tours' => 1,
+  'town' => 1,
+  'toyota' => 1,
+  'toys' => 1,
+  'trade' => 1,
+  'trading' => 1,
+  'training' => 1,
+  'travel' => 1,
+  'travelchannel' => 1,
+  'travelers' => 1,
+  'travelersinsurance' => 1,
+  'trust' => 1,
+  'trv' => 1,
+  'tube' => 1,
+  'tui' => 1,
+  'tunes' => 1,
+  'tushu' => 1,
+  'tvs' => 1,
+  'ubank' => 1,
+  'ubs' => 1,
+  'uconnect' => 1,
+  'unicom' => 1,
+  'university' => 1,
+  'uno' => 1,
+  'uol' => 1,
+  'ups' => 1,
+  'vacations' => 1,
+  'vana' => 1,
+  'vanguard' => 1,
+  'vegas' => 1,
+  'ventures' => 1,
+  'verisign' => 1,
+  'versicherung' => 1,
+  'vet' => 1,
+  'viajes' => 1,
+  'video' => 1,
+  'vig' => 1,
+  'viking' => 1,
+  'villas' => 1,
+  'vin' => 1,
+  'vip' => 1,
+  'virgin' => 1,
+  'visa' => 1,
+  'vision' => 1,
+  'vistaprint' => 1,
+  'viva' => 1,
+  'vivo' => 1,
+  'vlaanderen' => 1,
+  'vodka' => 1,
+  'volkswagen' => 1,
+  'volvo' => 1,
+  'vote' => 1,
+  'voting' => 1,
+  'voto' => 1,
+  'voyage' => 1,
+  'vuelos' => 1,
+  'wales' => 1,
+  'walmart' => 1,
+  'walter' => 1,
+  'wang' => 1,
+  'wanggou' => 1,
+  'warman' => 1,
+  'watch' => 1,
+  'watches' => 1,
+  'weather' => 1,
+  'weatherchannel' => 1,
+  'webcam' => 1,
+  'weber' => 1,
+  'website' => 1,
+  'wed' => 1,
+  'wedding' => 1,
+  'weibo' => 1,
+  'weir' => 1,
+  'whoswho' => 1,
+  'wien' => 1,
+  'wiki' => 1,
+  'williamhill' => 1,
+  'win' => 1,
+  'windows' => 1,
+  'wine' => 1,
+  'winners' => 1,
+  'wme' => 1,
+  'wolterskluwer' => 1,
+  'woodside' => 1,
+  'work' => 1,
+  'works' => 1,
+  'world' => 1,
+  'wow' => 1,
+  'wtc' => 1,
+  'wtf' => 1,
+  'xbox' => 1,
+  'xerox' => 1,
+  'xfinity' => 1,
+  'xihuan' => 1,
+  'xin' => 1,
+  'कॉम' => 1,
+  'セール' => 1,
+  '佛山' => 1,
+  '慈善' => 1,
+  '集团' => 1,
+  '在线' => 1,
+  '大众汽车' => 1,
+  '点看' => 1,
+  'คอม' => 1,
+  '八卦' => 1,
+  'موقع' => 1,
+  '公益' => 1,
+  '公司' => 1,
+  '香格里拉' => 1,
+  '网站' => 1,
+  '移动' => 1,
+  '我爱你' => 1,
+  'москва' => 1,
+  'католик' => 1,
+  'онлайн' => 1,
+  'сайт' => 1,
+  '联通' => 1,
+  'קום' => 1,
+  '时尚' => 1,
+  '微博' => 1,
+  '淡马锡' => 1,
+  'ファッション' => 1,
+  'орг' => 1,
+  'नेट' => 1,
+  'ストア' => 1,
+  '삼성' => 1,
+  '商标' => 1,
+  '商店' => 1,
+  '商城' => 1,
+  'дети' => 1,
+  'ポイント' => 1,
+  '新闻' => 1,
+  '工行' => 1,
+  '家電' => 1,
+  'كوم' => 1,
+  '中文网' => 1,
+  '中信' => 1,
+  '娱乐' => 1,
+  '谷歌' => 1,
+  '電訊盈科' => 1,
+  '购物' => 1,
+  'クラウド' => 1,
+  '通販' => 1,
+  '网店' => 1,
+  'संगठन' => 1,
+  '餐厅' => 1,
+  '网络' => 1,
+  'ком' => 1,
+  '诺基亚' => 1,
+  '食品' => 1,
+  '飞利浦' => 1,
+  '手表' => 1,
+  '手机' => 1,
+  'ارامكو' => 1,
+  'العليان' => 1,
+  'اتصالات' => 1,
+  'بازار' => 1,
+  'موبايلي' => 1,
+  'ابوظبي' => 1,
+  'كاثوليك' => 1,
+  'همراه' => 1,
+  '닷컴' => 1,
+  '政府' => 1,
+  'شبكة' => 1,
+  'بيتك' => 1,
+  'عرب' => 1,
+  '机构' => 1,
+  '组织机构' => 1,
+  '健康' => 1,
+  '招聘' => 1,
+  'рус' => 1,
+  '珠宝' => 1,
+  '大拿' => 1,
+  'みんな' => 1,
+  'グーグル' => 1,
+  '世界' => 1,
+  '書籍' => 1,
+  '网址' => 1,
+  '닷넷' => 1,
+  'コム' => 1,
+  '天主教' => 1,
+  '游戏' => 1,
+  'vermögensberater' => 1,
+  'vermögensberatung' => 1,
+  '企业' => 1,
+  '信息' => 1,
+  '嘉里大酒店' => 1,
+  '嘉里' => 1,
+  '广东' => 1,
+  '政务' => 1,
+  'xyz' => 1,
+  'yachts' => 1,
+  'yahoo' => 1,
+  'yamaxun' => 1,
+  'yandex' => 1,
+  'yodobashi' => 1,
+  'yoga' => 1,
+  'yokohama' => 1,
+  'you' => 1,
+  'youtube' => 1,
+  'yun' => 1,
+  'zappos' => 1,
+  'zara' => 1,
+  'zero' => 1,
+  'zip' => 1,
+  'zippo' => 1,
+  'zone' => 1,
+  'zuerich' => 1,
+  'cc.ua' => 2,
+  'inf.ua' => 2,
+  'ltd.ua' => 2,
+  'beep.pl' => 2,
+  '*.compute.estate' => 2,
+  '*.alces.network' => 2,
+  'alwaysdata.net' => 2,
+  'cloudfront.net' => 2,
+  '*.compute.amazonaws.com' => 2,
+  '*.compute-1.amazonaws.com' => 2,
+  '*.compute.amazonaws.com.cn' => 2,
+  'us-east-1.amazonaws.com' => 2,
+  'cn-north-1.eb.amazonaws.com.cn' => 2,
+  'cn-northwest-1.eb.amazonaws.com.cn' => 2,
+  'elasticbeanstalk.com' => 2,
+  'ap-northeast-1.elasticbeanstalk.com' => 2,
+  'ap-northeast-2.elasticbeanstalk.com' => 2,
+  'ap-northeast-3.elasticbeanstalk.com' => 2,
+  'ap-south-1.elasticbeanstalk.com' => 2,
+  'ap-southeast-1.elasticbeanstalk.com' => 2,
+  'ap-southeast-2.elasticbeanstalk.com' => 2,
+  'ca-central-1.elasticbeanstalk.com' => 2,
+  'eu-central-1.elasticbeanstalk.com' => 2,
+  'eu-west-1.elasticbeanstalk.com' => 2,
+  'eu-west-2.elasticbeanstalk.com' => 2,
+  'eu-west-3.elasticbeanstalk.com' => 2,
+  'sa-east-1.elasticbeanstalk.com' => 2,
+  'us-east-1.elasticbeanstalk.com' => 2,
+  'us-east-2.elasticbeanstalk.com' => 2,
+  'us-gov-west-1.elasticbeanstalk.com' => 2,
+  'us-west-1.elasticbeanstalk.com' => 2,
+  'us-west-2.elasticbeanstalk.com' => 2,
+  '*.elb.amazonaws.com' => 2,
+  '*.elb.amazonaws.com.cn' => 2,
+  's3.amazonaws.com' => 2,
+  's3-ap-northeast-1.amazonaws.com' => 2,
+  's3-ap-northeast-2.amazonaws.com' => 2,
+  's3-ap-south-1.amazonaws.com' => 2,
+  's3-ap-southeast-1.amazonaws.com' => 2,
+  's3-ap-southeast-2.amazonaws.com' => 2,
+  's3-ca-central-1.amazonaws.com' => 2,
+  's3-eu-central-1.amazonaws.com' => 2,
+  's3-eu-west-1.amazonaws.com' => 2,
+  's3-eu-west-2.amazonaws.com' => 2,
+  's3-eu-west-3.amazonaws.com' => 2,
+  's3-external-1.amazonaws.com' => 2,
+  's3-fips-us-gov-west-1.amazonaws.com' => 2,
+  's3-sa-east-1.amazonaws.com' => 2,
+  's3-us-gov-west-1.amazonaws.com' => 2,
+  's3-us-east-2.amazonaws.com' => 2,
+  's3-us-west-1.amazonaws.com' => 2,
+  's3-us-west-2.amazonaws.com' => 2,
+  's3.ap-northeast-2.amazonaws.com' => 2,
+  's3.ap-south-1.amazonaws.com' => 2,
+  's3.cn-north-1.amazonaws.com.cn' => 2,
+  's3.ca-central-1.amazonaws.com' => 2,
+  's3.eu-central-1.amazonaws.com' => 2,
+  's3.eu-west-2.amazonaws.com' => 2,
+  's3.eu-west-3.amazonaws.com' => 2,
+  's3.us-east-2.amazonaws.com' => 2,
+  's3.dualstack.ap-northeast-1.amazonaws.com' => 2,
+  's3.dualstack.ap-northeast-2.amazonaws.com' => 2,
+  's3.dualstack.ap-south-1.amazonaws.com' => 2,
+  's3.dualstack.ap-southeast-1.amazonaws.com' => 2,
+  's3.dualstack.ap-southeast-2.amazonaws.com' => 2,
+  's3.dualstack.ca-central-1.amazonaws.com' => 2,
+  's3.dualstack.eu-central-1.amazonaws.com' => 2,
+  's3.dualstack.eu-west-1.amazonaws.com' => 2,
+  's3.dualstack.eu-west-2.amazonaws.com' => 2,
+  's3.dualstack.eu-west-3.amazonaws.com' => 2,
+  's3.dualstack.sa-east-1.amazonaws.com' => 2,
+  's3.dualstack.us-east-1.amazonaws.com' => 2,
+  's3.dualstack.us-east-2.amazonaws.com' => 2,
+  's3-website-us-east-1.amazonaws.com' => 2,
+  's3-website-us-west-1.amazonaws.com' => 2,
+  's3-website-us-west-2.amazonaws.com' => 2,
+  's3-website-ap-northeast-1.amazonaws.com' => 2,
+  's3-website-ap-southeast-1.amazonaws.com' => 2,
+  's3-website-ap-southeast-2.amazonaws.com' => 2,
+  's3-website-eu-west-1.amazonaws.com' => 2,
+  's3-website-sa-east-1.amazonaws.com' => 2,
+  's3-website.ap-northeast-2.amazonaws.com' => 2,
+  's3-website.ap-south-1.amazonaws.com' => 2,
+  's3-website.ca-central-1.amazonaws.com' => 2,
+  's3-website.eu-central-1.amazonaws.com' => 2,
+  's3-website.eu-west-2.amazonaws.com' => 2,
+  's3-website.eu-west-3.amazonaws.com' => 2,
+  's3-website.us-east-2.amazonaws.com' => 2,
+  't3l3p0rt.net' => 2,
+  'tele.amune.org' => 2,
+  'apigee.io' => 2,
+  'on-aptible.com' => 2,
+  'user.party.eus' => 2,
+  'pimienta.org' => 2,
+  'poivron.org' => 2,
+  'potager.org' => 2,
+  'sweetpepper.org' => 2,
+  'myasustor.com' => 2,
+  'go-vip.co' => 2,
+  'wpcomstaging.com' => 2,
+  'myfritz.net' => 2,
+  '*.awdev.ca' => 2,
+  '*.advisor.ws' => 2,
+  'backplaneapp.io' => 2,
+  'betainabox.com' => 2,
+  'bnr.la' => 2,
+  'blackbaudcdn.net' => 2,
+  'boomla.net' => 2,
+  'boxfuse.io' => 2,
+  'square7.ch' => 2,
+  'bplaced.com' => 2,
+  'bplaced.de' => 2,
+  'square7.de' => 2,
+  'bplaced.net' => 2,
+  'square7.net' => 2,
+  'browsersafetymark.io' => 2,
+  'dh.bytemark.co.uk' => 2,
+  'vm.bytemark.co.uk' => 2,
+  'mycd.eu' => 2,
+  'ae.org' => 2,
+  'ar.com' => 2,
+  'br.com' => 2,
+  'cn.com' => 2,
+  'com.de' => 2,
+  'com.se' => 2,
+  'de.com' => 2,
+  'eu.com' => 2,
+  'gb.com' => 2,
+  'gb.net' => 2,
+  'hu.com' => 2,
+  'hu.net' => 2,
+  'jp.net' => 2,
+  'jpn.com' => 2,
+  'kr.com' => 2,
+  'mex.com' => 2,
+  'no.com' => 2,
+  'qc.com' => 2,
+  'ru.com' => 2,
+  'sa.com' => 2,
+  'se.net' => 2,
+  'uk.com' => 2,
+  'uk.net' => 2,
+  'us.com' => 2,
+  'uy.com' => 2,
+  'za.bz' => 2,
+  'za.com' => 2,
+  'africa.com' => 2,
+  'gr.com' => 2,
+  'in.net' => 2,
+  'us.org' => 2,
+  'co.com' => 2,
+  'c.la' => 2,
+  'certmgr.org' => 2,
+  'xenapponazure.com' => 2,
+  'virtueeldomein.nl' => 2,
+  'cleverapps.io' => 2,
+  'c66.me' => 2,
+  'cloud66.ws' => 2,
+  'jdevcloud.com' => 2,
+  'wpdevcloud.com' => 2,
+  'cloudaccess.host' => 2,
+  'freesite.host' => 2,
+  'cloudaccess.net' => 2,
+  'cloudcontrolled.com' => 2,
+  'cloudcontrolapp.com' => 2,
+  'co.ca' => 2,
+  '*.otap.co' => 2,
+  'co.cz' => 2,
+  'c.cdn77.org' => 2,
+  'cdn77-ssl.net' => 2,
+  'r.cdn77.net' => 2,
+  'rsc.cdn77.org' => 2,
+  'ssl.origin.cdn77-secure.org' => 2,
+  'cloudns.asia' => 2,
+  'cloudns.biz' => 2,
+  'cloudns.club' => 2,
+  'cloudns.cc' => 2,
+  'cloudns.eu' => 2,
+  'cloudns.in' => 2,
+  'cloudns.info' => 2,
+  'cloudns.org' => 2,
+  'cloudns.pro' => 2,
+  'cloudns.pw' => 2,
+  'cloudns.us' => 2,
+  'cloudeity.net' => 2,
+  'cnpy.gdn' => 2,
+  'co.nl' => 2,
+  'co.no' => 2,
+  'webhosting.be' => 2,
+  'hosting-cluster.nl' => 2,
+  'dyn.cosidns.de' => 2,
+  'dynamisches-dns.de' => 2,
+  'dnsupdater.de' => 2,
+  'internet-dns.de' => 2,
+  'l-o-g-i-n.de' => 2,
+  'dynamic-dns.info' => 2,
+  'feste-ip.net' => 2,
+  'knx-server.net' => 2,
+  'static-access.net' => 2,
+  'realm.cz' => 2,
+  '*.cryptonomic.net' => 2,
+  'cupcake.is' => 2,
+  'cyon.link' => 2,
+  'cyon.site' => 2,
+  'daplie.me' => 2,
+  'localhost.daplie.me' => 2,
+  'dattolocal.com' => 2,
+  'dattorelay.com' => 2,
+  'dattoweb.com' => 2,
+  'mydatto.com' => 2,
+  'dattolocal.net' => 2,
+  'mydatto.net' => 2,
+  'biz.dk' => 2,
+  'co.dk' => 2,
+  'firm.dk' => 2,
+  'reg.dk' => 2,
+  'store.dk' => 2,
+  'debian.net' => 2,
+  'dedyn.io' => 2,
+  'dnshome.de' => 2,
+  'online.th' => 2,
+  'shop.th' => 2,
+  'drayddns.com' => 2,
+  'dreamhosters.com' => 2,
+  'mydrobo.com' => 2,
+  'drud.io' => 2,
+  'drud.us' => 2,
+  'duckdns.org' => 2,
+  'dy.fi' => 2,
+  'tunk.org' => 2,
+  'dyndns-at-home.com' => 2,
+  'dyndns-at-work.com' => 2,
+  'dyndns-blog.com' => 2,
+  'dyndns-free.com' => 2,
+  'dyndns-home.com' => 2,
+  'dyndns-ip.com' => 2,
+  'dyndns-mail.com' => 2,
+  'dyndns-office.com' => 2,
+  'dyndns-pics.com' => 2,
+  'dyndns-remote.com' => 2,
+  'dyndns-server.com' => 2,
+  'dyndns-web.com' => 2,
+  'dyndns-wiki.com' => 2,
+  'dyndns-work.com' => 2,
+  'dyndns.biz' => 2,
+  'dyndns.info' => 2,
+  'dyndns.org' => 2,
+  'dyndns.tv' => 2,
+  'at-band-camp.net' => 2,
+  'ath.cx' => 2,
+  'barrel-of-knowledge.info' => 2,
+  'barrell-of-knowledge.info' => 2,
+  'better-than.tv' => 2,
+  'blogdns.com' => 2,
+  'blogdns.net' => 2,
+  'blogdns.org' => 2,
+  'blogsite.org' => 2,
+  'boldlygoingnowhere.org' => 2,
+  'broke-it.net' => 2,
+  'buyshouses.net' => 2,
+  'cechire.com' => 2,
+  'dnsalias.com' => 2,
+  'dnsalias.net' => 2,
+  'dnsalias.org' => 2,
+  'dnsdojo.com' => 2,
+  'dnsdojo.net' => 2,
+  'dnsdojo.org' => 2,
+  'does-it.net' => 2,
+  'doesntexist.com' => 2,
+  'doesntexist.org' => 2,
+  'dontexist.com' => 2,
+  'dontexist.net' => 2,
+  'dontexist.org' => 2,
+  'doomdns.com' => 2,
+  'doomdns.org' => 2,
+  'dvrdns.org' => 2,
+  'dyn-o-saur.com' => 2,
+  'dynalias.com' => 2,
+  'dynalias.net' => 2,
+  'dynalias.org' => 2,
+  'dynathome.net' => 2,
+  'dyndns.ws' => 2,
+  'endofinternet.net' => 2,
+  'endofinternet.org' => 2,
+  'endoftheinternet.org' => 2,
+  'est-a-la-maison.com' => 2,
+  'est-a-la-masion.com' => 2,
+  'est-le-patron.com' => 2,
+  'est-mon-blogueur.com' => 2,
+  'for-better.biz' => 2,
+  'for-more.biz' => 2,
+  'for-our.info' => 2,
+  'for-some.biz' => 2,
+  'for-the.biz' => 2,
+  'forgot.her.name' => 2,
+  'forgot.his.name' => 2,
+  'from-ak.com' => 2,
+  'from-al.com' => 2,
+  'from-ar.com' => 2,
+  'from-az.net' => 2,
+  'from-ca.com' => 2,
+  'from-co.net' => 2,
+  'from-ct.com' => 2,
+  'from-dc.com' => 2,
+  'from-de.com' => 2,
+  'from-fl.com' => 2,
+  'from-ga.com' => 2,
+  'from-hi.com' => 2,
+  'from-ia.com' => 2,
+  'from-id.com' => 2,
+  'from-il.com' => 2,
+  'from-in.com' => 2,
+  'from-ks.com' => 2,
+  'from-ky.com' => 2,
+  'from-la.net' => 2,
+  'from-ma.com' => 2,
+  'from-md.com' => 2,
+  'from-me.org' => 2,
+  'from-mi.com' => 2,
+  'from-mn.com' => 2,
+  'from-mo.com' => 2,
+  'from-ms.com' => 2,
+  'from-mt.com' => 2,
+  'from-nc.com' => 2,
+  'from-nd.com' => 2,
+  'from-ne.com' => 2,
+  'from-nh.com' => 2,
+  'from-nj.com' => 2,
+  'from-nm.com' => 2,
+  'from-nv.com' => 2,
+  'from-ny.net' => 2,
+  'from-oh.com' => 2,
+  'from-ok.com' => 2,
+  'from-or.com' => 2,
+  'from-pa.com' => 2,
+  'from-pr.com' => 2,
+  'from-ri.com' => 2,
+  'from-sc.com' => 2,
+  'from-sd.com' => 2,
+  'from-tn.com' => 2,
+  'from-tx.com' => 2,
+  'from-ut.com' => 2,
+  'from-va.com' => 2,
+  'from-vt.com' => 2,
+  'from-wa.com' => 2,
+  'from-wi.com' => 2,
+  'from-wv.com' => 2,
+  'from-wy.com' => 2,
+  'ftpaccess.cc' => 2,
+  'fuettertdasnetz.de' => 2,
+  'game-host.org' => 2,
+  'game-server.cc' => 2,
+  'getmyip.com' => 2,
+  'gets-it.net' => 2,
+  'go.dyndns.org' => 2,
+  'gotdns.com' => 2,
+  'gotdns.org' => 2,
+  'groks-the.info' => 2,
+  'groks-this.info' => 2,
+  'ham-radio-op.net' => 2,
+  'here-for-more.info' => 2,
+  'hobby-site.com' => 2,
+  'hobby-site.org' => 2,
+  'home.dyndns.org' => 2,
+  'homedns.org' => 2,
+  'homeftp.net' => 2,
+  'homeftp.org' => 2,
+  'homeip.net' => 2,
+  'homelinux.com' => 2,
+  'homelinux.net' => 2,
+  'homelinux.org' => 2,
+  'homeunix.com' => 2,
+  'homeunix.net' => 2,
+  'homeunix.org' => 2,
+  'iamallama.com' => 2,
+  'in-the-band.net' => 2,
+  'is-a-anarchist.com' => 2,
+  'is-a-blogger.com' => 2,
+  'is-a-bookkeeper.com' => 2,
+  'is-a-bruinsfan.org' => 2,
+  'is-a-bulls-fan.com' => 2,
+  'is-a-candidate.org' => 2,
+  'is-a-caterer.com' => 2,
+  'is-a-celticsfan.org' => 2,
+  'is-a-chef.com' => 2,
+  'is-a-chef.net' => 2,
+  'is-a-chef.org' => 2,
+  'is-a-conservative.com' => 2,
+  'is-a-cpa.com' => 2,
+  'is-a-cubicle-slave.com' => 2,
+  'is-a-democrat.com' => 2,
+  'is-a-designer.com' => 2,
+  'is-a-doctor.com' => 2,
+  'is-a-financialadvisor.com' => 2,
+  'is-a-geek.com' => 2,
+  'is-a-geek.net' => 2,
+  'is-a-geek.org' => 2,
+  'is-a-green.com' => 2,
+  'is-a-guru.com' => 2,
+  'is-a-hard-worker.com' => 2,
+  'is-a-hunter.com' => 2,
+  'is-a-knight.org' => 2,
+  'is-a-landscaper.com' => 2,
+  'is-a-lawyer.com' => 2,
+  'is-a-liberal.com' => 2,
+  'is-a-libertarian.com' => 2,
+  'is-a-linux-user.org' => 2,
+  'is-a-llama.com' => 2,
+  'is-a-musician.com' => 2,
+  'is-a-nascarfan.com' => 2,
+  'is-a-nurse.com' => 2,
+  'is-a-painter.com' => 2,
+  'is-a-patsfan.org' => 2,
+  'is-a-personaltrainer.com' => 2,
+  'is-a-photographer.com' => 2,
+  'is-a-player.com' => 2,
+  'is-a-republican.com' => 2,
+  'is-a-rockstar.com' => 2,
+  'is-a-socialist.com' => 2,
+  'is-a-soxfan.org' => 2,
+  'is-a-student.com' => 2,
+  'is-a-teacher.com' => 2,
+  'is-a-techie.com' => 2,
+  'is-a-therapist.com' => 2,
+  'is-an-accountant.com' => 2,
+  'is-an-actor.com' => 2,
+  'is-an-actress.com' => 2,
+  'is-an-anarchist.com' => 2,
+  'is-an-artist.com' => 2,
+  'is-an-engineer.com' => 2,
+  'is-an-entertainer.com' => 2,
+  'is-by.us' => 2,
+  'is-certified.com' => 2,
+  'is-found.org' => 2,
+  'is-gone.com' => 2,
+  'is-into-anime.com' => 2,
+  'is-into-cars.com' => 2,
+  'is-into-cartoons.com' => 2,
+  'is-into-games.com' => 2,
+  'is-leet.com' => 2,
+  'is-lost.org' => 2,
+  'is-not-certified.com' => 2,
+  'is-saved.org' => 2,
+  'is-slick.com' => 2,
+  'is-uberleet.com' => 2,
+  'is-very-bad.org' => 2,
+  'is-very-evil.org' => 2,
+  'is-very-good.org' => 2,
+  'is-very-nice.org' => 2,
+  'is-very-sweet.org' => 2,
+  'is-with-theband.com' => 2,
+  'isa-geek.com' => 2,
+  'isa-geek.net' => 2,
+  'isa-geek.org' => 2,
+  'isa-hockeynut.com' => 2,
+  'issmarterthanyou.com' => 2,
+  'isteingeek.de' => 2,
+  'istmein.de' => 2,
+  'kicks-ass.net' => 2,
+  'kicks-ass.org' => 2,
+  'knowsitall.info' => 2,
+  'land-4-sale.us' => 2,
+  'lebtimnetz.de' => 2,
+  'leitungsen.de' => 2,
+  'likes-pie.com' => 2,
+  'likescandy.com' => 2,
+  'merseine.nu' => 2,
+  'mine.nu' => 2,
+  'misconfused.org' => 2,
+  'mypets.ws' => 2,
+  'myphotos.cc' => 2,
+  'neat-url.com' => 2,
+  'office-on-the.net' => 2,
+  'on-the-web.tv' => 2,
+  'podzone.net' => 2,
+  'podzone.org' => 2,
+  'readmyblog.org' => 2,
+  'saves-the-whales.com' => 2,
+  'scrapper-site.net' => 2,
+  'scrapping.cc' => 2,
+  'selfip.biz' => 2,
+  'selfip.com' => 2,
+  'selfip.info' => 2,
+  'selfip.net' => 2,
+  'selfip.org' => 2,
+  'sells-for-less.com' => 2,
+  'sells-for-u.com' => 2,
+  'sells-it.net' => 2,
+  'sellsyourhome.org' => 2,
+  'servebbs.com' => 2,
+  'servebbs.net' => 2,
+  'servebbs.org' => 2,
+  'serveftp.net' => 2,
+  'serveftp.org' => 2,
+  'servegame.org' => 2,
+  'shacknet.nu' => 2,
+  'simple-url.com' => 2,
+  'space-to-rent.com' => 2,
+  'stuff-4-sale.org' => 2,
+  'stuff-4-sale.us' => 2,
+  'teaches-yoga.com' => 2,
+  'thruhere.net' => 2,
+  'traeumtgerade.de' => 2,
+  'webhop.biz' => 2,
+  'webhop.info' => 2,
+  'webhop.net' => 2,
+  'webhop.org' => 2,
+  'worse-than.tv' => 2,
+  'writesthisblog.com' => 2,
+  'ddnss.de' => 2,
+  'dyn.ddnss.de' => 2,
+  'dyndns.ddnss.de' => 2,
+  'dyndns1.de' => 2,
+  'dyn-ip24.de' => 2,
+  'home-webserver.de' => 2,
+  'dyn.home-webserver.de' => 2,
+  'myhome-server.de' => 2,
+  'ddnss.org' => 2,
+  'definima.net' => 2,
+  'definima.io' => 2,
+  'bci.dnstrace.pro' => 2,
+  'ddnsfree.com' => 2,
+  'ddnsgeek.com' => 2,
+  'giize.com' => 2,
+  'gleeze.com' => 2,
+  'kozow.com' => 2,
+  'loseyourip.com' => 2,
+  'ooguy.com' => 2,
+  'theworkpc.com' => 2,
+  'casacam.net' => 2,
+  'dynu.net' => 2,
+  'accesscam.org' => 2,
+  'camdvr.org' => 2,
+  'freeddns.org' => 2,
+  'mywire.org' => 2,
+  'webredirect.org' => 2,
+  'myddns.rocks' => 2,
+  'blogsite.xyz' => 2,
+  'dynv6.net' => 2,
+  'e4.cz' => 2,
+  'mytuleap.com' => 2,
+  'enonic.io' => 2,
+  'customer.enonic.io' => 2,
+  'eu.org' => 2,
+  'al.eu.org' => 2,
+  'asso.eu.org' => 2,
+  'at.eu.org' => 2,
+  'au.eu.org' => 2,
+  'be.eu.org' => 2,
+  'bg.eu.org' => 2,
+  'ca.eu.org' => 2,
+  'cd.eu.org' => 2,
+  'ch.eu.org' => 2,
+  'cn.eu.org' => 2,
+  'cy.eu.org' => 2,
+  'cz.eu.org' => 2,
+  'de.eu.org' => 2,
+  'dk.eu.org' => 2,
+  'edu.eu.org' => 2,
+  'ee.eu.org' => 2,
+  'es.eu.org' => 2,
+  'fi.eu.org' => 2,
+  'fr.eu.org' => 2,
+  'gr.eu.org' => 2,
+  'hr.eu.org' => 2,
+  'hu.eu.org' => 2,
+  'ie.eu.org' => 2,
+  'il.eu.org' => 2,
+  'in.eu.org' => 2,
+  'int.eu.org' => 2,
+  'is.eu.org' => 2,
+  'it.eu.org' => 2,
+  'jp.eu.org' => 2,
+  'kr.eu.org' => 2,
+  'lt.eu.org' => 2,
+  'lu.eu.org' => 2,
+  'lv.eu.org' => 2,
+  'mc.eu.org' => 2,
+  'me.eu.org' => 2,
+  'mk.eu.org' => 2,
+  'mt.eu.org' => 2,
+  'my.eu.org' => 2,
+  'net.eu.org' => 2,
+  'ng.eu.org' => 2,
+  'nl.eu.org' => 2,
+  'no.eu.org' => 2,
+  'nz.eu.org' => 2,
+  'paris.eu.org' => 2,
+  'pl.eu.org' => 2,
+  'pt.eu.org' => 2,
+  'q-a.eu.org' => 2,
+  'ro.eu.org' => 2,
+  'ru.eu.org' => 2,
+  'se.eu.org' => 2,
+  'si.eu.org' => 2,
+  'sk.eu.org' => 2,
+  'tr.eu.org' => 2,
+  'uk.eu.org' => 2,
+  'us.eu.org' => 2,
+  'eu-1.evennode.com' => 2,
+  'eu-2.evennode.com' => 2,
+  'eu-3.evennode.com' => 2,
+  'eu-4.evennode.com' => 2,
+  'us-1.evennode.com' => 2,
+  'us-2.evennode.com' => 2,
+  'us-3.evennode.com' => 2,
+  'us-4.evennode.com' => 2,
+  'twmail.cc' => 2,
+  'twmail.net' => 2,
+  'twmail.org' => 2,
+  'mymailer.com.tw' => 2,
+  'url.tw' => 2,
+  'apps.fbsbx.com' => 2,
+  'ru.net' => 2,
+  'adygeya.ru' => 2,
+  'bashkiria.ru' => 2,
+  'bir.ru' => 2,
+  'cbg.ru' => 2,
+  'com.ru' => 2,
+  'dagestan.ru' => 2,
+  'grozny.ru' => 2,
+  'kalmykia.ru' => 2,
+  'kustanai.ru' => 2,
+  'marine.ru' => 2,
+  'mordovia.ru' => 2,
+  'msk.ru' => 2,
+  'mytis.ru' => 2,
+  'nalchik.ru' => 2,
+  'nov.ru' => 2,
+  'pyatigorsk.ru' => 2,
+  'spb.ru' => 2,
+  'vladikavkaz.ru' => 2,
+  'vladimir.ru' => 2,
+  'abkhazia.su' => 2,
+  'adygeya.su' => 2,
+  'aktyubinsk.su' => 2,
+  'arkhangelsk.su' => 2,
+  'armenia.su' => 2,
+  'ashgabad.su' => 2,
+  'azerbaijan.su' => 2,
+  'balashov.su' => 2,
+  'bashkiria.su' => 2,
+  'bryansk.su' => 2,
+  'bukhara.su' => 2,
+  'chimkent.su' => 2,
+  'dagestan.su' => 2,
+  'east-kazakhstan.su' => 2,
+  'exnet.su' => 2,
+  'georgia.su' => 2,
+  'grozny.su' => 2,
+  'ivanovo.su' => 2,
+  'jambyl.su' => 2,
+  'kalmykia.su' => 2,
+  'kaluga.su' => 2,
+  'karacol.su' => 2,
+  'karaganda.su' => 2,
+  'karelia.su' => 2,
+  'khakassia.su' => 2,
+  'krasnodar.su' => 2,
+  'kurgan.su' => 2,
+  'kustanai.su' => 2,
+  'lenug.su' => 2,
+  'mangyshlak.su' => 2,
+  'mordovia.su' => 2,
+  'msk.su' => 2,
+  'murmansk.su' => 2,
+  'nalchik.su' => 2,
+  'navoi.su' => 2,
+  'north-kazakhstan.su' => 2,
+  'nov.su' => 2,
+  'obninsk.su' => 2,
+  'penza.su' => 2,
+  'pokrovsk.su' => 2,
+  'sochi.su' => 2,
+  'spb.su' => 2,
+  'tashkent.su' => 2,
+  'termez.su' => 2,
+  'togliatti.su' => 2,
+  'troitsk.su' => 2,
+  'tselinograd.su' => 2,
+  'tula.su' => 2,
+  'tuva.su' => 2,
+  'vladikavkaz.su' => 2,
+  'vladimir.su' => 2,
+  'vologda.su' => 2,
+  'channelsdvr.net' => 2,
+  'fastlylb.net' => 2,
+  'map.fastlylb.net' => 2,
+  'freetls.fastly.net' => 2,
+  'map.fastly.net' => 2,
+  'a.prod.fastly.net' => 2,
+  'global.prod.fastly.net' => 2,
+  'a.ssl.fastly.net' => 2,
+  'b.ssl.fastly.net' => 2,
+  'global.ssl.fastly.net' => 2,
+  'fastpanel.direct' => 2,
+  'fastvps-server.com' => 2,
+  'fhapp.xyz' => 2,
+  'fedorainfracloud.org' => 2,
+  'fedorapeople.org' => 2,
+  'cloud.fedoraproject.org' => 2,
+  'app.os.fedoraproject.org' => 2,
+  'app.os.stg.fedoraproject.org' => 2,
+  'mydobiss.com' => 2,
+  'filegear.me' => 2,
+  'firebaseapp.com' => 2,
+  'flynnhub.com' => 2,
+  'flynnhosting.net' => 2,
+  'freebox-os.com' => 2,
+  'freeboxos.com' => 2,
+  'fbx-os.fr' => 2,
+  'fbxos.fr' => 2,
+  'freebox-os.fr' => 2,
+  'freeboxos.fr' => 2,
+  'freedesktop.org' => 2,
+  '*.futurecms.at' => 2,
+  '*.ex.futurecms.at' => 2,
+  '*.in.futurecms.at' => 2,
+  'futurehosting.at' => 2,
+  'futuremailing.at' => 2,
+  '*.ex.ortsinfo.at' => 2,
+  '*.kunden.ortsinfo.at' => 2,
+  '*.statics.cloud' => 2,
+  'service.gov.uk' => 2,
+  'github.io' => 2,
+  'githubusercontent.com' => 2,
+  'gitlab.io' => 2,
+  'homeoffice.gov.uk' => 2,
+  'ro.im' => 2,
+  'shop.ro' => 2,
+  'goip.de' => 2,
+  '*.0emm.com' => 2,
+  'appspot.com' => 2,
+  'blogspot.ae' => 2,
+  'blogspot.al' => 2,
+  'blogspot.am' => 2,
+  'blogspot.ba' => 2,
+  'blogspot.be' => 2,
+  'blogspot.bg' => 2,
+  'blogspot.bj' => 2,
+  'blogspot.ca' => 2,
+  'blogspot.cf' => 2,
+  'blogspot.ch' => 2,
+  'blogspot.cl' => 2,
+  'blogspot.co.at' => 2,
+  'blogspot.co.id' => 2,
+  'blogspot.co.il' => 2,
+  'blogspot.co.ke' => 2,
+  'blogspot.co.nz' => 2,
+  'blogspot.co.uk' => 2,
+  'blogspot.co.za' => 2,
+  'blogspot.com' => 2,
+  'blogspot.com.ar' => 2,
+  'blogspot.com.au' => 2,
+  'blogspot.com.br' => 2,
+  'blogspot.com.by' => 2,
+  'blogspot.com.co' => 2,
+  'blogspot.com.cy' => 2,
+  'blogspot.com.ee' => 2,
+  'blogspot.com.eg' => 2,
+  'blogspot.com.es' => 2,
+  'blogspot.com.mt' => 2,
+  'blogspot.com.ng' => 2,
+  'blogspot.com.tr' => 2,
+  'blogspot.com.uy' => 2,
+  'blogspot.cv' => 2,
+  'blogspot.cz' => 2,
+  'blogspot.de' => 2,
+  'blogspot.dk' => 2,
+  'blogspot.fi' => 2,
+  'blogspot.fr' => 2,
+  'blogspot.gr' => 2,
+  'blogspot.hk' => 2,
+  'blogspot.hr' => 2,
+  'blogspot.hu' => 2,
+  'blogspot.ie' => 2,
+  'blogspot.in' => 2,
+  'blogspot.is' => 2,
+  'blogspot.it' => 2,
+  'blogspot.jp' => 2,
+  'blogspot.kr' => 2,
+  'blogspot.li' => 2,
+  'blogspot.lt' => 2,
+  'blogspot.lu' => 2,
+  'blogspot.md' => 2,
+  'blogspot.mk' => 2,
+  'blogspot.mr' => 2,
+  'blogspot.mx' => 2,
+  'blogspot.my' => 2,
+  'blogspot.nl' => 2,
+  'blogspot.no' => 2,
+  'blogspot.pe' => 2,
+  'blogspot.pt' => 2,
+  'blogspot.qa' => 2,
+  'blogspot.re' => 2,
+  'blogspot.ro' => 2,
+  'blogspot.rs' => 2,
+  'blogspot.ru' => 2,
+  'blogspot.se' => 2,
+  'blogspot.sg' => 2,
+  'blogspot.si' => 2,
+  'blogspot.sk' => 2,
+  'blogspot.sn' => 2,
+  'blogspot.td' => 2,
+  'blogspot.tw' => 2,
+  'blogspot.ug' => 2,
+  'blogspot.vn' => 2,
+  'cloudfunctions.net' => 2,
+  'cloud.goog' => 2,
+  'codespot.com' => 2,
+  'googleapis.com' => 2,
+  'googlecode.com' => 2,
+  'pagespeedmobilizer.com' => 2,
+  'publishproxy.com' => 2,
+  'withgoogle.com' => 2,
+  'withyoutube.com' => 2,
+  'hashbang.sh' => 2,
+  'hasura.app' => 2,
+  'hasura-app.io' => 2,
+  'hepforge.org' => 2,
+  'herokuapp.com' => 2,
+  'herokussl.com' => 2,
+  'myravendb.com' => 2,
+  'ravendb.community' => 2,
+  'ravendb.me' => 2,
+  'development.run' => 2,
+  'ravendb.run' => 2,
+  'moonscale.net' => 2,
+  'iki.fi' => 2,
+  'biz.at' => 2,
+  'info.at' => 2,
+  'info.cx' => 2,
+  'ac.leg.br' => 2,
+  'al.leg.br' => 2,
+  'am.leg.br' => 2,
+  'ap.leg.br' => 2,
+  'ba.leg.br' => 2,
+  'ce.leg.br' => 2,
+  'df.leg.br' => 2,
+  'es.leg.br' => 2,
+  'go.leg.br' => 2,
+  'ma.leg.br' => 2,
+  'mg.leg.br' => 2,
+  'ms.leg.br' => 2,
+  'mt.leg.br' => 2,
+  'pa.leg.br' => 2,
+  'pb.leg.br' => 2,
+  'pe.leg.br' => 2,
+  'pi.leg.br' => 2,
+  'pr.leg.br' => 2,
+  'rj.leg.br' => 2,
+  'rn.leg.br' => 2,
+  'ro.leg.br' => 2,
+  'rr.leg.br' => 2,
+  'rs.leg.br' => 2,
+  'sc.leg.br' => 2,
+  'se.leg.br' => 2,
+  'sp.leg.br' => 2,
+  'to.leg.br' => 2,
+  'pixolino.com' => 2,
+  'ipifony.net' => 2,
+  'mein-iserv.de' => 2,
+  'test-iserv.de' => 2,
+  'myjino.ru' => 2,
+  '*.hosting.myjino.ru' => 2,
+  '*.landing.myjino.ru' => 2,
+  '*.spectrum.myjino.ru' => 2,
+  '*.vps.myjino.ru' => 2,
+  '*.triton.zone' => 2,
+  '*.cns.joyent.com' => 2,
+  'js.org' => 2,
+  'keymachine.de' => 2,
+  'knightpoint.systems' => 2,
+  'co.krd' => 2,
+  'edu.krd' => 2,
+  'git-repos.de' => 2,
+  'lcube-server.de' => 2,
+  'svn-repos.de' => 2,
+  'app.lmpm.com' => 2,
+  'linkitools.space' => 2,
+  'linkyard.cloud' => 2,
+  'linkyard-cloud.ch' => 2,
+  'we.bs' => 2,
+  'krasnik.pl' => 2,
+  'leczna.pl' => 2,
+  'lubartow.pl' => 2,
+  'lublin.pl' => 2,
+  'poniatowa.pl' => 2,
+  'swidnik.pl' => 2,
+  'uklugs.org' => 2,
+  'glug.org.uk' => 2,
+  'lug.org.uk' => 2,
+  'lugs.org.uk' => 2,
+  'barsy.bg' => 2,
+  'barsy.co.uk' => 2,
+  'barsyonline.co.uk' => 2,
+  'barsycenter.com' => 2,
+  'barsyonline.com' => 2,
+  'barsy.club' => 2,
+  'barsy.de' => 2,
+  'barsy.eu' => 2,
+  'barsy.in' => 2,
+  'barsy.info' => 2,
+  'barsy.io' => 2,
+  'barsy.me' => 2,
+  'barsy.menu' => 2,
+  'barsy.mobi' => 2,
+  'barsy.net' => 2,
+  'barsy.online' => 2,
+  'barsy.org' => 2,
+  'barsy.pro' => 2,
+  'barsy.pub' => 2,
+  'barsy.shop' => 2,
+  'barsy.site' => 2,
+  'barsy.support' => 2,
+  'barsy.uk' => 2,
+  '*.magentosite.cloud' => 2,
+  'mayfirst.info' => 2,
+  'mayfirst.org' => 2,
+  'hb.cldmail.ru' => 2,
+  'miniserver.com' => 2,
+  'memset.net' => 2,
+  'cloud.metacentrum.cz' => 2,
+  'custom.metacentrum.cz' => 2,
+  'flt.cloud.muni.cz' => 2,
+  'usr.cloud.muni.cz' => 2,
+  'meteorapp.com' => 2,
+  'eu.meteorapp.com' => 2,
+  'co.pl' => 2,
+  'azurecontainer.io' => 2,
+  'azurewebsites.net' => 2,
+  'azure-mobile.net' => 2,
+  'cloudapp.net' => 2,
+  'mozilla-iot.org' => 2,
+  'bmoattachments.org' => 2,
+  'net.ru' => 2,
+  'org.ru' => 2,
+  'pp.ru' => 2,
+  'bitballoon.com' => 2,
+  'netlify.com' => 2,
+  '4u.com' => 2,
+  'ngrok.io' => 2,
+  'nh-serv.co.uk' => 2,
+  'nfshost.com' => 2,
+  'dnsking.ch' => 2,
+  'mypi.co' => 2,
+  'n4t.co' => 2,
+  '001www.com' => 2,
+  'ddnslive.com' => 2,
+  'myiphost.com' => 2,
+  'forumz.info' => 2,
+  '16-b.it' => 2,
+  '32-b.it' => 2,
+  '64-b.it' => 2,
+  'soundcast.me' => 2,
+  'tcp4.me' => 2,
+  'dnsup.net' => 2,
+  'hicam.net' => 2,
+  'now-dns.net' => 2,
+  'ownip.net' => 2,
+  'vpndns.net' => 2,
+  'dynserv.org' => 2,
+  'now-dns.org' => 2,
+  'x443.pw' => 2,
+  'now-dns.top' => 2,
+  'ntdll.top' => 2,
+  'freeddns.us' => 2,
+  'crafting.xyz' => 2,
+  'zapto.xyz' => 2,
+  'nsupdate.info' => 2,
+  'nerdpol.ovh' => 2,
+  'blogsyte.com' => 2,
+  'brasilia.me' => 2,
+  'cable-modem.org' => 2,
+  'ciscofreak.com' => 2,
+  'collegefan.org' => 2,
+  'couchpotatofries.org' => 2,
+  'damnserver.com' => 2,
+  'ddns.me' => 2,
+  'ditchyourip.com' => 2,
+  'dnsfor.me' => 2,
+  'dnsiskinky.com' => 2,
+  'dvrcam.info' => 2,
+  'dynns.com' => 2,
+  'eating-organic.net' => 2,
+  'fantasyleague.cc' => 2,
+  'geekgalaxy.com' => 2,
+  'golffan.us' => 2,
+  'health-carereform.com' => 2,
+  'homesecuritymac.com' => 2,
+  'homesecuritypc.com' => 2,
+  'hopto.me' => 2,
+  'ilovecollege.info' => 2,
+  'loginto.me' => 2,
+  'mlbfan.org' => 2,
+  'mmafan.biz' => 2,
+  'myactivedirectory.com' => 2,
+  'mydissent.net' => 2,
+  'myeffect.net' => 2,
+  'mymediapc.net' => 2,
+  'mypsx.net' => 2,
+  'mysecuritycamera.com' => 2,
+  'mysecuritycamera.net' => 2,
+  'mysecuritycamera.org' => 2,
+  'net-freaks.com' => 2,
+  'nflfan.org' => 2,
+  'nhlfan.net' => 2,
+  'no-ip.ca' => 2,
+  'no-ip.co.uk' => 2,
+  'no-ip.net' => 2,
+  'noip.us' => 2,
+  'onthewifi.com' => 2,
+  'pgafan.net' => 2,
+  'point2this.com' => 2,
+  'pointto.us' => 2,
+  'privatizehealthinsurance.net' => 2,
+  'quicksytes.com' => 2,
+  'read-books.org' => 2,
+  'securitytactics.com' => 2,
+  'serveexchange.com' => 2,
+  'servehumour.com' => 2,
+  'servep2p.com' => 2,
+  'servesarcasm.com' => 2,
+  'stufftoread.com' => 2,
+  'ufcfan.org' => 2,
+  'unusualperson.com' => 2,
+  'workisboring.com' => 2,
+  '3utilities.com' => 2,
+  'bounceme.net' => 2,
+  'ddns.net' => 2,
+  'ddnsking.com' => 2,
+  'gotdns.ch' => 2,
+  'hopto.org' => 2,
+  'myftp.biz' => 2,
+  'myftp.org' => 2,
+  'myvnc.com' => 2,
+  'no-ip.biz' => 2,
+  'no-ip.info' => 2,
+  'no-ip.org' => 2,
+  'noip.me' => 2,
+  'redirectme.net' => 2,
+  'servebeer.com' => 2,
+  'serveblog.net' => 2,
+  'servecounterstrike.com' => 2,
+  'serveftp.com' => 2,
+  'servegame.com' => 2,
+  'servehalflife.com' => 2,
+  'servehttp.com' => 2,
+  'serveirc.com' => 2,
+  'serveminecraft.net' => 2,
+  'servemp3.com' => 2,
+  'servepics.com' => 2,
+  'servequake.com' => 2,
+  'sytes.net' => 2,
+  'webhop.me' => 2,
+  'zapto.org' => 2,
+  'stage.nodeart.io' => 2,
+  'nodum.co' => 2,
+  'nodum.io' => 2,
+  'pcloud.host' => 2,
+  'nyc.mn' => 2,
+  'nom.ae' => 2,
+  'nom.af' => 2,
+  'nom.ai' => 2,
+  'nom.al' => 2,
+  'nym.by' => 2,
+  'nym.bz' => 2,
+  'nom.cl' => 2,
+  'nom.gd' => 2,
+  'nom.ge' => 2,
+  'nom.gl' => 2,
+  'nym.gr' => 2,
+  'nom.gt' => 2,
+  'nym.gy' => 2,
+  'nom.hn' => 2,
+  'nym.ie' => 2,
+  'nom.im' => 2,
+  'nom.ke' => 2,
+  'nym.kz' => 2,
+  'nym.la' => 2,
+  'nym.lc' => 2,
+  'nom.li' => 2,
+  'nym.li' => 2,
+  'nym.lt' => 2,
+  'nym.lu' => 2,
+  'nym.me' => 2,
+  'nom.mk' => 2,
+  'nym.mn' => 2,
+  'nym.mx' => 2,
+  'nom.nu' => 2,
+  'nym.nz' => 2,
+  'nym.pe' => 2,
+  'nym.pt' => 2,
+  'nom.pw' => 2,
+  'nom.qa' => 2,
+  'nym.ro' => 2,
+  'nom.rs' => 2,
+  'nom.si' => 2,
+  'nym.sk' => 2,
+  'nom.st' => 2,
+  'nym.su' => 2,
+  'nym.sx' => 2,
+  'nom.tj' => 2,
+  'nym.tw' => 2,
+  'nom.ug' => 2,
+  'nom.uy' => 2,
+  'nom.vc' => 2,
+  'nom.vg' => 2,
+  'cya.gg' => 2,
+  'cloudycluster.net' => 2,
+  'nid.io' => 2,
+  'opencraft.hosting' => 2,
+  'operaunite.com' => 2,
+  'outsystemscloud.com' => 2,
+  'ownprovider.com' => 2,
+  'own.pm' => 2,
+  'ox.rs' => 2,
+  'oy.lc' => 2,
+  'pgfog.com' => 2,
+  'pagefrontapp.com' => 2,
+  'art.pl' => 2,
+  'gliwice.pl' => 2,
+  'krakow.pl' => 2,
+  'poznan.pl' => 2,
+  'wroc.pl' => 2,
+  'zakopane.pl' => 2,
+  'pantheonsite.io' => 2,
+  'gotpantheon.com' => 2,
+  'mypep.link' => 2,
+  'on-web.fr' => 2,
+  '*.platform.sh' => 2,
+  '*.platformsh.site' => 2,
+  'xen.prgmr.com' => 2,
+  'priv.at' => 2,
+  'protonet.io' => 2,
+  'chirurgiens-dentistes-en-france.fr' => 2,
+  'byen.site' => 2,
+  'instantcloud.cn' => 2,
+  'ras.ru' => 2,
+  'qa2.com' => 2,
+  'dev-myqnapcloud.com' => 2,
+  'alpha-myqnapcloud.com' => 2,
+  'myqnapcloud.com' => 2,
+  '*.quipelements.com' => 2,
+  'vapor.cloud' => 2,
+  'vaporcloud.io' => 2,
+  'rackmaze.com' => 2,
+  'rackmaze.net' => 2,
+  'readthedocs.io' => 2,
+  'rhcloud.com' => 2,
+  'resindevice.io' => 2,
+  'devices.resinstaging.io' => 2,
+  'hzc.io' => 2,
+  'wellbeingzone.eu' => 2,
+  'ptplus.fit' => 2,
+  'wellbeingzone.co.uk' => 2,
+  'sandcats.io' => 2,
+  'logoip.de' => 2,
+  'logoip.com' => 2,
+  'schokokeks.net' => 2,
+  'scrysec.com' => 2,
+  'firewall-gateway.com' => 2,
+  'firewall-gateway.de' => 2,
+  'my-gateway.de' => 2,
+  'my-router.de' => 2,
+  'spdns.de' => 2,
+  'spdns.eu' => 2,
+  'firewall-gateway.net' => 2,
+  'my-firewall.org' => 2,
+  'myfirewall.org' => 2,
+  'spdns.org' => 2,
+  '*.s5y.io' => 2,
+  '*.sensiosite.cloud' => 2,
+  'biz.ua' => 2,
+  'co.ua' => 2,
+  'pp.ua' => 2,
+  'shiftedit.io' => 2,
+  'myshopblocks.com' => 2,
+  '1kapp.com' => 2,
+  'appchizi.com' => 2,
+  'applinzi.com' => 2,
+  'sinaapp.com' => 2,
+  'vipsinaapp.com' => 2,
+  'siteleaf.net' => 2,
+  'bounty-full.com' => 2,
+  'alpha.bounty-full.com' => 2,
+  'beta.bounty-full.com' => 2,
+  'static.land' => 2,
+  'dev.static.land' => 2,
+  'sites.static.land' => 2,
+  'apps.lair.io' => 2,
+  '*.stolos.io' => 2,
+  'spacekit.io' => 2,
+  'customer.speedpartner.de' => 2,
+  'storj.farm' => 2,
+  'utwente.io' => 2,
+  'temp-dns.com' => 2,
+  'diskstation.me' => 2,
+  'dscloud.biz' => 2,
+  'dscloud.me' => 2,
+  'dscloud.mobi' => 2,
+  'dsmynas.com' => 2,
+  'dsmynas.net' => 2,
+  'dsmynas.org' => 2,
+  'familyds.com' => 2,
+  'familyds.net' => 2,
+  'familyds.org' => 2,
+  'i234.me' => 2,
+  'myds.me' => 2,
+  'synology.me' => 2,
+  'vpnplus.to' => 2,
+  'taifun-dns.de' => 2,
+  'gda.pl' => 2,
+  'gdansk.pl' => 2,
+  'gdynia.pl' => 2,
+  'med.pl' => 2,
+  'sopot.pl' => 2,
+  'gwiddle.co.uk' => 2,
+  'cust.dev.thingdust.io' => 2,
+  'cust.disrec.thingdust.io' => 2,
+  'cust.prod.thingdust.io' => 2,
+  'cust.testing.thingdust.io' => 2,
+  'bloxcms.com' => 2,
+  'townnews-staging.com' => 2,
+  '12hp.at' => 2,
+  '2ix.at' => 2,
+  '4lima.at' => 2,
+  'lima-city.at' => 2,
+  '12hp.ch' => 2,
+  '2ix.ch' => 2,
+  '4lima.ch' => 2,
+  'lima-city.ch' => 2,
+  'trafficplex.cloud' => 2,
+  'de.cool' => 2,
+  '12hp.de' => 2,
+  '2ix.de' => 2,
+  '4lima.de' => 2,
+  'lima-city.de' => 2,
+  '1337.pictures' => 2,
+  'clan.rip' => 2,
+  'lima-city.rocks' => 2,
+  'webspace.rocks' => 2,
+  'lima.zone' => 2,
+  '*.transurl.be' => 2,
+  '*.transurl.eu' => 2,
+  '*.transurl.nl' => 2,
+  'tuxfamily.org' => 2,
+  'dd-dns.de' => 2,
+  'diskstation.eu' => 2,
+  'diskstation.org' => 2,
+  'dray-dns.de' => 2,
+  'draydns.de' => 2,
+  'dyn-vpn.de' => 2,
+  'dynvpn.de' => 2,
+  'mein-vigor.de' => 2,
+  'my-vigor.de' => 2,
+  'my-wan.de' => 2,
+  'syno-ds.de' => 2,
+  'synology-diskstation.de' => 2,
+  'synology-ds.de' => 2,
+  'uber.space' => 2,
+  '*.uberspace.de' => 2,
+  'hk.com' => 2,
+  'hk.org' => 2,
+  'ltd.hk' => 2,
+  'inc.hk' => 2,
+  'virtualuser.de' => 2,
+  'virtual-user.de' => 2,
+  'lib.de.us' => 2,
+  '2038.io' => 2,
+  'router.management' => 2,
+  'v-info.info' => 2,
+  'wedeploy.io' => 2,
+  'wedeploy.me' => 2,
+  'wedeploy.sh' => 2,
+  'remotewd.com' => 2,
+  'wmflabs.org' => 2,
+  'half.host' => 2,
+  'xnbay.com' => 2,
+  'u2.xnbay.com' => 2,
+  'u2-local.xnbay.com' => 2,
+  'cistron.nl' => 2,
+  'demon.nl' => 2,
+  'xs4all.space' => 2,
+  'official.academy' => 2,
+  'yolasite.com' => 2,
+  'ybo.faith' => 2,
+  'yombo.me' => 2,
+  'homelink.one' => 2,
+  'ybo.party' => 2,
+  'ybo.review' => 2,
+  'ybo.science' => 2,
+  'ybo.trade' => 2,
+  'nohost.me' => 2,
+  'noho.st' => 2,
+  'za.net' => 2,
+  'za.org' => 2,
+  'now.sh' => 2,
+  'zone.id' => 2,
+);

+ 19 - 0
api/vendor/layershifter/tld-database/src/Exceptions/Exception.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * TLDDatabase: Abstraction for Public Suffix List in PHP.
+ *
+ * @link      https://github.com/layershifter/TLDDatabase
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDDatabase/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDDatabase\Exceptions;
+
+/**
+ * Base exception.
+ */
+abstract class Exception extends \Exception
+{
+
+}

+ 19 - 0
api/vendor/layershifter/tld-database/src/Exceptions/HttpException.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * TLDDatabase: Abstraction for Public Suffix List in PHP.
+ *
+ * @link      https://github.com/layershifter/TLDDatabase
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDDatabase/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDDatabase\Exceptions;
+
+/**
+ * HTTP exception.
+ */
+final class HttpException extends Exception
+{
+
+}

+ 19 - 0
api/vendor/layershifter/tld-database/src/Exceptions/IOException.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * TLDDatabase: Abstraction for Public Suffix List in PHP.
+ *
+ * @link      https://github.com/layershifter/TLDDatabase
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDDatabase/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDDatabase\Exceptions;
+
+/**
+ * Exception for file operations.
+ */
+final class IOException extends Exception
+{
+
+}

+ 19 - 0
api/vendor/layershifter/tld-database/src/Exceptions/ParserException.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * TLDDatabase: Abstraction for Public Suffix List in PHP.
+ *
+ * @link      https://github.com/layershifter/TLDDatabase
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDDatabase/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDDatabase\Exceptions;
+
+/**
+ * Parser exception.
+ */
+final class ParserException extends Exception
+{
+
+}

+ 19 - 0
api/vendor/layershifter/tld-database/src/Exceptions/StoreException.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * TLDDatabase: Abstraction for Public Suffix List in PHP.
+ *
+ * @link      https://github.com/layershifter/TLDDatabase
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDDatabase/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDDatabase\Exceptions;
+
+/**
+ * Store exception.
+ */
+final class StoreException extends Exception
+{
+
+}

+ 19 - 0
api/vendor/layershifter/tld-database/src/Exceptions/UpdateException.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * TLDDatabase: Abstraction for Public Suffix List in PHP.
+ *
+ * @link      https://github.com/layershifter/TLDDatabase
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDDatabase/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDDatabase\Exceptions;
+
+/**
+ * Update exception.
+ */
+final class UpdateException extends Exception
+{
+
+}

+ 30 - 0
api/vendor/layershifter/tld-database/src/Http/AdapterInterface.php

@@ -0,0 +1,30 @@
+<?php
+/**
+ * TLDDatabase: Abstraction for Public Suffix List in PHP.
+ *
+ * @link      https://github.com/layershifter/TLDDatabase
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDDatabase/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDDatabase\Http;
+
+use LayerShifter\TLDDatabase\Exceptions\HttpException;
+
+/**
+ * AdapterInterface for HTTP adapters that can be used for fetching Public Suffix List.
+ */
+interface AdapterInterface
+{
+    /**
+     * Fetches Public Suffix List file and returns its content as array of strings.
+     *
+     * @param string $url URL of Public Suffix List file.
+     *
+     * @return array|string[]
+     *
+     * @throws HttpException
+     */
+    public function get($url);
+}

+ 66 - 0
api/vendor/layershifter/tld-database/src/Http/CurlAdapter.php

@@ -0,0 +1,66 @@
+<?php
+/**
+ * TLDDatabase: Abstraction for Public Suffix List in PHP.
+ *
+ * @link      https://github.com/layershifter/TLDDatabase
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDDatabase/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDDatabase\Http;
+
+use LayerShifter\TLDDatabase\Exceptions\HttpException;
+
+/**
+ * cURL adapter for fetching Public Suffix List.
+ */
+final class CurlAdapter implements AdapterInterface
+{
+    /**
+     * @const int Number of seconds for HTTP timeout.
+     */
+    const TIMEOUT = 60;
+
+    /**
+     * @inheritdoc
+     */
+    public function get($url)
+    {
+        $curl = curl_init();
+
+        curl_setopt($curl, CURLOPT_URL, $url);
+        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
+
+        curl_setopt($curl, CURLOPT_TIMEOUT, CurlAdapter::TIMEOUT);
+        curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, CurlAdapter::TIMEOUT);
+
+        // If windows is used, SSL verification will be disabled.
+
+        if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
+            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
+            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
+        }
+
+        $responseContent = curl_exec($curl);
+        $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
+
+        $errorMessage = curl_error($curl);
+        $errorNumber = curl_errno($curl);
+
+        curl_close($curl);
+
+        if ($errorNumber !== 0) {
+            throw new HttpException(sprintf('Get cURL error while fetching PSL file: %s', $errorMessage));
+        }
+
+        if ($responseCode !== 200) {
+            throw new HttpException(
+                sprintf('Get invalid HTTP response code "%d" while fetching PSL file', $responseCode)
+            );
+        }
+
+        return preg_split('/[\n\r]+/', $responseContent);
+    }
+}

+ 99 - 0
api/vendor/layershifter/tld-database/src/Parser.php

@@ -0,0 +1,99 @@
+<?php
+/**
+ * TLDDatabase: Abstraction for Public Suffix List in PHP.
+ *
+ * @link      https://github.com/layershifter/TLDDatabase
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDDatabase/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDDatabase;
+
+use LayerShifter\TLDDatabase\Exceptions\ParserException;
+use LayerShifter\TLDSupport\Helpers\Str;
+
+/**
+ * Class for parsing input of lines from Public Suffix List.
+ */
+final class Parser
+{
+    /**
+     * @const string String which shows that the line is a comment.
+     */
+    const COMMENT_STRING_START = '//';
+    /**
+     * @const string Commentary string which shows that beginning of private domains list.
+     */
+    const PRIVATE_DOMAINS_STRING = '// ===BEGIN PRIVATE DOMAINS===';
+
+    /**
+     * @var bool Flags which indicates what type of domain is currently parsed.
+     */
+    private $isICANNSuffix = true;
+    /**
+     * @var array|string[] Input array of lines from Public Suffix List.
+     */
+    private $lines = [];
+
+    /**
+     * Parser constructor.
+     *
+     * @param array|string[] $lines Array of lines from Public Suffix List
+     *
+     * @throws ParserException
+     */
+    public function __construct($lines)
+    {
+        if (!is_array($lines)) {
+            throw new ParserException('Invalid argument type, expecting array');
+        }
+
+        $this->lines = $lines;
+    }
+
+    /**
+     * Method that parses submitted strings and returns array from valid suffixes.
+     *
+     * Parser features the following rules apply:
+     * - the list is a set of rules, with one rule per line;
+     * - each line is only read up to the first whitespace; entire lines can also be commented using //;
+     * - each line which is not entirely whitespace or begins with a comment contains a rule;
+     *
+     * @see https://publicsuffix.org/list/
+     *
+     * @return array|string[]
+     *
+     * @throws ParserException
+     */
+    public function parse()
+    {
+        $suffixes = [];
+
+        foreach ($this->lines as $line) {
+            if (Str::startsWith($line, Parser::PRIVATE_DOMAINS_STRING)) {
+                $this->isICANNSuffix = false;
+
+                continue;
+            }
+
+            if (Str::startsWith($line, Parser::COMMENT_STRING_START)) {
+                continue;
+            }
+
+            $line = explode(' ', trim($line))[0];
+
+            if (Str::length($line) === 0) {
+                continue;
+            }
+
+            $suffixes[ $line ] = $this->isICANNSuffix ? Store::TYPE_ICANN : Store::TYPE_PRIVATE;
+        }
+
+        if (count($suffixes) === 0) {
+            throw new ParserException('Input array of lines does not have any valid suffix, check input');
+        }
+
+        return $suffixes;
+    }
+}

+ 144 - 0
api/vendor/layershifter/tld-database/src/Store.php

@@ -0,0 +1,144 @@
+<?php
+/**
+ * TLDDatabase: Abstraction for Public Suffix List in PHP.
+ *
+ * @link      https://github.com/layershifter/TLDDatabase
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDDatabase/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDDatabase;
+
+use LayerShifter\TLDDatabase\Exceptions\IOException;
+use LayerShifter\TLDDatabase\Exceptions\StoreException;
+
+/**
+ * Class for operations with database from Public Suffix List.
+ */
+class Store
+{
+    /**
+     * @const string Path to database which is supplied with library.
+     */
+    const DATABASE_FILE = '/../resources/database.php';
+    /**
+     * @const      int Type that is assigned when a suffix is ICANN TLD zone.
+     *
+     * @deprecated This constant is result of a typo, use `TYPE_ICANN` const instead.
+     */
+    const TYPE_ICCAN = 1;
+    /**
+     * @const int Type that is assigned when a suffix is ICANN TLD zone.
+     */
+    const TYPE_ICANN = 1;
+    /**
+     * @const int Type that is assigned when a suffix is private domain.
+     */
+    const TYPE_PRIVATE = 2;
+
+    /**
+     * @var array|int[] Array of suffixes where key is suffix and value is type of suffix.
+     */
+    private $suffixes;
+
+    /**
+     * Store constructor.
+     *
+     * @param string $databaseFile Optional, full path to database file.
+     *
+     * @throws IOException
+     */
+    public function __construct($databaseFile = null)
+    {
+        $databaseFile = null === $databaseFile
+            ? __DIR__ . Store::DATABASE_FILE
+            : $databaseFile;
+
+        if (!file_exists($databaseFile)) {
+            throw new IOException(sprintf('Database file (%s) does not exists', $databaseFile));
+        }
+
+        /** @noinspection PhpIncludeInspection */
+        $this->suffixes = require $databaseFile;
+
+        if (!is_array($this->suffixes)) {
+            throw new IOException(sprintf(
+                'Database file (%s) is seriously malformed, try reinstall package or run update again',
+                $databaseFile
+            ));
+        }
+    }
+
+    /**
+     * Checks existence of suffix entry in database. Returns true if suffix entry exists.
+     *
+     * @param string $suffix Suffix which existence will be checked in database.
+     *
+     * @return bool
+     */
+    public function isExists($suffix)
+    {
+        return array_key_exists($suffix, $this->suffixes);
+    }
+
+    /**
+     * Checks type of suffix entry. Returns true if suffix is ICANN TLD zone.
+     *
+     * @param string $suffix Suffix which type will be checked.
+     *
+     * @return int
+     *
+     * @throws StoreException
+     */
+    public function getType($suffix)
+    {
+        if (!array_key_exists($suffix, $this->suffixes)) {
+            throw new StoreException(sprintf(
+                'Provided suffix (%s) does not exists in database, check existence of entry with isExists() method ' .
+                'before',
+                $suffix
+            ));
+        }
+
+        return $this->suffixes[ $suffix ];
+    }
+
+    /**
+     * Checks type of suffix entry. Returns true if suffix is ICANN TLD zone.
+     *
+     * @param string $suffix Suffix which type will be checked.
+     *
+     * @deprecated This method is result of a typo, use `isICANN` const instead
+     *
+     * @return bool
+     */
+    public function isICCAN($suffix)
+    {
+        return $this->isICANN($suffix);
+    }
+
+    /**
+     * Checks type of suffix entry. Returns true if suffix is ICANN TLD zone.
+     *
+     * @param string $suffix Suffix which type will be checked.
+     *
+     * @return bool
+     */
+    public function isICANN($suffix)
+    {
+        return $this->getType($suffix) === Store::TYPE_ICANN;
+    }
+
+    /**
+     * Checks type of suffix entry. Returns true if suffix is private.
+     *
+     * @param string $suffix Suffix which type will be checked.
+     *
+     * @return bool
+     */
+    public function isPrivate($suffix)
+    {
+        return $this->getType($suffix) === Store::TYPE_PRIVATE;
+    }
+}

+ 119 - 0
api/vendor/layershifter/tld-database/src/Update.php

@@ -0,0 +1,119 @@
+<?php
+/**
+ * TLDDatabase: Abstraction for Public Suffix List in PHP.
+ *
+ * @link      https://github.com/layershifter/TLDDatabase
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDDatabase/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDDatabase;
+
+use LayerShifter\TLDDatabase\Exceptions\IOException;
+use LayerShifter\TLDDatabase\Exceptions\UpdateException;
+use LayerShifter\TLDDatabase\Http\AdapterInterface;
+use LayerShifter\TLDDatabase\Http\CurlAdapter;
+
+/**
+ * Class that performs database update with actual data from Public Suffix List.
+ */
+class Update
+{
+    /**
+     * @const string URL to Public Suffix List file.
+     * @todo Switch back after https://github.com/publicsuffix/list/issues/724 will be resolved
+     */
+    const PUBLIC_SUFFIX_LIST_URL = 'https://raw.githubusercontent.com/publicsuffix/list/master/public_suffix_list.dat';
+
+    /**
+     * @var AdapterInterface Object of HTTP adapter.
+     */
+    private $httpAdapter;
+    /**
+     * @var string Output filename.
+     */
+    private $outputFileName;
+
+    /**
+     * Parser constructor.
+     *
+     * @param string $outputFileName Filename of target file
+     * @param string $httpAdapter    Optional class name of custom HTTP adapter
+     *
+     * @throws UpdateException
+     */
+    public function __construct($outputFileName = null, $httpAdapter = null)
+    {
+        /*
+         * Defining output filename.
+         * */
+
+        $this->outputFileName = null === $outputFileName
+            ? __DIR__ . Store::DATABASE_FILE
+            : $outputFileName;
+
+        /*
+         * Defining HTTP adapter.
+         * */
+
+        if (null === $httpAdapter) {
+            $this->httpAdapter = new CurlAdapter();
+
+            return;
+        }
+
+        if (!class_exists($httpAdapter)) {
+            throw new Exceptions\UpdateException(sprintf('Class "%s" is not defined', $httpAdapter));
+        }
+
+        $this->httpAdapter = new $httpAdapter();
+
+        if (!($this->httpAdapter instanceof AdapterInterface)) {
+            throw new Exceptions\UpdateException(sprintf('Class "%s" is implements adapter interface', $httpAdapter));
+        }
+    }
+
+    /**
+     * Fetches actual Public Suffix List and writes obtained suffixes to target file.
+     *
+     * @return void
+     *
+     * @throws IOException
+     */
+    public function run()
+    {
+        /*
+         * Fetching Public Suffix List and parse suffixes.
+         * */
+
+        $lines = $this->httpAdapter->get(Update::PUBLIC_SUFFIX_LIST_URL);
+
+        $parser = new Parser($lines);
+        $suffixes = $parser->parse();
+
+        /*
+         * Write file with exclusive file write lock.
+         * */
+
+        $handle = @fopen($this->outputFileName, 'w+');
+
+        if ($handle === false) {
+            throw new Exceptions\IOException(error_get_last()['message']);
+        }
+
+        if (!flock($handle, LOCK_EX)) {
+            throw new Exceptions\IOException(sprintf('Cannot obtain lock to output file (%s)', $this->outputFileName));
+        }
+
+        $suffixFile = '<?php' . PHP_EOL . 'return ' . var_export($suffixes, true) . ';';
+        $writtenBytes = fwrite($handle, $suffixFile);
+
+        if ($writtenBytes === false || $writtenBytes !== strlen($suffixFile)) {
+            throw new Exceptions\IOException(sprintf('Write to output file (%s) failed', $this->outputFileName));
+        }
+
+        flock($handle, LOCK_UN);
+        fclose($handle);
+    }
+}

+ 44 - 0
api/vendor/layershifter/tld-extract/composer.json

@@ -0,0 +1,44 @@
+{
+  "name": "layershifter/tld-extract",
+  "type": "library",
+  "description": "TLDExtract, library for extracting parts of domain, e.q. domain parser",
+  "keywords": [
+    "TLDExtract",
+    "domain parser"
+  ],
+  "minimum-stability": "stable",
+  "license": "Apache-2.0",
+  "authors": [
+    {
+      "name": "Alexander Fedyashov",
+      "email": "a@fedyashov.com"
+    }
+  ],
+  "require": {
+    "php": "^5.5.0 || ^7.0",
+    "layershifter/tld-database": "^1.0",
+    "layershifter/tld-support": "^1.1",
+    "true/punycode": "^2.1.1"
+  },
+  "require-dev": {
+    "phpmd/phpmd": "@stable",
+    "phpunit/phpunit": "^4.8 || ^5.0",
+    "squizlabs/php_codesniffer": "~2.0"
+  },
+  "autoload": {
+    "files": [
+      "src/static.php"
+    ],
+    "psr-4": {
+      "LayerShifter\\TLDExtract\\": "src/"
+    }
+  },
+  "autoload-dev": {
+    "psr-4": {
+      "LayerShifter\\TLDExtract\\Tests\\": "tests/"
+    }
+  },
+  "scripts": {
+    "test": "phpunit"
+  }
+}

+ 19 - 0
api/vendor/layershifter/tld-extract/src/Exceptions/Exception.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * TLDExtract: Library for extraction of domain parts e.g. TLD. Domain parser that uses Public Suffix List.
+ *
+ * @link      https://github.com/layershifter/TLDExtract
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDExtract/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDExtract\Exceptions;
+
+/**
+ * Base exception.
+ */
+abstract class Exception extends \Exception
+{
+
+}

+ 18 - 0
api/vendor/layershifter/tld-extract/src/Exceptions/RuntimeException.php

@@ -0,0 +1,18 @@
+<?php
+/**
+ * TLDExtract: Library for extraction of domain parts e.g. TLD. Domain parser that uses Public Suffix List.
+ *
+ * @link      https://github.com/layershifter/TLDExtract
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDExtract/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDExtract\Exceptions;
+
+/**
+ * Exception for runtime errors.
+ */
+class RuntimeException extends Exception
+{
+}

+ 398 - 0
api/vendor/layershifter/tld-extract/src/Extract.php

@@ -0,0 +1,398 @@
+<?php
+/**
+ * TLDExtract: Library for extraction of domain parts e.g. TLD. Domain parser that uses Public Suffix List.
+ *
+ * @link      https://github.com/layershifter/TLDExtract
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDExtract/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDExtract;
+
+use LayerShifter\TLDDatabase\Store;
+use LayerShifter\TLDExtract\Exceptions\RuntimeException;
+use LayerShifter\TLDSupport\Helpers\Arr;
+use LayerShifter\TLDSupport\Helpers\IP;
+use LayerShifter\TLDSupport\Helpers\Str;
+use TrueBV\Exception\OutOfBoundsException;
+
+/**
+ * Extract class accurately extracts subdomain, domain and TLD components from URLs.
+ *
+ * @see Result for more information on the returned data structure.
+ */
+class Extract
+{
+
+    /**
+     * @const int If this option provided, extract will consider ICANN suffixes.
+     */
+    const MODE_ALLOW_ICANN = 2;
+
+    /**
+     * @deprecated This constant is a typo, please use self::MODE_ALLOW_ICANN
+     */
+    const MODE_ALLOW_ICCAN = self::MODE_ALLOW_ICANN;
+
+    /**
+     * @const int If this option provided, extract will consider private suffixes.
+     */
+    const MODE_ALLOW_PRIVATE = 4;
+    /**
+     * @const int If this option provided, extract will consider custom domains.
+     */
+    const MODE_ALLOW_NOT_EXISTING_SUFFIXES = 8;
+    /**
+     * @const string RFC 3986 compliant scheme regex pattern.
+     *
+     * @see   https://tools.ietf.org/html/rfc3986#section-3.1
+     */
+    const SCHEMA_PATTERN = '#^([a-zA-Z][a-zA-Z0-9+\-.]*:)?//#';
+    /**
+     * @const string The specification for this regex is based upon the extracts from RFC 1034 and RFC 2181 below.
+     *
+     * @see   https://tools.ietf.org/html/rfc1034
+     * @see   https://tools.ietf.org/html/rfc2181
+     */
+    const HOSTNAME_PATTERN = '#^((?!-)[a-z0-9_-]{0,62}[a-z0-9_]\.)+[a-z]{2,63}|[xn\-\-a-z0-9]]{6,63}$#';
+
+    /**
+     * @var int Value of extraction options.
+     */
+    private $extractionMode;
+    /**
+     * @var string Name of class that will store results of parsing.
+     */
+    private $resultClassName;
+    /**
+     * @var IDN Object of TLDExtract\IDN class.
+     */
+    private $idn;
+    /**
+     * @var Store Object of TLDDatabase\Store class.
+     */
+    private $suffixStore;
+
+    /**
+     * Factory constructor.
+     *
+     * @param null|string $databaseFile    Optional, name of file with Public Suffix List database
+     * @param null|string $resultClassName Optional, name of class that will store results of parsing
+     * @param null|int    $extractionMode  Optional, option that will control extraction process
+     *
+     * @throws RuntimeException
+     */
+    public function __construct($databaseFile = null, $resultClassName = null, $extractionMode = null)
+    {
+        $this->idn = new IDN();
+        $this->suffixStore = new Store($databaseFile);
+        $this->resultClassName = Result::class;
+
+        // Checks for resultClassName argument.
+
+        if (null !== $resultClassName) {
+            if (!class_exists($resultClassName)) {
+                throw new RuntimeException(sprintf('Class "%s" is not defined', $resultClassName));
+            }
+
+            if (!in_array(ResultInterface::class, class_implements($resultClassName), true)) {
+                throw new RuntimeException(sprintf('Class "%s" not implements ResultInterface', $resultClassName));
+            }
+
+            $this->resultClassName = $resultClassName;
+        }
+
+        $this->setExtractionMode($extractionMode);
+    }
+
+    /**
+     * Sets extraction mode, option that will control extraction process.
+     *
+     * @param int $extractionMode One of MODE_* constants
+     *
+     * @throws RuntimeException
+     */
+    public function setExtractionMode($extractionMode = null)
+    {
+        if (null === $extractionMode) {
+            $this->extractionMode = static::MODE_ALLOW_ICANN
+                | static::MODE_ALLOW_PRIVATE
+                | static::MODE_ALLOW_NOT_EXISTING_SUFFIXES;
+
+            return;
+        }
+
+        if (!is_int($extractionMode)) {
+            throw new RuntimeException('Invalid argument type, extractionMode must be integer');
+        }
+
+        if (!in_array($extractionMode, [
+            static::MODE_ALLOW_ICANN,
+            static::MODE_ALLOW_PRIVATE,
+            static::MODE_ALLOW_NOT_EXISTING_SUFFIXES,
+            static::MODE_ALLOW_ICANN | static::MODE_ALLOW_PRIVATE,
+            static::MODE_ALLOW_ICANN | static::MODE_ALLOW_NOT_EXISTING_SUFFIXES,
+            static::MODE_ALLOW_ICANN | static::MODE_ALLOW_PRIVATE | static::MODE_ALLOW_NOT_EXISTING_SUFFIXES,
+            static::MODE_ALLOW_PRIVATE | static::MODE_ALLOW_NOT_EXISTING_SUFFIXES
+        ], true)
+        ) {
+            throw new RuntimeException(
+                'Invalid argument type, extractionMode must be one of defined constants of their combination'
+            );
+        }
+
+        $this->extractionMode = $extractionMode;
+    }
+
+    /**
+     * Extract the subdomain, host and gTLD/ccTLD components from a URL.
+     *
+     * @param string $url URL that will be extracted
+     *
+     * @return ResultInterface
+     */
+    public function parse($url)
+    {
+        $hostname = $this->extractHostname($url);
+
+        // If received hostname is valid IP address, result will be formed from it.
+
+        if (IP::isValid($hostname)) {
+            return new $this->resultClassName(null, $hostname, null);
+        }
+
+        list($subDomain, $host, $suffix) = $this->extractParts($hostname);
+
+        return new $this->resultClassName($subDomain, $host, $suffix);
+    }
+
+    /**
+     * Method that extracts the hostname or IP address from a URL.
+     *
+     * @param string $url URL for extraction
+     *
+     * @return null|string Hostname or IP address
+     */
+    private function extractHostname($url)
+    {
+        $url = trim(Str::lower($url));
+
+        // Removes scheme and path i.e. "https://github.com/layershifter" to "github.com/layershifter".
+
+        $url = preg_replace(static::SCHEMA_PATTERN, '', $url);
+
+        // Removes path and query part of URL i.e. "github.com/layershifter" to "github.com".
+
+        $url = $this->fixUriParts($url);
+        $hostname = Arr::first(explode('/', $url, 2));
+
+        // Removes username from URL i.e. user@github.com to github.com.
+
+        $hostname = Arr::last(explode('@', $hostname));
+
+        // Remove ports from hosts, also check for IPv6 literals like "[3ffe:2a00:100:7031::1]".
+        //
+        // @see http://www.ietf.org/rfc/rfc2732.txt
+
+        $lastBracketPosition = Str::strrpos($hostname, ']');
+
+        if ($lastBracketPosition !== false && Str::startsWith($hostname, '[')) {
+            return Str::substr($hostname, 1, $lastBracketPosition - 1);
+        }
+
+        // This is either a normal hostname or an IPv4 address, just remove the port.
+
+        $hostname = Arr::first(explode(':', $hostname));
+
+        // If string is empty, null will be returned.
+
+        return '' === $hostname ? null : $hostname;
+    }
+
+    /**
+     * Extracts subdomain, host and suffix from input string. Based on algorithm described in
+     * https://publicsuffix.org/list/.
+     *
+     * @param string $hostname Hostname for extraction
+     *
+     * @return array|string[] An array that contains subdomain, host and suffix.
+     */
+    public function extractParts($hostname)
+    {
+        $suffix = $this->extractSuffix($hostname);
+
+        if ($suffix === $hostname) {
+            return [null, $hostname, null];
+        }
+
+        if (null !== $suffix) {
+            $hostname = Str::substr($hostname, 0, -Str::length($suffix) - 1);
+        }
+
+        $lastDot = Str::strrpos($hostname, '.');
+
+        if (false === $lastDot) {
+            return [null, $hostname, $suffix];
+        }
+
+        $subDomain = Str::substr($hostname, 0, $lastDot);
+        $host = Str::substr($hostname, $lastDot + 1);
+
+        return [
+            $subDomain,
+            $host,
+            $suffix
+        ];
+    }
+
+    /**
+     * Extracts suffix from hostname using Public Suffix List database.
+     *
+     * @param string $hostname Hostname for extraction
+     *
+     * @return null|string
+     */
+    private function extractSuffix($hostname)
+    {
+        // If hostname has leading dot, it's invalid.
+        // If hostname is a single label domain makes, it's invalid.
+
+        if (Str::startsWith($hostname, '.') || Str::strpos($hostname, '.') === false) {
+            return null;
+        }
+
+        // If domain is in punycode, it will be converted to IDN.
+
+        $isPunycoded = Str::strpos($hostname, 'xn--') !== false;
+
+        if ($isPunycoded) {
+            $hostname = $this->idn->toUTF8($hostname);
+        }
+
+        // URI producers should use names that conform to the DNS syntax, even when use of DNS is not immediately
+        // apparent, and should limit these names to no more than 255 characters in length.
+        //
+        // @see https://tools.ietf.org/html/rfc3986
+        // @see http://blogs.msdn.com/b/oldnewthing/archive/2012/04/12/10292868.aspx
+
+        if (Str::length($hostname) > 253) {
+            return null;
+        }
+
+        // The DNS itself places only one restriction on the particular labels that can be used to identify resource
+        // records. That one restriction relates to the length of the label and the full name. The length of any one
+        // label is limited to between 1 and 63 octets. A full domain name is limited to 255 octets (including the
+        // separators).
+        //
+        // @see http://tools.ietf.org/html/rfc2181
+
+        try {
+            $asciiHostname = $this->idn->toASCII($hostname);
+        } catch (OutOfBoundsException $e) {
+            return null;
+        }
+
+        if (0 === preg_match(self::HOSTNAME_PATTERN, $asciiHostname)) {
+            return null;
+        }
+
+        $suffix = $this->parseSuffix($hostname);
+
+        if (null === $suffix) {
+            if (!($this->extractionMode & static::MODE_ALLOW_NOT_EXISTING_SUFFIXES)) {
+                return null;
+            }
+
+            $suffix = Str::substr($hostname, Str::strrpos($hostname, '.') + 1);
+        }
+
+        // If domain is punycoded, suffix will be converted to punycode.
+
+        return $isPunycoded ? $this->idn->toASCII($suffix) : $suffix;
+    }
+
+    /**
+     * Extracts suffix from hostname using Public Suffix List database.
+     *
+     * @param string $hostname Hostname for extraction
+     *
+     * @return null|string
+     */
+    private function parseSuffix($hostname)
+    {
+        $hostnameParts = explode('.', $hostname);
+        $realSuffix = null;
+
+        for ($i = 0, $count = count($hostnameParts); $i < $count; $i++) {
+            $possibleSuffix = implode('.', array_slice($hostnameParts, $i));
+            $exceptionSuffix = '!' . $possibleSuffix;
+
+            if ($this->suffixExists($exceptionSuffix)) {
+                $realSuffix = implode('.', array_slice($hostnameParts, $i + 1));
+
+                break;
+            }
+
+            if ($this->suffixExists($possibleSuffix)) {
+                $realSuffix = $possibleSuffix;
+
+                break;
+            }
+
+            $wildcardTld = '*.' . implode('.', array_slice($hostnameParts, $i + 1));
+
+            if ($this->suffixExists($wildcardTld)) {
+                $realSuffix = $possibleSuffix;
+
+                break;
+            }
+        }
+
+        return $realSuffix;
+    }
+
+    /**
+     * Method that checks existence of entry in Public Suffix List database, including provided options.
+     *
+     * @param string $entry Entry for check in Public Suffix List database
+     *
+     * @return bool
+     */
+    protected function suffixExists($entry)
+    {
+        if (!$this->suffixStore->isExists($entry)) {
+            return false;
+        }
+
+        $type = $this->suffixStore->getType($entry);
+
+        if ($this->extractionMode & static::MODE_ALLOW_ICANN && $type === Store::TYPE_ICANN) {
+            return true;
+        }
+
+        return $this->extractionMode & static::MODE_ALLOW_PRIVATE && $type === Store::TYPE_PRIVATE;
+    }
+
+    /**
+     * Fixes URL:
+     * - from "github.com?layershifter" to "github.com/?layershifter".
+     * - from "github.com#layershifter" to "github.com/#layershifter".
+     *
+     * @see https://github.com/layershifter/TLDExtract/issues/5
+     *
+     * @param string $url
+     *
+     * @return string
+     */
+    private function fixUriParts($url)
+    {
+        $position = Str::strpos($url, '?') ?: Str::strpos($url, '#');
+
+        if ($position === false) {
+            return $url;
+        }
+
+        return Str::substr($url, 0, $position) . '/' . Str::substr($url, $position);
+    }
+}

+ 67 - 0
api/vendor/layershifter/tld-extract/src/IDN.php

@@ -0,0 +1,67 @@
+<?php
+
+namespace LayerShifter\TLDExtract;
+
+use TrueBV\Punycode;
+
+/**
+ * Class that transforms IDN domains, if `intl` extension present uses it.
+ */
+class IDN
+{
+
+    /**
+     * @var Punycode Object of TrueBV\Punycode class.
+     */
+    private $transformer;
+
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        if (!function_exists('\idn_to_utf8')) {
+            $this->transformer = new Punycode();
+        }
+    }
+
+    /**
+     * Converts domain name from Unicode to IDNA ASCII.
+     *
+     * @param string $domain Domain to convert in IDNA ASCII-compatible format.
+     *
+     * @return string
+     */
+    public function toASCII($domain)
+    {
+        if ($this->transformer) {
+            return $this->transformer->encode($domain);
+        }
+
+        if (defined('INTL_IDNA_VARIANT_UTS46')) {
+            return idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46);
+        }
+
+        return idn_to_ascii($domain);
+    }
+
+    /**
+     * Converts domain name from IDNA ASCII to Unicode.
+     *
+     * @param string $domain Domain to convert in Unicode format.
+     *
+     * @return string
+     */
+    public function toUTF8($domain)
+    {
+        if ($this->transformer) {
+            return $this->transformer->decode($domain);
+        }
+
+        if (defined('INTL_IDNA_VARIANT_UTS46')) {
+            return idn_to_utf8($domain, 0, INTL_IDNA_VARIANT_UTS46);
+        }
+
+        return idn_to_utf8($domain);
+    }
+}

+ 296 - 0
api/vendor/layershifter/tld-extract/src/Result.php

@@ -0,0 +1,296 @@
+<?php
+/**
+ * TLDExtract: Library for extraction of domain parts e.g. TLD. Domain parser that uses Public Suffix List.
+ *
+ * @link      https://github.com/layershifter/TLDExtract
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDExtract/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDExtract;
+
+use LayerShifter\TLDSupport\Helpers\IP;
+
+/**
+ * This class holds the components of a domain name.
+ *
+ * You can access the components using either method, property or array syntax. For example, "echo $result->suffix" and
+ * "echo $result['suffix']" will both work and output the same string.
+ *
+ * All properties are read-only.
+ *
+ * @property-read null|string $subdomain
+ * @property-read null|string $hostname
+ * @property-read null|string $suffix
+ */
+class Result implements \ArrayAccess, ResultInterface
+{
+    /**
+     * The subdomain. For example, the subdomain of "a.b.google.com" is "a.b".
+     *
+     * @var null|string
+     */
+    private $subdomain;
+    /**
+     * Hostname part of domain or IP-address. For example, in "a.b.google.com" the registered domain is "google".
+     *
+     * @var null|string
+     */
+    private $hostname;
+    /**
+     * The top-level domain / public suffix. For example: "com", "co.uk", "act.edu.au".
+     *
+     * @var null|string
+     */
+    private $suffix;
+
+    /**
+     * Constructor of class.
+     *
+     * @param null|string $subdomain
+     * @param null|string $hostname
+     * @param null|string $suffix
+     */
+    public function __construct($subdomain, $hostname, $suffix)
+    {
+        $this->subdomain = $subdomain;
+        $this->hostname = $hostname;
+        $this->suffix = $suffix;
+    }
+
+    /**
+     * Returns subdomain if it exists.
+     *
+     * @return null|string
+     */
+    public function getSubdomain()
+    {
+        return $this->subdomain;
+    }
+
+    /**
+     * Return subdomains if they exist, example subdomain is "www.news", method will return array ['www', 'bbc'].
+     *
+     * @return array
+     */
+    public function getSubdomains()
+    {
+        return null === $this->subdomain ? array() : explode('.', $this->subdomain);
+    }
+
+    /**
+     * Returns hostname if it exists.
+     *
+     * @return null|string
+     */
+    public function getHostname()
+    {
+        return $this->hostname;
+    }
+
+    /**
+     * Returns suffix if it exists.
+     *
+     * @return null|string
+     */
+    public function getSuffix()
+    {
+        return $this->suffix;
+    }
+
+    /**
+     * Method that returns full host record.
+     *
+     * @return string
+     */
+    public function getFullHost()
+    {
+        // Case 1: Host hasn't suffix, possibly IP.
+
+        if (null === $this->suffix) {
+            return $this->hostname;
+        }
+
+        // Case 2: Domain with suffix, but without subdomain.
+
+        if (null === $this->subdomain) {
+            return $this->hostname . '.' . $this->suffix;
+        }
+
+        // Case 3: Domain with suffix & subdomain.
+
+        return implode('.', [$this->subdomain, $this->hostname, $this->suffix]);
+    }
+
+    /**
+     * Returns registrable domain or null.
+     *
+     * @return null|string
+     */
+    public function getRegistrableDomain()
+    {
+        if (null === $this->suffix) {
+            return null;
+        }
+
+        return null === $this->hostname ? null : $this->hostname . '.' . $this->suffix;
+    }
+
+    /**
+     * Returns true if domain is valid.
+     *
+     * @return bool
+     */
+    public function isValidDomain()
+    {
+        return null !== $this->getRegistrableDomain();
+    }
+
+    /**
+     * Returns true is result is IP.
+     *
+     * @return bool
+     */
+    public function isIp()
+    {
+        return null === $this->suffix && IP::isValid($this->hostname);
+    }
+
+    /**
+     * Magic method for run isset on private params.
+     *
+     * @param string $name Field name
+     *
+     * @return bool
+     */
+    public function __isset($name)
+    {
+        return property_exists($this, $name);
+    }
+
+    /**
+     * Converts class fields to string.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->getFullHost();
+    }
+
+    /**
+     * Whether or not an offset exists.
+     *
+     * @param mixed $offset An offset to check for
+     *
+     * @return bool
+     */
+    public function offsetExists($offset)
+    {
+        return property_exists($this, $offset);
+    }
+
+    /**
+     * Returns the value at specified offset.
+     *
+     * @param mixed $offset The offset to retrieve.
+     *
+     * @throws \OutOfRangeException
+     *
+     * @return mixed
+     */
+    public function offsetGet($offset)
+    {
+        return $this->{$offset};
+    }
+
+    /**
+     * Magic method, controls access to private params.
+     *
+     * @param string $name Name of params to retrieve
+     *
+     * @throws \OutOfRangeException
+     *
+     * @return mixed
+     */
+    public function __get($name)
+    {
+        if (!property_exists($this, $name)) {
+            throw new \OutOfRangeException(sprintf('Unknown field "%s"', $name));
+        }
+
+        return $this->{$name};
+    }
+
+    /**
+     * Magic method, makes params read-only.
+     *
+     * @param string $name  Name of params to retrieve
+     * @param mixed  $value Value to set
+     *
+     * @throws \LogicException
+     *
+     * @return void
+     */
+    public function __set($name, $value)
+    {
+        throw new \LogicException("Can't modify an immutable object.");
+    }
+
+    /**
+     * Disables assigns a value to the specified offset.
+     *
+     * @param mixed $offset The offset to assign the value to
+     * @param mixed $value  Value to set
+     *
+     * @throws \LogicException
+     *
+     * @return void
+     */
+    public function offsetSet($offset, $value)
+    {
+        throw new \LogicException(
+            sprintf("Can't modify an immutable object. You tried to set value '%s' to field '%s'.", $value, $offset)
+        );
+    }
+
+    /**
+     * Disables unset of an offset.
+     *
+     * @param mixed $offset The offset for unset
+     *
+     * @throws \LogicException
+     *
+     * @return void
+     */
+    public function offsetUnset($offset)
+    {
+        throw new \LogicException(sprintf("Can't modify an immutable object. You tried to unset '%s.'", $offset));
+    }
+
+    /**
+     * Get the domain name components as a native PHP array. The returned array will contain these keys: 'subdomain',
+     * 'domain' and 'tld'.
+     *
+     * @return array
+     */
+    public function toArray()
+    {
+        return [
+            'subdomain' => $this->subdomain,
+            'hostname'  => $this->hostname,
+            'suffix'    => $this->suffix,
+        ];
+    }
+
+    /**
+     * Get the domain name components as a JSON.
+     *
+     * @return string
+     */
+    public function toJson()
+    {
+        return json_encode($this->toArray());
+    }
+}

+ 83 - 0
api/vendor/layershifter/tld-extract/src/ResultInterface.php

@@ -0,0 +1,83 @@
+<?php
+/**
+ * TLDExtract: Library for extraction of domain parts e.g. TLD. Domain parser that uses Public Suffix List.
+ *
+ * @link      https://github.com/layershifter/TLDExtract
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDExtract/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDExtract;
+
+/**
+ * Interface for parsing results.
+ */
+interface ResultInterface
+{
+
+    /**
+     * Class that implements ResultInterface must have following constructor.
+     *
+     * @param null|string $subdomain
+     * @param null|string $hostname
+     * @param null|string $suffix
+     */
+    public function __construct($subdomain, $hostname, $suffix);
+
+    /**
+     * Returns subdomain if it exists.
+     *
+     * @return null|string
+     */
+    public function getSubdomain();
+
+    /**
+     * Return subdomains if they exist, example subdomain is "www.news", method will return array ['www', 'bbc'].
+     *
+     * @return array
+     */
+    public function getSubdomains();
+
+    /**
+     * Returns hostname if it exists.
+     *
+     * @return null|string
+     */
+    public function getHostname();
+
+    /**
+     * Returns suffix if it exists.
+     *
+     * @return null|string
+     */
+    public function getSuffix();
+
+    /**
+     * Method that returns full host record.
+     *
+     * @return string
+     */
+    public function getFullHost();
+
+    /**
+     * Returns registrable domain or null.
+     *
+     * @return null|string
+     */
+    public function getRegistrableDomain();
+
+    /**
+     * Returns true if domain is valid.
+     *
+     * @return bool
+     */
+    public function isValidDomain();
+
+    /**
+     * Returns true is result is IP.
+     *
+     * @return bool
+     */
+    public function isIp();
+}

+ 37 - 0
api/vendor/layershifter/tld-extract/src/static.php

@@ -0,0 +1,37 @@
+<?php
+/**
+ * TLDExtract: Library for extraction of domain parts e.g. TLD. Domain parser that uses Public Suffix List.
+ *
+ * @link      https://github.com/layershifter/TLDExtract
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDExtract/master/LICENSE Apache 2.0 License
+ */
+
+namespace {
+
+    use LayerShifter\TLDExtract\Extract;
+
+    /**
+     * Extract the subdomain, host and gTLD/ccTLD components from a URL.
+     *
+     * @param string $url  URL that will be extracted
+     * @param int    $mode Optional, option that will control extraction process
+     *
+     * @return \LayerShifter\TLDExtract\ResultInterface
+     */
+    function tld_extract($url, $mode = null)
+    {
+        static $extract = null;
+
+        if (null === $extract) {
+            $extract = new Extract();
+        }
+
+        if (null !== $mode) {
+            $extract->setExtractionMode($mode);
+        }
+
+        return $extract->parse($url);
+    }
+}

+ 8 - 0
api/vendor/layershifter/tld-support/.codeclimate.yml

@@ -0,0 +1,8 @@
+exclude_paths:
+  - "/tests/*"
+  - "/vendor/*"
+languages:
+  PHP: true
+ratings:
+  paths:
+  - "**.php"

+ 8 - 0
api/vendor/layershifter/tld-support/.gitignore

@@ -0,0 +1,8 @@
+# IDE specific
+.idea/
+
+# PHP specific
+build/
+vendor/
+composer.lock
+composer.phar

+ 27 - 0
api/vendor/layershifter/tld-support/.travis.yml

@@ -0,0 +1,27 @@
+language: php
+
+php:
+  - 5.5
+  - 5.6
+  - 7.0
+  - hhvm
+
+install:
+  - composer self-update
+  - composer --prefer-source install
+
+notifications:
+  email: false
+
+env:
+  global:
+    - CODECLIMATE_REPO_TOKEN=3f96e0739f5ada6c5e2aedb71278a9b1ba2db06dc139426ae8d657b0f3020308
+
+before_script:
+  - mkdir -p build/logs
+
+script:
+  - ./vendor/bin/phpunit -v --coverage-clover ./build/logs/clover.xml
+
+after_script:
+  - ./vendor/bin/test-reporter --coverage-report ./build/logs/clover.xml

+ 201 - 0
api/vendor/layershifter/tld-support/LICENSE

@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 59 - 0
api/vendor/layershifter/tld-support/README.md

@@ -0,0 +1,59 @@
+# TLDSupport
+
+Support package for [TLDDatabase](https://github.com/layershifter/TLDDatabase) and [TLDExtract](https://github.com/layershifter/TLDExtract). This package provides helpers for work with arrays, IP addresses, strings and more.
+
+[![Build Status](https://travis-ci.org/layershifter/TLDSupport.svg)](https://travis-ci.org/layershifter/TLDSupport) [![Code Climate](https://codeclimate.com/github/layershifter/TLDSupport/badges/gpa.svg)](https://codeclimate.com/github/layershifter/TLDSupport) [![Test Coverage](https://codeclimate.com/github/layershifter/TLDSupport/badges/coverage.svg)](https://codeclimate.com/github/layershifter/TLDSupport/coverage) [![PHP 7 ready](http://php7ready.timesplinter.ch/layershifter/TLDSupport/master/badge.svg)](https://travis-ci.org/layershifter/TLDSupport})
+
+---
+
+This package is compliant with [PSR-1][], [PSR-2][], [PSR-4][]. If you notice compliance oversights, please send a patch via pull request.
+
+## Requirements
+
+The following versions of PHP are supported.
+
+* PHP 5.5
+* PHP 5.6
+* PHP 7.0
+* HHVM
+
+## Usage
+
+### Arrays:
+```php
+mixed Arr::first(array $haystack, null|callable $callback, mixed $default);
+mixed Arr::last(array $haystack, null|callable $callback, mixed $default);
+```
+### IP addresses:
+```php
+bool IP::isValid(string $hostname);
+```
+### Strings:
+```php
+bool     Str::endsWith(string $haystack, string|array $needles);
+int      Str::length(string $value);
+string   Str::lower(string $value);
+string   Str::substr(string $string, int $start, int|null $length = null);
+bool     Str::startsWith(string $haystack, string|array $needles);
+bool|int Str::strpos(string $haystack, string $needles, int $offset = 0);
+bool|int Str::strrpos(string $haystack, string $needles, int $offset = 0);
+```
+### Mixed:
+```php
+mixed Mixed::value(mixed $value);
+```
+## Install
+
+Via Composer
+
+``` bash
+$ composer require layershifter/tld-support
+```
+
+## License
+
+This library is released under the Apache 2.0 license. Please see [License File](LICENSE) for more information.
+
+[PSR-1]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md
+[PSR-2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
+[PSR-4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md

+ 32 - 0
api/vendor/layershifter/tld-support/composer.json

@@ -0,0 +1,32 @@
+{
+  "name": "layershifter/tld-support",
+  "description": "Support package for TLDDatabase and TLDExtract",
+  "minimum-stability": "stable",
+  "license": "Apache-2.0",
+  "authors": [
+    {
+      "name": "Alexander Fedyashov",
+      "email": "a@fedyashov.com"
+    }
+  ],
+  "autoload": {
+    "psr-4": {
+      "LayerShifter\\TLDSupport\\": "src/"
+    }
+  },
+  "autoload-dev": {
+    "psr-4": {
+      "LayerShifter\\TLDSupport\\Tests\\": "tests/"
+    }
+  },
+  "require": {
+    "php": ">=5.5",
+    "symfony/polyfill-mbstring": "^1.2"
+  },
+  "require-dev": {
+    "codeclimate/php-test-reporter": "dev-master",
+    "phpmd/phpmd": "@stable",
+    "phpunit/phpunit": "4.8.*",
+    "squizlabs/php_codesniffer": "2.*"
+  }
+}

+ 26 - 0
api/vendor/layershifter/tld-support/phpunit.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         bootstrap="tests/bootstrap.php"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnError="false"
+         stopOnFailure="false"
+         syntaxCheck="true"
+         verbose="true"
+>
+    <testsuites>
+        <testsuite name="TLDSupport Test Suite">
+            <directory>./tests</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./src</directory>
+        </whitelist>
+    </filter>
+</phpunit>

+ 55 - 0
api/vendor/layershifter/tld-support/src/Helpers/Arr.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace LayerShifter\TLDSupport\Helpers;
+
+/**
+ * Helper class for work with arrays.
+ * Taken from Illuminate/Support package.
+ *
+ * @see https://github.com/illuminate/support
+ */
+class Arr
+{
+
+    /**
+     * Return the first element in an array passing a given truth test.
+     *
+     * @param array         $array    Haystack array
+     * @param null|callable $callback Optional callback function
+     * @param mixed         $default  Default value if array element not found
+     *
+     * @return mixed
+     */
+    public static function first($array, callable $callback = null, $default = null)
+    {
+        if (null === $callback) {
+            return 0 === count($array) ? Mixed::value($default) : reset($array);
+        }
+
+        foreach ($array as $key => $value) {
+            if (call_user_func($callback, $value, $key)) {
+                return $value;
+            }
+        }
+
+        return Mixed::value($default);
+    }
+
+    /**
+     * Return the last element in an array passing a given truth test.
+     *
+     * @param array         $array    Haystack array
+     * @param null|callable $callback Optional callback function
+     * @param mixed         $default  Default value if array element not found
+     *
+     * @return mixed
+     */
+    public static function last($array, callable $callback = null, $default = null)
+    {
+        if (null === $callback) {
+            return 0 === count($array) ? Mixed::value($default) : end($array);
+        }
+
+        return static::first(array_reverse($array, true), $callback, $default);
+    }
+}

+ 38 - 0
api/vendor/layershifter/tld-support/src/Helpers/IP.php

@@ -0,0 +1,38 @@
+<?php
+/**
+ * TLDSupport: Support package for TLDDatabase and TLDExtract.
+ *
+ * @link      https://github.com/layershifter/TLDSupport
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDSupport/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDSupport\Helpers;
+
+/**
+ * Helper class for work with IP addresses.
+ */
+class IP
+{
+
+    /**
+     * Check if the input is a valid IP address. Recognizes both IPv4 and IPv6 addresses.
+     *
+     * @param string $hostname Hostname that will be checked
+     *
+     * @return boolean
+     */
+    public static function isValid($hostname)
+    {
+        $hostname = trim($hostname);
+
+        // Strip the wrapping square brackets from IPv6 addresses.
+
+        if (Str::startsWith($hostname, '[') && Str::endsWith($hostname, ']')) {
+            $hostname = substr($hostname, 1, -1);
+        }
+
+        return (bool)filter_var($hostname, FILTER_VALIDATE_IP);
+    }
+}

+ 25 - 0
api/vendor/layershifter/tld-support/src/Helpers/Mixed.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace LayerShifter\TLDSupport\Helpers;
+
+/**
+ * Helper class with mixed functions.
+ * Taken from Illuminate/Support package.
+ *
+ * @see https://github.com/illuminate/support
+ */
+class Mixed
+{
+
+    /**
+     * Return the default value of the given value.
+     *
+     * @param mixed $value
+     *
+     * @return mixed
+     */
+    public static function value($value)
+    {
+        return $value instanceof \Closure ? $value() : $value;
+    }
+}

+ 122 - 0
api/vendor/layershifter/tld-support/src/Helpers/Str.php

@@ -0,0 +1,122 @@
+<?php
+
+namespace LayerShifter\TLDSupport\Helpers;
+
+/**
+ * Helper class for work with strings.
+ * Taken from Illuminate/Support package.
+ *
+ * @see https://github.com/illuminate/support
+ */
+class Str
+{
+
+    /**
+     * @const string Encoding for strings.
+     */
+    const ENCODING = 'UTF-8';
+
+    /**
+     * Determine if a given string ends with a given substring.
+     *
+     * @param string       $haystack
+     * @param string|array $needles
+     *
+     * @return bool
+     */
+    public static function endsWith($haystack, $needles)
+    {
+        foreach ((array)$needles as $needle) {
+            if ((string)$needle === self::substr($haystack, -self::length($needle))) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Return the length of the given string.
+     *
+     * @param string $value
+     *
+     * @return int
+     */
+    public static function length($value)
+    {
+        return mb_strlen($value, self::ENCODING);
+    }
+
+    /**
+     * Convert the given string to lower-case.
+     *
+     * @param string $value
+     *
+     * @return string
+     */
+    public static function lower($value)
+    {
+        return mb_strtolower($value, self::ENCODING);
+    }
+
+    /**
+     * Returns the portion of string specified by the start and length parameters.
+     *
+     * @param string   $string
+     * @param int      $start
+     * @param int|null $length
+     *
+     * @return string
+     */
+    public static function substr($string, $start, $length = null)
+    {
+        return mb_substr($string, $start, $length, self::ENCODING);
+    }
+
+    /**
+     * Determine if a given string starts with a given substring.
+     *
+     * @param string       $haystack
+     * @param string|array $needles
+     *
+     * @return boolean
+     */
+    public static function startsWith($haystack, $needles)
+    {
+        foreach ((array)$needles as $needle) {
+            if ($needle !== '' && mb_strpos($haystack, $needle) === 0) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Find position of first occurrence of string in a string.
+     *
+     * @param string $haystack
+     * @param string $needle
+     * @param int    $offset
+     *
+     * @return bool|int
+     */
+    public static function strpos($haystack, $needle, $offset = 0)
+    {
+        return mb_strpos($haystack, $needle, $offset, self::ENCODING);
+    }
+
+    /**
+     * Find position of last occurrence of a string in a string.
+     *
+     * @param string $haystack
+     * @param string $needle
+     * @param int    $offset
+     *
+     * @return bool|int
+     */
+    public static function strrpos($haystack, $needle, $offset = 0)
+    {
+        return mb_strrpos($haystack, $needle, $offset, self::ENCODING);
+    }
+}

+ 64 - 0
api/vendor/layershifter/tld-support/tests/Helpers/ArrTest.php

@@ -0,0 +1,64 @@
+<?php
+/**
+ * TLDSupport: Support package for TLDDatabase and TLDExtract.
+ *
+ * @link      https://github.com/layershifter/TLDSupport
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDSupport/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDSupport\Tests\Helpers;
+
+use LayerShifter\TLDSupport\Helpers\Arr;
+
+/**
+ * Test cases for Helpers\Arr class.
+ */
+class ArrTest extends \PHPUnit_Framework_TestCase
+{
+
+    /**
+     * Test for first() method.
+     *
+     * @return void
+     */
+    public function testFirst()
+    {
+        self::assertEquals(1, Arr::first([1, 2, 3]));
+        self::assertEquals('a', Arr::first(['a', 'b', 'c']));
+        self::assertNotEquals('b', Arr::first(['a', 'b', 'c']));
+
+        self::assertEquals(2, Arr::first([1, 2, 3], function ($value) {
+            return $value === 2;
+        }));
+        self::assertEquals(null, Arr::first([1, 2, 3], function ($value) {
+            return $value === 20;
+        }));
+
+        self::assertInternalType('int', Arr::first([1, 2, 3]));
+        self::assertInternalType('string', Arr::first(['a', 'b', 'c']));
+    }
+
+    /**
+     * Test for last() method.
+     *
+     * @return void
+     */
+    public function testLast()
+    {
+        self::assertEquals(3, Arr::last([1, 2, 3]));
+        self::assertEquals('c', Arr::last(['a', 'b', 'c']));
+        self::assertNotEquals('b', Arr::last(['a', 'b', 'c']));
+
+        self::assertEquals(2, Arr::last([1, 2, 3], function ($value) {
+            return $value === 2;
+        }));
+        self::assertEquals(null, Arr::last([1, 2, 3], function ($value) {
+            return $value === 20;
+        }));
+
+        self::assertInternalType('int', Arr::last([1, 2, 3]));
+        self::assertInternalType('string', Arr::last(['a', 'b', 'c']));
+    }
+}

+ 81 - 0
api/vendor/layershifter/tld-support/tests/Helpers/IPTest.php

@@ -0,0 +1,81 @@
+<?php
+/**
+ * TLDSupport: Support package for TLDDatabase and TLDExtract.
+ *
+ * @link      https://github.com/layershifter/TLDSupport
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDSupport/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDSupport\Tests\Helpers;
+
+use LayerShifter\TLDSupport\Helpers\IP;
+
+/**
+ * Test cases for Helpers\IP class.
+ */
+class IPTest extends \PHPUnit_Framework_TestCase
+{
+
+    /**
+     * Test for isValid() method.
+     *
+     * @return void
+     */
+    public function testIsValid()
+    {
+        // IPv4 test cases.
+
+        self::assertTrue(IP::isValid('200.200.200.200'));
+        self::assertTrue(IP::isValid(' 200.200.200.200'));
+        self::assertTrue(IP::isValid('200.200.200.200 '));
+        self::assertTrue(IP::isValid('0.0.0.0'));
+        self::assertTrue(IP::isValid('255.255.255.255'));
+
+        self::assertFalse(IP::isValid('00.00.00.00'));
+        self::assertFalse(IP::isValid('100.100.020.100'));
+        self::assertFalse(IP::isValid('-1.0.0.0'));
+        self::assertFalse(IP::isValid('200.200.256.200'));
+        self::assertFalse(IP::isValid('200.200.200.200.'));
+        self::assertFalse(IP::isValid('200.200.200'));
+        self::assertFalse(IP::isValid('200.200.200.2d0'));
+        self::assertFalse(IP::isValid('200000000000000000000000000000000000000000000000000000.200.200.200'));
+
+        // IPv6 test cases.
+
+        self::assertTrue(IP::isValid('00AB:0002:3008:8CFD:00AB:0002:3008:8CFD'));
+        self::assertTrue(IP::isValid('00ab:0002:3008:8cfd:00ab:0002:3008:8cfd'));
+        self::assertTrue(IP::isValid('00aB:0002:3008:8cFd:00Ab:0002:3008:8cfD'));
+        self::assertTrue(IP::isValid('AB:02:3008:8CFD:AB:02:3008:8CFD'));
+        self::assertTrue(IP::isValid('AB:02:3008:8CFD::02:3008:8CFD'));
+        self::assertTrue(IP::isValid('::'));
+        self::assertTrue(IP::isValid('0::'));
+        self::assertTrue(IP::isValid('0::0'));
+
+        self::assertFalse(IP::isValid('00AB:00002:3008:8CFD:00AB:0002:3008:8CFD'));
+        self::assertFalse(IP::isValid(':0002:3008:8CFD:00AB:0002:3008:8CFD'));
+        self::assertFalse(IP::isValid('00AB:0002:3008:8CFD:00AB:0002:3008:'));
+        self::assertFalse(IP::isValid('AB:02:3008:8CFD:AB:02:3008:8CFD:02'));
+        self::assertFalse(IP::isValid('AB:02:3008:8CFD::02:3008:8CFD:02'));
+        self::assertFalse(IP::isValid('AB:02:3008:8CFD::02::8CFD'));
+        self::assertFalse(IP::isValid('GB:02:3008:8CFD:AB:02:3008:8CFD'));
+        self::assertFalse(IP::isValid('00000000000005.10.10.10'));
+        self::assertFalse(IP::isValid('2:::3'));
+
+        self::assertTrue(IP::isValid('[AB:02:3008:8CFD::02:3008:8CFD]'));
+        self::assertTrue(IP::isValid('[::]'));
+        self::assertTrue(IP::isValid('[::1]'));
+
+        self::assertFalse(IP::isValid('[AB:02:3008:8CFD::02:3008:8CFD'));
+        self::assertFalse(IP::isValid('::]'));
+        self::assertFalse(IP::isValid('/[::1]'));
+
+        // Domain test cases.
+
+        self::assertFalse(IP::isValid('google.com'));
+        self::assertFalse(IP::isValid('.google.com'));
+        self::assertFalse(IP::isValid('www.google.com'));
+        self::assertFalse(IP::isValid('com'));
+    }
+}

+ 38 - 0
api/vendor/layershifter/tld-support/tests/Helpers/Mixed.php

@@ -0,0 +1,38 @@
+<?php
+/**
+ * TLDSupport: Support package for TLDDatabase and TLDExtract.
+ *
+ * @link      https://github.com/layershifter/TLDSupport
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDSupport/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDSupport\Tests\Helpers;
+
+use LayerShifter\TLDSupport\Helpers\Mixed;
+
+/**
+ * Test cases for Helpers\Mixed class.
+ */
+class MixedTest extends \PHPUnit_Framework_TestCase
+{
+
+    /**
+     * Test for value() method.
+     *
+     * @return void
+     */
+    public function testValue()
+    {
+        self::assertEquals(1, Mixed::value(1));
+        self::assertInternalType('int', Mixed::value(1));
+
+        self::assertEquals(2, Mixed::value(function () {
+            return 2;
+        }));
+        self::assertInternalType('int', Mixed::value(function () {
+            return 2;
+        }));
+    }
+}

+ 122 - 0
api/vendor/layershifter/tld-support/tests/Helpers/StrTest.php

@@ -0,0 +1,122 @@
+<?php
+/**
+ * TLDSupport: Support package for TLDDatabase and TLDExtract.
+ *
+ * @link      https://github.com/layershifter/TLDSupport
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDSupport/master/LICENSE Apache 2.0 License
+ */
+
+namespace LayerShifter\TLDSupport\Tests\Helpers;
+
+use LayerShifter\TLDSupport\Helpers\Str;
+
+/**
+ * Test cases for Helpers\Str class.
+ */
+class StrTest extends \PHPUnit_Framework_TestCase
+{
+
+    /**
+     * Test for endsWith() method.
+     *
+     * @return void
+     */
+    public function testEndsWith()
+    {
+        self::assertTrue(Str::endsWith('jason', 'on'));
+        self::assertTrue(Str::endsWith('jason', 'jason'));
+        self::assertTrue(Str::endsWith('jason', ['on']));
+        self::assertTrue(Str::endsWith('jason', ['no', 'on']));
+        self::assertFalse(Str::endsWith('jason', 'no'));
+        self::assertFalse(Str::endsWith('jason', ['no']));
+        self::assertFalse(Str::endsWith('jason', ''));
+        self::assertFalse(Str::endsWith('7', ' 7'));
+    }
+
+    /**
+     * Test for length() method.
+     *
+     * @return void
+     */
+    public function testLength()
+    {
+        self::assertEquals(11, Str::length('foo bar baz'));
+    }
+
+    /**
+     * Test for lower() method.
+     *
+     * @return void
+     */
+    public function testLower()
+    {
+        self::assertEquals('foo bar baz', Str::lower('FOO BAR BAZ'));
+        self::assertEquals('foo bar baz', Str::lower('fOo Bar bAz'));
+    }
+
+    /**
+     * Test for substr() method.
+     *
+     * @return void
+     */
+    public function testSubstr()
+    {
+        self::assertEquals('Ё', Str::substr('БГДЖИЛЁ', -1));
+        self::assertEquals('ЛЁ', Str::substr('БГДЖИЛЁ', -2));
+        self::assertEquals('И', Str::substr('БГДЖИЛЁ', -3, 1));
+        self::assertEquals('ДЖИЛ', Str::substr('БГДЖИЛЁ', 2, -1));
+        self::assertEmpty(Str::substr('БГДЖИЛЁ', 4, -4));
+        self::assertEquals('ИЛ', Str::substr('БГДЖИЛЁ', -3, -1));
+        self::assertEquals('ГДЖИЛЁ', Str::substr('БГДЖИЛЁ', 1));
+        self::assertEquals('ГДЖ', Str::substr('БГДЖИЛЁ', 1, 3));
+        self::assertEquals('БГДЖ', Str::substr('БГДЖИЛЁ', 0, 4));
+        self::assertEquals('Ё', Str::substr('БГДЖИЛЁ', -1, 1));
+        self::assertEmpty(Str::substr('Б', 2));
+    }
+
+    /**
+     * Test for startsWith() method.
+     *
+     * @return void
+     */
+    public function testStartsWith()
+    {
+        self::assertTrue(Str::startsWith('jason', 'jas'));
+        self::assertTrue(Str::startsWith('jason', 'jason'));
+        self::assertTrue(Str::startsWith('jason', ['jas']));
+        self::assertTrue(Str::startsWith('jason', ['day', 'jas']));
+        self::assertFalse(Str::startsWith('jason', 'day'));
+        self::assertFalse(Str::startsWith('jason', ['day']));
+        self::assertFalse(Str::startsWith('jason', ''));
+    }
+
+    /**
+     * Test for strpos() method.
+     *
+     * @return void
+     */
+    public function testStrPos()
+    {
+        self::assertEquals(6, Str::strpos('БГДЖИЛЁ', 'Ё'));
+        self::assertEquals(0, Str::strpos('БГДЖИЛЁ', 'Б'));
+        self::assertEquals(0, Str::strpos('ЁБГДЖИЛЁ', 'Ё'));
+        self::assertEquals(2, Str::strpos('БГДЖИЛЁД', 'Д'));
+        self::assertFalse(Str::strpos('БГДЖИЛЁ', 'П'));
+    }
+
+    /**
+     * Test for strrpos() method.
+     *
+     * @return void
+     */
+    public function testStrRPos()
+    {
+        self::assertEquals(6, Str::strrpos('БГДЖИЛЁ', 'Ё'));
+        self::assertEquals(0, Str::strrpos('БГДЖИЛЁ', 'Б'));
+        self::assertEquals(7, Str::strrpos('ЁБГДЖИЛЁ', 'Ё'));
+        self::assertEquals(7, Str::strrpos('БГДЖИЛЁД', 'Д'));
+        self::assertFalse(Str::strrpos('БГДЖИЛЁ', 'П'));
+    }
+}

+ 11 - 0
api/vendor/layershifter/tld-support/tests/bootstrap.php

@@ -0,0 +1,11 @@
+<?php
+/**
+ * TLDSupport: Support package for TLDDatabase and TLDExtract.
+ *
+ * @link      https://github.com/layershifter/TLDSupport
+ *
+ * @copyright Copyright (c) 2016, Alexander Fedyashov
+ * @license   https://raw.githubusercontent.com/layershifter/TLDSupport/master/LICENSE Apache 2.0 License
+ */
+
+require __DIR__ . '/../vendor/autoload.php';

+ 19 - 0
api/vendor/symfony/polyfill-mbstring/LICENSE

@@ -0,0 +1,19 @@
+Copyright (c) 2015-2018 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 800 - 0
api/vendor/symfony/polyfill-mbstring/Mbstring.php

@@ -0,0 +1,800 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Mbstring;
+
+/**
+ * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
+ *
+ * Implemented:
+ * - mb_chr                  - Returns a specific character from its Unicode code point
+ * - mb_convert_encoding     - Convert character encoding
+ * - mb_convert_variables    - Convert character code in variable(s)
+ * - mb_decode_mimeheader    - Decode string in MIME header field
+ * - mb_encode_mimeheader    - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
+ * - mb_decode_numericentity - Decode HTML numeric string reference to character
+ * - mb_encode_numericentity - Encode character to HTML numeric string reference
+ * - mb_convert_case         - Perform case folding on a string
+ * - mb_detect_encoding      - Detect character encoding
+ * - mb_get_info             - Get internal settings of mbstring
+ * - mb_http_input           - Detect HTTP input character encoding
+ * - mb_http_output          - Set/Get HTTP output character encoding
+ * - mb_internal_encoding    - Set/Get internal character encoding
+ * - mb_list_encodings       - Returns an array of all supported encodings
+ * - mb_ord                  - Returns the Unicode code point of a character
+ * - mb_output_handler       - Callback function converts character encoding in output buffer
+ * - mb_scrub                - Replaces ill-formed byte sequences with substitute characters
+ * - mb_strlen               - Get string length
+ * - mb_strpos               - Find position of first occurrence of string in a string
+ * - mb_strrpos              - Find position of last occurrence of a string in a string
+ * - mb_strtolower           - Make a string lowercase
+ * - mb_strtoupper           - Make a string uppercase
+ * - mb_substitute_character - Set/Get substitution character
+ * - mb_substr               - Get part of string
+ * - mb_stripos              - Finds position of first occurrence of a string within another, case insensitive
+ * - mb_stristr              - Finds first occurrence of a string within another, case insensitive
+ * - mb_strrchr              - Finds the last occurrence of a character in a string within another
+ * - mb_strrichr             - Finds the last occurrence of a character in a string within another, case insensitive
+ * - mb_strripos             - Finds position of last occurrence of a string within another, case insensitive
+ * - mb_strstr               - Finds first occurrence of a string within another
+ * - mb_strwidth             - Return width of string
+ * - mb_substr_count         - Count the number of substring occurrences
+ *
+ * Not implemented:
+ * - mb_convert_kana         - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
+ * - mb_ereg_*               - Regular expression with multibyte support
+ * - mb_parse_str            - Parse GET/POST/COOKIE data and set global variable
+ * - mb_preferred_mime_name  - Get MIME charset string
+ * - mb_regex_encoding       - Returns current encoding for multibyte regex as string
+ * - mb_regex_set_options    - Set/Get the default options for mbregex functions
+ * - mb_send_mail            - Send encoded mail
+ * - mb_split                - Split multibyte string using regular expression
+ * - mb_strcut               - Get part of string
+ * - mb_strimwidth           - Get truncated string with specified width
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @internal
+ */
+final class Mbstring
+{
+    const MB_CASE_FOLD = PHP_INT_MAX;
+
+    private static $encodingList = array('ASCII', 'UTF-8');
+    private static $language = 'neutral';
+    private static $internalEncoding = 'UTF-8';
+    private static $caseFold = array(
+        array('µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"),
+        array('μ', 's', 'ι',        'σ', 'β',        'θ',        'φ',        'π',        'κ',        'ρ',        'ε',        "\xE1\xB9\xA1", 'ι'),
+    );
+
+    public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
+    {
+        if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
+            $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
+        } else {
+            $fromEncoding = self::getEncoding($fromEncoding);
+        }
+
+        $toEncoding = self::getEncoding($toEncoding);
+
+        if ('BASE64' === $fromEncoding) {
+            $s = base64_decode($s);
+            $fromEncoding = $toEncoding;
+        }
+
+        if ('BASE64' === $toEncoding) {
+            return base64_encode($s);
+        }
+
+        if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
+            if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
+                $fromEncoding = 'Windows-1252';
+            }
+            if ('UTF-8' !== $fromEncoding) {
+                $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
+            }
+
+            return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
+        }
+
+        if ('HTML-ENTITIES' === $fromEncoding) {
+            $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
+            $fromEncoding = 'UTF-8';
+        }
+
+        return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
+    }
+
+    public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
+    {
+        $vars = array(&$a, &$b, &$c, &$d, &$e, &$f);
+
+        $ok = true;
+        array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
+            if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
+                $ok = false;
+            }
+        });
+
+        return $ok ? $fromEncoding : false;
+    }
+
+    public static function mb_decode_mimeheader($s)
+    {
+        return iconv_mime_decode($s, 2, self::$internalEncoding);
+    }
+
+    public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
+    {
+        trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
+    }
+
+    public static function mb_decode_numericentity($s, $convmap, $encoding = null)
+    {
+        if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
+            trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+            return null;
+        }
+
+        if (!\is_array($convmap) || !$convmap) {
+            return false;
+        }
+
+        if (null !== $encoding && !\is_scalar($encoding)) {
+            trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+            return '';  // Instead of null (cf. mb_encode_numericentity).
+        }
+
+        $s = (string) $s;
+        if ('' === $s) {
+            return '';
+        }
+
+        $encoding = self::getEncoding($encoding);
+
+        if ('UTF-8' === $encoding) {
+            $encoding = null;
+            if (!preg_match('//u', $s)) {
+                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
+            }
+        } else {
+            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
+        }
+
+        $cnt = floor(\count($convmap) / 4) * 4;
+
+        for ($i = 0; $i < $cnt; $i += 4) {
+            // collector_decode_htmlnumericentity ignores $convmap[$i + 3]
+            $convmap[$i] += $convmap[$i + 2];
+            $convmap[$i + 1] += $convmap[$i + 2];
+        }
+
+        $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) {
+            $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];
+            for ($i = 0; $i < $cnt; $i += 4) {
+                if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
+                    return Mbstring::mb_chr($c - $convmap[$i + 2]);
+                }
+            }
+
+            return $m[0];
+        }, $s);
+
+        if (null === $encoding) {
+            return $s;
+        }
+
+        return iconv('UTF-8', $encoding.'//IGNORE', $s);
+    }
+
+    public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
+    {
+        if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
+            trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+            return null;
+        }
+
+        if (!\is_array($convmap) || !$convmap) {
+            return false;
+        }
+
+        if (null !== $encoding && !\is_scalar($encoding)) {
+            trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+            return null;  // Instead of '' (cf. mb_decode_numericentity).
+        }
+
+        if (null !== $is_hex && !\is_scalar($is_hex)) {
+            trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', E_USER_WARNING);
+
+            return null;
+        }
+
+        $s = (string) $s;
+        if ('' === $s) {
+            return '';
+        }
+
+        $encoding = self::getEncoding($encoding);
+
+        if ('UTF-8' === $encoding) {
+            $encoding = null;
+            if (!preg_match('//u', $s)) {
+                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
+            }
+        } else {
+            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
+        }
+
+        static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
+
+        $cnt = floor(\count($convmap) / 4) * 4;
+        $i = 0;
+        $len = \strlen($s);
+        $result = '';
+
+        while ($i < $len) {
+            $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
+            $uchr = substr($s, $i, $ulen);
+            $i += $ulen;
+            $c = self::mb_ord($uchr);
+
+            for ($j = 0; $j < $cnt; $j += 4) {
+                if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {
+                    $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];
+                    $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';';
+                    continue 2;
+                }
+            }
+            $result .= $uchr;
+        }
+
+        if (null === $encoding) {
+            return $result;
+        }
+
+        return iconv('UTF-8', $encoding.'//IGNORE', $result);
+    }
+
+    public static function mb_convert_case($s, $mode, $encoding = null)
+    {
+        $s = (string) $s;
+        if ('' === $s) {
+            return '';
+        }
+
+        $encoding = self::getEncoding($encoding);
+
+        if ('UTF-8' === $encoding) {
+            $encoding = null;
+            if (!preg_match('//u', $s)) {
+                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
+            }
+        } else {
+            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
+        }
+
+        if (MB_CASE_TITLE == $mode) {
+            static $titleRegexp = null;
+            if (null === $titleRegexp) {
+                $titleRegexp = self::getData('titleCaseRegexp');
+            }
+            $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s);
+        } else {
+            if (MB_CASE_UPPER == $mode) {
+                static $upper = null;
+                if (null === $upper) {
+                    $upper = self::getData('upperCase');
+                }
+                $map = $upper;
+            } else {
+                if (self::MB_CASE_FOLD === $mode) {
+                    $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
+                }
+
+                static $lower = null;
+                if (null === $lower) {
+                    $lower = self::getData('lowerCase');
+                }
+                $map = $lower;
+            }
+
+            static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
+
+            $i = 0;
+            $len = \strlen($s);
+
+            while ($i < $len) {
+                $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
+                $uchr = substr($s, $i, $ulen);
+                $i += $ulen;
+
+                if (isset($map[$uchr])) {
+                    $uchr = $map[$uchr];
+                    $nlen = \strlen($uchr);
+
+                    if ($nlen == $ulen) {
+                        $nlen = $i;
+                        do {
+                            $s[--$nlen] = $uchr[--$ulen];
+                        } while ($ulen);
+                    } else {
+                        $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
+                        $len += $nlen - $ulen;
+                        $i += $nlen - $ulen;
+                    }
+                }
+            }
+        }
+
+        if (null === $encoding) {
+            return $s;
+        }
+
+        return iconv('UTF-8', $encoding.'//IGNORE', $s);
+    }
+
+    public static function mb_internal_encoding($encoding = null)
+    {
+        if (null === $encoding) {
+            return self::$internalEncoding;
+        }
+
+        $encoding = self::getEncoding($encoding);
+
+        if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) {
+            self::$internalEncoding = $encoding;
+
+            return true;
+        }
+
+        return false;
+    }
+
+    public static function mb_language($lang = null)
+    {
+        if (null === $lang) {
+            return self::$language;
+        }
+
+        switch ($lang = strtolower($lang)) {
+            case 'uni':
+            case 'neutral':
+                self::$language = $lang;
+
+                return true;
+        }
+
+        return false;
+    }
+
+    public static function mb_list_encodings()
+    {
+        return array('UTF-8');
+    }
+
+    public static function mb_encoding_aliases($encoding)
+    {
+        switch (strtoupper($encoding)) {
+            case 'UTF8':
+            case 'UTF-8':
+                return array('utf8');
+        }
+
+        return false;
+    }
+
+    public static function mb_check_encoding($var = null, $encoding = null)
+    {
+        if (null === $encoding) {
+            if (null === $var) {
+                return false;
+            }
+            $encoding = self::$internalEncoding;
+        }
+
+        return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var);
+    }
+
+    public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
+    {
+        if (null === $encodingList) {
+            $encodingList = self::$encodingList;
+        } else {
+            if (!\is_array($encodingList)) {
+                $encodingList = array_map('trim', explode(',', $encodingList));
+            }
+            $encodingList = array_map('strtoupper', $encodingList);
+        }
+
+        foreach ($encodingList as $enc) {
+            switch ($enc) {
+                case 'ASCII':
+                    if (!preg_match('/[\x80-\xFF]/', $str)) {
+                        return $enc;
+                    }
+                    break;
+
+                case 'UTF8':
+                case 'UTF-8':
+                    if (preg_match('//u', $str)) {
+                        return 'UTF-8';
+                    }
+                    break;
+
+                default:
+                    if (0 === strncmp($enc, 'ISO-8859-', 9)) {
+                        return $enc;
+                    }
+            }
+        }
+
+        return false;
+    }
+
+    public static function mb_detect_order($encodingList = null)
+    {
+        if (null === $encodingList) {
+            return self::$encodingList;
+        }
+
+        if (!\is_array($encodingList)) {
+            $encodingList = array_map('trim', explode(',', $encodingList));
+        }
+        $encodingList = array_map('strtoupper', $encodingList);
+
+        foreach ($encodingList as $enc) {
+            switch ($enc) {
+                default:
+                    if (strncmp($enc, 'ISO-8859-', 9)) {
+                        return false;
+                    }
+                    // no break
+                case 'ASCII':
+                case 'UTF8':
+                case 'UTF-8':
+            }
+        }
+
+        self::$encodingList = $encodingList;
+
+        return true;
+    }
+
+    public static function mb_strlen($s, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+        if ('CP850' === $encoding || 'ASCII' === $encoding) {
+            return \strlen($s);
+        }
+
+        return @iconv_strlen($s, $encoding);
+    }
+
+    public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+        if ('CP850' === $encoding || 'ASCII' === $encoding) {
+            return strpos($haystack, $needle, $offset);
+        }
+
+        $needle = (string) $needle;
+        if ('' === $needle) {
+            trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);
+
+            return false;
+        }
+
+        return iconv_strpos($haystack, $needle, $offset, $encoding);
+    }
+
+    public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+        if ('CP850' === $encoding || 'ASCII' === $encoding) {
+            return strrpos($haystack, $needle, $offset);
+        }
+
+        if ($offset != (int) $offset) {
+            $offset = 0;
+        } elseif ($offset = (int) $offset) {
+            if ($offset < 0) {
+                $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
+                $offset = 0;
+            } else {
+                $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
+            }
+        }
+
+        $pos = iconv_strrpos($haystack, $needle, $encoding);
+
+        return false !== $pos ? $offset + $pos : false;
+    }
+
+    public static function mb_strtolower($s, $encoding = null)
+    {
+        return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
+    }
+
+    public static function mb_strtoupper($s, $encoding = null)
+    {
+        return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);
+    }
+
+    public static function mb_substitute_character($c = null)
+    {
+        if (0 === strcasecmp($c, 'none')) {
+            return true;
+        }
+
+        return null !== $c ? false : 'none';
+    }
+
+    public static function mb_substr($s, $start, $length = null, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+        if ('CP850' === $encoding || 'ASCII' === $encoding) {
+            return substr($s, $start, null === $length ? 2147483647 : $length);
+        }
+
+        if ($start < 0) {
+            $start = iconv_strlen($s, $encoding) + $start;
+            if ($start < 0) {
+                $start = 0;
+            }
+        }
+
+        if (null === $length) {
+            $length = 2147483647;
+        } elseif ($length < 0) {
+            $length = iconv_strlen($s, $encoding) + $length - $start;
+            if ($length < 0) {
+                return '';
+            }
+        }
+
+        return (string) iconv_substr($s, $start, $length, $encoding);
+    }
+
+    public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
+    {
+        $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
+        $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
+
+        return self::mb_strpos($haystack, $needle, $offset, $encoding);
+    }
+
+    public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
+    {
+        $pos = self::mb_stripos($haystack, $needle, 0, $encoding);
+
+        return self::getSubpart($pos, $part, $haystack, $encoding);
+    }
+
+    public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+        if ('CP850' === $encoding || 'ASCII' === $encoding) {
+            return strrchr($haystack, $needle, $part);
+        }
+        $needle = self::mb_substr($needle, 0, 1, $encoding);
+        $pos = iconv_strrpos($haystack, $needle, $encoding);
+
+        return self::getSubpart($pos, $part, $haystack, $encoding);
+    }
+
+    public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
+    {
+        $needle = self::mb_substr($needle, 0, 1, $encoding);
+        $pos = self::mb_strripos($haystack, $needle, $encoding);
+
+        return self::getSubpart($pos, $part, $haystack, $encoding);
+    }
+
+    public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
+    {
+        $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
+        $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
+
+        return self::mb_strrpos($haystack, $needle, $offset, $encoding);
+    }
+
+    public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
+    {
+        $pos = strpos($haystack, $needle);
+        if (false === $pos) {
+            return false;
+        }
+        if ($part) {
+            return substr($haystack, 0, $pos);
+        }
+
+        return substr($haystack, $pos);
+    }
+
+    public static function mb_get_info($type = 'all')
+    {
+        $info = array(
+            'internal_encoding' => self::$internalEncoding,
+            'http_output' => 'pass',
+            'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
+            'func_overload' => 0,
+            'func_overload_list' => 'no overload',
+            'mail_charset' => 'UTF-8',
+            'mail_header_encoding' => 'BASE64',
+            'mail_body_encoding' => 'BASE64',
+            'illegal_chars' => 0,
+            'encoding_translation' => 'Off',
+            'language' => self::$language,
+            'detect_order' => self::$encodingList,
+            'substitute_character' => 'none',
+            'strict_detection' => 'Off',
+        );
+
+        if ('all' === $type) {
+            return $info;
+        }
+        if (isset($info[$type])) {
+            return $info[$type];
+        }
+
+        return false;
+    }
+
+    public static function mb_http_input($type = '')
+    {
+        return false;
+    }
+
+    public static function mb_http_output($encoding = null)
+    {
+        return null !== $encoding ? 'pass' === $encoding : 'pass';
+    }
+
+    public static function mb_strwidth($s, $encoding = null)
+    {
+        $encoding = self::getEncoding($encoding);
+
+        if ('UTF-8' !== $encoding) {
+            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
+        }
+
+        $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
+
+        return ($wide << 1) + iconv_strlen($s, 'UTF-8');
+    }
+
+    public static function mb_substr_count($haystack, $needle, $encoding = null)
+    {
+        return substr_count($haystack, $needle);
+    }
+
+    public static function mb_output_handler($contents, $status)
+    {
+        return $contents;
+    }
+
+    public static function mb_chr($code, $encoding = null)
+    {
+        if (0x80 > $code %= 0x200000) {
+            $s = \chr($code);
+        } elseif (0x800 > $code) {
+            $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F);
+        } elseif (0x10000 > $code) {
+            $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
+        } else {
+            $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
+        }
+
+        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
+            $s = mb_convert_encoding($s, $encoding, 'UTF-8');
+        }
+
+        return $s;
+    }
+
+    public static function mb_ord($s, $encoding = null)
+    {
+        if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
+            $s = mb_convert_encoding($s, 'UTF-8', $encoding);
+        }
+
+        if (1 === \strlen($s)) {
+            return \ord($s);
+        }
+
+        $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
+        if (0xF0 <= $code) {
+            return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
+        }
+        if (0xE0 <= $code) {
+            return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
+        }
+        if (0xC0 <= $code) {
+            return (($code - 0xC0) << 6) + $s[2] - 0x80;
+        }
+
+        return $code;
+    }
+
+    private static function getSubpart($pos, $part, $haystack, $encoding)
+    {
+        if (false === $pos) {
+            return false;
+        }
+        if ($part) {
+            return self::mb_substr($haystack, 0, $pos, $encoding);
+        }
+
+        return self::mb_substr($haystack, $pos, null, $encoding);
+    }
+
+    private static function html_encoding_callback(array $m)
+    {
+        $i = 1;
+        $entities = '';
+        $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8'));
+
+        while (isset($m[$i])) {
+            if (0x80 > $m[$i]) {
+                $entities .= \chr($m[$i++]);
+                continue;
+            }
+            if (0xF0 <= $m[$i]) {
+                $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
+            } elseif (0xE0 <= $m[$i]) {
+                $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
+            } else {
+                $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
+            }
+
+            $entities .= '&#'.$c.';';
+        }
+
+        return $entities;
+    }
+
+    private static function title_case(array $s)
+    {
+        return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8');
+    }
+
+    private static function getData($file)
+    {
+        if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {
+            return require $file;
+        }
+
+        return false;
+    }
+
+    private static function getEncoding($encoding)
+    {
+        if (null === $encoding) {
+            return self::$internalEncoding;
+        }
+
+        $encoding = strtoupper($encoding);
+
+        if ('8BIT' === $encoding || 'BINARY' === $encoding) {
+            return 'CP850';
+        }
+        if ('UTF8' === $encoding) {
+            return 'UTF-8';
+        }
+
+        return $encoding;
+    }
+}

+ 13 - 0
api/vendor/symfony/polyfill-mbstring/README.md

@@ -0,0 +1,13 @@
+Symfony Polyfill / Mbstring
+===========================
+
+This component provides a partial, native PHP implementation for the
+[Mbstring](http://php.net/mbstring) extension.
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).

+ 1096 - 0
api/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php

@@ -0,0 +1,1096 @@
+<?php
+
+return array(
+  'A' => 'a',
+  'B' => 'b',
+  'C' => 'c',
+  'D' => 'd',
+  'E' => 'e',
+  'F' => 'f',
+  'G' => 'g',
+  'H' => 'h',
+  'I' => 'i',
+  'J' => 'j',
+  'K' => 'k',
+  'L' => 'l',
+  'M' => 'm',
+  'N' => 'n',
+  'O' => 'o',
+  'P' => 'p',
+  'Q' => 'q',
+  'R' => 'r',
+  'S' => 's',
+  'T' => 't',
+  'U' => 'u',
+  'V' => 'v',
+  'W' => 'w',
+  'X' => 'x',
+  'Y' => 'y',
+  'Z' => 'z',
+  'À' => 'à',
+  'Á' => 'á',
+  'Â' => 'â',
+  'Ã' => 'ã',
+  'Ä' => 'ä',
+  'Å' => 'å',
+  'Æ' => 'æ',
+  'Ç' => 'ç',
+  'È' => 'è',
+  'É' => 'é',
+  'Ê' => 'ê',
+  'Ë' => 'ë',
+  'Ì' => 'ì',
+  'Í' => 'í',
+  'Î' => 'î',
+  'Ï' => 'ï',
+  'Ð' => 'ð',
+  'Ñ' => 'ñ',
+  'Ò' => 'ò',
+  'Ó' => 'ó',
+  'Ô' => 'ô',
+  'Õ' => 'õ',
+  'Ö' => 'ö',
+  'Ø' => 'ø',
+  'Ù' => 'ù',
+  'Ú' => 'ú',
+  'Û' => 'û',
+  'Ü' => 'ü',
+  'Ý' => 'ý',
+  'Þ' => 'þ',
+  'Ā' => 'ā',
+  'Ă' => 'ă',
+  'Ą' => 'ą',
+  'Ć' => 'ć',
+  'Ĉ' => 'ĉ',
+  'Ċ' => 'ċ',
+  'Č' => 'č',
+  'Ď' => 'ď',
+  'Đ' => 'đ',
+  'Ē' => 'ē',
+  'Ĕ' => 'ĕ',
+  'Ė' => 'ė',
+  'Ę' => 'ę',
+  'Ě' => 'ě',
+  'Ĝ' => 'ĝ',
+  'Ğ' => 'ğ',
+  'Ġ' => 'ġ',
+  'Ģ' => 'ģ',
+  'Ĥ' => 'ĥ',
+  'Ħ' => 'ħ',
+  'Ĩ' => 'ĩ',
+  'Ī' => 'ī',
+  'Ĭ' => 'ĭ',
+  'Į' => 'į',
+  'İ' => 'i',
+  'IJ' => 'ij',
+  'Ĵ' => 'ĵ',
+  'Ķ' => 'ķ',
+  'Ĺ' => 'ĺ',
+  'Ļ' => 'ļ',
+  'Ľ' => 'ľ',
+  'Ŀ' => 'ŀ',
+  'Ł' => 'ł',
+  'Ń' => 'ń',
+  'Ņ' => 'ņ',
+  'Ň' => 'ň',
+  'Ŋ' => 'ŋ',
+  'Ō' => 'ō',
+  'Ŏ' => 'ŏ',
+  'Ő' => 'ő',
+  'Œ' => 'œ',
+  'Ŕ' => 'ŕ',
+  'Ŗ' => 'ŗ',
+  'Ř' => 'ř',
+  'Ś' => 'ś',
+  'Ŝ' => 'ŝ',
+  'Ş' => 'ş',
+  'Š' => 'š',
+  'Ţ' => 'ţ',
+  'Ť' => 'ť',
+  'Ŧ' => 'ŧ',
+  'Ũ' => 'ũ',
+  'Ū' => 'ū',
+  'Ŭ' => 'ŭ',
+  'Ů' => 'ů',
+  'Ű' => 'ű',
+  'Ų' => 'ų',
+  'Ŵ' => 'ŵ',
+  'Ŷ' => 'ŷ',
+  'Ÿ' => 'ÿ',
+  'Ź' => 'ź',
+  'Ż' => 'ż',
+  'Ž' => 'ž',
+  'Ɓ' => 'ɓ',
+  'Ƃ' => 'ƃ',
+  'Ƅ' => 'ƅ',
+  'Ɔ' => 'ɔ',
+  'Ƈ' => 'ƈ',
+  'Ɖ' => 'ɖ',
+  'Ɗ' => 'ɗ',
+  'Ƌ' => 'ƌ',
+  'Ǝ' => 'ǝ',
+  'Ə' => 'ə',
+  'Ɛ' => 'ɛ',
+  'Ƒ' => 'ƒ',
+  'Ɠ' => 'ɠ',
+  'Ɣ' => 'ɣ',
+  'Ɩ' => 'ɩ',
+  'Ɨ' => 'ɨ',
+  'Ƙ' => 'ƙ',
+  'Ɯ' => 'ɯ',
+  'Ɲ' => 'ɲ',
+  'Ɵ' => 'ɵ',
+  'Ơ' => 'ơ',
+  'Ƣ' => 'ƣ',
+  'Ƥ' => 'ƥ',
+  'Ʀ' => 'ʀ',
+  'Ƨ' => 'ƨ',
+  'Ʃ' => 'ʃ',
+  'Ƭ' => 'ƭ',
+  'Ʈ' => 'ʈ',
+  'Ư' => 'ư',
+  'Ʊ' => 'ʊ',
+  'Ʋ' => 'ʋ',
+  'Ƴ' => 'ƴ',
+  'Ƶ' => 'ƶ',
+  'Ʒ' => 'ʒ',
+  'Ƹ' => 'ƹ',
+  'Ƽ' => 'ƽ',
+  'DŽ' => 'dž',
+  'Dž' => 'dž',
+  'LJ' => 'lj',
+  'Lj' => 'lj',
+  'NJ' => 'nj',
+  'Nj' => 'nj',
+  'Ǎ' => 'ǎ',
+  'Ǐ' => 'ǐ',
+  'Ǒ' => 'ǒ',
+  'Ǔ' => 'ǔ',
+  'Ǖ' => 'ǖ',
+  'Ǘ' => 'ǘ',
+  'Ǚ' => 'ǚ',
+  'Ǜ' => 'ǜ',
+  'Ǟ' => 'ǟ',
+  'Ǡ' => 'ǡ',
+  'Ǣ' => 'ǣ',
+  'Ǥ' => 'ǥ',
+  'Ǧ' => 'ǧ',
+  'Ǩ' => 'ǩ',
+  'Ǫ' => 'ǫ',
+  'Ǭ' => 'ǭ',
+  'Ǯ' => 'ǯ',
+  'DZ' => 'dz',
+  'Dz' => 'dz',
+  'Ǵ' => 'ǵ',
+  'Ƕ' => 'ƕ',
+  'Ƿ' => 'ƿ',
+  'Ǹ' => 'ǹ',
+  'Ǻ' => 'ǻ',
+  'Ǽ' => 'ǽ',
+  'Ǿ' => 'ǿ',
+  'Ȁ' => 'ȁ',
+  'Ȃ' => 'ȃ',
+  'Ȅ' => 'ȅ',
+  'Ȇ' => 'ȇ',
+  'Ȉ' => 'ȉ',
+  'Ȋ' => 'ȋ',
+  'Ȍ' => 'ȍ',
+  'Ȏ' => 'ȏ',
+  'Ȑ' => 'ȑ',
+  'Ȓ' => 'ȓ',
+  'Ȕ' => 'ȕ',
+  'Ȗ' => 'ȗ',
+  'Ș' => 'ș',
+  'Ț' => 'ț',
+  'Ȝ' => 'ȝ',
+  'Ȟ' => 'ȟ',
+  'Ƞ' => 'ƞ',
+  'Ȣ' => 'ȣ',
+  'Ȥ' => 'ȥ',
+  'Ȧ' => 'ȧ',
+  'Ȩ' => 'ȩ',
+  'Ȫ' => 'ȫ',
+  'Ȭ' => 'ȭ',
+  'Ȯ' => 'ȯ',
+  'Ȱ' => 'ȱ',
+  'Ȳ' => 'ȳ',
+  'Ⱥ' => 'ⱥ',
+  'Ȼ' => 'ȼ',
+  'Ƚ' => 'ƚ',
+  'Ⱦ' => 'ⱦ',
+  'Ɂ' => 'ɂ',
+  'Ƀ' => 'ƀ',
+  'Ʉ' => 'ʉ',
+  'Ʌ' => 'ʌ',
+  'Ɇ' => 'ɇ',
+  'Ɉ' => 'ɉ',
+  'Ɋ' => 'ɋ',
+  'Ɍ' => 'ɍ',
+  'Ɏ' => 'ɏ',
+  'Ͱ' => 'ͱ',
+  'Ͳ' => 'ͳ',
+  'Ͷ' => 'ͷ',
+  'Ϳ' => 'ϳ',
+  'Ά' => 'ά',
+  'Έ' => 'έ',
+  'Ή' => 'ή',
+  'Ί' => 'ί',
+  'Ό' => 'ό',
+  'Ύ' => 'ύ',
+  'Ώ' => 'ώ',
+  'Α' => 'α',
+  'Β' => 'β',
+  'Γ' => 'γ',
+  'Δ' => 'δ',
+  'Ε' => 'ε',
+  'Ζ' => 'ζ',
+  'Η' => 'η',
+  'Θ' => 'θ',
+  'Ι' => 'ι',
+  'Κ' => 'κ',
+  'Λ' => 'λ',
+  'Μ' => 'μ',
+  'Ν' => 'ν',
+  'Ξ' => 'ξ',
+  'Ο' => 'ο',
+  'Π' => 'π',
+  'Ρ' => 'ρ',
+  'Σ' => 'σ',
+  'Τ' => 'τ',
+  'Υ' => 'υ',
+  'Φ' => 'φ',
+  'Χ' => 'χ',
+  'Ψ' => 'ψ',
+  'Ω' => 'ω',
+  'Ϊ' => 'ϊ',
+  'Ϋ' => 'ϋ',
+  'Ϗ' => 'ϗ',
+  'Ϙ' => 'ϙ',
+  'Ϛ' => 'ϛ',
+  'Ϝ' => 'ϝ',
+  'Ϟ' => 'ϟ',
+  'Ϡ' => 'ϡ',
+  'Ϣ' => 'ϣ',
+  'Ϥ' => 'ϥ',
+  'Ϧ' => 'ϧ',
+  'Ϩ' => 'ϩ',
+  'Ϫ' => 'ϫ',
+  'Ϭ' => 'ϭ',
+  'Ϯ' => 'ϯ',
+  'ϴ' => 'θ',
+  'Ϸ' => 'ϸ',
+  'Ϲ' => 'ϲ',
+  'Ϻ' => 'ϻ',
+  'Ͻ' => 'ͻ',
+  'Ͼ' => 'ͼ',
+  'Ͽ' => 'ͽ',
+  'Ѐ' => 'ѐ',
+  'Ё' => 'ё',
+  'Ђ' => 'ђ',
+  'Ѓ' => 'ѓ',
+  'Є' => 'є',
+  'Ѕ' => 'ѕ',
+  'І' => 'і',
+  'Ї' => 'ї',
+  'Ј' => 'ј',
+  'Љ' => 'љ',
+  'Њ' => 'њ',
+  'Ћ' => 'ћ',
+  'Ќ' => 'ќ',
+  'Ѝ' => 'ѝ',
+  'Ў' => 'ў',
+  'Џ' => 'џ',
+  'А' => 'а',
+  'Б' => 'б',
+  'В' => 'в',
+  'Г' => 'г',
+  'Д' => 'д',
+  'Е' => 'е',
+  'Ж' => 'ж',
+  'З' => 'з',
+  'И' => 'и',
+  'Й' => 'й',
+  'К' => 'к',
+  'Л' => 'л',
+  'М' => 'м',
+  'Н' => 'н',
+  'О' => 'о',
+  'П' => 'п',
+  'Р' => 'р',
+  'С' => 'с',
+  'Т' => 'т',
+  'У' => 'у',
+  'Ф' => 'ф',
+  'Х' => 'х',
+  'Ц' => 'ц',
+  'Ч' => 'ч',
+  'Ш' => 'ш',
+  'Щ' => 'щ',
+  'Ъ' => 'ъ',
+  'Ы' => 'ы',
+  'Ь' => 'ь',
+  'Э' => 'э',
+  'Ю' => 'ю',
+  'Я' => 'я',
+  'Ѡ' => 'ѡ',
+  'Ѣ' => 'ѣ',
+  'Ѥ' => 'ѥ',
+  'Ѧ' => 'ѧ',
+  'Ѩ' => 'ѩ',
+  'Ѫ' => 'ѫ',
+  'Ѭ' => 'ѭ',
+  'Ѯ' => 'ѯ',
+  'Ѱ' => 'ѱ',
+  'Ѳ' => 'ѳ',
+  'Ѵ' => 'ѵ',
+  'Ѷ' => 'ѷ',
+  'Ѹ' => 'ѹ',
+  'Ѻ' => 'ѻ',
+  'Ѽ' => 'ѽ',
+  'Ѿ' => 'ѿ',
+  'Ҁ' => 'ҁ',
+  'Ҋ' => 'ҋ',
+  'Ҍ' => 'ҍ',
+  'Ҏ' => 'ҏ',
+  'Ґ' => 'ґ',
+  'Ғ' => 'ғ',
+  'Ҕ' => 'ҕ',
+  'Җ' => 'җ',
+  'Ҙ' => 'ҙ',
+  'Қ' => 'қ',
+  'Ҝ' => 'ҝ',
+  'Ҟ' => 'ҟ',
+  'Ҡ' => 'ҡ',
+  'Ң' => 'ң',
+  'Ҥ' => 'ҥ',
+  'Ҧ' => 'ҧ',
+  'Ҩ' => 'ҩ',
+  'Ҫ' => 'ҫ',
+  'Ҭ' => 'ҭ',
+  'Ү' => 'ү',
+  'Ұ' => 'ұ',
+  'Ҳ' => 'ҳ',
+  'Ҵ' => 'ҵ',
+  'Ҷ' => 'ҷ',
+  'Ҹ' => 'ҹ',
+  'Һ' => 'һ',
+  'Ҽ' => 'ҽ',
+  'Ҿ' => 'ҿ',
+  'Ӏ' => 'ӏ',
+  'Ӂ' => 'ӂ',
+  'Ӄ' => 'ӄ',
+  'Ӆ' => 'ӆ',
+  'Ӈ' => 'ӈ',
+  'Ӊ' => 'ӊ',
+  'Ӌ' => 'ӌ',
+  'Ӎ' => 'ӎ',
+  'Ӑ' => 'ӑ',
+  'Ӓ' => 'ӓ',
+  'Ӕ' => 'ӕ',
+  'Ӗ' => 'ӗ',
+  'Ә' => 'ә',
+  'Ӛ' => 'ӛ',
+  'Ӝ' => 'ӝ',
+  'Ӟ' => 'ӟ',
+  'Ӡ' => 'ӡ',
+  'Ӣ' => 'ӣ',
+  'Ӥ' => 'ӥ',
+  'Ӧ' => 'ӧ',
+  'Ө' => 'ө',
+  'Ӫ' => 'ӫ',
+  'Ӭ' => 'ӭ',
+  'Ӯ' => 'ӯ',
+  'Ӱ' => 'ӱ',
+  'Ӳ' => 'ӳ',
+  'Ӵ' => 'ӵ',
+  'Ӷ' => 'ӷ',
+  'Ӹ' => 'ӹ',
+  'Ӻ' => 'ӻ',
+  'Ӽ' => 'ӽ',
+  'Ӿ' => 'ӿ',
+  'Ԁ' => 'ԁ',
+  'Ԃ' => 'ԃ',
+  'Ԅ' => 'ԅ',
+  'Ԇ' => 'ԇ',
+  'Ԉ' => 'ԉ',
+  'Ԋ' => 'ԋ',
+  'Ԍ' => 'ԍ',
+  'Ԏ' => 'ԏ',
+  'Ԑ' => 'ԑ',
+  'Ԓ' => 'ԓ',
+  'Ԕ' => 'ԕ',
+  'Ԗ' => 'ԗ',
+  'Ԙ' => 'ԙ',
+  'Ԛ' => 'ԛ',
+  'Ԝ' => 'ԝ',
+  'Ԟ' => 'ԟ',
+  'Ԡ' => 'ԡ',
+  'Ԣ' => 'ԣ',
+  'Ԥ' => 'ԥ',
+  'Ԧ' => 'ԧ',
+  'Ԩ' => 'ԩ',
+  'Ԫ' => 'ԫ',
+  'Ԭ' => 'ԭ',
+  'Ԯ' => 'ԯ',
+  'Ա' => 'ա',
+  'Բ' => 'բ',
+  'Գ' => 'գ',
+  'Դ' => 'դ',
+  'Ե' => 'ե',
+  'Զ' => 'զ',
+  'Է' => 'է',
+  'Ը' => 'ը',
+  'Թ' => 'թ',
+  'Ժ' => 'ժ',
+  'Ի' => 'ի',
+  'Լ' => 'լ',
+  'Խ' => 'խ',
+  'Ծ' => 'ծ',
+  'Կ' => 'կ',
+  'Հ' => 'հ',
+  'Ձ' => 'ձ',
+  'Ղ' => 'ղ',
+  'Ճ' => 'ճ',
+  'Մ' => 'մ',
+  'Յ' => 'յ',
+  'Ն' => 'ն',
+  'Շ' => 'շ',
+  'Ո' => 'ո',
+  'Չ' => 'չ',
+  'Պ' => 'պ',
+  'Ջ' => 'ջ',
+  'Ռ' => 'ռ',
+  'Ս' => 'ս',
+  'Վ' => 'վ',
+  'Տ' => 'տ',
+  'Ր' => 'ր',
+  'Ց' => 'ց',
+  'Ւ' => 'ւ',
+  'Փ' => 'փ',
+  'Ք' => 'ք',
+  'Օ' => 'օ',
+  'Ֆ' => 'ֆ',
+  'Ⴀ' => 'ⴀ',
+  'Ⴁ' => 'ⴁ',
+  'Ⴂ' => 'ⴂ',
+  'Ⴃ' => 'ⴃ',
+  'Ⴄ' => 'ⴄ',
+  'Ⴅ' => 'ⴅ',
+  'Ⴆ' => 'ⴆ',
+  'Ⴇ' => 'ⴇ',
+  'Ⴈ' => 'ⴈ',
+  'Ⴉ' => 'ⴉ',
+  'Ⴊ' => 'ⴊ',
+  'Ⴋ' => 'ⴋ',
+  'Ⴌ' => 'ⴌ',
+  'Ⴍ' => 'ⴍ',
+  'Ⴎ' => 'ⴎ',
+  'Ⴏ' => 'ⴏ',
+  'Ⴐ' => 'ⴐ',
+  'Ⴑ' => 'ⴑ',
+  'Ⴒ' => 'ⴒ',
+  'Ⴓ' => 'ⴓ',
+  'Ⴔ' => 'ⴔ',
+  'Ⴕ' => 'ⴕ',
+  'Ⴖ' => 'ⴖ',
+  'Ⴗ' => 'ⴗ',
+  'Ⴘ' => 'ⴘ',
+  'Ⴙ' => 'ⴙ',
+  'Ⴚ' => 'ⴚ',
+  'Ⴛ' => 'ⴛ',
+  'Ⴜ' => 'ⴜ',
+  'Ⴝ' => 'ⴝ',
+  'Ⴞ' => 'ⴞ',
+  'Ⴟ' => 'ⴟ',
+  'Ⴠ' => 'ⴠ',
+  'Ⴡ' => 'ⴡ',
+  'Ⴢ' => 'ⴢ',
+  'Ⴣ' => 'ⴣ',
+  'Ⴤ' => 'ⴤ',
+  'Ⴥ' => 'ⴥ',
+  'Ⴧ' => 'ⴧ',
+  'Ⴭ' => 'ⴭ',
+  'Ḁ' => 'ḁ',
+  'Ḃ' => 'ḃ',
+  'Ḅ' => 'ḅ',
+  'Ḇ' => 'ḇ',
+  'Ḉ' => 'ḉ',
+  'Ḋ' => 'ḋ',
+  'Ḍ' => 'ḍ',
+  'Ḏ' => 'ḏ',
+  'Ḑ' => 'ḑ',
+  'Ḓ' => 'ḓ',
+  'Ḕ' => 'ḕ',
+  'Ḗ' => 'ḗ',
+  'Ḙ' => 'ḙ',
+  'Ḛ' => 'ḛ',
+  'Ḝ' => 'ḝ',
+  'Ḟ' => 'ḟ',
+  'Ḡ' => 'ḡ',
+  'Ḣ' => 'ḣ',
+  'Ḥ' => 'ḥ',
+  'Ḧ' => 'ḧ',
+  'Ḩ' => 'ḩ',
+  'Ḫ' => 'ḫ',
+  'Ḭ' => 'ḭ',
+  'Ḯ' => 'ḯ',
+  'Ḱ' => 'ḱ',
+  'Ḳ' => 'ḳ',
+  'Ḵ' => 'ḵ',
+  'Ḷ' => 'ḷ',
+  'Ḹ' => 'ḹ',
+  'Ḻ' => 'ḻ',
+  'Ḽ' => 'ḽ',
+  'Ḿ' => 'ḿ',
+  'Ṁ' => 'ṁ',
+  'Ṃ' => 'ṃ',
+  'Ṅ' => 'ṅ',
+  'Ṇ' => 'ṇ',
+  'Ṉ' => 'ṉ',
+  'Ṋ' => 'ṋ',
+  'Ṍ' => 'ṍ',
+  'Ṏ' => 'ṏ',
+  'Ṑ' => 'ṑ',
+  'Ṓ' => 'ṓ',
+  'Ṕ' => 'ṕ',
+  'Ṗ' => 'ṗ',
+  'Ṙ' => 'ṙ',
+  'Ṛ' => 'ṛ',
+  'Ṝ' => 'ṝ',
+  'Ṟ' => 'ṟ',
+  'Ṡ' => 'ṡ',
+  'Ṣ' => 'ṣ',
+  'Ṥ' => 'ṥ',
+  'Ṧ' => 'ṧ',
+  'Ṩ' => 'ṩ',
+  'Ṫ' => 'ṫ',
+  'Ṭ' => 'ṭ',
+  'Ṯ' => 'ṯ',
+  'Ṱ' => 'ṱ',
+  'Ṳ' => 'ṳ',
+  'Ṵ' => 'ṵ',
+  'Ṷ' => 'ṷ',
+  'Ṹ' => 'ṹ',
+  'Ṻ' => 'ṻ',
+  'Ṽ' => 'ṽ',
+  'Ṿ' => 'ṿ',
+  'Ẁ' => 'ẁ',
+  'Ẃ' => 'ẃ',
+  'Ẅ' => 'ẅ',
+  'Ẇ' => 'ẇ',
+  'Ẉ' => 'ẉ',
+  'Ẋ' => 'ẋ',
+  'Ẍ' => 'ẍ',
+  'Ẏ' => 'ẏ',
+  'Ẑ' => 'ẑ',
+  'Ẓ' => 'ẓ',
+  'Ẕ' => 'ẕ',
+  'ẞ' => 'ß',
+  'Ạ' => 'ạ',
+  'Ả' => 'ả',
+  'Ấ' => 'ấ',
+  'Ầ' => 'ầ',
+  'Ẩ' => 'ẩ',
+  'Ẫ' => 'ẫ',
+  'Ậ' => 'ậ',
+  'Ắ' => 'ắ',
+  'Ằ' => 'ằ',
+  'Ẳ' => 'ẳ',
+  'Ẵ' => 'ẵ',
+  'Ặ' => 'ặ',
+  'Ẹ' => 'ẹ',
+  'Ẻ' => 'ẻ',
+  'Ẽ' => 'ẽ',
+  'Ế' => 'ế',
+  'Ề' => 'ề',
+  'Ể' => 'ể',
+  'Ễ' => 'ễ',
+  'Ệ' => 'ệ',
+  'Ỉ' => 'ỉ',
+  'Ị' => 'ị',
+  'Ọ' => 'ọ',
+  'Ỏ' => 'ỏ',
+  'Ố' => 'ố',
+  'Ồ' => 'ồ',
+  'Ổ' => 'ổ',
+  'Ỗ' => 'ỗ',
+  'Ộ' => 'ộ',
+  'Ớ' => 'ớ',
+  'Ờ' => 'ờ',
+  'Ở' => 'ở',
+  'Ỡ' => 'ỡ',
+  'Ợ' => 'ợ',
+  'Ụ' => 'ụ',
+  'Ủ' => 'ủ',
+  'Ứ' => 'ứ',
+  'Ừ' => 'ừ',
+  'Ử' => 'ử',
+  'Ữ' => 'ữ',
+  'Ự' => 'ự',
+  'Ỳ' => 'ỳ',
+  'Ỵ' => 'ỵ',
+  'Ỷ' => 'ỷ',
+  'Ỹ' => 'ỹ',
+  'Ỻ' => 'ỻ',
+  'Ỽ' => 'ỽ',
+  'Ỿ' => 'ỿ',
+  'Ἀ' => 'ἀ',
+  'Ἁ' => 'ἁ',
+  'Ἂ' => 'ἂ',
+  'Ἃ' => 'ἃ',
+  'Ἄ' => 'ἄ',
+  'Ἅ' => 'ἅ',
+  'Ἆ' => 'ἆ',
+  'Ἇ' => 'ἇ',
+  'Ἐ' => 'ἐ',
+  'Ἑ' => 'ἑ',
+  'Ἒ' => 'ἒ',
+  'Ἓ' => 'ἓ',
+  'Ἔ' => 'ἔ',
+  'Ἕ' => 'ἕ',
+  'Ἠ' => 'ἠ',
+  'Ἡ' => 'ἡ',
+  'Ἢ' => 'ἢ',
+  'Ἣ' => 'ἣ',
+  'Ἤ' => 'ἤ',
+  'Ἥ' => 'ἥ',
+  'Ἦ' => 'ἦ',
+  'Ἧ' => 'ἧ',
+  'Ἰ' => 'ἰ',
+  'Ἱ' => 'ἱ',
+  'Ἲ' => 'ἲ',
+  'Ἳ' => 'ἳ',
+  'Ἴ' => 'ἴ',
+  'Ἵ' => 'ἵ',
+  'Ἶ' => 'ἶ',
+  'Ἷ' => 'ἷ',
+  'Ὀ' => 'ὀ',
+  'Ὁ' => 'ὁ',
+  'Ὂ' => 'ὂ',
+  'Ὃ' => 'ὃ',
+  'Ὄ' => 'ὄ',
+  'Ὅ' => 'ὅ',
+  'Ὑ' => 'ὑ',
+  'Ὓ' => 'ὓ',
+  'Ὕ' => 'ὕ',
+  'Ὗ' => 'ὗ',
+  'Ὠ' => 'ὠ',
+  'Ὡ' => 'ὡ',
+  'Ὢ' => 'ὢ',
+  'Ὣ' => 'ὣ',
+  'Ὤ' => 'ὤ',
+  'Ὥ' => 'ὥ',
+  'Ὦ' => 'ὦ',
+  'Ὧ' => 'ὧ',
+  'ᾈ' => 'ᾀ',
+  'ᾉ' => 'ᾁ',
+  'ᾊ' => 'ᾂ',
+  'ᾋ' => 'ᾃ',
+  'ᾌ' => 'ᾄ',
+  'ᾍ' => 'ᾅ',
+  'ᾎ' => 'ᾆ',
+  'ᾏ' => 'ᾇ',
+  'ᾘ' => 'ᾐ',
+  'ᾙ' => 'ᾑ',
+  'ᾚ' => 'ᾒ',
+  'ᾛ' => 'ᾓ',
+  'ᾜ' => 'ᾔ',
+  'ᾝ' => 'ᾕ',
+  'ᾞ' => 'ᾖ',
+  'ᾟ' => 'ᾗ',
+  'ᾨ' => 'ᾠ',
+  'ᾩ' => 'ᾡ',
+  'ᾪ' => 'ᾢ',
+  'ᾫ' => 'ᾣ',
+  'ᾬ' => 'ᾤ',
+  'ᾭ' => 'ᾥ',
+  'ᾮ' => 'ᾦ',
+  'ᾯ' => 'ᾧ',
+  'Ᾰ' => 'ᾰ',
+  'Ᾱ' => 'ᾱ',
+  'Ὰ' => 'ὰ',
+  'Ά' => 'ά',
+  'ᾼ' => 'ᾳ',
+  'Ὲ' => 'ὲ',
+  'Έ' => 'έ',
+  'Ὴ' => 'ὴ',
+  'Ή' => 'ή',
+  'ῌ' => 'ῃ',
+  'Ῐ' => 'ῐ',
+  'Ῑ' => 'ῑ',
+  'Ὶ' => 'ὶ',
+  'Ί' => 'ί',
+  'Ῠ' => 'ῠ',
+  'Ῡ' => 'ῡ',
+  'Ὺ' => 'ὺ',
+  'Ύ' => 'ύ',
+  'Ῥ' => 'ῥ',
+  'Ὸ' => 'ὸ',
+  'Ό' => 'ό',
+  'Ὼ' => 'ὼ',
+  'Ώ' => 'ώ',
+  'ῼ' => 'ῳ',
+  'Ω' => 'ω',
+  'K' => 'k',
+  'Å' => 'å',
+  'Ⅎ' => 'ⅎ',
+  'Ⅰ' => 'ⅰ',
+  'Ⅱ' => 'ⅱ',
+  'Ⅲ' => 'ⅲ',
+  'Ⅳ' => 'ⅳ',
+  'Ⅴ' => 'ⅴ',
+  'Ⅵ' => 'ⅵ',
+  'Ⅶ' => 'ⅶ',
+  'Ⅷ' => 'ⅷ',
+  'Ⅸ' => 'ⅸ',
+  'Ⅹ' => 'ⅹ',
+  'Ⅺ' => 'ⅺ',
+  'Ⅻ' => 'ⅻ',
+  'Ⅼ' => 'ⅼ',
+  'Ⅽ' => 'ⅽ',
+  'Ⅾ' => 'ⅾ',
+  'Ⅿ' => 'ⅿ',
+  'Ↄ' => 'ↄ',
+  'Ⓐ' => 'ⓐ',
+  'Ⓑ' => 'ⓑ',
+  'Ⓒ' => 'ⓒ',
+  'Ⓓ' => 'ⓓ',
+  'Ⓔ' => 'ⓔ',
+  'Ⓕ' => 'ⓕ',
+  'Ⓖ' => 'ⓖ',
+  'Ⓗ' => 'ⓗ',
+  'Ⓘ' => 'ⓘ',
+  'Ⓙ' => 'ⓙ',
+  'Ⓚ' => 'ⓚ',
+  'Ⓛ' => 'ⓛ',
+  'Ⓜ' => 'ⓜ',
+  'Ⓝ' => 'ⓝ',
+  'Ⓞ' => 'ⓞ',
+  'Ⓟ' => 'ⓟ',
+  'Ⓠ' => 'ⓠ',
+  'Ⓡ' => 'ⓡ',
+  'Ⓢ' => 'ⓢ',
+  'Ⓣ' => 'ⓣ',
+  'Ⓤ' => 'ⓤ',
+  'Ⓥ' => 'ⓥ',
+  'Ⓦ' => 'ⓦ',
+  'Ⓧ' => 'ⓧ',
+  'Ⓨ' => 'ⓨ',
+  'Ⓩ' => 'ⓩ',
+  'Ⰰ' => 'ⰰ',
+  'Ⰱ' => 'ⰱ',
+  'Ⰲ' => 'ⰲ',
+  'Ⰳ' => 'ⰳ',
+  'Ⰴ' => 'ⰴ',
+  'Ⰵ' => 'ⰵ',
+  'Ⰶ' => 'ⰶ',
+  'Ⰷ' => 'ⰷ',
+  'Ⰸ' => 'ⰸ',
+  'Ⰹ' => 'ⰹ',
+  'Ⰺ' => 'ⰺ',
+  'Ⰻ' => 'ⰻ',
+  'Ⰼ' => 'ⰼ',
+  'Ⰽ' => 'ⰽ',
+  'Ⰾ' => 'ⰾ',
+  'Ⰿ' => 'ⰿ',
+  'Ⱀ' => 'ⱀ',
+  'Ⱁ' => 'ⱁ',
+  'Ⱂ' => 'ⱂ',
+  'Ⱃ' => 'ⱃ',
+  'Ⱄ' => 'ⱄ',
+  'Ⱅ' => 'ⱅ',
+  'Ⱆ' => 'ⱆ',
+  'Ⱇ' => 'ⱇ',
+  'Ⱈ' => 'ⱈ',
+  'Ⱉ' => 'ⱉ',
+  'Ⱊ' => 'ⱊ',
+  'Ⱋ' => 'ⱋ',
+  'Ⱌ' => 'ⱌ',
+  'Ⱍ' => 'ⱍ',
+  'Ⱎ' => 'ⱎ',
+  'Ⱏ' => 'ⱏ',
+  'Ⱐ' => 'ⱐ',
+  'Ⱑ' => 'ⱑ',
+  'Ⱒ' => 'ⱒ',
+  'Ⱓ' => 'ⱓ',
+  'Ⱔ' => 'ⱔ',
+  'Ⱕ' => 'ⱕ',
+  'Ⱖ' => 'ⱖ',
+  'Ⱗ' => 'ⱗ',
+  'Ⱘ' => 'ⱘ',
+  'Ⱙ' => 'ⱙ',
+  'Ⱚ' => 'ⱚ',
+  'Ⱛ' => 'ⱛ',
+  'Ⱜ' => 'ⱜ',
+  'Ⱝ' => 'ⱝ',
+  'Ⱞ' => 'ⱞ',
+  'Ⱡ' => 'ⱡ',
+  'Ɫ' => 'ɫ',
+  'Ᵽ' => 'ᵽ',
+  'Ɽ' => 'ɽ',
+  'Ⱨ' => 'ⱨ',
+  'Ⱪ' => 'ⱪ',
+  'Ⱬ' => 'ⱬ',
+  'Ɑ' => 'ɑ',
+  'Ɱ' => 'ɱ',
+  'Ɐ' => 'ɐ',
+  'Ɒ' => 'ɒ',
+  'Ⱳ' => 'ⱳ',
+  'Ⱶ' => 'ⱶ',
+  'Ȿ' => 'ȿ',
+  'Ɀ' => 'ɀ',
+  'Ⲁ' => 'ⲁ',
+  'Ⲃ' => 'ⲃ',
+  'Ⲅ' => 'ⲅ',
+  'Ⲇ' => 'ⲇ',
+  'Ⲉ' => 'ⲉ',
+  'Ⲋ' => 'ⲋ',
+  'Ⲍ' => 'ⲍ',
+  'Ⲏ' => 'ⲏ',
+  'Ⲑ' => 'ⲑ',
+  'Ⲓ' => 'ⲓ',
+  'Ⲕ' => 'ⲕ',
+  'Ⲗ' => 'ⲗ',
+  'Ⲙ' => 'ⲙ',
+  'Ⲛ' => 'ⲛ',
+  'Ⲝ' => 'ⲝ',
+  'Ⲟ' => 'ⲟ',
+  'Ⲡ' => 'ⲡ',
+  'Ⲣ' => 'ⲣ',
+  'Ⲥ' => 'ⲥ',
+  'Ⲧ' => 'ⲧ',
+  'Ⲩ' => 'ⲩ',
+  'Ⲫ' => 'ⲫ',
+  'Ⲭ' => 'ⲭ',
+  'Ⲯ' => 'ⲯ',
+  'Ⲱ' => 'ⲱ',
+  'Ⲳ' => 'ⲳ',
+  'Ⲵ' => 'ⲵ',
+  'Ⲷ' => 'ⲷ',
+  'Ⲹ' => 'ⲹ',
+  'Ⲻ' => 'ⲻ',
+  'Ⲽ' => 'ⲽ',
+  'Ⲿ' => 'ⲿ',
+  'Ⳁ' => 'ⳁ',
+  'Ⳃ' => 'ⳃ',
+  'Ⳅ' => 'ⳅ',
+  'Ⳇ' => 'ⳇ',
+  'Ⳉ' => 'ⳉ',
+  'Ⳋ' => 'ⳋ',
+  'Ⳍ' => 'ⳍ',
+  'Ⳏ' => 'ⳏ',
+  'Ⳑ' => 'ⳑ',
+  'Ⳓ' => 'ⳓ',
+  'Ⳕ' => 'ⳕ',
+  'Ⳗ' => 'ⳗ',
+  'Ⳙ' => 'ⳙ',
+  'Ⳛ' => 'ⳛ',
+  'Ⳝ' => 'ⳝ',
+  'Ⳟ' => 'ⳟ',
+  'Ⳡ' => 'ⳡ',
+  'Ⳣ' => 'ⳣ',
+  'Ⳬ' => 'ⳬ',
+  'Ⳮ' => 'ⳮ',
+  'Ⳳ' => 'ⳳ',
+  'Ꙁ' => 'ꙁ',
+  'Ꙃ' => 'ꙃ',
+  'Ꙅ' => 'ꙅ',
+  'Ꙇ' => 'ꙇ',
+  'Ꙉ' => 'ꙉ',
+  'Ꙋ' => 'ꙋ',
+  'Ꙍ' => 'ꙍ',
+  'Ꙏ' => 'ꙏ',
+  'Ꙑ' => 'ꙑ',
+  'Ꙓ' => 'ꙓ',
+  'Ꙕ' => 'ꙕ',
+  'Ꙗ' => 'ꙗ',
+  'Ꙙ' => 'ꙙ',
+  'Ꙛ' => 'ꙛ',
+  'Ꙝ' => 'ꙝ',
+  'Ꙟ' => 'ꙟ',
+  'Ꙡ' => 'ꙡ',
+  'Ꙣ' => 'ꙣ',
+  'Ꙥ' => 'ꙥ',
+  'Ꙧ' => 'ꙧ',
+  'Ꙩ' => 'ꙩ',
+  'Ꙫ' => 'ꙫ',
+  'Ꙭ' => 'ꙭ',
+  'Ꚁ' => 'ꚁ',
+  'Ꚃ' => 'ꚃ',
+  'Ꚅ' => 'ꚅ',
+  'Ꚇ' => 'ꚇ',
+  'Ꚉ' => 'ꚉ',
+  'Ꚋ' => 'ꚋ',
+  'Ꚍ' => 'ꚍ',
+  'Ꚏ' => 'ꚏ',
+  'Ꚑ' => 'ꚑ',
+  'Ꚓ' => 'ꚓ',
+  'Ꚕ' => 'ꚕ',
+  'Ꚗ' => 'ꚗ',
+  'Ꚙ' => 'ꚙ',
+  'Ꚛ' => 'ꚛ',
+  'Ꜣ' => 'ꜣ',
+  'Ꜥ' => 'ꜥ',
+  'Ꜧ' => 'ꜧ',
+  'Ꜩ' => 'ꜩ',
+  'Ꜫ' => 'ꜫ',
+  'Ꜭ' => 'ꜭ',
+  'Ꜯ' => 'ꜯ',
+  'Ꜳ' => 'ꜳ',
+  'Ꜵ' => 'ꜵ',
+  'Ꜷ' => 'ꜷ',
+  'Ꜹ' => 'ꜹ',
+  'Ꜻ' => 'ꜻ',
+  'Ꜽ' => 'ꜽ',
+  'Ꜿ' => 'ꜿ',
+  'Ꝁ' => 'ꝁ',
+  'Ꝃ' => 'ꝃ',
+  'Ꝅ' => 'ꝅ',
+  'Ꝇ' => 'ꝇ',
+  'Ꝉ' => 'ꝉ',
+  'Ꝋ' => 'ꝋ',
+  'Ꝍ' => 'ꝍ',
+  'Ꝏ' => 'ꝏ',
+  'Ꝑ' => 'ꝑ',
+  'Ꝓ' => 'ꝓ',
+  'Ꝕ' => 'ꝕ',
+  'Ꝗ' => 'ꝗ',
+  'Ꝙ' => 'ꝙ',
+  'Ꝛ' => 'ꝛ',
+  'Ꝝ' => 'ꝝ',
+  'Ꝟ' => 'ꝟ',
+  'Ꝡ' => 'ꝡ',
+  'Ꝣ' => 'ꝣ',
+  'Ꝥ' => 'ꝥ',
+  'Ꝧ' => 'ꝧ',
+  'Ꝩ' => 'ꝩ',
+  'Ꝫ' => 'ꝫ',
+  'Ꝭ' => 'ꝭ',
+  'Ꝯ' => 'ꝯ',
+  'Ꝺ' => 'ꝺ',
+  'Ꝼ' => 'ꝼ',
+  'Ᵹ' => 'ᵹ',
+  'Ꝿ' => 'ꝿ',
+  'Ꞁ' => 'ꞁ',
+  'Ꞃ' => 'ꞃ',
+  'Ꞅ' => 'ꞅ',
+  'Ꞇ' => 'ꞇ',
+  'Ꞌ' => 'ꞌ',
+  'Ɥ' => 'ɥ',
+  'Ꞑ' => 'ꞑ',
+  'Ꞓ' => 'ꞓ',
+  'Ꞗ' => 'ꞗ',
+  'Ꞙ' => 'ꞙ',
+  'Ꞛ' => 'ꞛ',
+  'Ꞝ' => 'ꞝ',
+  'Ꞟ' => 'ꞟ',
+  'Ꞡ' => 'ꞡ',
+  'Ꞣ' => 'ꞣ',
+  'Ꞥ' => 'ꞥ',
+  'Ꞧ' => 'ꞧ',
+  'Ꞩ' => 'ꞩ',
+  'Ɦ' => 'ɦ',
+  'Ɜ' => 'ɜ',
+  'Ɡ' => 'ɡ',
+  'Ɬ' => 'ɬ',
+  'Ʞ' => 'ʞ',
+  'Ʇ' => 'ʇ',
+  'A' => 'a',
+  'B' => 'b',
+  'C' => 'c',
+  'D' => 'd',
+  'E' => 'e',
+  'F' => 'f',
+  'G' => 'g',
+  'H' => 'h',
+  'I' => 'i',
+  'J' => 'j',
+  'K' => 'k',
+  'L' => 'l',
+  'M' => 'm',
+  'N' => 'n',
+  'O' => 'o',
+  'P' => 'p',
+  'Q' => 'q',
+  'R' => 'r',
+  'S' => 's',
+  'T' => 't',
+  'U' => 'u',
+  'V' => 'v',
+  'W' => 'w',
+  'X' => 'x',
+  'Y' => 'y',
+  'Z' => 'z',
+  '𐐀' => '𐐨',
+  '𐐁' => '𐐩',
+  '𐐂' => '𐐪',
+  '𐐃' => '𐐫',
+  '𐐄' => '𐐬',
+  '𐐅' => '𐐭',
+  '𐐆' => '𐐮',
+  '𐐇' => '𐐯',
+  '𐐈' => '𐐰',
+  '𐐉' => '𐐱',
+  '𐐊' => '𐐲',
+  '𐐋' => '𐐳',
+  '𐐌' => '𐐴',
+  '𐐍' => '𐐵',
+  '𐐎' => '𐐶',
+  '𐐏' => '𐐷',
+  '𐐐' => '𐐸',
+  '𐐑' => '𐐹',
+  '𐐒' => '𐐺',
+  '𐐓' => '𐐻',
+  '𐐔' => '𐐼',
+  '𐐕' => '𐐽',
+  '𐐖' => '𐐾',
+  '𐐗' => '𐐿',
+  '𐐘' => '𐑀',
+  '𐐙' => '𐑁',
+  '𐐚' => '𐑂',
+  '𐐛' => '𐑃',
+  '𐐜' => '𐑄',
+  '𐐝' => '𐑅',
+  '𐐞' => '𐑆',
+  '𐐟' => '𐑇',
+  '𐐠' => '𐑈',
+  '𐐡' => '𐑉',
+  '𐐢' => '𐑊',
+  '𐐣' => '𐑋',
+  '𐐤' => '𐑌',
+  '𐐥' => '𐑍',
+  '𐐦' => '𐑎',
+  '𐐧' => '𐑏',
+  '𑢠' => '𑣀',
+  '𑢡' => '𑣁',
+  '𑢢' => '𑣂',
+  '𑢣' => '𑣃',
+  '𑢤' => '𑣄',
+  '𑢥' => '𑣅',
+  '𑢦' => '𑣆',
+  '𑢧' => '𑣇',
+  '𑢨' => '𑣈',
+  '𑢩' => '𑣉',
+  '𑢪' => '𑣊',
+  '𑢫' => '𑣋',
+  '𑢬' => '𑣌',
+  '𑢭' => '𑣍',
+  '𑢮' => '𑣎',
+  '𑢯' => '𑣏',
+  '𑢰' => '𑣐',
+  '𑢱' => '𑣑',
+  '𑢲' => '𑣒',
+  '𑢳' => '𑣓',
+  '𑢴' => '𑣔',
+  '𑢵' => '𑣕',
+  '𑢶' => '𑣖',
+  '𑢷' => '𑣗',
+  '𑢸' => '𑣘',
+  '𑢹' => '𑣙',
+  '𑢺' => '𑣚',
+  '𑢻' => '𑣛',
+  '𑢼' => '𑣜',
+  '𑢽' => '𑣝',
+  '𑢾' => '𑣞',
+  '𑢿' => '𑣟',
+);

File diff ditekan karena terlalu besar
+ 4 - 0
api/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php


+ 1104 - 0
api/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php

@@ -0,0 +1,1104 @@
+<?php
+
+return array(
+  'a' => 'A',
+  'b' => 'B',
+  'c' => 'C',
+  'd' => 'D',
+  'e' => 'E',
+  'f' => 'F',
+  'g' => 'G',
+  'h' => 'H',
+  'i' => 'I',
+  'j' => 'J',
+  'k' => 'K',
+  'l' => 'L',
+  'm' => 'M',
+  'n' => 'N',
+  'o' => 'O',
+  'p' => 'P',
+  'q' => 'Q',
+  'r' => 'R',
+  's' => 'S',
+  't' => 'T',
+  'u' => 'U',
+  'v' => 'V',
+  'w' => 'W',
+  'x' => 'X',
+  'y' => 'Y',
+  'z' => 'Z',
+  'µ' => 'Μ',
+  'à' => 'À',
+  'á' => 'Á',
+  'â' => 'Â',
+  'ã' => 'Ã',
+  'ä' => 'Ä',
+  'å' => 'Å',
+  'æ' => 'Æ',
+  'ç' => 'Ç',
+  'è' => 'È',
+  'é' => 'É',
+  'ê' => 'Ê',
+  'ë' => 'Ë',
+  'ì' => 'Ì',
+  'í' => 'Í',
+  'î' => 'Î',
+  'ï' => 'Ï',
+  'ð' => 'Ð',
+  'ñ' => 'Ñ',
+  'ò' => 'Ò',
+  'ó' => 'Ó',
+  'ô' => 'Ô',
+  'õ' => 'Õ',
+  'ö' => 'Ö',
+  'ø' => 'Ø',
+  'ù' => 'Ù',
+  'ú' => 'Ú',
+  'û' => 'Û',
+  'ü' => 'Ü',
+  'ý' => 'Ý',
+  'þ' => 'Þ',
+  'ÿ' => 'Ÿ',
+  'ā' => 'Ā',
+  'ă' => 'Ă',
+  'ą' => 'Ą',
+  'ć' => 'Ć',
+  'ĉ' => 'Ĉ',
+  'ċ' => 'Ċ',
+  'č' => 'Č',
+  'ď' => 'Ď',
+  'đ' => 'Đ',
+  'ē' => 'Ē',
+  'ĕ' => 'Ĕ',
+  'ė' => 'Ė',
+  'ę' => 'Ę',
+  'ě' => 'Ě',
+  'ĝ' => 'Ĝ',
+  'ğ' => 'Ğ',
+  'ġ' => 'Ġ',
+  'ģ' => 'Ģ',
+  'ĥ' => 'Ĥ',
+  'ħ' => 'Ħ',
+  'ĩ' => 'Ĩ',
+  'ī' => 'Ī',
+  'ĭ' => 'Ĭ',
+  'į' => 'Į',
+  'ı' => 'I',
+  'ij' => 'IJ',
+  'ĵ' => 'Ĵ',
+  'ķ' => 'Ķ',
+  'ĺ' => 'Ĺ',
+  'ļ' => 'Ļ',
+  'ľ' => 'Ľ',
+  'ŀ' => 'Ŀ',
+  'ł' => 'Ł',
+  'ń' => 'Ń',
+  'ņ' => 'Ņ',
+  'ň' => 'Ň',
+  'ŋ' => 'Ŋ',
+  'ō' => 'Ō',
+  'ŏ' => 'Ŏ',
+  'ő' => 'Ő',
+  'œ' => 'Œ',
+  'ŕ' => 'Ŕ',
+  'ŗ' => 'Ŗ',
+  'ř' => 'Ř',
+  'ś' => 'Ś',
+  'ŝ' => 'Ŝ',
+  'ş' => 'Ş',
+  'š' => 'Š',
+  'ţ' => 'Ţ',
+  'ť' => 'Ť',
+  'ŧ' => 'Ŧ',
+  'ũ' => 'Ũ',
+  'ū' => 'Ū',
+  'ŭ' => 'Ŭ',
+  'ů' => 'Ů',
+  'ű' => 'Ű',
+  'ų' => 'Ų',
+  'ŵ' => 'Ŵ',
+  'ŷ' => 'Ŷ',
+  'ź' => 'Ź',
+  'ż' => 'Ż',
+  'ž' => 'Ž',
+  'ſ' => 'S',
+  'ƀ' => 'Ƀ',
+  'ƃ' => 'Ƃ',
+  'ƅ' => 'Ƅ',
+  'ƈ' => 'Ƈ',
+  'ƌ' => 'Ƌ',
+  'ƒ' => 'Ƒ',
+  'ƕ' => 'Ƕ',
+  'ƙ' => 'Ƙ',
+  'ƚ' => 'Ƚ',
+  'ƞ' => 'Ƞ',
+  'ơ' => 'Ơ',
+  'ƣ' => 'Ƣ',
+  'ƥ' => 'Ƥ',
+  'ƨ' => 'Ƨ',
+  'ƭ' => 'Ƭ',
+  'ư' => 'Ư',
+  'ƴ' => 'Ƴ',
+  'ƶ' => 'Ƶ',
+  'ƹ' => 'Ƹ',
+  'ƽ' => 'Ƽ',
+  'ƿ' => 'Ƿ',
+  'Dž' => 'DŽ',
+  'dž' => 'DŽ',
+  'Lj' => 'LJ',
+  'lj' => 'LJ',
+  'Nj' => 'NJ',
+  'nj' => 'NJ',
+  'ǎ' => 'Ǎ',
+  'ǐ' => 'Ǐ',
+  'ǒ' => 'Ǒ',
+  'ǔ' => 'Ǔ',
+  'ǖ' => 'Ǖ',
+  'ǘ' => 'Ǘ',
+  'ǚ' => 'Ǚ',
+  'ǜ' => 'Ǜ',
+  'ǝ' => 'Ǝ',
+  'ǟ' => 'Ǟ',
+  'ǡ' => 'Ǡ',
+  'ǣ' => 'Ǣ',
+  'ǥ' => 'Ǥ',
+  'ǧ' => 'Ǧ',
+  'ǩ' => 'Ǩ',
+  'ǫ' => 'Ǫ',
+  'ǭ' => 'Ǭ',
+  'ǯ' => 'Ǯ',
+  'Dz' => 'DZ',
+  'dz' => 'DZ',
+  'ǵ' => 'Ǵ',
+  'ǹ' => 'Ǹ',
+  'ǻ' => 'Ǻ',
+  'ǽ' => 'Ǽ',
+  'ǿ' => 'Ǿ',
+  'ȁ' => 'Ȁ',
+  'ȃ' => 'Ȃ',
+  'ȅ' => 'Ȅ',
+  'ȇ' => 'Ȇ',
+  'ȉ' => 'Ȉ',
+  'ȋ' => 'Ȋ',
+  'ȍ' => 'Ȍ',
+  'ȏ' => 'Ȏ',
+  'ȑ' => 'Ȑ',
+  'ȓ' => 'Ȓ',
+  'ȕ' => 'Ȕ',
+  'ȗ' => 'Ȗ',
+  'ș' => 'Ș',
+  'ț' => 'Ț',
+  'ȝ' => 'Ȝ',
+  'ȟ' => 'Ȟ',
+  'ȣ' => 'Ȣ',
+  'ȥ' => 'Ȥ',
+  'ȧ' => 'Ȧ',
+  'ȩ' => 'Ȩ',
+  'ȫ' => 'Ȫ',
+  'ȭ' => 'Ȭ',
+  'ȯ' => 'Ȯ',
+  'ȱ' => 'Ȱ',
+  'ȳ' => 'Ȳ',
+  'ȼ' => 'Ȼ',
+  'ȿ' => 'Ȿ',
+  'ɀ' => 'Ɀ',
+  'ɂ' => 'Ɂ',
+  'ɇ' => 'Ɇ',
+  'ɉ' => 'Ɉ',
+  'ɋ' => 'Ɋ',
+  'ɍ' => 'Ɍ',
+  'ɏ' => 'Ɏ',
+  'ɐ' => 'Ɐ',
+  'ɑ' => 'Ɑ',
+  'ɒ' => 'Ɒ',
+  'ɓ' => 'Ɓ',
+  'ɔ' => 'Ɔ',
+  'ɖ' => 'Ɖ',
+  'ɗ' => 'Ɗ',
+  'ə' => 'Ə',
+  'ɛ' => 'Ɛ',
+  'ɜ' => 'Ɜ',
+  'ɠ' => 'Ɠ',
+  'ɡ' => 'Ɡ',
+  'ɣ' => 'Ɣ',
+  'ɥ' => 'Ɥ',
+  'ɦ' => 'Ɦ',
+  'ɨ' => 'Ɨ',
+  'ɩ' => 'Ɩ',
+  'ɫ' => 'Ɫ',
+  'ɬ' => 'Ɬ',
+  'ɯ' => 'Ɯ',
+  'ɱ' => 'Ɱ',
+  'ɲ' => 'Ɲ',
+  'ɵ' => 'Ɵ',
+  'ɽ' => 'Ɽ',
+  'ʀ' => 'Ʀ',
+  'ʃ' => 'Ʃ',
+  'ʇ' => 'Ʇ',
+  'ʈ' => 'Ʈ',
+  'ʉ' => 'Ʉ',
+  'ʊ' => 'Ʊ',
+  'ʋ' => 'Ʋ',
+  'ʌ' => 'Ʌ',
+  'ʒ' => 'Ʒ',
+  'ʞ' => 'Ʞ',
+  'ͅ' => 'Ι',
+  'ͱ' => 'Ͱ',
+  'ͳ' => 'Ͳ',
+  'ͷ' => 'Ͷ',
+  'ͻ' => 'Ͻ',
+  'ͼ' => 'Ͼ',
+  'ͽ' => 'Ͽ',
+  'ά' => 'Ά',
+  'έ' => 'Έ',
+  'ή' => 'Ή',
+  'ί' => 'Ί',
+  'α' => 'Α',
+  'β' => 'Β',
+  'γ' => 'Γ',
+  'δ' => 'Δ',
+  'ε' => 'Ε',
+  'ζ' => 'Ζ',
+  'η' => 'Η',
+  'θ' => 'Θ',
+  'ι' => 'Ι',
+  'κ' => 'Κ',
+  'λ' => 'Λ',
+  'μ' => 'Μ',
+  'ν' => 'Ν',
+  'ξ' => 'Ξ',
+  'ο' => 'Ο',
+  'π' => 'Π',
+  'ρ' => 'Ρ',
+  'ς' => 'Σ',
+  'σ' => 'Σ',
+  'τ' => 'Τ',
+  'υ' => 'Υ',
+  'φ' => 'Φ',
+  'χ' => 'Χ',
+  'ψ' => 'Ψ',
+  'ω' => 'Ω',
+  'ϊ' => 'Ϊ',
+  'ϋ' => 'Ϋ',
+  'ό' => 'Ό',
+  'ύ' => 'Ύ',
+  'ώ' => 'Ώ',
+  'ϐ' => 'Β',
+  'ϑ' => 'Θ',
+  'ϕ' => 'Φ',
+  'ϖ' => 'Π',
+  'ϗ' => 'Ϗ',
+  'ϙ' => 'Ϙ',
+  'ϛ' => 'Ϛ',
+  'ϝ' => 'Ϝ',
+  'ϟ' => 'Ϟ',
+  'ϡ' => 'Ϡ',
+  'ϣ' => 'Ϣ',
+  'ϥ' => 'Ϥ',
+  'ϧ' => 'Ϧ',
+  'ϩ' => 'Ϩ',
+  'ϫ' => 'Ϫ',
+  'ϭ' => 'Ϭ',
+  'ϯ' => 'Ϯ',
+  'ϰ' => 'Κ',
+  'ϱ' => 'Ρ',
+  'ϲ' => 'Ϲ',
+  'ϳ' => 'Ϳ',
+  'ϵ' => 'Ε',
+  'ϸ' => 'Ϸ',
+  'ϻ' => 'Ϻ',
+  'а' => 'А',
+  'б' => 'Б',
+  'в' => 'В',
+  'г' => 'Г',
+  'д' => 'Д',
+  'е' => 'Е',
+  'ж' => 'Ж',
+  'з' => 'З',
+  'и' => 'И',
+  'й' => 'Й',
+  'к' => 'К',
+  'л' => 'Л',
+  'м' => 'М',
+  'н' => 'Н',
+  'о' => 'О',
+  'п' => 'П',
+  'р' => 'Р',
+  'с' => 'С',
+  'т' => 'Т',
+  'у' => 'У',
+  'ф' => 'Ф',
+  'х' => 'Х',
+  'ц' => 'Ц',
+  'ч' => 'Ч',
+  'ш' => 'Ш',
+  'щ' => 'Щ',
+  'ъ' => 'Ъ',
+  'ы' => 'Ы',
+  'ь' => 'Ь',
+  'э' => 'Э',
+  'ю' => 'Ю',
+  'я' => 'Я',
+  'ѐ' => 'Ѐ',
+  'ё' => 'Ё',
+  'ђ' => 'Ђ',
+  'ѓ' => 'Ѓ',
+  'є' => 'Є',
+  'ѕ' => 'Ѕ',
+  'і' => 'І',
+  'ї' => 'Ї',
+  'ј' => 'Ј',
+  'љ' => 'Љ',
+  'њ' => 'Њ',
+  'ћ' => 'Ћ',
+  'ќ' => 'Ќ',
+  'ѝ' => 'Ѝ',
+  'ў' => 'Ў',
+  'џ' => 'Џ',
+  'ѡ' => 'Ѡ',
+  'ѣ' => 'Ѣ',
+  'ѥ' => 'Ѥ',
+  'ѧ' => 'Ѧ',
+  'ѩ' => 'Ѩ',
+  'ѫ' => 'Ѫ',
+  'ѭ' => 'Ѭ',
+  'ѯ' => 'Ѯ',
+  'ѱ' => 'Ѱ',
+  'ѳ' => 'Ѳ',
+  'ѵ' => 'Ѵ',
+  'ѷ' => 'Ѷ',
+  'ѹ' => 'Ѹ',
+  'ѻ' => 'Ѻ',
+  'ѽ' => 'Ѽ',
+  'ѿ' => 'Ѿ',
+  'ҁ' => 'Ҁ',
+  'ҋ' => 'Ҋ',
+  'ҍ' => 'Ҍ',
+  'ҏ' => 'Ҏ',
+  'ґ' => 'Ґ',
+  'ғ' => 'Ғ',
+  'ҕ' => 'Ҕ',
+  'җ' => 'Җ',
+  'ҙ' => 'Ҙ',
+  'қ' => 'Қ',
+  'ҝ' => 'Ҝ',
+  'ҟ' => 'Ҟ',
+  'ҡ' => 'Ҡ',
+  'ң' => 'Ң',
+  'ҥ' => 'Ҥ',
+  'ҧ' => 'Ҧ',
+  'ҩ' => 'Ҩ',
+  'ҫ' => 'Ҫ',
+  'ҭ' => 'Ҭ',
+  'ү' => 'Ү',
+  'ұ' => 'Ұ',
+  'ҳ' => 'Ҳ',
+  'ҵ' => 'Ҵ',
+  'ҷ' => 'Ҷ',
+  'ҹ' => 'Ҹ',
+  'һ' => 'Һ',
+  'ҽ' => 'Ҽ',
+  'ҿ' => 'Ҿ',
+  'ӂ' => 'Ӂ',
+  'ӄ' => 'Ӄ',
+  'ӆ' => 'Ӆ',
+  'ӈ' => 'Ӈ',
+  'ӊ' => 'Ӊ',
+  'ӌ' => 'Ӌ',
+  'ӎ' => 'Ӎ',
+  'ӏ' => 'Ӏ',
+  'ӑ' => 'Ӑ',
+  'ӓ' => 'Ӓ',
+  'ӕ' => 'Ӕ',
+  'ӗ' => 'Ӗ',
+  'ә' => 'Ә',
+  'ӛ' => 'Ӛ',
+  'ӝ' => 'Ӝ',
+  'ӟ' => 'Ӟ',
+  'ӡ' => 'Ӡ',
+  'ӣ' => 'Ӣ',
+  'ӥ' => 'Ӥ',
+  'ӧ' => 'Ӧ',
+  'ө' => 'Ө',
+  'ӫ' => 'Ӫ',
+  'ӭ' => 'Ӭ',
+  'ӯ' => 'Ӯ',
+  'ӱ' => 'Ӱ',
+  'ӳ' => 'Ӳ',
+  'ӵ' => 'Ӵ',
+  'ӷ' => 'Ӷ',
+  'ӹ' => 'Ӹ',
+  'ӻ' => 'Ӻ',
+  'ӽ' => 'Ӽ',
+  'ӿ' => 'Ӿ',
+  'ԁ' => 'Ԁ',
+  'ԃ' => 'Ԃ',
+  'ԅ' => 'Ԅ',
+  'ԇ' => 'Ԇ',
+  'ԉ' => 'Ԉ',
+  'ԋ' => 'Ԋ',
+  'ԍ' => 'Ԍ',
+  'ԏ' => 'Ԏ',
+  'ԑ' => 'Ԑ',
+  'ԓ' => 'Ԓ',
+  'ԕ' => 'Ԕ',
+  'ԗ' => 'Ԗ',
+  'ԙ' => 'Ԙ',
+  'ԛ' => 'Ԛ',
+  'ԝ' => 'Ԝ',
+  'ԟ' => 'Ԟ',
+  'ԡ' => 'Ԡ',
+  'ԣ' => 'Ԣ',
+  'ԥ' => 'Ԥ',
+  'ԧ' => 'Ԧ',
+  'ԩ' => 'Ԩ',
+  'ԫ' => 'Ԫ',
+  'ԭ' => 'Ԭ',
+  'ԯ' => 'Ԯ',
+  'ա' => 'Ա',
+  'բ' => 'Բ',
+  'գ' => 'Գ',
+  'դ' => 'Դ',
+  'ե' => 'Ե',
+  'զ' => 'Զ',
+  'է' => 'Է',
+  'ը' => 'Ը',
+  'թ' => 'Թ',
+  'ժ' => 'Ժ',
+  'ի' => 'Ի',
+  'լ' => 'Լ',
+  'խ' => 'Խ',
+  'ծ' => 'Ծ',
+  'կ' => 'Կ',
+  'հ' => 'Հ',
+  'ձ' => 'Ձ',
+  'ղ' => 'Ղ',
+  'ճ' => 'Ճ',
+  'մ' => 'Մ',
+  'յ' => 'Յ',
+  'ն' => 'Ն',
+  'շ' => 'Շ',
+  'ո' => 'Ո',
+  'չ' => 'Չ',
+  'պ' => 'Պ',
+  'ջ' => 'Ջ',
+  'ռ' => 'Ռ',
+  'ս' => 'Ս',
+  'վ' => 'Վ',
+  'տ' => 'Տ',
+  'ր' => 'Ր',
+  'ց' => 'Ց',
+  'ւ' => 'Ւ',
+  'փ' => 'Փ',
+  'ք' => 'Ք',
+  'օ' => 'Օ',
+  'ֆ' => 'Ֆ',
+  'ᵹ' => 'Ᵹ',
+  'ᵽ' => 'Ᵽ',
+  'ḁ' => 'Ḁ',
+  'ḃ' => 'Ḃ',
+  'ḅ' => 'Ḅ',
+  'ḇ' => 'Ḇ',
+  'ḉ' => 'Ḉ',
+  'ḋ' => 'Ḋ',
+  'ḍ' => 'Ḍ',
+  'ḏ' => 'Ḏ',
+  'ḑ' => 'Ḑ',
+  'ḓ' => 'Ḓ',
+  'ḕ' => 'Ḕ',
+  'ḗ' => 'Ḗ',
+  'ḙ' => 'Ḙ',
+  'ḛ' => 'Ḛ',
+  'ḝ' => 'Ḝ',
+  'ḟ' => 'Ḟ',
+  'ḡ' => 'Ḡ',
+  'ḣ' => 'Ḣ',
+  'ḥ' => 'Ḥ',
+  'ḧ' => 'Ḧ',
+  'ḩ' => 'Ḩ',
+  'ḫ' => 'Ḫ',
+  'ḭ' => 'Ḭ',
+  'ḯ' => 'Ḯ',
+  'ḱ' => 'Ḱ',
+  'ḳ' => 'Ḳ',
+  'ḵ' => 'Ḵ',
+  'ḷ' => 'Ḷ',
+  'ḹ' => 'Ḹ',
+  'ḻ' => 'Ḻ',
+  'ḽ' => 'Ḽ',
+  'ḿ' => 'Ḿ',
+  'ṁ' => 'Ṁ',
+  'ṃ' => 'Ṃ',
+  'ṅ' => 'Ṅ',
+  'ṇ' => 'Ṇ',
+  'ṉ' => 'Ṉ',
+  'ṋ' => 'Ṋ',
+  'ṍ' => 'Ṍ',
+  'ṏ' => 'Ṏ',
+  'ṑ' => 'Ṑ',
+  'ṓ' => 'Ṓ',
+  'ṕ' => 'Ṕ',
+  'ṗ' => 'Ṗ',
+  'ṙ' => 'Ṙ',
+  'ṛ' => 'Ṛ',
+  'ṝ' => 'Ṝ',
+  'ṟ' => 'Ṟ',
+  'ṡ' => 'Ṡ',
+  'ṣ' => 'Ṣ',
+  'ṥ' => 'Ṥ',
+  'ṧ' => 'Ṧ',
+  'ṩ' => 'Ṩ',
+  'ṫ' => 'Ṫ',
+  'ṭ' => 'Ṭ',
+  'ṯ' => 'Ṯ',
+  'ṱ' => 'Ṱ',
+  'ṳ' => 'Ṳ',
+  'ṵ' => 'Ṵ',
+  'ṷ' => 'Ṷ',
+  'ṹ' => 'Ṹ',
+  'ṻ' => 'Ṻ',
+  'ṽ' => 'Ṽ',
+  'ṿ' => 'Ṿ',
+  'ẁ' => 'Ẁ',
+  'ẃ' => 'Ẃ',
+  'ẅ' => 'Ẅ',
+  'ẇ' => 'Ẇ',
+  'ẉ' => 'Ẉ',
+  'ẋ' => 'Ẋ',
+  'ẍ' => 'Ẍ',
+  'ẏ' => 'Ẏ',
+  'ẑ' => 'Ẑ',
+  'ẓ' => 'Ẓ',
+  'ẕ' => 'Ẕ',
+  'ẛ' => 'Ṡ',
+  'ạ' => 'Ạ',
+  'ả' => 'Ả',
+  'ấ' => 'Ấ',
+  'ầ' => 'Ầ',
+  'ẩ' => 'Ẩ',
+  'ẫ' => 'Ẫ',
+  'ậ' => 'Ậ',
+  'ắ' => 'Ắ',
+  'ằ' => 'Ằ',
+  'ẳ' => 'Ẳ',
+  'ẵ' => 'Ẵ',
+  'ặ' => 'Ặ',
+  'ẹ' => 'Ẹ',
+  'ẻ' => 'Ẻ',
+  'ẽ' => 'Ẽ',
+  'ế' => 'Ế',
+  'ề' => 'Ề',
+  'ể' => 'Ể',
+  'ễ' => 'Ễ',
+  'ệ' => 'Ệ',
+  'ỉ' => 'Ỉ',
+  'ị' => 'Ị',
+  'ọ' => 'Ọ',
+  'ỏ' => 'Ỏ',
+  'ố' => 'Ố',
+  'ồ' => 'Ồ',
+  'ổ' => 'Ổ',
+  'ỗ' => 'Ỗ',
+  'ộ' => 'Ộ',
+  'ớ' => 'Ớ',
+  'ờ' => 'Ờ',
+  'ở' => 'Ở',
+  'ỡ' => 'Ỡ',
+  'ợ' => 'Ợ',
+  'ụ' => 'Ụ',
+  'ủ' => 'Ủ',
+  'ứ' => 'Ứ',
+  'ừ' => 'Ừ',
+  'ử' => 'Ử',
+  'ữ' => 'Ữ',
+  'ự' => 'Ự',
+  'ỳ' => 'Ỳ',
+  'ỵ' => 'Ỵ',
+  'ỷ' => 'Ỷ',
+  'ỹ' => 'Ỹ',
+  'ỻ' => 'Ỻ',
+  'ỽ' => 'Ỽ',
+  'ỿ' => 'Ỿ',
+  'ἀ' => 'Ἀ',
+  'ἁ' => 'Ἁ',
+  'ἂ' => 'Ἂ',
+  'ἃ' => 'Ἃ',
+  'ἄ' => 'Ἄ',
+  'ἅ' => 'Ἅ',
+  'ἆ' => 'Ἆ',
+  'ἇ' => 'Ἇ',
+  'ἐ' => 'Ἐ',
+  'ἑ' => 'Ἑ',
+  'ἒ' => 'Ἒ',
+  'ἓ' => 'Ἓ',
+  'ἔ' => 'Ἔ',
+  'ἕ' => 'Ἕ',
+  'ἠ' => 'Ἠ',
+  'ἡ' => 'Ἡ',
+  'ἢ' => 'Ἢ',
+  'ἣ' => 'Ἣ',
+  'ἤ' => 'Ἤ',
+  'ἥ' => 'Ἥ',
+  'ἦ' => 'Ἦ',
+  'ἧ' => 'Ἧ',
+  'ἰ' => 'Ἰ',
+  'ἱ' => 'Ἱ',
+  'ἲ' => 'Ἲ',
+  'ἳ' => 'Ἳ',
+  'ἴ' => 'Ἴ',
+  'ἵ' => 'Ἵ',
+  'ἶ' => 'Ἶ',
+  'ἷ' => 'Ἷ',
+  'ὀ' => 'Ὀ',
+  'ὁ' => 'Ὁ',
+  'ὂ' => 'Ὂ',
+  'ὃ' => 'Ὃ',
+  'ὄ' => 'Ὄ',
+  'ὅ' => 'Ὅ',
+  'ὑ' => 'Ὑ',
+  'ὓ' => 'Ὓ',
+  'ὕ' => 'Ὕ',
+  'ὗ' => 'Ὗ',
+  'ὠ' => 'Ὠ',
+  'ὡ' => 'Ὡ',
+  'ὢ' => 'Ὢ',
+  'ὣ' => 'Ὣ',
+  'ὤ' => 'Ὤ',
+  'ὥ' => 'Ὥ',
+  'ὦ' => 'Ὦ',
+  'ὧ' => 'Ὧ',
+  'ὰ' => 'Ὰ',
+  'ά' => 'Ά',
+  'ὲ' => 'Ὲ',
+  'έ' => 'Έ',
+  'ὴ' => 'Ὴ',
+  'ή' => 'Ή',
+  'ὶ' => 'Ὶ',
+  'ί' => 'Ί',
+  'ὸ' => 'Ὸ',
+  'ό' => 'Ό',
+  'ὺ' => 'Ὺ',
+  'ύ' => 'Ύ',
+  'ὼ' => 'Ὼ',
+  'ώ' => 'Ώ',
+  'ᾀ' => 'ᾈ',
+  'ᾁ' => 'ᾉ',
+  'ᾂ' => 'ᾊ',
+  'ᾃ' => 'ᾋ',
+  'ᾄ' => 'ᾌ',
+  'ᾅ' => 'ᾍ',
+  'ᾆ' => 'ᾎ',
+  'ᾇ' => 'ᾏ',
+  'ᾐ' => 'ᾘ',
+  'ᾑ' => 'ᾙ',
+  'ᾒ' => 'ᾚ',
+  'ᾓ' => 'ᾛ',
+  'ᾔ' => 'ᾜ',
+  'ᾕ' => 'ᾝ',
+  'ᾖ' => 'ᾞ',
+  'ᾗ' => 'ᾟ',
+  'ᾠ' => 'ᾨ',
+  'ᾡ' => 'ᾩ',
+  'ᾢ' => 'ᾪ',
+  'ᾣ' => 'ᾫ',
+  'ᾤ' => 'ᾬ',
+  'ᾥ' => 'ᾭ',
+  'ᾦ' => 'ᾮ',
+  'ᾧ' => 'ᾯ',
+  'ᾰ' => 'Ᾰ',
+  'ᾱ' => 'Ᾱ',
+  'ᾳ' => 'ᾼ',
+  'ι' => 'Ι',
+  'ῃ' => 'ῌ',
+  'ῐ' => 'Ῐ',
+  'ῑ' => 'Ῑ',
+  'ῠ' => 'Ῠ',
+  'ῡ' => 'Ῡ',
+  'ῥ' => 'Ῥ',
+  'ῳ' => 'ῼ',
+  'ⅎ' => 'Ⅎ',
+  'ⅰ' => 'Ⅰ',
+  'ⅱ' => 'Ⅱ',
+  'ⅲ' => 'Ⅲ',
+  'ⅳ' => 'Ⅳ',
+  'ⅴ' => 'Ⅴ',
+  'ⅵ' => 'Ⅵ',
+  'ⅶ' => 'Ⅶ',
+  'ⅷ' => 'Ⅷ',
+  'ⅸ' => 'Ⅸ',
+  'ⅹ' => 'Ⅹ',
+  'ⅺ' => 'Ⅺ',
+  'ⅻ' => 'Ⅻ',
+  'ⅼ' => 'Ⅼ',
+  'ⅽ' => 'Ⅽ',
+  'ⅾ' => 'Ⅾ',
+  'ⅿ' => 'Ⅿ',
+  'ↄ' => 'Ↄ',
+  'ⓐ' => 'Ⓐ',
+  'ⓑ' => 'Ⓑ',
+  'ⓒ' => 'Ⓒ',
+  'ⓓ' => 'Ⓓ',
+  'ⓔ' => 'Ⓔ',
+  'ⓕ' => 'Ⓕ',
+  'ⓖ' => 'Ⓖ',
+  'ⓗ' => 'Ⓗ',
+  'ⓘ' => 'Ⓘ',
+  'ⓙ' => 'Ⓙ',
+  'ⓚ' => 'Ⓚ',
+  'ⓛ' => 'Ⓛ',
+  'ⓜ' => 'Ⓜ',
+  'ⓝ' => 'Ⓝ',
+  'ⓞ' => 'Ⓞ',
+  'ⓟ' => 'Ⓟ',
+  'ⓠ' => 'Ⓠ',
+  'ⓡ' => 'Ⓡ',
+  'ⓢ' => 'Ⓢ',
+  'ⓣ' => 'Ⓣ',
+  'ⓤ' => 'Ⓤ',
+  'ⓥ' => 'Ⓥ',
+  'ⓦ' => 'Ⓦ',
+  'ⓧ' => 'Ⓧ',
+  'ⓨ' => 'Ⓨ',
+  'ⓩ' => 'Ⓩ',
+  'ⰰ' => 'Ⰰ',
+  'ⰱ' => 'Ⰱ',
+  'ⰲ' => 'Ⰲ',
+  'ⰳ' => 'Ⰳ',
+  'ⰴ' => 'Ⰴ',
+  'ⰵ' => 'Ⰵ',
+  'ⰶ' => 'Ⰶ',
+  'ⰷ' => 'Ⰷ',
+  'ⰸ' => 'Ⰸ',
+  'ⰹ' => 'Ⰹ',
+  'ⰺ' => 'Ⰺ',
+  'ⰻ' => 'Ⰻ',
+  'ⰼ' => 'Ⰼ',
+  'ⰽ' => 'Ⰽ',
+  'ⰾ' => 'Ⰾ',
+  'ⰿ' => 'Ⰿ',
+  'ⱀ' => 'Ⱀ',
+  'ⱁ' => 'Ⱁ',
+  'ⱂ' => 'Ⱂ',
+  'ⱃ' => 'Ⱃ',
+  'ⱄ' => 'Ⱄ',
+  'ⱅ' => 'Ⱅ',
+  'ⱆ' => 'Ⱆ',
+  'ⱇ' => 'Ⱇ',
+  'ⱈ' => 'Ⱈ',
+  'ⱉ' => 'Ⱉ',
+  'ⱊ' => 'Ⱊ',
+  'ⱋ' => 'Ⱋ',
+  'ⱌ' => 'Ⱌ',
+  'ⱍ' => 'Ⱍ',
+  'ⱎ' => 'Ⱎ',
+  'ⱏ' => 'Ⱏ',
+  'ⱐ' => 'Ⱐ',
+  'ⱑ' => 'Ⱑ',
+  'ⱒ' => 'Ⱒ',
+  'ⱓ' => 'Ⱓ',
+  'ⱔ' => 'Ⱔ',
+  'ⱕ' => 'Ⱕ',
+  'ⱖ' => 'Ⱖ',
+  'ⱗ' => 'Ⱗ',
+  'ⱘ' => 'Ⱘ',
+  'ⱙ' => 'Ⱙ',
+  'ⱚ' => 'Ⱚ',
+  'ⱛ' => 'Ⱛ',
+  'ⱜ' => 'Ⱜ',
+  'ⱝ' => 'Ⱝ',
+  'ⱞ' => 'Ⱞ',
+  'ⱡ' => 'Ⱡ',
+  'ⱥ' => 'Ⱥ',
+  'ⱦ' => 'Ⱦ',
+  'ⱨ' => 'Ⱨ',
+  'ⱪ' => 'Ⱪ',
+  'ⱬ' => 'Ⱬ',
+  'ⱳ' => 'Ⱳ',
+  'ⱶ' => 'Ⱶ',
+  'ⲁ' => 'Ⲁ',
+  'ⲃ' => 'Ⲃ',
+  'ⲅ' => 'Ⲅ',
+  'ⲇ' => 'Ⲇ',
+  'ⲉ' => 'Ⲉ',
+  'ⲋ' => 'Ⲋ',
+  'ⲍ' => 'Ⲍ',
+  'ⲏ' => 'Ⲏ',
+  'ⲑ' => 'Ⲑ',
+  'ⲓ' => 'Ⲓ',
+  'ⲕ' => 'Ⲕ',
+  'ⲗ' => 'Ⲗ',
+  'ⲙ' => 'Ⲙ',
+  'ⲛ' => 'Ⲛ',
+  'ⲝ' => 'Ⲝ',
+  'ⲟ' => 'Ⲟ',
+  'ⲡ' => 'Ⲡ',
+  'ⲣ' => 'Ⲣ',
+  'ⲥ' => 'Ⲥ',
+  'ⲧ' => 'Ⲧ',
+  'ⲩ' => 'Ⲩ',
+  'ⲫ' => 'Ⲫ',
+  'ⲭ' => 'Ⲭ',
+  'ⲯ' => 'Ⲯ',
+  'ⲱ' => 'Ⲱ',
+  'ⲳ' => 'Ⲳ',
+  'ⲵ' => 'Ⲵ',
+  'ⲷ' => 'Ⲷ',
+  'ⲹ' => 'Ⲹ',
+  'ⲻ' => 'Ⲻ',
+  'ⲽ' => 'Ⲽ',
+  'ⲿ' => 'Ⲿ',
+  'ⳁ' => 'Ⳁ',
+  'ⳃ' => 'Ⳃ',
+  'ⳅ' => 'Ⳅ',
+  'ⳇ' => 'Ⳇ',
+  'ⳉ' => 'Ⳉ',
+  'ⳋ' => 'Ⳋ',
+  'ⳍ' => 'Ⳍ',
+  'ⳏ' => 'Ⳏ',
+  'ⳑ' => 'Ⳑ',
+  'ⳓ' => 'Ⳓ',
+  'ⳕ' => 'Ⳕ',
+  'ⳗ' => 'Ⳗ',
+  'ⳙ' => 'Ⳙ',
+  'ⳛ' => 'Ⳛ',
+  'ⳝ' => 'Ⳝ',
+  'ⳟ' => 'Ⳟ',
+  'ⳡ' => 'Ⳡ',
+  'ⳣ' => 'Ⳣ',
+  'ⳬ' => 'Ⳬ',
+  'ⳮ' => 'Ⳮ',
+  'ⳳ' => 'Ⳳ',
+  'ⴀ' => 'Ⴀ',
+  'ⴁ' => 'Ⴁ',
+  'ⴂ' => 'Ⴂ',
+  'ⴃ' => 'Ⴃ',
+  'ⴄ' => 'Ⴄ',
+  'ⴅ' => 'Ⴅ',
+  'ⴆ' => 'Ⴆ',
+  'ⴇ' => 'Ⴇ',
+  'ⴈ' => 'Ⴈ',
+  'ⴉ' => 'Ⴉ',
+  'ⴊ' => 'Ⴊ',
+  'ⴋ' => 'Ⴋ',
+  'ⴌ' => 'Ⴌ',
+  'ⴍ' => 'Ⴍ',
+  'ⴎ' => 'Ⴎ',
+  'ⴏ' => 'Ⴏ',
+  'ⴐ' => 'Ⴐ',
+  'ⴑ' => 'Ⴑ',
+  'ⴒ' => 'Ⴒ',
+  'ⴓ' => 'Ⴓ',
+  'ⴔ' => 'Ⴔ',
+  'ⴕ' => 'Ⴕ',
+  'ⴖ' => 'Ⴖ',
+  'ⴗ' => 'Ⴗ',
+  'ⴘ' => 'Ⴘ',
+  'ⴙ' => 'Ⴙ',
+  'ⴚ' => 'Ⴚ',
+  'ⴛ' => 'Ⴛ',
+  'ⴜ' => 'Ⴜ',
+  'ⴝ' => 'Ⴝ',
+  'ⴞ' => 'Ⴞ',
+  'ⴟ' => 'Ⴟ',
+  'ⴠ' => 'Ⴠ',
+  'ⴡ' => 'Ⴡ',
+  'ⴢ' => 'Ⴢ',
+  'ⴣ' => 'Ⴣ',
+  'ⴤ' => 'Ⴤ',
+  'ⴥ' => 'Ⴥ',
+  'ⴧ' => 'Ⴧ',
+  'ⴭ' => 'Ⴭ',
+  'ꙁ' => 'Ꙁ',
+  'ꙃ' => 'Ꙃ',
+  'ꙅ' => 'Ꙅ',
+  'ꙇ' => 'Ꙇ',
+  'ꙉ' => 'Ꙉ',
+  'ꙋ' => 'Ꙋ',
+  'ꙍ' => 'Ꙍ',
+  'ꙏ' => 'Ꙏ',
+  'ꙑ' => 'Ꙑ',
+  'ꙓ' => 'Ꙓ',
+  'ꙕ' => 'Ꙕ',
+  'ꙗ' => 'Ꙗ',
+  'ꙙ' => 'Ꙙ',
+  'ꙛ' => 'Ꙛ',
+  'ꙝ' => 'Ꙝ',
+  'ꙟ' => 'Ꙟ',
+  'ꙡ' => 'Ꙡ',
+  'ꙣ' => 'Ꙣ',
+  'ꙥ' => 'Ꙥ',
+  'ꙧ' => 'Ꙧ',
+  'ꙩ' => 'Ꙩ',
+  'ꙫ' => 'Ꙫ',
+  'ꙭ' => 'Ꙭ',
+  'ꚁ' => 'Ꚁ',
+  'ꚃ' => 'Ꚃ',
+  'ꚅ' => 'Ꚅ',
+  'ꚇ' => 'Ꚇ',
+  'ꚉ' => 'Ꚉ',
+  'ꚋ' => 'Ꚋ',
+  'ꚍ' => 'Ꚍ',
+  'ꚏ' => 'Ꚏ',
+  'ꚑ' => 'Ꚑ',
+  'ꚓ' => 'Ꚓ',
+  'ꚕ' => 'Ꚕ',
+  'ꚗ' => 'Ꚗ',
+  'ꚙ' => 'Ꚙ',
+  'ꚛ' => 'Ꚛ',
+  'ꜣ' => 'Ꜣ',
+  'ꜥ' => 'Ꜥ',
+  'ꜧ' => 'Ꜧ',
+  'ꜩ' => 'Ꜩ',
+  'ꜫ' => 'Ꜫ',
+  'ꜭ' => 'Ꜭ',
+  'ꜯ' => 'Ꜯ',
+  'ꜳ' => 'Ꜳ',
+  'ꜵ' => 'Ꜵ',
+  'ꜷ' => 'Ꜷ',
+  'ꜹ' => 'Ꜹ',
+  'ꜻ' => 'Ꜻ',
+  'ꜽ' => 'Ꜽ',
+  'ꜿ' => 'Ꜿ',
+  'ꝁ' => 'Ꝁ',
+  'ꝃ' => 'Ꝃ',
+  'ꝅ' => 'Ꝅ',
+  'ꝇ' => 'Ꝇ',
+  'ꝉ' => 'Ꝉ',
+  'ꝋ' => 'Ꝋ',
+  'ꝍ' => 'Ꝍ',
+  'ꝏ' => 'Ꝏ',
+  'ꝑ' => 'Ꝑ',
+  'ꝓ' => 'Ꝓ',
+  'ꝕ' => 'Ꝕ',
+  'ꝗ' => 'Ꝗ',
+  'ꝙ' => 'Ꝙ',
+  'ꝛ' => 'Ꝛ',
+  'ꝝ' => 'Ꝝ',
+  'ꝟ' => 'Ꝟ',
+  'ꝡ' => 'Ꝡ',
+  'ꝣ' => 'Ꝣ',
+  'ꝥ' => 'Ꝥ',
+  'ꝧ' => 'Ꝧ',
+  'ꝩ' => 'Ꝩ',
+  'ꝫ' => 'Ꝫ',
+  'ꝭ' => 'Ꝭ',
+  'ꝯ' => 'Ꝯ',
+  'ꝺ' => 'Ꝺ',
+  'ꝼ' => 'Ꝼ',
+  'ꝿ' => 'Ꝿ',
+  'ꞁ' => 'Ꞁ',
+  'ꞃ' => 'Ꞃ',
+  'ꞅ' => 'Ꞅ',
+  'ꞇ' => 'Ꞇ',
+  'ꞌ' => 'Ꞌ',
+  'ꞑ' => 'Ꞑ',
+  'ꞓ' => 'Ꞓ',
+  'ꞗ' => 'Ꞗ',
+  'ꞙ' => 'Ꞙ',
+  'ꞛ' => 'Ꞛ',
+  'ꞝ' => 'Ꞝ',
+  'ꞟ' => 'Ꞟ',
+  'ꞡ' => 'Ꞡ',
+  'ꞣ' => 'Ꞣ',
+  'ꞥ' => 'Ꞥ',
+  'ꞧ' => 'Ꞧ',
+  'ꞩ' => 'Ꞩ',
+  'a' => 'A',
+  'b' => 'B',
+  'c' => 'C',
+  'd' => 'D',
+  'e' => 'E',
+  'f' => 'F',
+  'g' => 'G',
+  'h' => 'H',
+  'i' => 'I',
+  'j' => 'J',
+  'k' => 'K',
+  'l' => 'L',
+  'm' => 'M',
+  'n' => 'N',
+  'o' => 'O',
+  'p' => 'P',
+  'q' => 'Q',
+  'r' => 'R',
+  's' => 'S',
+  't' => 'T',
+  'u' => 'U',
+  'v' => 'V',
+  'w' => 'W',
+  'x' => 'X',
+  'y' => 'Y',
+  'z' => 'Z',
+  '𐐨' => '𐐀',
+  '𐐩' => '𐐁',
+  '𐐪' => '𐐂',
+  '𐐫' => '𐐃',
+  '𐐬' => '𐐄',
+  '𐐭' => '𐐅',
+  '𐐮' => '𐐆',
+  '𐐯' => '𐐇',
+  '𐐰' => '𐐈',
+  '𐐱' => '𐐉',
+  '𐐲' => '𐐊',
+  '𐐳' => '𐐋',
+  '𐐴' => '𐐌',
+  '𐐵' => '𐐍',
+  '𐐶' => '𐐎',
+  '𐐷' => '𐐏',
+  '𐐸' => '𐐐',
+  '𐐹' => '𐐑',
+  '𐐺' => '𐐒',
+  '𐐻' => '𐐓',
+  '𐐼' => '𐐔',
+  '𐐽' => '𐐕',
+  '𐐾' => '𐐖',
+  '𐐿' => '𐐗',
+  '𐑀' => '𐐘',
+  '𐑁' => '𐐙',
+  '𐑂' => '𐐚',
+  '𐑃' => '𐐛',
+  '𐑄' => '𐐜',
+  '𐑅' => '𐐝',
+  '𐑆' => '𐐞',
+  '𐑇' => '𐐟',
+  '𐑈' => '𐐠',
+  '𐑉' => '𐐡',
+  '𐑊' => '𐐢',
+  '𐑋' => '𐐣',
+  '𐑌' => '𐐤',
+  '𐑍' => '𐐥',
+  '𐑎' => '𐐦',
+  '𐑏' => '𐐧',
+  '𑣀' => '𑢠',
+  '𑣁' => '𑢡',
+  '𑣂' => '𑢢',
+  '𑣃' => '𑢣',
+  '𑣄' => '𑢤',
+  '𑣅' => '𑢥',
+  '𑣆' => '𑢦',
+  '𑣇' => '𑢧',
+  '𑣈' => '𑢨',
+  '𑣉' => '𑢩',
+  '𑣊' => '𑢪',
+  '𑣋' => '𑢫',
+  '𑣌' => '𑢬',
+  '𑣍' => '𑢭',
+  '𑣎' => '𑢮',
+  '𑣏' => '𑢯',
+  '𑣐' => '𑢰',
+  '𑣑' => '𑢱',
+  '𑣒' => '𑢲',
+  '𑣓' => '𑢳',
+  '𑣔' => '𑢴',
+  '𑣕' => '𑢵',
+  '𑣖' => '𑢶',
+  '𑣗' => '𑢷',
+  '𑣘' => '𑢸',
+  '𑣙' => '𑢹',
+  '𑣚' => '𑢺',
+  '𑣛' => '𑢻',
+  '𑣜' => '𑢼',
+  '𑣝' => '𑢽',
+  '𑣞' => '𑢾',
+  '𑣟' => '𑢿',
+);

+ 58 - 0
api/vendor/symfony/polyfill-mbstring/bootstrap.php

@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Mbstring as p;
+
+if (!function_exists('mb_strlen')) {
+    define('MB_CASE_UPPER', 0);
+    define('MB_CASE_LOWER', 1);
+    define('MB_CASE_TITLE', 2);
+
+    function mb_convert_encoding($s, $to, $from = null) { return p\Mbstring::mb_convert_encoding($s, $to, $from); }
+    function mb_decode_mimeheader($s) { return p\Mbstring::mb_decode_mimeheader($s); }
+    function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent); }
+    function mb_decode_numericentity($s, $convmap, $enc = null) { return p\Mbstring::mb_decode_numericentity($s, $convmap, $enc); }
+    function mb_encode_numericentity($s, $convmap, $enc = null, $is_hex = false) { return p\Mbstring::mb_encode_numericentity($s, $convmap, $enc, $is_hex); }
+    function mb_convert_case($s, $mode, $enc = null) { return p\Mbstring::mb_convert_case($s, $mode, $enc); }
+    function mb_internal_encoding($enc = null) { return p\Mbstring::mb_internal_encoding($enc); }
+    function mb_language($lang = null) { return p\Mbstring::mb_language($lang); }
+    function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
+    function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
+    function mb_check_encoding($var = null, $encoding = null) { return p\Mbstring::mb_check_encoding($var, $encoding); }
+    function mb_detect_encoding($str, $encodingList = null, $strict = false) { return p\Mbstring::mb_detect_encoding($str, $encodingList, $strict); }
+    function mb_detect_order($encodingList = null) { return p\Mbstring::mb_detect_order($encodingList); }
+    function mb_parse_str($s, &$result = array()) { parse_str($s, $result); }
+    function mb_strlen($s, $enc = null) { return p\Mbstring::mb_strlen($s, $enc); }
+    function mb_strpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strpos($s, $needle, $offset, $enc); }
+    function mb_strtolower($s, $enc = null) { return p\Mbstring::mb_strtolower($s, $enc); }
+    function mb_strtoupper($s, $enc = null) { return p\Mbstring::mb_strtoupper($s, $enc); }
+    function mb_substitute_character($char = null) { return p\Mbstring::mb_substitute_character($char); }
+    function mb_substr($s, $start, $length = 2147483647, $enc = null) { return p\Mbstring::mb_substr($s, $start, $length, $enc); }
+    function mb_stripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_stripos($s, $needle, $offset, $enc); }
+    function mb_stristr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_stristr($s, $needle, $part, $enc); }
+    function mb_strrchr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrchr($s, $needle, $part, $enc); }
+    function mb_strrichr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrichr($s, $needle, $part, $enc); }
+    function mb_strripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strripos($s, $needle, $offset, $enc); }
+    function mb_strrpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strrpos($s, $needle, $offset, $enc); }
+    function mb_strstr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strstr($s, $needle, $part, $enc); }
+    function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
+    function mb_http_output($enc = null) { return p\Mbstring::mb_http_output($enc); }
+    function mb_strwidth($s, $enc = null) { return p\Mbstring::mb_strwidth($s, $enc); }
+    function mb_substr_count($haystack, $needle, $enc = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $enc); }
+    function mb_output_handler($contents, $status) { return p\Mbstring::mb_output_handler($contents, $status); }
+    function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); }
+    function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f); }
+}
+if (!function_exists('mb_chr')) {
+    function mb_ord($s, $enc = null) { return p\Mbstring::mb_ord($s, $enc); }
+    function mb_chr($code, $enc = null) { return p\Mbstring::mb_chr($code, $enc); }
+    function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); }
+}

+ 34 - 0
api/vendor/symfony/polyfill-mbstring/composer.json

@@ -0,0 +1,34 @@
+{
+    "name": "symfony/polyfill-mbstring",
+    "type": "library",
+    "description": "Symfony polyfill for the Mbstring extension",
+    "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Nicolas Grekas",
+            "email": "p@tchwork.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.3"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" },
+        "files": [ "bootstrap.php" ]
+    },
+    "suggest": {
+        "ext-mbstring": "For best performance"
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.9-dev"
+        }
+    }
+}

+ 45 - 0
api/vendor/true/punycode/CHANGELOG.md

@@ -0,0 +1,45 @@
+# Changelog
+
+## 2.1.0 - 2016-08-09
+
+- [Enhancement] Increase rfc compliance (#20)
+  - Thanks to [@skroczek](https://github.com/skroczek) for the full patch.
+
+## 2.0.3 - 2016-05-23
+
+- [Fix] Exclude development stuff from repository autogenerated ZIP archives (#18)
+  - Thanks to [@mlocati](https://github.com/mlocati) for the full patch.
+
+## 2.0.2 - 2016-01-07
+
+- [Fix] Encode and decode domains regardless of their casing (#16)
+  - Thanks to [@abcdmitry](https://github.com/abcdmitry) for the full patch.
+
+
+## 2.0.1 - 2015-09-01
+
+- [Fix] Removed `version` property from `composer.json` file
+  - Thanks to [@GrahamCampbell](https://github.com/GrahamCampbell) for the patch.
+
+
+## 2.0.0 - 2015-06-24
+
+- [Enhancement] PHP 7 support
+- [Fix] Renamed `True` namespace to `TrueBV` as it is a reserved word in PHP 7
+
+
+## 1.1.0 - 2015-03-12
+
+- [Enhancement] Character encoding is now passed to the constructor, defaulting to UTF-8, as opposite to relying on `mb_internal_encoding` function call (#9).
+
+
+## 1.0.1 - 2014-08-26
+
+- [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) compliant and automation on Travis-CI
+  - Thanks to [@nyamsprod](https://github.com/nyamsprod) for initial patch.
+- [Fix] Domain containing `x`, `n` or `-` would result in failures while decoding (#6).
+
+
+## 1.0.0 - 2014-03-10
+
+- Initial release

+ 19 - 0
api/vendor/true/punycode/LICENSE

@@ -0,0 +1,19 @@
+Copyright (c) 2014 TrueServer B.V.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 45 - 0
api/vendor/true/punycode/README.md

@@ -0,0 +1,45 @@
+# Punycode
+
+[![Build Status](https://secure.travis-ci.org/true/php-punycode.png?branch=master)](http://travis-ci.org/true/php-punycode)
+[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/true/php-punycode/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/true/php-punycode/?branch=master)
+[![Code Coverage](https://scrutinizer-ci.com/g/true/php-punycode/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/true/php-punycode/?branch=master)
+[![Latest Stable Version](https://poser.pugx.org/true/punycode/version.png)](https://packagist.org/packages/true/punycode)
+
+A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA).
+
+
+## Install
+
+```
+composer require true/punycode:~2.0
+```
+
+
+## Usage
+
+```php
+<?php
+
+// Import Punycode
+use TrueBV\Punycode;
+
+$Punycode = new Punycode();
+var_dump($Punycode->encode('renangonçalves.com'));
+// outputs: xn--renangonalves-pgb.com
+
+var_dump($Punycode->decode('xn--renangonalves-pgb.com'));
+// outputs: renangonçalves.com
+```
+
+
+## FAQ
+
+### 1. What is this library for?
+
+This library converts a Unicode encoded domain name to a IDNA ASCII form and vice-versa.
+
+
+### 2. Why should I use this instead of [PHP's IDN Functions](http://php.net/manual/en/ref.intl.idn.php)?
+
+If you can compile the needed dependencies (intl, libidn) there is not much difference.
+But if you want to write portable code between hosts (including Windows and Mac OS), or can't install PECL extensions, this is the right library for you.

+ 26 - 0
api/vendor/true/punycode/composer.json

@@ -0,0 +1,26 @@
+{
+	"name": "true/punycode",
+	"description": "A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)",
+	"keywords": ["IDNA", "punycode"],
+	"homepage": "https://github.com/true/php-punycode",
+	"license": "MIT",
+	"authors": [
+		{
+			"name": "Renan Gonçalves",
+			"email": "renan.saddam@gmail.com"
+		}
+	],
+	"autoload": {
+		"psr-4": {
+			"TrueBV\\": "src/"
+		}
+	},
+	"require": {
+		"symfony/polyfill-mbstring": "^1.3",
+		"php": ">=5.3.0"
+	},
+	"require-dev": {
+		"phpunit/phpunit": "~4.7",
+		"squizlabs/php_codesniffer": "~2.0"
+	}
+}

+ 13 - 0
api/vendor/true/punycode/src/Exception/DomainOutOfBoundsException.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace TrueBV\Exception;
+
+/**
+ * Class DomainOutOfBoundsException
+ * @package TrueBV\Exception
+ * @author  Sebastian Kroczek <sk@xbug.de>
+ */
+class DomainOutOfBoundsException extends OutOfBoundsException
+{
+
+}

+ 13 - 0
api/vendor/true/punycode/src/Exception/LabelOutOfBoundsException.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace TrueBV\Exception;
+
+/**
+ * Class LabelOutOfBoundsException
+ * @package TrueBV\Exception
+ * @author  Sebastian Kroczek <sk@xbug.de>
+ */
+class LabelOutOfBoundsException extends OutOfBoundsException
+{
+
+}

+ 13 - 0
api/vendor/true/punycode/src/Exception/OutOfBoundsException.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace TrueBV\Exception;
+
+/**
+ * Class OutOfBoundsException
+ * @package TrueBV\Exception
+ * @author  Sebastian Kroczek <sk@xbug.de>
+ */
+class OutOfBoundsException extends \RuntimeException
+{
+
+}

+ 360 - 0
api/vendor/true/punycode/src/Punycode.php

@@ -0,0 +1,360 @@
+<?php
+namespace TrueBV;
+
+use TrueBV\Exception\DomainOutOfBoundsException;
+use TrueBV\Exception\LabelOutOfBoundsException;
+
+/**
+ * Punycode implementation as described in RFC 3492
+ *
+ * @link http://tools.ietf.org/html/rfc3492
+ */
+class Punycode
+{
+
+    /**
+     * Bootstring parameter values
+     *
+     */
+    const BASE         = 36;
+    const TMIN         = 1;
+    const TMAX         = 26;
+    const SKEW         = 38;
+    const DAMP         = 700;
+    const INITIAL_BIAS = 72;
+    const INITIAL_N    = 128;
+    const PREFIX       = 'xn--';
+    const DELIMITER    = '-';
+
+    /**
+     * Encode table
+     *
+     * @param array
+     */
+    protected static $encodeTable = array(
+        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
+        'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
+        'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+    );
+
+    /**
+     * Decode table
+     *
+     * @param array
+     */
+    protected static $decodeTable = array(
+        'a' =>  0, 'b' =>  1, 'c' =>  2, 'd' =>  3, 'e' =>  4, 'f' =>  5,
+        'g' =>  6, 'h' =>  7, 'i' =>  8, 'j' =>  9, 'k' => 10, 'l' => 11,
+        'm' => 12, 'n' => 13, 'o' => 14, 'p' => 15, 'q' => 16, 'r' => 17,
+        's' => 18, 't' => 19, 'u' => 20, 'v' => 21, 'w' => 22, 'x' => 23,
+        'y' => 24, 'z' => 25, '0' => 26, '1' => 27, '2' => 28, '3' => 29,
+        '4' => 30, '5' => 31, '6' => 32, '7' => 33, '8' => 34, '9' => 35
+    );
+
+    /**
+     * Character encoding
+     *
+     * @param string
+     */
+    protected $encoding;
+
+    /**
+     * Constructor
+     *
+     * @param string $encoding Character encoding
+     */
+    public function __construct($encoding = 'UTF-8')
+    {
+        $this->encoding = $encoding;
+    }
+
+    /**
+     * Encode a domain to its Punycode version
+     *
+     * @param string $input Domain name in Unicode to be encoded
+     * @return string Punycode representation in ASCII
+     */
+    public function encode($input)
+    {
+        $input = mb_strtolower($input, $this->encoding);
+        $parts = explode('.', $input);
+        foreach ($parts as &$part) {
+            $length = strlen($part);
+            if ($length < 1) {
+                throw new LabelOutOfBoundsException(sprintf('The length of any one label is limited to between 1 and 63 octets, but %s given.', $length));
+            }
+            $part = $this->encodePart($part);
+        }
+        $output = implode('.', $parts);
+        $length = strlen($output);
+        if ($length > 255) {
+            throw new DomainOutOfBoundsException(sprintf('A full domain name is limited to 255 octets (including the separators), %s given.', $length));
+        }
+
+        return $output;
+    }
+
+    /**
+     * Encode a part of a domain name, such as tld, to its Punycode version
+     *
+     * @param string $input Part of a domain name
+     * @return string Punycode representation of a domain part
+     */
+    protected function encodePart($input)
+    {
+        $codePoints = $this->listCodePoints($input);
+
+        $n = static::INITIAL_N;
+        $bias = static::INITIAL_BIAS;
+        $delta = 0;
+        $h = $b = count($codePoints['basic']);
+
+        $output = '';
+        foreach ($codePoints['basic'] as $code) {
+            $output .= $this->codePointToChar($code);
+        }
+        if ($input === $output) {
+            return $output;
+        }
+        if ($b > 0) {
+            $output .= static::DELIMITER;
+        }
+
+        $codePoints['nonBasic'] = array_unique($codePoints['nonBasic']);
+        sort($codePoints['nonBasic']);
+
+        $i = 0;
+        $length = mb_strlen($input, $this->encoding);
+        while ($h < $length) {
+            $m = $codePoints['nonBasic'][$i++];
+            $delta = $delta + ($m - $n) * ($h + 1);
+            $n = $m;
+
+            foreach ($codePoints['all'] as $c) {
+                if ($c < $n || $c < static::INITIAL_N) {
+                    $delta++;
+                }
+                if ($c === $n) {
+                    $q = $delta;
+                    for ($k = static::BASE;; $k += static::BASE) {
+                        $t = $this->calculateThreshold($k, $bias);
+                        if ($q < $t) {
+                            break;
+                        }
+
+                        $code = $t + (($q - $t) % (static::BASE - $t));
+                        $output .= static::$encodeTable[$code];
+
+                        $q = ($q - $t) / (static::BASE - $t);
+                    }
+
+                    $output .= static::$encodeTable[$q];
+                    $bias = $this->adapt($delta, $h + 1, ($h === $b));
+                    $delta = 0;
+                    $h++;
+                }
+            }
+
+            $delta++;
+            $n++;
+        }
+        $out = static::PREFIX . $output;
+        $length = strlen($out);
+        if ($length > 63 || $length < 1) {
+            throw new LabelOutOfBoundsException(sprintf('The length of any one label is limited to between 1 and 63 octets, but %s given.', $length));
+        }
+
+        return $out;
+    }
+
+    /**
+     * Decode a Punycode domain name to its Unicode counterpart
+     *
+     * @param string $input Domain name in Punycode
+     * @return string Unicode domain name
+     */
+    public function decode($input)
+    {
+        $input = strtolower($input);
+        $parts = explode('.', $input);
+        foreach ($parts as &$part) {
+            $length = strlen($part);
+            if ($length > 63 || $length < 1) {
+                throw new LabelOutOfBoundsException(sprintf('The length of any one label is limited to between 1 and 63 octets, but %s given.', $length));
+            }
+            if (strpos($part, static::PREFIX) !== 0) {
+                continue;
+            }
+
+            $part = substr($part, strlen(static::PREFIX));
+            $part = $this->decodePart($part);
+        }
+        $output = implode('.', $parts);
+        $length = strlen($output);
+        if ($length > 255) {
+            throw new DomainOutOfBoundsException(sprintf('A full domain name is limited to 255 octets (including the separators), %s given.', $length));
+        }
+
+        return $output;
+    }
+
+    /**
+     * Decode a part of domain name, such as tld
+     *
+     * @param string $input Part of a domain name
+     * @return string Unicode domain part
+     */
+    protected function decodePart($input)
+    {
+        $n = static::INITIAL_N;
+        $i = 0;
+        $bias = static::INITIAL_BIAS;
+        $output = '';
+
+        $pos = strrpos($input, static::DELIMITER);
+        if ($pos !== false) {
+            $output = substr($input, 0, $pos++);
+        } else {
+            $pos = 0;
+        }
+
+        $outputLength = strlen($output);
+        $inputLength = strlen($input);
+        while ($pos < $inputLength) {
+            $oldi = $i;
+            $w = 1;
+
+            for ($k = static::BASE;; $k += static::BASE) {
+                $digit = static::$decodeTable[$input[$pos++]];
+                $i = $i + ($digit * $w);
+                $t = $this->calculateThreshold($k, $bias);
+
+                if ($digit < $t) {
+                    break;
+                }
+
+                $w = $w * (static::BASE - $t);
+            }
+
+            $bias = $this->adapt($i - $oldi, ++$outputLength, ($oldi === 0));
+            $n = $n + (int) ($i / $outputLength);
+            $i = $i % ($outputLength);
+            $output = mb_substr($output, 0, $i, $this->encoding) . $this->codePointToChar($n) . mb_substr($output, $i, $outputLength - 1, $this->encoding);
+
+            $i++;
+        }
+
+        return $output;
+    }
+
+    /**
+     * Calculate the bias threshold to fall between TMIN and TMAX
+     *
+     * @param integer $k
+     * @param integer $bias
+     * @return integer
+     */
+    protected function calculateThreshold($k, $bias)
+    {
+        if ($k <= $bias + static::TMIN) {
+            return static::TMIN;
+        } elseif ($k >= $bias + static::TMAX) {
+            return static::TMAX;
+        }
+        return $k - $bias;
+    }
+
+    /**
+     * Bias adaptation
+     *
+     * @param integer $delta
+     * @param integer $numPoints
+     * @param boolean $firstTime
+     * @return integer
+     */
+    protected function adapt($delta, $numPoints, $firstTime)
+    {
+        $delta = (int) (
+            ($firstTime)
+                ? $delta / static::DAMP
+                : $delta / 2
+            );
+        $delta += (int) ($delta / $numPoints);
+
+        $k = 0;
+        while ($delta > ((static::BASE - static::TMIN) * static::TMAX) / 2) {
+            $delta = (int) ($delta / (static::BASE - static::TMIN));
+            $k = $k + static::BASE;
+        }
+        $k = $k + (int) (((static::BASE - static::TMIN + 1) * $delta) / ($delta + static::SKEW));
+
+        return $k;
+    }
+
+    /**
+     * List code points for a given input
+     *
+     * @param string $input
+     * @return array Multi-dimension array with basic, non-basic and aggregated code points
+     */
+    protected function listCodePoints($input)
+    {
+        $codePoints = array(
+            'all'      => array(),
+            'basic'    => array(),
+            'nonBasic' => array(),
+        );
+
+        $length = mb_strlen($input, $this->encoding);
+        for ($i = 0; $i < $length; $i++) {
+            $char = mb_substr($input, $i, 1, $this->encoding);
+            $code = $this->charToCodePoint($char);
+            if ($code < 128) {
+                $codePoints['all'][] = $codePoints['basic'][] = $code;
+            } else {
+                $codePoints['all'][] = $codePoints['nonBasic'][] = $code;
+            }
+        }
+
+        return $codePoints;
+    }
+
+    /**
+     * Convert a single or multi-byte character to its code point
+     *
+     * @param string $char
+     * @return integer
+     */
+    protected function charToCodePoint($char)
+    {
+        $code = ord($char[0]);
+        if ($code < 128) {
+            return $code;
+        } elseif ($code < 224) {
+            return (($code - 192) * 64) + (ord($char[1]) - 128);
+        } elseif ($code < 240) {
+            return (($code - 224) * 4096) + ((ord($char[1]) - 128) * 64) + (ord($char[2]) - 128);
+        } else {
+            return (($code - 240) * 262144) + ((ord($char[1]) - 128) * 4096) + ((ord($char[2]) - 128) * 64) + (ord($char[3]) - 128);
+        }
+    }
+
+    /**
+     * Convert a code point to its single or multi-byte character
+     *
+     * @param integer $code
+     * @return string
+     */
+    protected function codePointToChar($code)
+    {
+        if ($code <= 0x7F) {
+            return chr($code);
+        } elseif ($code <= 0x7FF) {
+            return chr(($code >> 6) + 192) . chr(($code & 63) + 128);
+        } elseif ($code <= 0xFFFF) {
+            return chr(($code >> 12) + 224) . chr((($code >> 6) & 63) + 128) . chr(($code & 63) + 128);
+        } else {
+            return chr(($code >> 18) + 240) . chr((($code >> 12) & 63) + 128) . chr((($code >> 6) & 63) + 128) . chr(($code & 63) + 128);
+        }
+    }
+}

+ 3 - 0
js/custom.js

@@ -820,6 +820,7 @@ $(document).on("click", ".deleteTab", function () {
 $(document).on("click", ".editTabButton", function () {
     $('#edit-tab-form [name=tabName]').val($(this).parent().parent().attr("data-name"));
     $('#edit-tab-form [name=tabURL]').val($(this).parent().parent().attr("data-url"));
+    $('#edit-tab-form [name=tabLocalURL]').val($(this).parent().parent().attr("data-local-url"));
     $('#edit-tab-form [name=pingURL]').val($(this).parent().parent().attr("data-ping-url"));
     $('#edit-tab-form [name=tabImage]').val($(this).parent().parent().attr("data-image"));
     $('#edit-tab-form [name=id]').val($(this).parent().parent().attr("data-id"));
@@ -839,6 +840,7 @@ $(document).on("click", ".editTab", function () {
         tabName:$('#edit-tab-form [name=tabName]').val(),
         tabImage:$('#edit-tab-form [name=tabImage]').val(),
         tabURL:$('#edit-tab-form [name=tabURL]').val(),
+        tabLocalURL:$('#edit-tab-form [name=tabLocalURL]').val(),
         pingURL:$('#edit-tab-form [name=pingURL]').val(),
         messageTitle:'',
         messageBody:'Edited Tab '+$('#edit-tab-form [name=tabName]').val(),
@@ -874,6 +876,7 @@ $(document).on("click", ".addNewTab", function () {
         tabName:$('#new-tab-form [name=tabName]').val(),
         tabImage:$('#new-tab-form [name=tabImage]').val(),
         tabURL:$('#new-tab-form [name=tabURL]').val(),
+        tabLocalURL:$('#new-tab-form [name=tabLocalURL]').val(),
         pingURL:$('#new-tab-form [name=pingURL]').val(),
         tabGroupID:1,
         tabEnabled:0,

File diff ditekan karena terlalu besar
+ 0 - 0
js/custom.min.js


+ 4 - 4
js/functions.js

@@ -2104,7 +2104,7 @@ function tabProcess(arrayItems) {
                     defaultTabName = cleanClass(v.name);
                     defaultTabType = v.type;
                 }
-                var menuList = buildMenuList(v.name,v.url,v.type,v.image,v.ping_url);
+                var menuList = buildMenuList(v.name,v.access_url,v.type,v.image,v.ping_url);
                 if(v.category_id === 0){
                     if(activeInfo.settings.misc.unsortedTabs === 'top'){
                         $(menuList).prependTo($('#side-menu'));
@@ -2119,13 +2119,13 @@ function tabProcess(arrayItems) {
 					case 0:
 					case '0':
 					case 'internal':
-						internalList = buildInternalContainer(v.name,v.url,v.type);
+						internalList = buildInternalContainer(v.name,v.access_url,v.type);
 						$(internalList).appendTo($('.internal-listing'));
 						break;
 					case 1:
 					case '1':
 					case 'iframe':
-						iFrameList = buildFrameContainer(v.name,v.url,v.type);
+						iFrameList = buildFrameContainer(v.name,v.access_url,v.type);
 						$(iFrameList).appendTo($('.iFrame-listing'));
 						//Auto load tabs (soon)
                         /*
@@ -2408,7 +2408,7 @@ function buildTabEditorItem(array){
 		var buttonDisabled = v.url.indexOf('/settings/') > 0 ? 'disabled' : '';
         var typeDisabled = v.url.indexOf('/?v1/') > 0 ? 'disabled' : '';
 		tabList += `
-		<tr class="tabEditor" data-order="`+v.order+`" data-id="`+v.id+`" data-group-id="`+v.group_id+`" data-category-id="`+v.category_id+`" data-name="`+v.name+`" data-url="`+v.url+`" data-ping-url="`+v.ping_url+`" data-image="`+v.image+`">
+		<tr class="tabEditor" data-order="`+v.order+`" data-id="`+v.id+`" data-group-id="`+v.group_id+`" data-category-id="`+v.category_id+`" data-name="`+v.name+`" data-url="`+v.url+`" data-local-url="`+v.url_local+`" data-ping-url="`+v.ping_url+`" data-image="`+v.image+`">
 			<input type="hidden" class="form-control" name="tab[`+v.id+`].id" value="`+v.id+`">
 			<input type="hidden" class="form-control order" name="tab[`+v.id+`].order" value="`+v.order+`">
 			<input type="hidden" class="form-control" name="tab[`+v.id+`].originalOrder" value="`+v.order+`">

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini