Renamed 'E5Utilities' to 'EricUtilities' and 'E5Network' to 'EricNetwork'. eric7

Sat, 22 May 2021 16:52:45 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 22 May 2021 16:52:45 +0200
branch
eric7
changeset 8354
12ebd3934fef
parent 8353
799196d0b05d
child 8355
8a7677a63c8d

Renamed 'E5Utilities' to 'EricUtilities' and 'E5Network' to 'EricNetwork'.

eric7.epj file | annotate | diff | comparison | revisions
eric7/E5Network/E5Ftp.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5GoogleMail.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5GoogleMailHelpers.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5JsonClient.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5JsonServer.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5NetworkHeaderDetailsDialog.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5NetworkHeaderDetailsDialog.ui file | annotate | diff | comparison | revisions
eric7/E5Network/E5NetworkProxyFactory.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5RFC6266.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5SslCertificateSelectionDialog.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5SslCertificateSelectionDialog.ui file | annotate | diff | comparison | revisions
eric7/E5Network/E5SslCertificatesDialog.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5SslCertificatesDialog.ui file | annotate | diff | comparison | revisions
eric7/E5Network/E5SslCertificatesInfoDialog.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5SslCertificatesInfoDialog.ui file | annotate | diff | comparison | revisions
eric7/E5Network/E5SslCertificatesInfoWidget.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5SslCertificatesInfoWidget.ui file | annotate | diff | comparison | revisions
eric7/E5Network/E5SslErrorHandler.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5SslInfoWidget.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5SslUtilities.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5TldExtractor.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5UrlInfo.py file | annotate | diff | comparison | revisions
eric7/E5Network/E5XmlRpcClient.py file | annotate | diff | comparison | revisions
eric7/E5Network/__init__.py file | annotate | diff | comparison | revisions
eric7/E5Network/data/__init__.py file | annotate | diff | comparison | revisions
eric7/E5Network/data/effective_tld_names.dat file | annotate | diff | comparison | revisions
eric7/E5Network/data/test_psl.txt file | annotate | diff | comparison | revisions
eric7/E5Utilities/E5Cache.py file | annotate | diff | comparison | revisions
eric7/E5Utilities/E5MutexLocker.py file | annotate | diff | comparison | revisions
eric7/E5Utilities/__init__.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricFtp.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricGoogleMail.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricGoogleMailHelpers.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricJsonClient.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricJsonServer.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricNetworkProxyFactory.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricSslCertificateSelectionDialog.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricSslCertificateSelectionDialog.ui file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricSslCertificatesDialog.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricSslCertificatesDialog.ui file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricSslCertificatesInfoDialog.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricSslCertificatesInfoDialog.ui file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricSslCertificatesInfoWidget.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricSslCertificatesInfoWidget.ui file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricSslErrorHandler.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricSslInfoWidget.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricSslUtilities.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricTldExtractor.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/EricUrlInfo.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/__init__.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/data/__init__.py file | annotate | diff | comparison | revisions
eric7/EricNetwork/data/effective_tld_names.dat file | annotate | diff | comparison | revisions
eric7/EricNetwork/data/test_psl.txt file | annotate | diff | comparison | revisions
eric7/EricUtilities/EricCache.py file | annotate | diff | comparison | revisions
eric7/EricUtilities/EricMutexLocker.py file | annotate | diff | comparison | revisions
eric7/EricUtilities/__init__.py file | annotate | diff | comparison | revisions
eric7/Network/IRC/IrcWidget.py file | annotate | diff | comparison | revisions
eric7/PipInterface/Pip.py file | annotate | diff | comparison | revisions
eric7/PluginManager/PluginManager.py file | annotate | diff | comparison | revisions
eric7/PluginManager/PluginRepositoryDialog.py file | annotate | diff | comparison | revisions
eric7/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/IbmWatsonEngine.py file | annotate | diff | comparison | revisions
eric7/Plugins/UiExtensionPlugins/Translator/TranslatorRequest.py file | annotate | diff | comparison | revisions
eric7/Plugins/VcsPlugins/vcsPySvn/SvnBlameDialog.py file | annotate | diff | comparison | revisions
eric7/Plugins/VcsPlugins/vcsPySvn/SvnChangeListsDialog.py file | annotate | diff | comparison | revisions
eric7/Plugins/VcsPlugins/vcsPySvn/SvnDiffDialog.py file | annotate | diff | comparison | revisions
eric7/Plugins/VcsPlugins/vcsPySvn/SvnInfoDialog.py file | annotate | diff | comparison | revisions
eric7/Plugins/VcsPlugins/vcsPySvn/SvnLogBrowserDialog.py file | annotate | diff | comparison | revisions
eric7/Plugins/VcsPlugins/vcsPySvn/SvnPropListDialog.py file | annotate | diff | comparison | revisions
eric7/Plugins/VcsPlugins/vcsPySvn/SvnRepoBrowserDialog.py file | annotate | diff | comparison | revisions
eric7/Plugins/VcsPlugins/vcsPySvn/SvnStatusDialog.py file | annotate | diff | comparison | revisions
eric7/Plugins/VcsPlugins/vcsPySvn/SvnTagBranchListDialog.py file | annotate | diff | comparison | revisions
eric7/Plugins/VcsPlugins/vcsPySvn/subversion.py file | annotate | diff | comparison | revisions
eric7/Preferences/ConfigurationPages/EmailPage.py file | annotate | diff | comparison | revisions
eric7/Preferences/ConfigurationPages/NetworkPage.py file | annotate | diff | comparison | revisions
eric7/Preferences/__init__.py file | annotate | diff | comparison | revisions
eric7/QScintilla/Editor.py file | annotate | diff | comparison | revisions
eric7/UI/EmailDialog.py file | annotate | diff | comparison | revisions
eric7/UI/UserInterface.py file | annotate | diff | comparison | revisions
eric7/Utilities/FtpUtilities.py file | annotate | diff | comparison | revisions
eric7/WebBrowser/AdBlock/AdBlockManager.py file | annotate | diff | comparison | revisions
eric7/WebBrowser/Network/EricSchemeHandler.py file | annotate | diff | comparison | revisions
eric7/WebBrowser/Network/NetworkManager.py file | annotate | diff | comparison | revisions
eric7/WebBrowser/Network/NetworkUrlInterceptor.py file | annotate | diff | comparison | revisions
eric7/WebBrowser/Network/QtHelpSchemeHandler.py file | annotate | diff | comparison | revisions
eric7/WebBrowser/SiteInfo/SiteInfoDialog.ui file | annotate | diff | comparison | revisions
eric7/WebBrowser/Sync/FtpSyncHandler.py file | annotate | diff | comparison | revisions
eric7/WebBrowser/TabManager/TabManagerWidget.py file | annotate | diff | comparison | revisions
eric7/WebBrowser/WebBrowserPage.py file | annotate | diff | comparison | revisions
eric7/WebBrowser/WebBrowserView.py file | annotate | diff | comparison | revisions
eric7/WebBrowser/WebBrowserWindow.py file | annotate | diff | comparison | revisions
eric7/eric7.py file | annotate | diff | comparison | revisions
scripts/install.py file | annotate | diff | comparison | revisions
--- a/eric7.epj	Sat May 22 12:54:57 2021 +0200
+++ b/eric7.epj	Sat May 22 16:52:45 2021 +0200
@@ -2,7 +2,7 @@
   "header": {
     "comment": "eric project file for project eric7",
     "copyright": "Copyright (C) 2021 Detlev Offenbach, detlev@die-offenbachs.de",
-    "saved": "2021-05-22, 11:10:19"
+    "saved": "2021-05-22, 16:56:28"
   },
   "project": {
     "AUTHOR": "Detlev Offenbach",
@@ -294,11 +294,6 @@
       "eric7/E5Gui/E5StringListEditWidget.ui",
       "eric7/E5Gui/E5ToolBarDialog.ui",
       "eric7/E5Gui/E5ZoomWidget.ui",
-      "eric7/E5Network/E5NetworkHeaderDetailsDialog.ui",
-      "eric7/E5Network/E5SslCertificateSelectionDialog.ui",
-      "eric7/E5Network/E5SslCertificatesDialog.ui",
-      "eric7/E5Network/E5SslCertificatesInfoDialog.ui",
-      "eric7/E5Network/E5SslCertificatesInfoWidget.ui",
       "eric7/Graphics/UMLSceneSizeDialog.ui",
       "eric7/HexEdit/HexEditGotoWidget.ui",
       "eric7/HexEdit/HexEditReplaceWidget.ui",
@@ -710,7 +705,11 @@
       "eric7/WebBrowser/WebBrowserClearPrivateDataDialog.ui",
       "eric7/WebBrowser/WebBrowserLanguagesDialog.ui",
       "eric7/WebBrowser/ZoomManager/ZoomValuesDialog.ui",
-      "eric7/MicroPython/ConnectionSelectionDialog.ui"
+      "eric7/MicroPython/ConnectionSelectionDialog.ui",
+      "eric7/EricNetwork/EricSslCertificateSelectionDialog.ui",
+      "eric7/EricNetwork/EricSslCertificatesDialog.ui",
+      "eric7/EricNetwork/EricSslCertificatesInfoDialog.ui",
+      "eric7/EricNetwork/EricSslCertificatesInfoWidget.ui"
     ],
     "HASH": "df7daa8781250f7664e6ecaeaf1361fa2efd39ee",
     "IDLPARAMS": {
@@ -769,8 +768,6 @@
       "eric7/DesignerTemplates",
       "eric7/Documentation/Help",
       "eric7/Documentation/Source",
-      "eric7/E5Network/data/effective_tld_names.dat",
-      "eric7/E5Network/data/test_psl.txt",
       "eric7/IconEditor/cursors/aim-cursor.xpm",
       "eric7/IconEditor/cursors/colorpicker-cursor.xpm",
       "eric7/IconEditor/cursors/eraser-cursor.xpm",
@@ -931,7 +928,9 @@
       "eric7/DebugClients/Python/coverage/doc/CHANGES.rst",
       "eric7/DebugClients/Python/coverage/doc/LICENSE.txt",
       "eric7/DebugClients/Python/coverage/doc/CONTRIBUTORS.txt",
-      "eric7/DebugClients/Python/coverage/doc/README.rst"
+      "eric7/DebugClients/Python/coverage/doc/README.rst",
+      "eric7/EricNetwork/data/effective_tld_names.dat",
+      "eric7/EricNetwork/data/test_psl.txt"
     ],
     "OTHERTOOLSPARMS": {
       "CodeMetrics": {
@@ -1122,27 +1121,6 @@
       "eric7/E5Gui/E5TreeWidget.py",
       "eric7/E5Gui/E5ZoomWidget.py",
       "eric7/E5Gui/__init__.py",
-      "eric7/E5Network/E5Ftp.py",
-      "eric7/E5Network/E5GoogleMail.py",
-      "eric7/E5Network/E5GoogleMailHelpers.py",
-      "eric7/E5Network/E5NetworkHeaderDetailsDialog.py",
-      "eric7/E5Network/E5NetworkProxyFactory.py",
-      "eric7/E5Network/E5RFC6266.py",
-      "eric7/E5Network/E5SslCertificateSelectionDialog.py",
-      "eric7/E5Network/E5SslCertificatesDialog.py",
-      "eric7/E5Network/E5SslCertificatesInfoDialog.py",
-      "eric7/E5Network/E5SslCertificatesInfoWidget.py",
-      "eric7/E5Network/E5SslErrorHandler.py",
-      "eric7/E5Network/E5SslInfoWidget.py",
-      "eric7/E5Network/E5SslUtilities.py",
-      "eric7/E5Network/E5TldExtractor.py",
-      "eric7/E5Network/E5UrlInfo.py",
-      "eric7/E5Network/E5XmlRpcClient.py",
-      "eric7/E5Network/__init__.py",
-      "eric7/E5Network/data/__init__.py",
-      "eric7/E5Utilities/E5Cache.py",
-      "eric7/E5Utilities/E5MutexLocker.py",
-      "eric7/E5Utilities/__init__.py",
       "eric7/Globals/AppInfo.py",
       "eric7/Globals/__init__.py",
       "eric7/Graphics/ApplicationDiagramBuilder.py",
@@ -2207,8 +2185,6 @@
       "eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsFunctionVisitor.py",
       "eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsEnums.py",
       "eric7/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsCheckerDefaults.py",
-      "eric7/E5Network/E5JsonClient.py",
-      "eric7/E5Network/E5JsonServer.py",
       "eric7/eric7_api.py",
       "eric7/eric7_browser.py",
       "eric7/eric7_browser.pyw",
@@ -2268,7 +2244,27 @@
       "eric7/EricXML/TemplatesReader.py",
       "eric7/EricXML/UserProjectReader.py",
       "eric7/EricXML/XMLStreamReaderBase.py",
-      "eric7/EricXML/__init__.py"
+      "eric7/EricXML/__init__.py",
+      "eric7/EricUtilities/__init__.py",
+      "eric7/EricUtilities/EricMutexLocker.py",
+      "eric7/EricUtilities/EricCache.py",
+      "eric7/EricNetwork/__init__.py",
+      "eric7/EricNetwork/data/__init__.py",
+      "eric7/EricNetwork/EricFtp.py",
+      "eric7/EricNetwork/EricGoogleMail.py",
+      "eric7/EricNetwork/EricGoogleMailHelpers.py",
+      "eric7/EricNetwork/EricJsonClient.py",
+      "eric7/EricNetwork/EricJsonServer.py",
+      "eric7/EricNetwork/EricNetworkProxyFactory.py",
+      "eric7/EricNetwork/EricSslCertificateSelectionDialog.py",
+      "eric7/EricNetwork/EricSslCertificatesDialog.py",
+      "eric7/EricNetwork/EricSslCertificatesInfoDialog.py",
+      "eric7/EricNetwork/EricSslCertificatesInfoWidget.py",
+      "eric7/EricNetwork/EricSslErrorHandler.py",
+      "eric7/EricNetwork/EricSslInfoWidget.py",
+      "eric7/EricNetwork/EricSslUtilities.py",
+      "eric7/EricNetwork/EricTldExtractor.py",
+      "eric7/EricNetwork/EricUrlInfo.py"
     ],
     "SPELLEXCLUDES": "Dictionaries/excludes.dic",
     "SPELLLANGUAGE": "en_US",
--- a/eric7/E5Network/E5Ftp.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,369 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2012 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing an extension to the Python FTP class to support FTP
-proxies.
-"""
-
-import enum
-import ftplib           # secok
-from socket import _GLOBAL_DEFAULT_TIMEOUT
-
-
-class E5FtpProxyError(ftplib.Error):
-    """
-    Class to signal an error related to proxy configuration.
-    
-    The error message starts with a three digit error code followed by a
-    space and the error string. Supported error codes are:
-    <ul>
-      <li>910: proxy error; the second number gives the category of the proxy
-          error. The original response from the proxy is appended in the next
-          line.</li>
-      <li>930: proxy error; the second number gives the category of the proxy
-          error. The original response from the proxy is appended in the next
-          line.</li>
-      <li>940: proxy error; the second number gives the category of the proxy
-          error. The original response from the proxy is appended in the next
-          line.</li>
-      <li>950: proxy error; the second number gives the category of the proxy
-          error. The original response from the proxy is appended in the next
-          line.</li>
-      <li>990: proxy usage is enabled but no proxy host given</li>
-      <li>991: proxy usage is enabled but no proxy user given</li>
-      <li>992: proxy usage is enabled but no proxy password given</li>
-    </ul>
-    """
-    pass
-
-
-class E5FtpProxyType(enum.Enum):
-    """
-    Class defining the supported FTP proxy types.
-    """
-    NO_PROXY = 0                    # no proxy
-    NON_AUTHORIZING = 1             # non authorizing proxy
-    USER_SERVER = 2                 # proxy login first, than user@remote.host
-    SITE = 3                        # proxy login first, than use SITE command
-    OPEN = 4                        # proxy login first, than use OPEN command
-    USER_PROXYUSER_SERVER = 5       # one login for both
-    PROXYUSER_SERVER = 6
-    # proxy login with remote host given, than normal remote login
-    AUTH_RESP = 7  # authenticate to proxy with AUTH and RESP commands
-    BLUECOAT = 8                    # bluecoat proxy
-
-
-class E5Ftp(ftplib.FTP):
-    """
-    Class implementing an extension to the Python FTP class to support FTP
-    proxies.
-    """
-    def __init__(self, host="", user="", password="", acct="",          # secok
-                 proxyType=E5FtpProxyType.NO_PROXY, proxyHost="",
-                 proxyPort=ftplib.FTP_PORT, proxyUser="", proxyPassword="",
-                 proxyAccount="", timeout=_GLOBAL_DEFAULT_TIMEOUT):
-        """
-        Constructor
-        
-        @param host name of the FTP host
-        @type str
-        @param user user name for login to FTP host
-        @type str
-        @param password password for login to FTP host
-        @type str
-        @param acct account for login to FTP host
-        @type str
-        @param proxyType type of the FTP proxy
-        @type E5FtpProxyType
-        @param proxyHost name of the FTP proxy
-        @type str
-        @param proxyPort port of the FTP proxy
-        @type int
-        @param proxyUser user name for login to the proxy
-        @type str
-        @param proxyPassword password for login to the proxy
-        @type str
-        @param proxyAccount accounting info for the proxy
-        @type str
-        @param timeout timeout in seconds for blocking operations
-        @type int
-        """
-        super().__init__()
-        
-        self.__timeout = timeout
-        
-        self.__proxyType = proxyType
-        self.__proxyHost = proxyHost
-        self.__proxyPort = proxyPort
-        self.__proxyUser = proxyUser
-        self.__proxyPassword = proxyPassword
-        self.__proxyAccount = proxyAccount
-        
-        self.__host = host
-        self.__port = ftplib.FTP_PORT
-        self.__user = user
-        self.__password = password
-        self.__acct = acct
-        
-        if host:
-            self.connect(host)
-            if user:
-                self.login(user, password, acct)
-    
-    def setProxy(self, proxyType=E5FtpProxyType.NO_PROXY, proxyHost="",
-                 proxyPort=ftplib.FTP_PORT, proxyUser="", proxyPassword="",
-                 proxyAccount=""):
-        """
-        Public method to set the proxy configuration.
-        
-        @param proxyType type of the FTP proxy
-        @type E5FtpProxyType
-        @param proxyHost name of the FTP proxy
-        @type str
-        @param proxyPort port of the FTP proxy
-        @type int
-        @param proxyUser user name for login to the proxy
-        @type str
-        @param proxyPassword password  for login to the proxy
-        @type str
-        @param proxyAccount accounting info for the proxy
-        @type str
-        """
-        self.__proxyType = proxyType
-        self.__proxyHost = proxyHost
-        self.__proxyPort = proxyPort
-        self.__proxyUser = proxyUser
-        self.__proxyPassword = proxyPassword
-        self.__proxyAccount = proxyAccount
-    
-    def setProxyAuthentication(self, proxyUser="", proxyPassword="",
-                               proxyAccount=""):
-        """
-        Public method to set the proxy authentication info.
-        
-        @param proxyUser user name for login to the proxy
-        @type str
-        @param proxyPassword password  for login to the proxy
-        @type str
-        @param proxyAccount accounting info for the proxy
-        @type str
-        """
-        self.__proxyUser = proxyUser
-        self.__proxyPassword = proxyPassword
-        self.__proxyAccount = proxyAccount
-    
-    def connect(self, host="", port=0, timeout=-999):
-        """
-        Public method to connect to the given FTP server.
-        
-        This extended method connects to the proxy instead of the given host,
-        if a proxy is to be used. It throws an exception, if the proxy data
-        is incomplete.
-        
-        @param host name of the FTP host
-        @type str
-        @param port port of the FTP host
-        @type int
-        @param timeout timeout in seconds for blocking operations
-        @type int
-        @return welcome message of the server
-        @rtype str
-        @exception E5FtpProxyError raised to indicate a proxy related issue
-        """
-        if host:
-            self.__host = host
-        if port:
-            self.__port = port
-        if timeout != -999:
-            self.__timeout = timeout
-        
-        if self.__proxyType != E5FtpProxyType.NO_PROXY:
-            if not self.__proxyHost:
-                raise E5FtpProxyError(
-                    "990 Proxy usage requested, but no proxy host given.")
-            
-            return super().connect(
-                self.__proxyHost, self.__proxyPort, self.__timeout)
-        else:
-            return super().connect(
-                self.__host, self.__port, self.__timeout)
-    
-    def login(self, user="", password="", acct=""):         # secok
-        """
-        Public method to login to the FTP server.
-        
-        This extended method respects the FTP proxy configuration. There are
-        many different FTP proxy products available. But unfortunately there
-        is no standard for how o traverse a FTP proxy. The lis below shows
-        the sequence of commands used.
-        
-        <table>
-          <tr><td>user</td><td>Username for remote host</td></tr>
-          <tr><td>pass</td><td>Password for remote host</td></tr>
-          <tr><td>pruser</td><td>Username for FTP proxy</td></tr>
-          <tr><td>prpass</td><td>Password for FTP proxy</td></tr>
-          <tr><td>remote.host</td><td>Hostname of the remote FTP server</td>
-          </tr>
-        </table>
-        
-        <dl>
-          <dt>E5FtpProxyType.NO_PROXY:</dt>
-          <dd>
-            USER user<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.NON_AUTHORIZING:</dt>
-          <dd>
-            USER user@remote.host<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.USER_SERVER:</dt>
-          <dd>
-            USER pruser<br/>
-            PASS prpass<br/>
-            USER user@remote.host<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.SITE:</dt>
-          <dd>
-            USER pruser<br/>
-            PASS prpass<br/>
-            SITE remote.site<br/>
-            USER user<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.OPEN:</dt>
-          <dd>
-            USER pruser<br/>
-            PASS prpass<br/>
-            OPEN remote.site<br/>
-            USER user<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.USER_PROXYUSER_SERVER:</dt>
-          <dd>
-            USER user@pruser@remote.host<br/>
-            PASS pass@prpass
-          </dd>
-          <dt>E5FtpProxyType.PROXYUSER_SERVER:</dt>
-          <dd>
-            USER pruser@remote.host<br/>
-            PASS prpass<br/>
-            USER user<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.AUTH_RESP:</dt>
-          <dd>
-            USER user@remote.host<br/>
-            PASS pass<br/>
-            AUTH pruser<br/>
-            RESP prpass
-          </dd>
-          <dt>E5FtpProxyType.BLUECOAT:</dt>
-          <dd>
-            USER user@remote.host pruser<br/>
-            PASS pass<br/>
-            ACCT prpass
-          </dd>
-        </dl>
-        
-        @param user username for the remote host
-        @type str
-        @param password password for the remote host
-        @type str
-        @param acct accounting information for the remote host
-        @type str
-        @return response sent by the remote host
-        @rtype str
-        @exception E5FtpProxyError raised to indicate a proxy related issue
-        @exception ftplib.error_reply raised to indicate an FTP error reply
-        """
-        if not user:
-            user = "anonymous"
-        if not password:
-            # make sure it is a string
-            password = ""           # secok
-        if not acct:
-            # make sure it is a string
-            acct = ""
-        if user == "anonymous" and password in {'', '-'}:
-            password += "anonymous@"
-        
-        if self.__proxyType != E5FtpProxyType.NO_PROXY:
-            if self.__proxyType != E5FtpProxyType.NON_AUTHORIZING:
-                # check, if a valid proxy configuration is known
-                if not self.__proxyUser:
-                    raise E5FtpProxyError(
-                        "991 Proxy usage requested, but no proxy user given")
-                if not self.__proxyPassword:
-                    raise E5FtpProxyError(
-                        "992 Proxy usage requested, but no proxy password"
-                        " given")
-            
-            if self.__proxyType in [E5FtpProxyType.NON_AUTHORIZING,
-                                    E5FtpProxyType.AUTH_RESP,
-                                    E5FtpProxyType.BLUECOAT]:
-                user += "@" + self.__host
-                if self.__proxyType == E5FtpProxyType.BLUECOAT:
-                    user += " " + self.__proxyUser
-                    acct = self.__proxyPassword
-            elif self.__proxyType == E5FtpProxyType.USER_PROXYUSER_SERVER:
-                user = "{0}@{1}@{2}".format(
-                    user, self.__proxyUser, self.__host)
-                password = "{0}@{1}".format(password, self.__proxyPassword)
-            else:
-                pruser = self.__proxyUser
-                if self.__proxyType == E5FtpProxyType.USER_SERVER:
-                    user += "@" + self.__host
-                elif self.__proxyType == E5FtpProxyType.PROXYUSER_SERVER:
-                    pruser += "@" + self.__host
-                
-                # authenticate to the proxy first
-                presp = self.sendcmd("USER " + pruser)
-                if presp[0] == "3":
-                    presp = self.sendcmd("PASS " + self.__proxyPassword)
-                if presp[0] == "3" and self.__proxyAccount:
-                    presp = self.sendcmd("ACCT " + self.__proxyAccount)
-                if presp[0] != "2":
-                    raise E5FtpProxyError(
-                        "9{0}0 Error authorizing at proxy\n{1}".format(
-                            presp[0], presp))
-                
-                if self.__proxyType == E5FtpProxyType.SITE:
-                    # send SITE command
-                    presp = self.sendcmd("SITE " + self.__host)
-                    if presp[0] != "2":
-                        raise E5FtpProxyError(
-                            "9{0}0 Error sending SITE command\n{1}".format(
-                                presp[0], presp))
-                elif self.__proxyType == E5FtpProxyType.OPEN:
-                    # send OPEN command
-                    presp = self.sendcmd("OPEN " + self.__host)
-                    if presp[0] != "2":
-                        raise E5FtpProxyError(
-                            "9{0}0 Error sending OPEN command\n{1}".format(
-                                presp[0], presp))
-        
-        # authenticate to the remote host or combined to proxy and remote host
-        resp = self.sendcmd("USER " + user)
-        if resp[0] == "3":
-            resp = self.sendcmd("PASS " + password)
-        if resp[0] == "3":
-            resp = self.sendcmd("ACCT " + acct)
-        if resp[0] != "2":
-            raise ftplib.error_reply(resp)          # secok
-        
-        if self.__proxyType == E5FtpProxyType.AUTH_RESP:
-            # authorize to the FTP proxy
-            presp = self.sendcmd("AUTH " + self.__proxyUser)
-            if presp[0] == "3":
-                presp = self.sendcmd("RESP " + self.__proxyPassword)
-            if presp[0] != "2":
-                raise E5FtpProxyError(
-                    "9{0}0 Error authorizing at proxy\n{1}".format(
-                        presp[0], presp))
-        
-        return resp
--- a/eric7/E5Network/E5GoogleMail.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,359 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2017 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a dialog to send bug reports.
-"""
-
-import os
-import base64
-import json
-import datetime
-import contextlib
-
-from googleapiclient import discovery
-from google.oauth2.credentials import Credentials
-from requests_oauthlib import OAuth2Session
-
-from PyQt6.QtCore import pyqtSlot, pyqtSignal, QObject, QUrl, QUrlQuery
-from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout
-
-from E5Gui.E5TextInputDialog import E5TextInputDialog
-
-import Globals
-
-from .E5GoogleMailHelpers import (
-    CLIENT_SECRET_FILE, SCOPES, TOKEN_FILE, APPLICATION_NAME
-)
-
-
-class E5GoogleMailAuthBrowser(QDialog):
-    """
-    Class implementing a simple web browser to perform the OAuth2
-    authentication process.
-    
-    @signal approvalCodeReceived(str) emitted to indicate the receipt of the
-        approval code
-    """
-    approvalCodeReceived = pyqtSignal(str)
-    
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        super().__init__(parent)
-        
-        self.__layout = QVBoxLayout(self)
-        
-        from PyQt6.QtWebEngineWidgets import QWebEngineView
-        self.__browser = QWebEngineView(self)
-        self.__browser.titleChanged.connect(self.__titleChanged)
-        self.__browser.loadFinished.connect(self.__pageLoadFinished)
-        self.__layout.addWidget(self.__browser)
-        
-        self.__buttonBox = QDialogButtonBox(
-            QDialogButtonBox.StandardButton.Close)
-        self.__buttonBox.rejected.connect(self.reject)
-        self.__layout.addWidget(self.__buttonBox)
-        
-        self.resize(600, 700)
-    
-    @pyqtSlot(str)
-    def __titleChanged(self, title):
-        """
-        Private slot handling changes of the web page title.
-        
-        @param title web page title
-        @type str
-        """
-        self.setWindowTitle(title)
-    
-    @pyqtSlot()
-    def __pageLoadFinished(self):
-        """
-        Private slot handling the loadFinished signal.
-        """
-        url = self.__browser.url()
-        if url.toString().startswith(
-                "https://accounts.google.com/o/oauth2/approval/v2"):
-            urlQuery = QUrlQuery(url)
-            approvalCode = urlQuery.queryItemValue(
-                "approvalCode", QUrl.ComponentFormattingOption.FullyDecoded)
-            if approvalCode:
-                self.approvalCodeReceived.emit(approvalCode)
-                self.close()
-    
-    def load(self, url):
-        """
-        Public method to start the authorization flow by loading the given URL.
-        
-        @param url URL to be laoded
-        @type str or QUrl
-        """
-        self.__browser.setUrl(QUrl(url))
-
-
-class E5GoogleMail(QObject):
-    """
-    Class implementing the logic to send emails via Google Mail.
-    
-    @signal sendResult(bool, str) emitted to indicate the transmission result
-        and a result message
-    """
-    sendResult = pyqtSignal(bool, str)
-    
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent object
-        @type QObject
-        """
-        super().__init__(parent=parent)
-        
-        self.__messages = []
-        
-        self.__session = None
-        self.__clientConfig = {}
-        
-        self.__browser = None
-    
-    def sendMessage(self, message):
-        """
-        Public method to send a message via Google Mail.
-        
-        @param message email message to be sent
-        @type email.mime.text.MIMEBase
-        """
-        self.__messages.append(message)
-        
-        if not self.__session:
-            self.__startSession()
-        else:
-            self.__doSendMessages()
-    
-    def __prepareMessage(self, message):
-        """
-        Private method to prepare the message for sending.
-        
-        @param message message to be prepared
-        @type email.mime.text.MIMEBase
-        @return prepared message dictionary
-        @rtype dict
-        """
-        messageAsBase64 = base64.urlsafe_b64encode(message.as_bytes())
-        raw = messageAsBase64.decode()
-        return {'raw': raw}
-    
-    def __startSession(self):
-        """
-        Private method to start an authorized session and optionally start the
-        authorization flow.
-        """
-        # check for availability of secrets file
-        if not os.path.exists(os.path.join(Globals.getConfigDir(),
-                                           CLIENT_SECRET_FILE)):
-            self.sendResult.emit(
-                False,
-                self.tr("The client secrets file is not present. Has the Gmail"
-                        " API been enabled?")
-            )
-            return
-        
-        with open(os.path.join(Globals.getConfigDir(), CLIENT_SECRET_FILE),
-                  "r") as clientSecret:
-            clientData = json.load(clientSecret)
-            self.__clientConfig = clientData['installed']
-        token = self.__loadToken()
-        if token is None:
-            # no valid OAuth2 token available
-            self.__session = OAuth2Session(
-                self.__clientConfig['client_id'],
-                scope=SCOPES,
-                redirect_uri=self.__clientConfig['redirect_uris'][0]
-            )
-            authorizationUrl, _ = self.__session.authorization_url(
-                self.__clientConfig['auth_uri'],
-                access_type="offline",
-                prompt="select_account"
-            )
-            if self.__browser is None:
-                with contextlib.suppress(ImportError):
-                    self.__browser = E5GoogleMailAuthBrowser()
-                    self.__browser.approvalCodeReceived.connect(
-                        self.__processAuthorization)
-            if self.__browser:
-                self.__browser.show()
-                self.__browser.load(QUrl(authorizationUrl))
-            else:
-                from PyQt6.QtGui import QDesktopServices
-                QDesktopServices.openUrl(QUrl(authorizationUrl))
-                ok, authCode = E5TextInputDialog.getText(
-                    None,
-                    self.tr("OAuth2 Authorization Code"),
-                    self.tr("Enter the OAuth2 authorization code:"))
-                if ok and authCode:
-                    self.__processAuthorization(authCode)
-                else:
-                    self.__session = None
-        else:
-            self.__session = OAuth2Session(
-                self.__clientConfig['client_id'],
-                scope=SCOPES,
-                redirect_uri=self.__clientConfig['redirect_uris'][0],
-                token=token,
-                auto_refresh_kwargs={
-                    'client_id': self.__clientConfig['client_id'],
-                    'client_secret': self.__clientConfig['client_secret'],
-                },
-                auto_refresh_url=self.__clientConfig['token_uri'],
-                token_updater=self.__saveToken)
-            self.__doSendMessages()
-    
-    @pyqtSlot(str)
-    def __processAuthorization(self, authCode):
-        """
-        Private slot to process the received authorization code.
-        
-        @param authCode received authorization code
-        @type str
-        """
-        self.__session.fetch_token(
-            self.__clientConfig['token_uri'],
-            client_secret=self.__clientConfig['client_secret'],
-            code=authCode)
-        self.__saveToken(self.__session.token)
-        
-        # authorization completed; now send all queued messages
-        self.__doSendMessages()
-    
-    def __doSendMessages(self):
-        """
-        Private method to send all queued messages.
-        """
-        if not self.__session:
-            self.sendResult.emit(
-                False,
-                self.tr("No authorized session available.")
-            )
-            return
-        
-        try:
-            results = []
-            credentials = self.__credentialsFromSession()
-            service = discovery.build('gmail', 'v1', credentials=credentials,
-                                      cache_discovery=False)
-            count = 0
-            while self.__messages:
-                count += 1
-                message = self.__messages.pop(0)
-                message1 = self.__prepareMessage(message)
-                service.users().messages().send(
-                    userId="me", body=message1).execute()
-                results.append(self.tr("Message #{0} sent.").format(count))
-
-            self.sendResult.emit(True, "\n\n".join(results))
-        except Exception as error:
-            self.sendResult.emit(False, str(error))
-    
-    def __loadToken(self):
-        """
-        Private method to load a token from the token file.
-        
-        @return loaded token
-        @rtype dict or None
-        """
-        homeDir = os.path.expanduser('~')
-        credentialsDir = os.path.join(homeDir, '.credentials')
-        if not os.path.exists(credentialsDir):
-            os.makedirs(credentialsDir)
-        tokenPath = os.path.join(credentialsDir, TOKEN_FILE)
-        
-        if os.path.exists(tokenPath):
-            with open(tokenPath, "r") as tokenFile:
-                return json.load(tokenFile)
-        else:
-            return None
-    
-    def __saveToken(self, token):
-        """
-        Private method to save a token to the token file.
-        
-        @param token token to be saved
-        @type dict
-        """
-        homeDir = os.path.expanduser('~')
-        credentialsDir = os.path.join(homeDir, '.credentials')
-        if not os.path.exists(credentialsDir):
-            os.makedirs(credentialsDir)
-        tokenPath = os.path.join(credentialsDir, TOKEN_FILE)
-        
-        with open(tokenPath, "w") as tokenFile:
-            json.dump(token, tokenFile)
-    
-    def __credentialsFromSession(self):
-        """
-        Private method to create a credentials object.
-        
-        @return created credentials object
-        @rtype google.oauth2.credentials.Credentials
-        """
-        credentials = None
-        
-        if self.__clientConfig and self.__session:
-            token = self.__session.token
-            if token:
-                credentials = Credentials(
-                    token['access_token'],
-                    refresh_token=token.get('refresh_token'),
-                    id_token=token.get('id_token'),
-                    token_uri=self.__clientConfig['token_uri'],
-                    client_id=self.__clientConfig['client_id'],
-                    client_secret=self.__clientConfig['client_secret'],
-                    scopes=SCOPES
-                )
-                credentials.expiry = datetime.datetime.fromtimestamp(
-                    token['expires_at'])
-        
-        return credentials
-
-
-def GoogleMailHelp():
-    """
-    Module function to get some help about how to enable the Google Mail
-    OAuth2 service.
-    
-    @return help text
-    @rtype str
-    """
-    return (
-        "<h2>Steps to turn on the Gmail API</h2>"
-        "<ol>"
-        "<li>Use <a href='{0}'>this wizard</a> to create or select a project"
-        " in the Google Developers Console and automatically turn on the API."
-        " Click <b>Continue</b>, then <b>Go to credentials</b>.</li>"
-        "<li>At the top of the page, select the <b>OAuth consent screen</b>"
-        " tab. Select an <b>Email address</b>, enter a <b>Product name</b> if"
-        " not already set, and click the <b>Save</b> button.</li>"
-        "<li>Select the <b>Credentials</b> tab, click the <b>Add credentials"
-        "</b> button and select <b>OAuth 2.0 client ID</b>.</li>"
-        "<li>Select the application type <b>Other</b>, enter the name &quot;"
-        "{1}&quot;, and click the <b>Create</b>"
-        " button.</li>"
-        "<li>Click <b>OK</b> to dismiss the resulting dialog.</li>"
-        "<li>Click the (Download JSON) button to the right of the client ID."
-        "</li>"
-        "<li>Move this file to the eric configuration directory"
-        " <code>{2}</code> and rename it <code>{3}</code>.</li>"
-        "</ol>".format(
-            "https://console.developers.google.com/start/api?id=gmail",
-            APPLICATION_NAME,
-            Globals.getConfigDir(),
-            CLIENT_SECRET_FILE
-        )
-    )
--- a/eric7/E5Network/E5GoogleMailHelpers.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2019 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing some helpers for Google mail.
-"""
-
-import os
-
-import Globals
-
-SCOPES = 'https://www.googleapis.com/auth/gmail.send'
-CLIENT_SECRET_FILE = 'eric_client_secret.json'          # secok
-TOKEN_FILE = 'eric_python_email_send_token.json'        # secok
-APPLICATION_NAME = 'Eric Python Send Email'
-
-RequiredPackages = (
-    "google-api-python-client",
-    "requests-oauthlib",
-)
-
-
-def isClientSecretFileAvailable():
-    """
-    Module function to check, if the client secret file has been installed.
-    
-    @return flag indicating, that the credentials file is there
-    @rtype bool
-    """
-    return os.path.exists(
-        os.path.join(Globals.getConfigDir(), CLIENT_SECRET_FILE))
-
-
-def getInstallCommand():
-    """
-    Module function to get the install command to get the Google mail support
-    activated.
-    
-    @return install command
-    @rtype str
-    """
-    pipCommand = "pip install --upgrade {0}".format(
-        " ".join(RequiredPackages))
-    
-    return pipCommand
--- a/eric7/E5Network/E5JsonClient.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,203 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2017 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing the JSON based client base class.
-"""
-
-import io
-import sys
-import socket
-import select
-import traceback
-import json
-import contextlib
-
-
-class E5JsonClient:
-    """
-    Class implementing a JSON based client base class.
-    """
-    def __init__(self, host, port, idString=""):
-        """
-        Constructor
-        
-        @param host ip address the background service is listening
-        @type str
-        @param port port of the background service
-        @type int
-        @param idString assigned client id to be sent back to the server in
-            order to identify the connection
-        @type str
-        """
-        self.__connection = socket.create_connection((host, port))
-        if idString:
-            reply = idString + '\n'
-            self.__connection.sendall(reply.encode('utf8', 'backslashreplace'))
-    
-    def sendJson(self, command, params):
-        """
-        Public method to send a single refactoring command to the server.
-        
-        @param command command name to be sent
-        @type str
-        @param params dictionary of named parameters for the command
-        @type dict
-        """
-        commandDict = {
-            "jsonrpc": "2.0",
-            "method": command,
-            "params": params,
-        }
-        cmd = json.dumps(commandDict) + '\n'
-        self.__connection.sendall(cmd.encode('utf8', 'backslashreplace'))
-    
-    def __receiveJson(self):
-        """
-        Private method to receive a JSON encode command and data from the
-        server.
-        
-        @return tuple containing the received command and a dictionary
-            containing the associated data
-        @rtype tuple of (str, dict)
-        """
-        # step 1: receive the data
-        # The JSON RPC string is prefixed by a 9 character long length field.
-        length = self.__connection.recv(9)
-        if len(length) < 9:
-            # invalid length string received
-            return None, None
-        
-        length = int(length)
-        data = b''
-        while len(data) < length:
-            newData = self.__connection.recv(length - len(data))
-            if not newData:
-                return None, None
-            
-            data += newData
-        
-        # step 2: decode and convert the data
-        line = data.decode(
-            'utf8', 'backslashreplace')
-        try:
-            commandDict = json.loads(line.strip())
-        except (TypeError, ValueError) as err:
-            self.sendJson("ClientException", {
-                "ExceptionType": "ProtocolError",
-                "ExceptionValue": str(err),
-                "ProtocolData": line.strip(),
-            })
-            return None, None
-        
-        method = commandDict["method"]
-        params = commandDict["params"]
-        
-        return method, params
-    
-    def handleCall(self, method, params):
-        """
-        Public method to handle a method call from the server.
-        
-        Note: This is an empty implementation that must be overridden in
-        derived classes.
-        
-        @param method requested method name
-        @type str
-        @param params dictionary with method specific parameters
-        @type dict
-        """
-        pass
-    
-    def run(self):
-        """
-        Public method implementing the main loop of the client.
-        """
-        try:
-            selectErrors = 0
-            while selectErrors <= 10:  # selected arbitrarily
-                try:
-                    rrdy, wrdy, xrdy = select.select(
-                        [self.__connection], [], [])
-                    
-                    # Just waiting for self.__connection. Therefor no check
-                    # needed.
-                    method, params = self.__receiveJson()
-                    if method is None:
-                        selectErrors += 1
-                    elif method == "Exit":
-                        break
-                    else:
-                        self.handleCall(method, params)
-                        
-                        # reset select errors
-                        selectErrors = 0
-                
-                except (select.error, KeyboardInterrupt, socket.error):
-                    selectErrors += 1
-        
-        except Exception:
-            exctype, excval, exctb = sys.exc_info()
-            tbinfofile = io.StringIO()
-            traceback.print_tb(exctb, None, tbinfofile)
-            tbinfofile.seek(0)
-            tbinfo = tbinfofile.read()
-            del exctb
-            self.sendJson("ClientException", {
-                "ExceptionType": str(exctype),
-                "ExceptionValue": str(excval),
-                "Traceback": tbinfo,
-            })
-
-        # Give time to process latest response on server side
-        with contextlib.suppress(socket.error, OSError):
-            self.__connection.shutdown(socket.SHUT_RDWR)
-            self.__connection.close()
-    
-    def poll(self, waitMethod=""):
-        """
-        Public method to check and receive one message (if available).
-        
-        @param waitMethod name of a method to wait for
-        @type str
-        @return dictionary containing the data of the waited for method
-        @rtype dict
-        """
-        try:
-            if waitMethod:
-                rrdy, wrdy, xrdy = select.select(
-                    [self.__connection], [], [])
-            else:
-                rrdy, wrdy, xrdy = select.select(
-                    [self.__connection], [], [], 0)
-            
-            if self.__connection in rrdy:
-                method, params = self.__receiveJson()
-                if method is not None:
-                    if method == "Exit":
-                        self.__exitClient = True
-                    elif method == waitMethod:
-                        return params
-                    else:
-                        self.handleCall(method, params)
-        
-        except (select.error, KeyboardInterrupt, socket.error):
-            # just ignore these
-            pass
-        
-        except Exception:
-            exctype, excval, exctb = sys.exc_info()
-            tbinfofile = io.StringIO()
-            traceback.print_tb(exctb, None, tbinfofile)
-            tbinfofile.seek(0)
-            tbinfo = tbinfofile.read()
-            del exctb
-            self.sendJson("ClientException", {
-                "ExceptionType": str(exctype),
-                "ExceptionValue": str(excval),
-                "Traceback": tbinfo,
-            })
-        
-        return None
--- a/eric7/E5Network/E5JsonServer.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,335 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2017 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing the JSON based server base class.
-"""
-
-import contextlib
-import json
-
-from PyQt6.QtCore import (
-    pyqtSlot, QProcess, QProcessEnvironment, QCoreApplication, QEventLoop,
-    QTimer
-)
-from PyQt6.QtNetwork import QTcpServer, QHostAddress
-
-from E5Gui import E5MessageBox
-
-import Preferences
-import Utilities
-
-
-class E5JsonServer(QTcpServer):
-    """
-    Class implementing a JSON based server base class.
-    """
-    def __init__(self, name="", multiplex=False, parent=None):
-        """
-        Constructor
-        
-        @param name name of the server (used for output only)
-        @type str
-        @param multiplex flag indicating a multiplexing server
-        @type bool
-        @param parent parent object
-        @type QObject
-        """
-        super().__init__(parent)
-        
-        self.__name = name
-        self.__multiplex = multiplex
-        if self.__multiplex:
-            self.__clientProcesses = {}
-            self.__connections = {}
-        else:
-            self.__clientProcess = None
-            self.__connection = None
-        
-        # setup the network interface
-        networkInterface = Preferences.getDebugger("NetworkInterface")
-        if networkInterface == "all" or '.' in networkInterface:
-            # IPv4
-            self.__hostAddress = '127.0.0.1'
-        else:
-            # IPv6
-            self.__hostAddress = '::1'
-        self.listen(QHostAddress(self.__hostAddress))
-
-        self.newConnection.connect(self.handleNewConnection)
-        
-        port = self.serverPort()
-        ## Note: Need the port if client is started external in debugger.
-        print('JSON server ({1}) listening on: {0:d}'   # __IGNORE_WARNING__
-              .format(port, self.__name))
-    
-    @pyqtSlot()
-    def handleNewConnection(self):
-        """
-        Public slot for new incoming connections from a client.
-        """
-        connection = self.nextPendingConnection()
-        if not connection.isValid():
-            return
-        
-        if self.__multiplex:
-            if not connection.waitForReadyRead(3000):
-                return
-            idString = bytes(connection.readLine()).decode(
-                "utf-8", 'backslashreplace').strip()
-            if idString in self.__connections:
-                self.__connections[idString].close()
-            self.__connections[idString] = connection
-        else:
-            idString = ""
-            if self.__connection is not None:
-                self.__connection.close()
-            
-            self.__connection = connection
-        
-        connection.readyRead.connect(
-            lambda: self.__receiveJson(idString))
-        connection.disconnected.connect(
-            lambda: self.__handleDisconnect(idString))
-    
-    @pyqtSlot()
-    def __handleDisconnect(self, idString):
-        """
-        Private slot handling a disconnect of the client.
-        
-        @param idString id of the connection been disconnected
-        @type str
-        """
-        if idString:
-            if idString in self.__connections:
-                self.__connections[idString].close()
-                del self.__connections[idString]
-        else:
-            if self.__connection is not None:
-                self.__connection.close()
-            
-            self.__connection = None
-    
-    def connectionNames(self):
-        """
-        Public method to get the list of active connection names.
-        
-        If this is not a multiplexing server, an empty list is returned.
-        
-        @return list of active connection names
-        @rtype list of str
-        """
-        if self.__multiplex:
-            return list(self.__connections.keys())
-        else:
-            return []
-    
-    @pyqtSlot()
-    def __receiveJson(self, idString):
-        """
-        Private slot handling received data from the client.
-        
-        @param idString id of the connection been disconnected
-        @type str
-        """
-        if idString:
-            try:
-                connection = self.__connections[idString]
-            except KeyError:
-                connection = None
-        else:
-            connection = self.__connection
-        
-        while connection and connection.canReadLine():
-            data = connection.readLine()
-            jsonLine = bytes(data).decode("utf-8", 'backslashreplace')
-            
-            #- print("JSON Server ({0}): {1}".format(self.__name, jsonLine))
-            #- this is for debugging only
-            
-            try:
-                clientDict = json.loads(jsonLine.strip())
-            except (TypeError, ValueError) as err:
-                E5MessageBox.critical(
-                    None,
-                    self.tr("JSON Protocol Error"),
-                    self.tr("""<p>The response received from the client"""
-                            """ could not be decoded. Please report"""
-                            """ this issue with the received data to the"""
-                            """ eric bugs email address.</p>"""
-                            """<p>Error: {0}</p>"""
-                            """<p>Data:<br/>{1}</p>""").format(
-                        str(err), Utilities.html_encode(jsonLine.strip())),
-                    E5MessageBox.Ok)
-                return
-            
-            self.handleCall(clientDict["method"], clientDict["params"])
-    
-    def sendJson(self, command, params, flush=False, idString=""):
-        """
-        Public method to send a single command to a client.
-        
-        @param command command name to be sent
-        @type str
-        @param params dictionary of named parameters for the command
-        @type dict
-        @param flush flag indicating to flush the data to the socket
-        @type bool
-        @param idString id of the connection to send data to
-        @type str
-        """
-        commandDict = {
-            "jsonrpc": "2.0",
-            "method": command,
-            "params": params,
-        }
-        cmd = json.dumps(commandDict) + '\n'
-        
-        if idString:
-            try:
-                connection = self.__connections[idString]
-            except KeyError:
-                connection = None
-        else:
-            connection = self.__connection
-        
-        if connection is not None:
-            data = cmd.encode('utf8', 'backslashreplace')
-            length = "{0:09d}".format(len(data))
-            connection.write(length.encode() + data)
-            if flush:
-                connection.flush()
-    
-    def startClient(self, interpreter, clientScript, clientArgs, idString="",
-                    environment=None):
-        """
-        Public method to start a client process.
-        
-        @param interpreter interpreter to be used for the client
-        @type str
-        @param clientScript path to the client script
-        @type str
-        @param clientArgs list of arguments for the client
-        @param idString id of the client to be started
-        @type str
-        @param environment dictionary of environment settings to pass
-        @type dict
-        @return flag indicating a successful client start and the exit code
-            in case of an issue
-        @rtype bool, int
-        """
-        if interpreter == "" or not Utilities.isinpath(interpreter):
-            return False
-        
-        exitCode = None
-        
-        proc = QProcess()
-        proc.setProcessChannelMode(
-            QProcess.ProcessChannelMode.ForwardedChannels)
-        if environment is not None:
-            env = QProcessEnvironment()
-            for key, value in list(environment.items()):
-                env.insert(key, value)
-            proc.setProcessEnvironment(env)
-        args = [clientScript, self.__hostAddress, str(self.serverPort())]
-        if idString:
-            args.append(idString)
-        args.extend(clientArgs)
-        proc.start(interpreter, args)
-        if not proc.waitForStarted(10000):
-            proc = None
-        
-        if idString:
-            self.__clientProcesses[idString] = proc
-            if proc:
-                timer = QTimer()
-                timer.setSingleShot(True)
-                timer.start(30000)           # 30s timeout
-                while (
-                    idString not in self.connectionNames() and
-                    timer.isActive()
-                ):
-                    # Give the event loop the chance to process the new
-                    # connection of the client (= slow start).
-                    QCoreApplication.processEvents(
-                        QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-                    
-                    # check if client exited prematurely
-                    if proc.state() == QProcess.ProcessState.NotRunning:
-                        exitCode = proc.exitCode()
-                        proc = None
-                        self.__clientProcesses[idString] = None
-                        break
-        else:
-            if proc:
-                timer = QTimer()
-                timer.setSingleShot(True)
-                timer.start(1000)           # 1s timeout
-                while timer.isActive():
-                    # check if client exited prematurely
-                    QCoreApplication.processEvents(
-                        QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-                    if proc.state() == QProcess.ProcessState.NotRunning:
-                        exitCode = proc.exitCode()
-                        proc = None
-                        break
-            self.__clientProcess = proc
-        
-        return proc is not None, exitCode
-    
-    def stopClient(self, idString=""):
-        """
-        Public method to stop a client process.
-        
-        @param idString id of the client to be stopped
-        @type str
-        """
-        self.sendJson("Exit", {}, flush=True, idString=idString)
-        
-        if idString:
-            try:
-                connection = self.__connections[idString]
-            except KeyError:
-                connection = None
-        else:
-            connection = self.__connection
-        if connection is not None:
-            connection.waitForDisconnected()
-        
-        if idString:
-            with contextlib.suppress(KeyError):
-                if self .__clientProcesses[idString] is not None:
-                    self .__clientProcesses[idString].close()
-                del self.__clientProcesses[idString]
-        else:
-            if self.__clientProcess is not None:
-                self.__clientProcess.close()
-                self.__clientProcess = None
-    
-    def stopAllClients(self):
-        """
-        Public method to stop all clients.
-        """
-        clientNames = self.connectionNames()[:]
-        for clientName in clientNames:
-            self.stopClient(clientName)
-    
-    #######################################################################
-    ## The following methods should be overridden by derived classes
-    #######################################################################
-    
-    def handleCall(self, method, params):
-        """
-        Public method to handle a method call from the client.
-        
-        Note: This is an empty implementation that must be overridden in
-        derived classes.
-        
-        @param method requested method name
-        @type str
-        @param params dictionary with method specific parameters
-        @type dict
-        """
-        pass
--- a/eric7/E5Network/E5NetworkHeaderDetailsDialog.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2009 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a dialog to show the data of a response or reply header.
-"""
-
-from PyQt6.QtCore import Qt
-from PyQt6.QtWidgets import QDialog
-
-from .Ui_E5NetworkHeaderDetailsDialog import Ui_E5NetworkHeaderDetailsDialog
-
-
-class E5NetworkHeaderDetailsDialog(QDialog, Ui_E5NetworkHeaderDetailsDialog):
-    """
-    Class implementing a dialog to show the data of a response or reply header.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent object (QWidget)
-        """
-        super().__init__(parent)
-        self.setupUi(self)
-        self.setWindowFlags(Qt.WindowType.Window)
-    
-    def setData(self, name, value):
-        """
-        Public method to set the data to display.
-        
-        @param name name of the header (string)
-        @param value value of the header (string)
-        """
-        self.nameEdit.setText(name)
-        self.valueEdit.setPlainText(value)
--- a/eric7/E5Network/E5NetworkHeaderDetailsDialog.ui	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>E5NetworkHeaderDetailsDialog</class>
- <widget class="QDialog" name="E5NetworkHeaderDetailsDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>500</width>
-    <height>350</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Header Details</string>
-  </property>
-  <property name="sizeGripEnabled">
-   <bool>true</bool>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Name:</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLineEdit" name="nameEdit">
-     <property name="readOnly">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QLabel" name="label_2">
-     <property name="text">
-      <string>Value:</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QPlainTextEdit" name="valueEdit">
-     <property name="tabChangesFocus">
-      <bool>true</bool>
-     </property>
-     <property name="readOnly">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Close</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>E5NetworkHeaderDetailsDialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>E5NetworkHeaderDetailsDialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
--- a/eric7/E5Network/E5NetworkProxyFactory.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,261 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2010 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a network proxy factory.
-"""
-
-import os
-import re
-
-from PyQt6.QtCore import QUrl, QCoreApplication
-from PyQt6.QtWidgets import QDialog
-from PyQt6.QtNetwork import (
-    QNetworkProxyFactory, QNetworkProxy, QNetworkProxyQuery
-)
-
-from E5Gui import E5MessageBox
-
-import Preferences
-import Globals
-import Utilities
-
-
-def schemeFromProxyType(proxyType):
-    """
-    Module function to determine the scheme name from the proxy type.
-    
-    @param proxyType type of the proxy (QNetworkProxy.ProxyType)
-    @return scheme (string, one of Http, Https, Ftp)
-    """
-    scheme = ""
-    if proxyType == QNetworkProxy.ProxyType.HttpProxy:
-        scheme = "Http"
-    elif proxyType == QNetworkProxy.ProxyType.HttpCachingProxy:
-        scheme = "Https"
-    elif proxyType == QNetworkProxy.ProxyType.FtpCachingProxy:
-        scheme = "Ftp"
-    elif proxyType == QNetworkProxy.ProxyType.NoProxy:
-        scheme = "NoProxy"
-    return scheme
-
-
-def proxyAuthenticationRequired(proxy, auth):
-    """
-    Module slot to handle a proxy authentication request.
-    
-    @param proxy reference to the proxy object (QNetworkProxy)
-    @param auth reference to the authenticator object (QAuthenticator)
-    """
-    info = QCoreApplication.translate(
-        "E5NetworkProxyFactory",
-        "<b>Connect to proxy '{0}' using:</b>"
-    ).format(Utilities.html_encode(proxy.hostName()))
-    
-    from UI.AuthenticationDialog import AuthenticationDialog
-    dlg = AuthenticationDialog(info, proxy.user(), True)
-    dlg.setData(proxy.user(), proxy.password())
-    if dlg.exec() == QDialog.DialogCode.Accepted:
-        username, password = dlg.getData()
-        auth.setUser(username)
-        auth.setPassword(password)
-        if dlg.shallSave():
-            scheme = schemeFromProxyType(proxy.type())
-            if scheme and scheme != "NoProxy":
-                Preferences.setUI("ProxyUser/{0}".format(scheme), username)
-                Preferences.setUI("ProxyPassword/{0}".format(scheme), password)
-            proxy.setUser(username)
-            proxy.setPassword(password)
-
-
-class HostnameMatcher:
-    """
-    Class implementing a matcher for host names.
-    """
-    def __init__(self, pattern):
-        """
-        Constructor
-        
-        @param pattern pattern to be matched against
-        @type str
-        """
-        self.__regExp = None
-        self.setPattern(pattern)
-    
-    def setPattern(self, pattern):
-        """
-        Public method to set the match pattern.
-        
-        @param pattern pattern to be matched against
-        """
-        self.__pattern = pattern
-        
-        if "?" in pattern or "*" in pattern:
-            regexp = "^.*{0}.*$".format(
-                pattern
-                .replace(".", "\\.")
-                .replace("*", ".*")
-                .replace("?", ".")
-            )
-            self.__regExp = re.compile(regexp, re.IGNORECASE)
-    
-    def pattern(self):
-        """
-        Public method to get the match pattern.
-        
-        @return match pattern
-        @rtype str
-        """
-        return self.__pattern
-    
-    def match(self, host):
-        """
-        Public method to test the given string.
-        
-        @param host host name to be matched
-        @type str
-        @return flag indicating a successful match
-        @rtype bool
-        """
-        if self.__regExp is None:
-            return self.__pattern in host
-        
-        return self.__regExp.search(host) is not None
-
-
-class E5NetworkProxyFactory(QNetworkProxyFactory):
-    """
-    Class implementing a network proxy factory.
-    """
-    def __init__(self):
-        """
-        Constructor
-        """
-        super().__init__()
-        
-        self.__hostnameMatchers = []
-        self.__exceptions = ""
-    
-    def __setExceptions(self, exceptions):
-        """
-        Private method to set the host name exceptions.
-        
-        @param exceptions list of exceptions separated by ','
-        @type str
-        """
-        self.__hostnameMatchers = []
-        self.__exceptions = exceptions
-        for exception in self.__exceptions.split(","):
-            self.__hostnameMatchers.append(HostnameMatcher(exception.strip()))
-    
-    def queryProxy(self, query):
-        """
-        Public method to determine a proxy for a given query.
-        
-        @param query reference to the query object (QNetworkProxyQuery)
-        @return list of proxies in order of preference (list of QNetworkProxy)
-        """
-        if (
-            query.queryType() == QNetworkProxyQuery.QueryType.UrlRequest and
-            query.protocolTag() in ["http", "https", "ftp"]
-        ):
-            # use proxy at all ?
-            if not Preferences.getUI("UseProxy"):
-                return [QNetworkProxy(QNetworkProxy.ProxyType.NoProxy)]
-            
-            # test for exceptions
-            exceptions = Preferences.getUI("ProxyExceptions")
-            if exceptions != self.__exceptions:
-                self.__setExceptions(exceptions)
-            urlHost = query.url().host()
-            for matcher in self.__hostnameMatchers:
-                if matcher.match(urlHost):
-                    return [QNetworkProxy(QNetworkProxy.ProxyType.NoProxy)]
-            
-            # determine proxy
-            if Preferences.getUI("UseSystemProxy"):
-                proxyList = QNetworkProxyFactory.systemProxyForQuery(query)
-                if (
-                    not Globals.isWindowsPlatform() and
-                    len(proxyList) == 1 and
-                    proxyList[0].type() == QNetworkProxy.ProxyType.NoProxy
-                ):
-                    # try it the Python way
-                    # scan the environment for variables named <scheme>_proxy
-                    # scan over whole environment to make this case insensitive
-                    for name, value in os.environ.items():
-                        name = name.lower()
-                        if (
-                            value and
-                            name[-6:] == '_proxy' and
-                            name[:-6] == query.protocolTag().lower()
-                        ):
-                            url = QUrl(value)
-                            if url.scheme() in ["http", "https"]:
-                                proxyType = QNetworkProxy.ProxyType.HttpProxy
-                            elif url.scheme() == "ftp":
-                                proxyType = (
-                                    QNetworkProxy.ProxyType.FtpCachingProxy
-                                )
-                            else:
-                                proxyType = QNetworkProxy.ProxyType.HttpProxy
-                            proxy = QNetworkProxy(
-                                proxyType, url.host(), url.port(),
-                                url.userName(), url.password())
-                            proxyList = [proxy]
-                            break
-                if proxyList:
-                    scheme = schemeFromProxyType(proxyList[0].type())
-                    if scheme == "":
-                        scheme = "Http"
-                    if scheme != "NoProxy":
-                        proxyList[0].setUser(
-                            Preferences.getUI("ProxyUser/{0}".format(scheme)))
-                        proxyList[0].setPassword(
-                            Preferences.getUI(
-                                "ProxyPassword/{0}".format(scheme)))
-                    return proxyList
-                else:
-                    return [QNetworkProxy(QNetworkProxy.ProxyType.NoProxy)]
-            else:
-                if Preferences.getUI("UseHttpProxyForAll"):
-                    protocolKey = "Http"
-                else:
-                    protocolKey = query.protocolTag().capitalize()
-                host = Preferences.getUI("ProxyHost/{0}".format(protocolKey))
-                if not host:
-                    E5MessageBox.critical(
-                        None,
-                        QCoreApplication.translate(
-                            "E5NetworkProxyFactory",
-                            "Proxy Configuration Error"),
-                        QCoreApplication.translate(
-                            "E5NetworkProxyFactory",
-                            """Proxy usage was activated"""
-                            """ but no proxy host for protocol"""
-                            """ '{0}' configured.""").format(protocolKey))
-                    return [
-                        QNetworkProxy(QNetworkProxy.ProxyType.DefaultProxy)
-                    ]
-                else:
-                    if protocolKey in ["Http", "Https", "Ftp"]:
-                        if query.protocolTag() == "ftp":
-                            proxyType = QNetworkProxy.ProxyType.FtpCachingProxy
-                        else:
-                            proxyType = QNetworkProxy.ProxyType.HttpProxy
-                        proxy = QNetworkProxy(
-                            proxyType, host,
-                            Preferences.getUI("ProxyPort/" + protocolKey),
-                            Preferences.getUI("ProxyUser/" + protocolKey),
-                            Preferences.getUI("ProxyPassword/" + protocolKey))
-                    else:
-                        proxy = QNetworkProxy(
-                            QNetworkProxy.ProxyType.DefaultProxy)
-                    return [
-                        proxy,
-                        QNetworkProxy(QNetworkProxy.ProxyType.DefaultProxy)
-                    ]
-        else:
-            return [QNetworkProxy(QNetworkProxy.ProxyType.NoProxy)]
--- a/eric7/E5Network/E5RFC6266.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,358 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2015 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a Content-Disposition parser iaw. RFC 6266.
-"""
-
-#
-# This code is adapted from the rfc6266.py module of qutebrowser.
-# Original copyright 2014-2015 Florian Bruhin (The Compiler)
-# <mail@qutebrowser.org>
-#
-
-import urllib.parse as parse
-import collections
-import string
-import re
-
-try:
-    import pypeg2 as peg
-
-    class UniqueNamespace(peg.Namespace):
-        """
-        A pyPEG2 namespace which prevents setting a value twice.
-        """
-        def __setitem__(self, key, value):
-            """
-            Special method to set an item.
-            
-            @param key key for the item
-            @param value value of the item
-            """
-            if key in self:
-                raise DuplicateParamError(key)
-            super().__setitem__(key, value)
-
-    # RFC 2616
-    separator_chars = "()<>@,;:\\\"/[]?={} \t"      # __IGNORE_WARNING_M613__
-    ctl_chars = ''.join(chr(i) for i in range(32)) + chr(127)
-    nontoken_chars = separator_chars + ctl_chars
-
-    # RFC 5987
-    attr_chars_nonalnum = '!#$&+-.^_`|~'
-    attr_chars = string.ascii_letters + string.digits + attr_chars_nonalnum
-
-    # RFC 5987 gives this alternative construction of the token character class
-    token_chars = attr_chars + "*'%"        # __IGNORE_WARNING_M601__
-
-    # Definitions from https://tools.ietf.org/html/rfc2616#section-2.2
-    # token was redefined from attr_chars to avoid using AnyBut,
-    # which might include non-ascii octets.
-    token_re = '[{0}]+'.format(re.escape(token_chars))
-
-    class Token(str):
-        """
-        A token (RFC 2616, Section 2.2).
-        """
-        grammar = re.compile(token_re)
-
-    # RFC 2616 says some linear whitespace (LWS) is in fact allowed in text
-    # and qdtext; however it also mentions folding that whitespace into
-    # a single SP (which isn't in CTL) before interpretation.
-    # Assume the caller already that folding when parsing headers.
-
-    # Note: qdtext also allows non-ascii, which we choose to parse
-    # as ISO-8859-1; rejecting it entirely would also be permitted.
-    # Some broken browsers attempt encoding-sniffing, which is broken
-    # because the spec only allows iso, and because encoding-sniffing
-    # can mangle valid values.
-    # Everything else in this grammar (including RFC 5987 ext values)
-    # is in an ascii-safe encoding.
-
-    qdtext_re = r'[^"{0}]'.format(re.escape(ctl_chars))
-    quoted_pair_re = r'\\[{0}]'.format(re.escape(
-        ''.join(chr(i) for i in range(128))))
-
-    class QuotedString(str):
-        """
-        A quoted string (RFC 2616, Section 2.2).
-        """
-        grammar = re.compile(r'"({0}|{1})+"'.format(quoted_pair_re, qdtext_re))
-
-        def __str__(self):
-            s = super().__str__()
-            s = s[1:-1]  # remove quotes
-            s = re.sub(r'\\(.)', r'\1', s)  # drop backslashes
-            return s
-
-    class Value(str):
-        """
-        A value. (RFC 2616, Section 3.6).
-        """
-        grammar = [re.compile(token_re), QuotedString]
-
-    class Charset(str):
-        """
-        A charset (RFC5987, Section 3.2.1).
-        """
-        # Other charsets are forbidden, the spec reserves them
-        # for future evolutions.
-        grammar = re.compile('UTF-8|ISO-8859-1', re.I)
-
-    class Language(str):
-        """
-        A language-tag (RFC 5646, Section 2.1).
-
-        Fixme: This grammar is not 100% correct yet.
-        https://github.com/The-Compiler/qutebrowser/issues/105
-        """
-        grammar = re.compile('[A-Za-z0-9-]+')
-
-    attr_char_re = '[{0}]'.format(re.escape(attr_chars))
-    hex_digit_re = '%[' + string.hexdigits + ']{2}'
-
-    class ValueChars(str):
-        """
-        A value of an attribute.
-
-        Fixme: Can we merge this with Value?
-        https://github.com/The-Compiler/qutebrowser/issues/105
-        """
-        grammar = re.compile('({0}|{1})*'.format(attr_char_re, hex_digit_re))
-
-    class ExtValue(peg.List):
-        """
-        An ext-value of an attribute (RFC 5987, Section 3.2).
-        """
-        grammar = peg.contiguous(Charset, "'", peg.optional(Language), "'",
-                                 ValueChars)
-
-    class ExtToken(peg.Symbol):
-        """
-        A token introducing an extended value (RFC 6266, Section 4.1).
-        """
-        regex = re.compile(token_re + r'\*')
-
-        def __str__(self):
-            return super().__str__().lower()
-
-    class NoExtToken(peg.Symbol):
-        """
-        A token introducing a normal value (RFC 6266, Section 4.1).
-        """
-        regex = re.compile(token_re + r'(?<!\*)')
-
-        def __str__(self):
-            return super().__str__().lower()
-
-    class DispositionParm(str):
-        """
-        A parameter for the Disposition-Type header (RFC6266, Section 4.1).
-        """
-        grammar = peg.attr('name', NoExtToken), '=', Value
-
-    class ExtDispositionParm:
-        """
-        An extended parameter (RFC6266, Section 4.1).
-        """
-        grammar = peg.attr('name', ExtToken), '=', ExtValue
-
-        def __init__(self, value, name=None):
-            self.name = name
-            self.value = value
-
-    class DispositionType(peg.List):
-        """
-        The disposition type (RFC6266, Section 4.1).
-        """
-        grammar = [re.compile('(inline|attachment)', re.I), Token]
-
-    class DispositionParmList(UniqueNamespace):
-        """
-        A list of disposition parameters (RFC6266, Section 4.1).
-        """
-        grammar = peg.maybe_some(';', [ExtDispositionParm, DispositionParm])
-
-    class ContentDispositionValue:
-        """
-        A complete Content-Disposition value (RFC 6266, Section 4.1).
-        """
-        # Allows nonconformant final semicolon
-        # I've seen it in the wild, and browsers accept it
-        # http://greenbytes.de/tech/tc2231/#attwithasciifilenamenqs
-        grammar = (peg.attr('dtype', DispositionType),
-                   peg.attr('params', DispositionParmList),
-                   peg.optional(';'))
-
-    LangTagged = collections.namedtuple('LangTagged', ['string', 'langtag'])
-
-    class DuplicateParamError(Exception):
-        """
-        Exception raised when a parameter has been given twice.
-        """
-
-    class InvalidISO8859Error(Exception):
-        """
-        Exception raised when a byte is invalid in ISO-8859-1.
-        """
-
-    class ContentDisposition:
-        """
-        Records various indications and hints about content disposition.
-
-        These can be used to know if a file should be downloaded or
-        displayed directly, and to hint what filename it should have
-        in the download case.
-        """
-        def __init__(self, disposition='inline', assocs=None):
-            """
-            Used internally after parsing the header.
-
-            Instances should generally be created from a factory
-            function, such as parse_headers and its variants.
-            """
-            if len(disposition) != 1:
-                self.disposition = 'inline'
-            else:
-                self.disposition = disposition[0]
-            if assocs is None:
-                self.assocs = {}
-            else:
-                self.assocs = dict(assocs)  # So we can change values
-                if 'filename*' in self.assocs:
-                    param = self.assocs['filename*']
-                    if isinstance(param, ExtDispositionParm):
-                        self.assocs['filename*'] = (
-                            parse_ext_value(param.value).string
-                        )
-
-        def filename(self):
-            """
-            The filename from the Content-Disposition header or None.
-
-            On safety:
-            This property records the intent of the sender.
-
-            You shouldn't use this sender-controlled value as a filesystem
-            path, it can be insecure. Serving files with this filename can be
-            dangerous as well, due to a certain browser using the part after
-            the dot for mime-sniffing.  Saving it to a database is fine by
-            itself though.
-            """
-            if 'filename*' in self.assocs:
-                return self.assocs['filename*']
-            elif 'filename' in self.assocs:
-                # XXX Reject non-ascii (parsed via qdtext) here?
-                return self.assocs['filename']
-            else:
-                return None
-
-        def is_inline(self):
-            """
-            Return if the file should be handled inline.
-
-            If not, and unless your application supports other dispositions
-            than the standard inline and attachment, it should be handled
-            as an attachment.
-            """
-            return self.disposition.lower() == 'inline'
-
-    def normalize_ws(text):
-        """
-        Do LWS (linear whitespace) folding.
-        """
-        return ' '.join(text.split())
-
-    def parse_headers(content_disposition):
-        """
-        Build a ContentDisposition from header values.
-        
-        @param content_disposition contents of the disposition header
-        @type bytes
-        """
-        # We allow non-ascii here (it will only be parsed inside of qdtext, and
-        # rejected by the grammar if it appears in other places), although
-        # parsing it can be ambiguous.  Parsing it ensures that a non-ambiguous
-        # filename* value won't get dismissed because of an unrelated ambiguity
-        # in the filename parameter. But it does mean we occasionally give
-        # less-than-certain values for some legacy senders.
-        content_disposition = content_disposition.decode('iso-8859-1')
-        
-        # Our parsing is relaxed in these regards:
-        # - The grammar allows a final ';' in the header;
-        # - We do LWS-folding, and possibly normalise other broken
-        #   whitespace, instead of rejecting non-lws-safe text.
-        # XXX Would prefer to accept only the quoted whitespace
-        # case, rather than normalising everything.
-        content_disposition = normalize_ws(content_disposition)
-        try:
-            parsed = peg.parse(content_disposition, ContentDispositionValue)
-        except (SyntaxError, DuplicateParamError, InvalidISO8859Error):
-            return ContentDisposition()
-        else:
-            return ContentDisposition(disposition=parsed.dtype,
-                                      assocs=parsed.params)
-
-    def parse_ext_value(val):
-        """
-        Parse the value of an extended attribute.
-        """
-        if len(val) == 3:
-            charset, langtag, coded = val
-        else:
-            charset, coded = val
-            langtag = None
-        decoded = parse.unquote(coded, charset, errors='strict')
-        if charset == 'iso-8859-1':
-            # Fail if the filename contains an invalid ISO-8859-1 char
-            for c in decoded:
-                if 0x7F <= ord(c) <= 0x9F:
-                    raise InvalidISO8859Error(c)
-        return LangTagged(decoded, langtag)
-
-except ImportError:
-    class ContentDisposition:
-        """
-        Records various indications and hints about content disposition.
-
-        These can be used to know if a file should be downloaded or
-        displayed directly, and to hint what filename it should have
-        in the download case.
-        """
-        def __init__(self, filename):
-            """
-            Constructor
-            
-            @param filename file name to be stored in this surrogate class
-            @type str
-            """
-            self.__filename = filename
-        
-        def filename(self):
-            """
-            Public method to get the stored file name
-            
-            @return file name
-            @rtype str
-            """
-            return self.__filename
-    
-    def parse_headers(content_disposition):
-        """
-        Build a ContentDisposition from header values.
-        
-        @param content_disposition contents of the disposition header
-        @type bytes
-        """
-        header = content_disposition.decode()
-        if header:
-            pos = header.find("filename=")
-            if pos != -1:
-                path = header[pos + 9:]
-                if path.startswith('"') and path.endswith('"'):
-                    path = path[1:-1]
-                return ContentDisposition(path)
-        return ContentDisposition("")
--- a/eric7/E5Network/E5SslCertificateSelectionDialog.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2019 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a dialog to select a SSL certificate.
-"""
-
-import contextlib
-
-from PyQt6.QtCore import pyqtSlot, Qt
-from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem
-with contextlib.suppress(ImportError):
-    from PyQt6.QtNetwork import QSslCertificate
-
-from .Ui_E5SslCertificateSelectionDialog import (
-    Ui_E5SslCertificateSelectionDialog
-)
-
-import Utilities
-import UI.PixmapCache
-
-
-class E5SslCertificateSelectionDialog(QDialog,
-                                      Ui_E5SslCertificateSelectionDialog):
-    """
-    Class implementing a dialog to select a SSL certificate.
-    """
-    CertRole = Qt.ItemDataRole.UserRole + 1
-    
-    def __init__(self, certificates, parent=None):
-        """
-        Constructor
-        
-        @param certificates list of SSL certificates to select from
-        @type list of QSslCertificate
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        super().__init__(parent)
-        self.setupUi(self)
-        
-        self.viewButton.setIcon(
-            UI.PixmapCache.getIcon("certificates"))
-        
-        self.buttonBox.button(QDialogButtonBox.OK).setEnabled(False)
-        self.viewButton.setEnabled(False)
-        
-        self.__populateCertificatesTree(certificates)
-    
-    def __populateCertificatesTree(self, certificates):
-        """
-        Private slot to populate the certificates tree.
-        
-        @param certificates list of SSL certificates to select from
-        @type list of QSslCertificate
-        """
-        for cert in certificates():
-            self.__createCertificateEntry(cert)
-        
-        self.certificatesTree.expandAll()
-        for i in range(self.certificatesTree.columnCount()):
-            self.certificatesTree.resizeColumnToContents(i)
-        self.certificatesTree.sortItems(0, Qt.SortOrder.AscendingOrder)
-    
-    def __createCaCertificateEntry(self, cert):
-        """
-        Private method to create a certificate entry.
-        
-        @param cert certificate to insert
-        @type QSslCertificate
-        """
-        # step 1: extract the info to be shown
-        organisation = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.Organization)))
-        commonName = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.CommonName)))
-        if organisation is None or organisation == "":
-            organisation = self.tr("(Unknown)")
-        if commonName is None or commonName == "":
-            commonName = self.tr("(Unknown common name)")
-        expiryDate = cert.expiryDate().toString("yyyy-MM-dd")
-        
-        # step 2: create the entry
-        items = self.certificatesTree.findItems(
-            organisation,
-            Qt.MatchFlag.MatchFixedString | Qt.MatchFlag.MatchCaseSensitive)
-        if len(items) == 0:
-            parent = QTreeWidgetItem(self.certificatesTree, [organisation])
-            parent.setFirstColumnSpanned(True)
-        else:
-            parent = items[0]
-        
-        itm = QTreeWidgetItem(parent, [commonName, expiryDate])
-        itm.setData(0, self.CertRole, cert.toPem())
-    
-    @pyqtSlot()
-    def on_certificatesTree_itemSelectionChanged(self):
-        """
-        Private slot to handle the selection of an item.
-        """
-        enable = (
-            len(self.certificatesTree.selectedItems()) > 0 and
-            self.certificatesTree.selectedItems()[0].parent() is not None
-        )
-        self.buttonBox.button(QDialogButtonBox.OK).setEnabled(enable)
-        self.viewButton.setEnabled(enable)
-    
-    @pyqtSlot()
-    def on_viewButton_clicked(self):
-        """
-        Private slot to show data of the selected certificate.
-        """
-        with contextlib.suppress(ImportError):
-            from E5Network.E5SslCertificatesInfoDialog import (
-                E5SslCertificatesInfoDialog
-            )
-            cert = QSslCertificate.fromData(
-                self.certificatesTree.selectedItems()[0].data(
-                    0, self.CertRole))
-            dlg = E5SslCertificatesInfoDialog(cert, self)
-            dlg.exec()
-    
-    def getSelectedCertificate(self):
-        """
-        Public method to get the selected certificate.
-        
-        @return selected certificate
-        @rtype QSslCertificate
-        """
-        valid = (
-            len(self.certificatesTree.selectedItems()) > 0 and
-            self.certificatesTree.selectedItems()[0].parent() is not None
-        )
-        
-        certificate = (
-            QSslCertificate.fromData(
-                self.certificatesTree.selectedItems()[0].data(
-                    0, self.CertRole))
-            if valid else
-            None
-        )
-        
-        return certificate
--- a/eric7/E5Network/E5SslCertificateSelectionDialog.ui	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,118 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>E5SslCertificateSelectionDialog</class>
- <widget class="QDialog" name="E5SslCertificateSelectionDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>760</width>
-    <height>440</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>SSL Certificate Selection</string>
-  </property>
-  <property name="sizeGripEnabled">
-   <bool>true</bool>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Select a SSL certificate:</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QTreeWidget" name="certificatesTree">
-     <column>
-      <property name="text">
-       <string>Certificate name</string>
-      </property>
-     </column>
-     <column>
-      <property name="text">
-       <string>Expiry Date</string>
-      </property>
-     </column>
-    </widget>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout">
-     <item>
-      <widget class="QPushButton" name="viewButton">
-       <property name="enabled">
-        <bool>false</bool>
-       </property>
-       <property name="toolTip">
-        <string>Press to view the selected certificate</string>
-       </property>
-       <property name="text">
-        <string>&amp;View...</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <spacer name="horizontalSpacer_2">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>E5SslCertificateSelectionDialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>E5SslCertificateSelectionDialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
--- a/eric7/E5Network/E5SslCertificatesDialog.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,518 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2010 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a dialog to show and edit all certificates.
-"""
-
-import contextlib
-
-from PyQt6.QtCore import (
-    pyqtSlot, Qt, QByteArray, QFile, QFileInfo, QIODevice
-)
-from PyQt6.QtWidgets import QDialog, QTreeWidgetItem
-with contextlib.suppress(ImportError):
-    from PyQt6.QtNetwork import (
-        QSslCertificate, QSslSocket, QSslConfiguration, QSsl
-    )
-
-from E5Gui import E5MessageBox, E5FileDialog
-
-from .Ui_E5SslCertificatesDialog import Ui_E5SslCertificatesDialog
-
-import Preferences
-import Utilities
-import UI.PixmapCache
-import Globals
-
-
-class E5SslCertificatesDialog(QDialog, Ui_E5SslCertificatesDialog):
-    """
-    Class implementing a dialog to show and edit all certificates.
-    """
-    CertRole = Qt.ItemDataRole.UserRole + 1
-    
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget (QWidget)
-        """
-        super().__init__(parent)
-        self.setupUi(self)
-        
-        self.serversViewButton.setIcon(
-            UI.PixmapCache.getIcon("certificates"))
-        self.serversDeleteButton.setIcon(
-            UI.PixmapCache.getIcon("certificateDelete"))
-        self.serversExportButton.setIcon(
-            UI.PixmapCache.getIcon("certificateExport"))
-        self.serversImportButton.setIcon(
-            UI.PixmapCache.getIcon("certificateImport"))
-        
-        self.caViewButton.setIcon(
-            UI.PixmapCache.getIcon("certificates"))
-        self.caDeleteButton.setIcon(
-            UI.PixmapCache.getIcon("certificateDelete"))
-        self.caExportButton.setIcon(
-            UI.PixmapCache.getIcon("certificateExport"))
-        self.caImportButton.setIcon(
-            UI.PixmapCache.getIcon("certificateImport"))
-        
-        self.__populateServerCertificatesTree()
-        self.__populateCaCertificatesTree()
-    
-    def __populateServerCertificatesTree(self):
-        """
-        Private slot to populate the server certificates tree.
-        """
-        certificateDict = Globals.toDict(
-            Preferences.Prefs.settings.value("Ssl/CaCertificatesDict"))
-        for server in certificateDict:
-            for cert in QSslCertificate.fromData(certificateDict[server]):
-                self.__createServerCertificateEntry(server, cert)
-        
-        self.serversCertificatesTree.expandAll()
-        for i in range(self.serversCertificatesTree.columnCount()):
-            self.serversCertificatesTree.resizeColumnToContents(i)
-    
-    def __createServerCertificateEntry(self, server, cert):
-        """
-        Private method to create a server certificate entry.
-        
-        @param server server name of the certificate (string)
-        @param cert certificate to insert (QSslCertificate)
-        """
-        # step 1: extract the info to be shown
-        organisation = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.Organization)))
-        commonName = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.CommonName)))
-        if organisation is None or organisation == "":
-            organisation = self.tr("(Unknown)")
-        if commonName is None or commonName == "":
-            commonName = self.tr("(Unknown common name)")
-        expiryDate = cert.expiryDate().toString("yyyy-MM-dd")
-        
-        # step 2: create the entry
-        items = self.serversCertificatesTree.findItems(
-            organisation,
-            Qt.MatchFlag.MatchFixedString | Qt.MatchFlag.MatchCaseSensitive)
-        if len(items) == 0:
-            parent = QTreeWidgetItem(
-                self.serversCertificatesTree, [organisation])
-            parent.setFirstColumnSpanned(True)
-        else:
-            parent = items[0]
-        
-        itm = QTreeWidgetItem(parent, [commonName, server, expiryDate])
-        itm.setData(0, self.CertRole, cert.toPem())
-    
-    @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
-    def on_serversCertificatesTree_currentItemChanged(self, current, previous):
-        """
-        Private slot handling a change of the current item in the
-        server certificates list.
-        
-        @param current new current item (QTreeWidgetItem)
-        @param previous previous current item (QTreeWidgetItem)
-        """
-        enable = current is not None and current.parent() is not None
-        self.serversViewButton.setEnabled(enable)
-        self.serversDeleteButton.setEnabled(enable)
-        self.serversExportButton.setEnabled(enable)
-    
-    @pyqtSlot()
-    def on_serversViewButton_clicked(self):
-        """
-        Private slot to show data of the selected server certificate.
-        """
-        with contextlib.suppress(ImportError):
-            from E5Network.E5SslCertificatesInfoDialog import (
-                E5SslCertificatesInfoDialog
-            )
-            cert = QSslCertificate.fromData(
-                self.serversCertificatesTree.currentItem().data(
-                    0, self.CertRole))
-            dlg = E5SslCertificatesInfoDialog(cert, self)
-            dlg.exec()
-    
-    @pyqtSlot()
-    def on_serversDeleteButton_clicked(self):
-        """
-        Private slot to delete the selected server certificate.
-        """
-        itm = self.serversCertificatesTree.currentItem()
-        res = E5MessageBox.yesNo(
-            self,
-            self.tr("Delete Server Certificate"),
-            self.tr("""<p>Shall the server certificate really be"""
-                    """ deleted?</p><p>{0}</p>"""
-                    """<p>If the server certificate is deleted, the"""
-                    """ normal security checks will be reinstantiated"""
-                    """ and the server has to present a valid"""
-                    """ certificate.</p>""")
-            .format(itm.text(0)))
-        if res:
-            server = itm.text(1)
-            cert = self.serversCertificatesTree.currentItem().data(
-                0, self.CertRole)
-            
-            # delete the selected entry and its parent entry,
-            # if it was the only one
-            parent = itm.parent()
-            parent.takeChild(parent.indexOfChild(itm))
-            if parent.childCount() == 0:
-                self.serversCertificatesTree.takeTopLevelItem(
-                    self.serversCertificatesTree.indexOfTopLevelItem(parent))
-            
-            # delete the certificate from the user certificate store
-            certificateDict = Globals.toDict(
-                Preferences.Prefs.settings.value("Ssl/CaCertificatesDict"))
-            if server in certificateDict:
-                certs = [c.toPem() for c in
-                         QSslCertificate.fromData(certificateDict[server])]
-                if cert in certs:
-                    certs.remove(cert)
-                if certs:
-                    pems = QByteArray()
-                    for cert in certs:
-                        pems.append(cert + b'\n')
-                    certificateDict[server] = pems
-                else:
-                    del certificateDict[server]
-            Preferences.Prefs.settings.setValue(
-                "Ssl/CaCertificatesDict",
-                certificateDict)
-            
-            # delete the certificate from the default certificates
-            self.__updateDefaultConfiguration()
-    
-    @pyqtSlot()
-    def on_serversImportButton_clicked(self):
-        """
-        Private slot to import server certificates.
-        """
-        certs = self.__importCertificate()
-        if certs:
-            server = "*"
-            certificateDict = Globals.toDict(
-                Preferences.Prefs.settings.value("Ssl/CaCertificatesDict"))
-            if server in certificateDict:
-                sCerts = QSslCertificate.fromData(certificateDict[server])
-            else:
-                sCerts = []
-            
-            pems = QByteArray()
-            for cert in certs:
-                if cert in sCerts:
-                    commonStr = ", ".join(
-                        cert.subjectInfo(
-                            QSslCertificate.SubjectInfo.CommonName))
-                    E5MessageBox.warning(
-                        self,
-                        self.tr("Import Certificate"),
-                        self.tr(
-                            """<p>The certificate <b>{0}</b> already exists."""
-                            """ Skipping.</p>""")
-                        .format(Utilities.decodeString(commonStr)))
-                else:
-                    pems.append(cert.toPem() + '\n')
-            if server not in certificateDict:
-                certificateDict[server] = QByteArray()
-            certificateDict[server].append(pems)
-            Preferences.Prefs.settings.setValue(
-                "Ssl/CaCertificatesDict",
-                certificateDict)
-            
-            self.serversCertificatesTree.clear()
-            self.__populateServerCertificatesTree()
-            
-            self.__updateDefaultConfiguration()
-    
-    @pyqtSlot()
-    def on_serversExportButton_clicked(self):
-        """
-        Private slot to export the selected server certificate.
-        """
-        cert = self.serversCertificatesTree.currentItem().data(
-            0, self.CertRole)
-        fname = (
-            self.serversCertificatesTree.currentItem().text(0).replace(" ", "")
-            .replace("\t", "")
-        )
-        self.__exportCertificate(fname, cert)
-    
-    def __updateDefaultConfiguration(self):
-        """
-        Private method to update the default SSL configuration.
-        """
-        caList = self.__getSystemCaCertificates()
-        certificateDict = Globals.toDict(
-            Preferences.Prefs.settings.value("Ssl/CaCertificatesDict"))
-        for server in certificateDict:
-            for cert in QSslCertificate.fromData(certificateDict[server]):
-                if cert not in caList:
-                    caList.append(cert)
-        sslCfg = QSslConfiguration.defaultConfiguration()
-        sslCfg.setCaCertificates(caList)
-        QSslConfiguration.setDefaultConfiguration(sslCfg)
-    
-    def __getSystemCaCertificates(self):
-        """
-        Private method to get the list of system certificates.
-        
-        @return list of system certificates (list of QSslCertificate)
-        """
-        caList = QSslCertificate.fromData(Globals.toByteArray(
-            Preferences.Prefs.settings.value("Help/SystemCertificates")))
-        if not caList:
-            caList = QSslSocket.systemCaCertificates()
-        return caList
-    
-    def __populateCaCertificatesTree(self):
-        """
-        Private slot to populate the CA certificates tree.
-        """
-        for cert in self.__getSystemCaCertificates():
-            self.__createCaCertificateEntry(cert)
-        
-        self.caCertificatesTree.expandAll()
-        for i in range(self.caCertificatesTree.columnCount()):
-            self.caCertificatesTree.resizeColumnToContents(i)
-        self.caCertificatesTree.sortItems(0, Qt.SortOrder.AscendingOrder)
-    
-    def __createCaCertificateEntry(self, cert):
-        """
-        Private method to create a CA certificate entry.
-        
-        @param cert certificate to insert (QSslCertificate)
-        """
-        # step 1: extract the info to be shown
-        organisation = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.Organization)))
-        commonName = Utilities.decodeString(
-            ", ".join(cert.subjectInfo(
-                QSslCertificate.SubjectInfo.CommonName)))
-        if organisation is None or organisation == "":
-            organisation = self.tr("(Unknown)")
-        if commonName is None or commonName == "":
-            commonName = self.tr("(Unknown common name)")
-        expiryDate = cert.expiryDate().toString("yyyy-MM-dd")
-        
-        # step 2: create the entry
-        items = self.caCertificatesTree.findItems(
-            organisation,
-            Qt.MatchFlag.MatchFixedString | Qt.MatchFlag.MatchCaseSensitive)
-        if len(items) == 0:
-            parent = QTreeWidgetItem(self.caCertificatesTree, [organisation])
-            parent.setFirstColumnSpanned(True)
-        else:
-            parent = items[0]
-        
-        itm = QTreeWidgetItem(parent, [commonName, expiryDate])
-        itm.setData(0, self.CertRole, cert.toPem())
-    
-    @pyqtSlot(QTreeWidgetItem, QTreeWidgetItem)
-    def on_caCertificatesTree_currentItemChanged(self, current, previous):
-        """
-        Private slot handling a change of the current item
-        in the CA certificates list.
-        
-        @param current new current item (QTreeWidgetItem)
-        @param previous previous current item (QTreeWidgetItem)
-        """
-        enable = current is not None and current.parent() is not None
-        self.caViewButton.setEnabled(enable)
-        self.caDeleteButton.setEnabled(enable)
-        self.caExportButton.setEnabled(enable)
-    
-    @pyqtSlot()
-    def on_caViewButton_clicked(self):
-        """
-        Private slot to show data of the selected CA certificate.
-        """
-        with contextlib.suppress(ImportError):
-            from E5Network.E5SslCertificatesInfoDialog import (
-                E5SslCertificatesInfoDialog
-            )
-            cert = QSslCertificate.fromData(
-                self.caCertificatesTree.currentItem().data(0, self.CertRole))
-            dlg = E5SslCertificatesInfoDialog(cert, self)
-            dlg.exec()
-    
-    @pyqtSlot()
-    def on_caDeleteButton_clicked(self):
-        """
-        Private slot to delete the selected CA certificate.
-        """
-        itm = self.caCertificatesTree.currentItem()
-        res = E5MessageBox.yesNo(
-            self,
-            self.tr("Delete CA Certificate"),
-            self.tr(
-                """<p>Shall the CA certificate really be deleted?</p>"""
-                """<p>{0}</p>"""
-                """<p>If the CA certificate is deleted, the browser"""
-                """ will not trust any certificate issued by this CA.</p>""")
-            .format(itm.text(0)))
-        if res:
-            cert = self.caCertificatesTree.currentItem().data(0, self.CertRole)
-            
-            # delete the selected entry and its parent entry,
-            # if it was the only one
-            parent = itm.parent()
-            parent.takeChild(parent.indexOfChild(itm))
-            if parent.childCount() == 0:
-                self.caCertificatesTree.takeTopLevelItem(
-                    self.caCertificatesTree.indexOfTopLevelItem(parent))
-            
-            # delete the certificate from the CA certificate store
-            caCerts = self.__getSystemCaCertificates()
-            if cert in caCerts:
-                caCerts.remove(cert)
-            pems = QByteArray()
-            for cert in caCerts:
-                pems.append(cert.toPem() + '\n')
-            Preferences.Prefs.settings.setValue(
-                "Help/SystemCertificates", pems)
-            
-            # delete the certificate from the default certificates
-            self.__updateDefaultConfiguration()
-    
-    @pyqtSlot()
-    def on_caImportButton_clicked(self):
-        """
-        Private slot to import server certificates.
-        """
-        certs = self.__importCertificate()
-        if certs:
-            caCerts = self.__getSystemCaCertificates()
-            for cert in certs:
-                if cert in caCerts:
-                    commonStr = ", ".join(
-                        cert.subjectInfo(
-                            QSslCertificate.SubjectInfo.CommonName))
-                    E5MessageBox.warning(
-                        self,
-                        self.tr("Import Certificate"),
-                        self.tr(
-                            """<p>The certificate <b>{0}</b> already exists."""
-                            """ Skipping.</p>""")
-                        .format(Utilities.decodeString(commonStr)))
-                else:
-                    caCerts.append(cert)
-            
-            pems = QByteArray()
-            for cert in caCerts:
-                pems.append(cert.toPem() + '\n')
-            Preferences.Prefs.settings.setValue(
-                "Help/SystemCertificates", pems)
-            
-            self.caCertificatesTree.clear()
-            self.__populateCaCertificatesTree()
-            
-            self.__updateDefaultConfiguration()
-    
-    @pyqtSlot()
-    def on_caExportButton_clicked(self):
-        """
-        Private slot to export the selected CA certificate.
-        """
-        cert = self.caCertificatesTree.currentItem().data(0, self.CertRole)
-        fname = (
-            self.caCertificatesTree.currentItem().text(0).replace(" ", "")
-            .replace("\t", "")
-        )
-        self.__exportCertificate(fname, cert)
-    
-    def __exportCertificate(self, name, cert):
-        """
-        Private slot to export a certificate.
-        
-        @param name default file name without extension (string)
-        @param cert certificate to be exported (QSslCertificate)
-        """
-        if cert is not None:
-            fname, selectedFilter = E5FileDialog.getSaveFileNameAndFilter(
-                self,
-                self.tr("Export Certificate"),
-                name,
-                self.tr("Certificate File (PEM) (*.pem);;"
-                        "Certificate File (DER) (*.der)"),
-                None,
-                E5FileDialog.DontConfirmOverwrite)
-            
-            if fname:
-                ext = QFileInfo(fname).suffix()
-                if not ext or ext not in ["pem", "der"]:
-                    ex = selectedFilter.split("(*")[1].split(")")[0]
-                    if ex:
-                        fname += ex
-                if QFileInfo(fname).exists():
-                    res = E5MessageBox.yesNo(
-                        self,
-                        self.tr("Export Certificate"),
-                        self.tr("<p>The file <b>{0}</b> already exists."
-                                " Overwrite it?</p>").format(fname),
-                        icon=E5MessageBox.Warning)
-                    if not res:
-                        return
-                
-                f = QFile(fname)
-                if not f.open(QIODevice.OpenModeFlag.WriteOnly):
-                    E5MessageBox.critical(
-                        self,
-                        self.tr("Export Certificate"),
-                        self.tr(
-                            """<p>The certificate could not be written"""
-                            """ to file <b>{0}</b></p><p>Error: {1}</p>""")
-                        .format(fname, f.errorString()))
-                    return
-                
-                if fname.endswith(".pem"):
-                    crt = cert.toPem()
-                else:
-                    crt = cert.toDer()
-                f.write(crt)
-                f.close()
-    
-    def __importCertificate(self):
-        """
-        Private method to read a certificate.
-        
-        @return certificates read (list of QSslCertificate)
-        """
-        fname = E5FileDialog.getOpenFileName(
-            self,
-            self.tr("Import Certificate"),
-            "",
-            self.tr("Certificate Files (*.pem *.crt *.der *.cer *.ca);;"
-                    "All Files (*)"))
-        
-        if fname:
-            f = QFile(fname)
-            if not f.open(QIODevice.OpenModeFlag.ReadOnly):
-                E5MessageBox.critical(
-                    self,
-                    self.tr("Export Certificate"),
-                    self.tr(
-                        """<p>The certificate could not be read from file"""
-                        """ <b>{0}</b></p><p>Error: {1}</p>""")
-                    .format(fname, f.errorString()))
-                return []
-            
-            crt = f.readAll()
-            f.close()
-            cert = QSslCertificate.fromData(crt, QSsl.EncodingFormat.Pem)
-            if not cert:
-                cert = QSslCertificate.fromData(crt, QSsl.EncodingFormat.Der)
-            
-            return cert
-        
-        return []
--- a/eric7/E5Network/E5SslCertificatesDialog.ui	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,281 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>E5SslCertificatesDialog</class>
- <widget class="QDialog" name="E5SslCertificatesDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>760</width>
-    <height>440</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>SSL Certificate Manager</string>
-  </property>
-  <property name="sizeGripEnabled">
-   <bool>true</bool>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QTabWidget" name="certificatesWidget">
-     <property name="currentIndex">
-      <number>0</number>
-     </property>
-     <widget class="QWidget" name="serversTab">
-      <attribute name="title">
-       <string>&amp;Servers</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_2">
-       <item>
-        <widget class="QLabel" name="label">
-         <property name="text">
-          <string>You have saved certificates identifying these servers:</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QTreeWidget" name="serversCertificatesTree">
-         <column>
-          <property name="text">
-           <string>Certificate name</string>
-          </property>
-         </column>
-         <column>
-          <property name="text">
-           <string>Server</string>
-          </property>
-         </column>
-         <column>
-          <property name="text">
-           <string>Expiry Date</string>
-          </property>
-         </column>
-        </widget>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout">
-         <item>
-          <widget class="QPushButton" name="serversViewButton">
-           <property name="enabled">
-            <bool>false</bool>
-           </property>
-           <property name="toolTip">
-            <string>Press to view the selected certificate</string>
-           </property>
-           <property name="text">
-            <string>&amp;View...</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="serversImportButton">
-           <property name="toolTip">
-            <string>Press to import a certificate</string>
-           </property>
-           <property name="text">
-            <string>&amp;Import...</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="serversExportButton">
-           <property name="enabled">
-            <bool>false</bool>
-           </property>
-           <property name="toolTip">
-            <string>Press to export the selected certificate</string>
-           </property>
-           <property name="text">
-            <string>&amp;Export...</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="serversDeleteButton">
-           <property name="enabled">
-            <bool>false</bool>
-           </property>
-           <property name="toolTip">
-            <string>Press to delete the selected certificate</string>
-           </property>
-           <property name="text">
-            <string>&amp;Delete...</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <spacer name="horizontalSpacer">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
-     <widget class="QWidget" name="caTab">
-      <attribute name="title">
-       <string>Certificate &amp;Authorities</string>
-      </attribute>
-      <layout class="QVBoxLayout" name="verticalLayout_3">
-       <item>
-        <widget class="QLabel" name="label_2">
-         <property name="text">
-          <string>You have saved certificates identifying these certification authorities:</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QTreeWidget" name="caCertificatesTree">
-         <column>
-          <property name="text">
-           <string>Certificate name</string>
-          </property>
-         </column>
-         <column>
-          <property name="text">
-           <string>Expiry Date</string>
-          </property>
-         </column>
-        </widget>
-       </item>
-       <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_2">
-         <item>
-          <widget class="QPushButton" name="caViewButton">
-           <property name="enabled">
-            <bool>false</bool>
-           </property>
-           <property name="toolTip">
-            <string>Press to view the selected certificate</string>
-           </property>
-           <property name="text">
-            <string>&amp;View...</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="caImportButton">
-           <property name="toolTip">
-            <string>Press to import a certificate</string>
-           </property>
-           <property name="text">
-            <string>&amp;Import...</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="caExportButton">
-           <property name="enabled">
-            <bool>false</bool>
-           </property>
-           <property name="toolTip">
-            <string>Press to export the selected certificate</string>
-           </property>
-           <property name="text">
-            <string>&amp;Export...</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QPushButton" name="caDeleteButton">
-           <property name="enabled">
-            <bool>false</bool>
-           </property>
-           <property name="toolTip">
-            <string>Press to delete the selected certificate</string>
-           </property>
-           <property name="text">
-            <string>&amp;Delete...</string>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <spacer name="horizontalSpacer_2">
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="sizeHint" stdset="0">
-            <size>
-             <width>40</width>
-             <height>20</height>
-            </size>
-           </property>
-          </spacer>
-         </item>
-        </layout>
-       </item>
-      </layout>
-     </widget>
-    </widget>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Close</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <tabstops>
-  <tabstop>certificatesWidget</tabstop>
-  <tabstop>serversCertificatesTree</tabstop>
-  <tabstop>serversViewButton</tabstop>
-  <tabstop>serversImportButton</tabstop>
-  <tabstop>serversExportButton</tabstop>
-  <tabstop>serversDeleteButton</tabstop>
-  <tabstop>caCertificatesTree</tabstop>
-  <tabstop>caViewButton</tabstop>
-  <tabstop>caImportButton</tabstop>
-  <tabstop>caExportButton</tabstop>
-  <tabstop>caDeleteButton</tabstop>
-  <tabstop>buttonBox</tabstop>
- </tabstops>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>E5SslCertificatesDialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>E5SslCertificatesDialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
--- a/eric7/E5Network/E5SslCertificatesInfoDialog.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2010 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a dialog to show SSL certificate infos.
-"""
-
-from PyQt6.QtWidgets import QDialog
-
-from .Ui_E5SslCertificatesInfoDialog import Ui_E5SslCertificatesInfoDialog
-
-
-class E5SslCertificatesInfoDialog(QDialog, Ui_E5SslCertificatesInfoDialog):
-    """
-    Class implementing a dialog to show SSL certificate infos.
-    """
-    def __init__(self, certificateChain, parent=None):
-        """
-        Constructor
-        
-        @param certificateChain SSL certificate chain (list of QSslCertificate)
-        @param parent reference to the parent widget (QWidget)
-        """
-        super().__init__(parent)
-        self.setupUi(self)
-        
-        self.sslWidget.showCertificateChain(certificateChain)
--- a/eric7/E5Network/E5SslCertificatesInfoDialog.ui	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>E5SslCertificatesInfoDialog</class>
- <widget class="QDialog" name="E5SslCertificatesInfoDialog">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>556</width>
-    <height>486</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>SSL Certificate Info</string>
-  </property>
-  <property name="sizeGripEnabled">
-   <bool>true</bool>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="E5SslCertificatesInfoWidget" name="sslWidget" native="true"/>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Close</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>E5SslCertificatesInfoWidget</class>
-   <extends>QWidget</extends>
-   <header>E5Network/E5SslCertificatesInfoWidget.h</header>
-   <container>1</container>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>E5SslCertificatesInfoDialog</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>E5SslCertificatesInfoDialog</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
--- a/eric7/E5Network/E5SslCertificatesInfoWidget.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,203 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2010 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a widget to show SSL certificate infos.
-"""
-
-from PyQt6.QtCore import pyqtSlot, QCryptographicHash, QDateTime
-from PyQt6.QtWidgets import QWidget
-try:
-    from PyQt6.QtNetwork import QSslCertificate
-except ImportError:
-    QSslCertificate = None
-
-from .Ui_E5SslCertificatesInfoWidget import Ui_E5SslCertificatesInfoWidget
-
-import Utilities
-
-
-class E5SslCertificatesInfoWidget(QWidget, Ui_E5SslCertificatesInfoWidget):
-    """
-    Class implementing a widget to show SSL certificate infos.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget (QWidget)
-        """
-        super().__init__(parent)
-        self.setupUi(self)
-        
-        self.__chain = []
-    
-    def showCertificateChain(self, certificateChain):
-        """
-        Public method to show the SSL certificates of a certificate chain.
-        
-        @param certificateChain list od SSL certificates
-            (list of QSslCertificate)
-        """
-        if QSslCertificate:
-            self.chainLabel.show()
-            self.chainComboBox.show()
-            self.chainComboBox.clear()
-            
-            self.__chain = certificateChain[:]
-            
-            for cert in self.__chain:
-                name = ", ".join(cert.subjectInfo(
-                    QSslCertificate.SubjectInfo.CommonName))
-                if not name:
-                    name = ", ".join(
-                        cert.subjectInfo(
-                            QSslCertificate.SubjectInfo.Organization))
-                if not name:
-                    name = cert.serialNumber()
-                self.chainComboBox.addItem(name)
-            
-            self.on_chainComboBox_activated(0)
-    
-    def showCertificate(self, certificate):
-        """
-        Public method to show the SSL certificate information.
-        
-        @param certificate reference to the SSL certificate (QSslCertificate)
-        """
-        self.chainLabel.hide()
-        self.chainComboBox.hide()
-        self.chainComboBox.clear()
-        
-        self.__chain = []
-        
-        if QSslCertificate:
-            self.__showCertificate(certificate)
-    
-    def __showCertificate(self, certificate):
-        """
-        Private method to show the  SSL certificate information.
-        
-        @param certificate reference to the SSL certificate (QSslCertificate)
-        """
-        if QSslCertificate:
-            self.blacklistedLabel.setVisible(False)
-            self.blacklistedLabel.setStyleSheet(
-                "QLabel { color : white; background-color : red; }")
-            self.expiredLabel.setVisible(False)
-            self.expiredLabel.setStyleSheet(
-                "QLabel { color : white; background-color : red; }")
-            
-            self.subjectCommonNameLabel.setText(self.__certificateString(
-                ", ".join(certificate.subjectInfo(
-                    QSslCertificate.SubjectInfo.CommonName))))
-            self.subjectOrganizationLabel.setText(self.__certificateString(
-                ", ".join(certificate.subjectInfo(
-                    QSslCertificate.SubjectInfo.Organization))))
-            self.subjectOrganizationalUnitLabel.setText(
-                self.__certificateString(", ".join(
-                    certificate.subjectInfo(
-                        QSslCertificate.SubjectInfo.OrganizationalUnitName))))
-            self.issuerCommonNameLabel.setText(self.__certificateString(
-                ", ".join(certificate.issuerInfo(
-                    QSslCertificate.SubjectInfo.CommonName))))
-            self.issuerOrganizationLabel.setText(self.__certificateString(
-                ", ".join(certificate.issuerInfo(
-                    QSslCertificate.SubjectInfo.Organization))))
-            self.issuerOrganizationalUnitLabel.setText(
-                self.__certificateString(", ".join(
-                    certificate.issuerInfo(
-                        QSslCertificate.SubjectInfo.OrganizationalUnitName))))
-            self.serialNumberLabel.setText(self.__serialNumber(certificate))
-            self.effectiveLabel.setText(
-                certificate.effectiveDate().toString("yyyy-MM-dd"))
-            self.expiresLabel.setText(
-                certificate.expiryDate().toString("yyyy-MM-dd"))
-            self.sha1Label.setText(self.__formatHexString(
-                str(certificate.digest(
-                    QCryptographicHash.Algorithm.Sha1).toHex(),
-                    encoding="ascii")))
-            self.md5Label.setText(self.__formatHexString(
-                str(certificate.digest(
-                    QCryptographicHash.Algorithm.Md5).toHex(),
-                    encoding="ascii")))
-            
-            if certificate.isBlacklisted():
-                # something is wrong; indicate it to the user
-                if self.__hasExpired(certificate.effectiveDate(),
-                                     certificate.expiryDate()):
-                    self.expiredLabel.setVisible(True)
-                else:
-                    self.blacklistedLabel.setVisible(True)
-    
-    def __certificateString(self, txt):
-        """
-        Private method to prepare some text for display.
-        
-        @param txt text to be displayed (string)
-        @return prepared text (string)
-        """
-        if txt is None or txt == "":
-            return self.tr("<not part of the certificate>")
-        
-        return Utilities.decodeString(txt)
-    
-    def __serialNumber(self, cert):
-        """
-        Private slot to format the certificate serial number.
-        
-        @param cert reference to the SSL certificate (QSslCertificate)
-        @return formated serial number (string)
-        """
-        serial = cert.serialNumber()
-        if serial == "":
-            return self.tr("<not part of the certificate>")
-        
-        if b':' in serial:
-            return str(serial, encoding="ascii").upper()
-        else:
-            hexString = hex(int(serial))[2:]
-            return self.__formatHexString(hexString)
-    
-    def __formatHexString(self, hexString):
-        """
-        Private method to format a hex string for display.
-        
-        @param hexString hex string to be formatted (string)
-        @return formatted string (string)
-        """
-        hexString = hexString.upper()
-        
-        if len(hexString) % 2 == 1:
-            hexString = '0' + hexString
-        
-        hexList = []
-        while hexString:
-            hexList.append(hexString[:2])
-            hexString = hexString[2:]
-        
-        return ':'.join(hexList)
-    
-    def __hasExpired(self, effectiveDate, expiryDate):
-        """
-        Private method to check for a certificate expiration.
-        
-        @param effectiveDate date the certificate becomes effective (QDateTime)
-        @param expiryDate date the certificate expires (QDateTime)
-        @return flag indicating the expiration status (boolean)
-        """
-        now = QDateTime.currentDateTime()
-        
-        return now < effectiveDate or now >= expiryDate
-    
-    @pyqtSlot(int)
-    def on_chainComboBox_activated(self, index):
-        """
-        Private slot to show the certificate info for the selected entry.
-        
-        @param index number of the certificate in the certificate chain
-            (integer)
-        """
-        self.__showCertificate(self.__chain[index])
--- a/eric7/E5Network/E5SslCertificatesInfoWidget.ui	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,359 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>E5SslCertificatesInfoWidget</class>
- <widget class="QWidget" name="E5SslCertificatesInfoWidget">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>500</width>
-    <height>455</height>
-   </rect>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="label_17">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="text">
-      <string>&lt;h2&gt;Certificate Information&lt;/h2&gt;</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <layout class="QHBoxLayout" name="horizontalLayout">
-     <item>
-      <widget class="QLabel" name="chainLabel">
-       <property name="text">
-        <string>Certificate Chain:</string>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QComboBox" name="chainComboBox">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-      </widget>
-     </item>
-    </layout>
-   </item>
-   <item>
-    <widget class="QLabel" name="blacklistedLabel">
-     <property name="text">
-      <string>This certificated has been blacklisted.</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="groupBox">
-     <layout class="QGridLayout" name="gridLayout">
-      <item row="0" column="0" colspan="2">
-       <widget class="QLabel" name="label">
-        <property name="text">
-         <string>&lt;b&gt;Issued for:&lt;/b&gt;</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0">
-       <widget class="QLabel" name="label_2">
-        <property name="text">
-         <string>Common Name (CN):</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QLabel" name="subjectCommonNameLabel">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="0">
-       <widget class="QLabel" name="label_3">
-        <property name="text">
-         <string>Organization (O):</string>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="QLabel" name="subjectOrganizationLabel">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="0">
-       <widget class="QLabel" name="label_4">
-        <property name="text">
-         <string>Organizational Unit (OU):</string>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1">
-       <widget class="QLabel" name="subjectOrganizationalUnitLabel">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="0">
-       <widget class="QLabel" name="label_5">
-        <property name="text">
-         <string>Serialnumber:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="1">
-       <widget class="QLabel" name="serialNumberLabel">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="5" column="0">
-       <spacer name="verticalSpacer_3">
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>20</width>
-          <height>10</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="6" column="0" colspan="2">
-       <widget class="QLabel" name="label_6">
-        <property name="text">
-         <string>&lt;b&gt;Issued by:&lt;/b&gt;</string>
-        </property>
-       </widget>
-      </item>
-      <item row="7" column="0">
-       <widget class="QLabel" name="label_9">
-        <property name="text">
-         <string>Common Name (CN):</string>
-        </property>
-       </widget>
-      </item>
-      <item row="7" column="1">
-       <widget class="QLabel" name="issuerCommonNameLabel">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="8" column="0">
-       <widget class="QLabel" name="label_8">
-        <property name="text">
-         <string>Organization (O):</string>
-        </property>
-       </widget>
-      </item>
-      <item row="8" column="1">
-       <widget class="QLabel" name="issuerOrganizationLabel">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="9" column="0">
-       <widget class="QLabel" name="label_7">
-        <property name="text">
-         <string>Organizational Unit (OU):</string>
-        </property>
-       </widget>
-      </item>
-      <item row="9" column="1">
-       <widget class="QLabel" name="issuerOrganizationalUnitLabel">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="10" column="0">
-       <spacer name="verticalSpacer_2">
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>20</width>
-          <height>9</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="11" column="0" colspan="2">
-       <widget class="QLabel" name="label_10">
-        <property name="text">
-         <string>&lt;b&gt;Validity:&lt;/b&gt;</string>
-        </property>
-       </widget>
-      </item>
-      <item row="12" column="0">
-       <widget class="QLabel" name="label_11">
-        <property name="text">
-         <string>Issued on:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="12" column="1">
-       <widget class="QLabel" name="effectiveLabel">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="13" column="0">
-       <widget class="QLabel" name="label_12">
-        <property name="text">
-         <string>Expires on:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="13" column="1">
-       <widget class="QLabel" name="expiresLabel">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="14" column="0" colspan="2">
-       <widget class="QLabel" name="expiredLabel">
-        <property name="text">
-         <string>This certificate is not valid yet or has expired.</string>
-        </property>
-       </widget>
-      </item>
-      <item row="15" column="0">
-       <spacer name="verticalSpacer">
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>20</width>
-          <height>10</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-      <item row="16" column="0" colspan="2">
-       <widget class="QLabel" name="label_13">
-        <property name="text">
-         <string>&lt;b&gt;Fingerprints:&lt;/b&gt;</string>
-        </property>
-       </widget>
-      </item>
-      <item row="17" column="0">
-       <widget class="QLabel" name="label_14">
-        <property name="text">
-         <string>SHA1-Fingerprint:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="17" column="1">
-       <widget class="QLabel" name="sha1Label">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-      <item row="18" column="0">
-       <widget class="QLabel" name="label_15">
-        <property name="text">
-         <string>MD5-Fingerprint:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="18" column="1">
-       <widget class="QLabel" name="md5Label">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="text">
-         <string/>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
--- a/eric7/E5Network/E5SslErrorHandler.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2013 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a SSL error handler.
-"""
-
-import contextlib
-import enum
-import platform
-
-from PyQt6.QtCore import QObject, QByteArray
-from PyQt6.QtNetwork import QSslCertificate, QSslConfiguration, QSslError, QSsl
-
-from E5Gui import E5MessageBox
-
-import Preferences
-import Utilities
-import Globals
-
-
-class E5SslErrorState(enum.Enum):
-    """
-    Class defining the SSL error handling states.
-    """
-    NOT_IGNORED = 0
-    SYSTEM_IGNORED = 1
-    USER_IGNORED = 2
-
-
-class E5SslErrorHandler(QObject):
-    """
-    Class implementing a handler for SSL errors.
-    
-    It also initializes the default SSL configuration with certificates
-    permanently accepted by the user already.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent object (QObject)
-        """
-        super().__init__(parent)
-        
-        caList = self.__getSystemCaCertificates()
-        if Preferences.Prefs.settings.contains("Help/CaCertificatesDict"):
-            # port old entries stored under 'Help'
-            certificateDict = Globals.toDict(
-                Preferences.Prefs.settings.value("Help/CaCertificatesDict"))
-            Preferences.Prefs.settings.setValue(
-                "Ssl/CaCertificatesDict", certificateDict)
-            Preferences.Prefs.settings.remove("Help/CaCertificatesDict")
-        else:
-            certificateDict = Globals.toDict(
-                Preferences.Prefs.settings.value("Ssl/CaCertificatesDict"))
-        for server in certificateDict:
-            for cert in QSslCertificate.fromData(certificateDict[server]):
-                if cert not in caList:
-                    caList.append(cert)
-        sslCfg = QSslConfiguration.defaultConfiguration()
-        sslCfg.setCaCertificates(caList)
-        try:
-            sslProtocol = QSsl.SslProtocol.TlsV1_1OrLater
-            if Globals.isWindowsPlatform() and platform.win32_ver()[0] == '7':
-                sslProtocol = QSsl.SslProtocol.SecureProtocols
-        except AttributeError:
-            sslProtocol = QSsl.SslProtocol.SecureProtocols
-        sslCfg.setProtocol(sslProtocol)
-        with contextlib.suppress(AttributeError):
-            sslCfg.setSslOption(QSsl.SslOption.SslOptionDisableCompression,
-                                True)
-        QSslConfiguration.setDefaultConfiguration(sslCfg)
-    
-    def sslErrorsReplySlot(self, reply, errors):
-        """
-        Public slot to handle SSL errors for a network reply.
-        
-        @param reply reference to the reply object (QNetworkReply)
-        @param errors list of SSL errors (list of QSslError)
-        """
-        self.sslErrorsReply(reply, errors)
-    
-    def sslErrorsReply(self, reply, errors):
-        """
-        Public slot to handle SSL errors for a network reply.
-        
-        @param reply reference to the reply object (QNetworkReply)
-        @param errors list of SSL errors (list of QSslError)
-        @return tuple indicating to ignore the SSL errors (one of NotIgnored,
-            SystemIgnored or UserIgnored) and indicating a change of the
-            default SSL configuration (boolean)
-        """
-        url = reply.url()
-        ignore, defaultChanged = self.sslErrors(errors, url.host(), url.port())
-        if ignore:
-            if defaultChanged:
-                reply.setSslConfiguration(
-                    QSslConfiguration.defaultConfiguration())
-            reply.ignoreSslErrors()
-        else:
-            reply.abort()
-        
-        return ignore, defaultChanged
-    
-    def sslErrors(self, errors, server, port=-1):
-        """
-        Public method to handle SSL errors.
-        
-        @param errors list of SSL errors
-        @type list of QSslError
-        @param server name of the server
-        @type str
-        @param port value of the port
-        @type int
-        @return tuple indicating to ignore the SSL errors and indicating a
-            change of the default SSL configuration
-        @rtype tuple of (E5SslErrorState, bool)
-        """
-        caMerge = {}
-        certificateDict = Globals.toDict(
-            Preferences.Prefs.settings.value("Ssl/CaCertificatesDict"))
-        for caServer in certificateDict:
-            caMerge[caServer] = QSslCertificate.fromData(
-                certificateDict[caServer])
-        caNew = []
-        
-        errorStrings = []
-        if port != -1:
-            server += ":{0:d}".format(port)
-        if errors:
-            for err in errors:
-                if err.error() == QSslError.SslError.NoError:
-                    continue
-                if server in caMerge and err.certificate() in caMerge[server]:
-                    continue
-                errorStrings.append(err.errorString())
-                if not err.certificate().isNull():
-                    cert = err.certificate()
-                    if cert not in caNew:
-                        caNew.append(cert)
-        if not errorStrings:
-            return E5SslErrorState.SYSTEM_IGNORED, False
-        
-        errorString = '.</li><li>'.join(errorStrings)
-        ret = E5MessageBox.yesNo(
-            None,
-            self.tr("SSL Errors"),
-            self.tr("""<p>SSL Errors for <br /><b>{0}</b>"""
-                    """<ul><li>{1}</li></ul></p>"""
-                    """<p>Do you want to ignore these errors?</p>""")
-            .format(server, errorString),
-            icon=E5MessageBox.Warning)
-        
-        if ret:
-            caRet = False
-            if len(caNew) > 0:
-                certinfos = []
-                for cert in caNew:
-                    certinfos.append(self.__certToString(cert))
-                caRet = E5MessageBox.yesNo(
-                    None,
-                    self.tr("Certificates"),
-                    self.tr(
-                        """<p>Certificates:<br/>{0}<br/>"""
-                        """Do you want to accept all these certificates?"""
-                        """</p>""")
-                    .format("".join(certinfos)))
-                if caRet:
-                    if server not in caMerge:
-                        caMerge[server] = []
-                    for cert in caNew:
-                        caMerge[server].append(cert)
-                    
-                    sslCfg = QSslConfiguration.defaultConfiguration()
-                    caList = sslCfg.caCertificates()
-                    for cert in caNew:
-                        caList.append(cert)
-                    sslCfg.setCaCertificates(caList)
-                    try:
-                        sslCfg.setProtocol(QSsl.SslProtocol.TlsV1_1OrLater)
-                    except AttributeError:
-                        sslCfg.setProtocol(QSsl.SslProtocol.SecureProtocols)
-                    with contextlib.suppress(AttributeError):
-                        sslCfg.setSslOption(
-                            QSsl.SslOption.SslOptionDisableCompression,
-                            True)
-                    QSslConfiguration.setDefaultConfiguration(sslCfg)
-                    
-                    certificateDict = {}
-                    for server in caMerge:
-                        pems = QByteArray()
-                        for cert in caMerge[server]:
-                            pems.append(cert.toPem() + b'\n')
-                        certificateDict[server] = pems
-                    Preferences.Prefs.settings.setValue(
-                        "Ssl/CaCertificatesDict",
-                        certificateDict)
-            
-            return E5SslErrorState.USER_IGNORED, caRet
-        
-        else:
-            return E5SslErrorState.NOT_IGNORED, False
-    
-    def __certToString(self, cert):
-        """
-        Private method to convert a certificate to a formatted string.
-        
-        @param cert certificate to convert (QSslCertificate)
-        @return formatted string (string)
-        """
-        result = "<p>"
-        
-        result += self.tr(
-            "Name: {0}"
-        ).format(
-            Utilities.html_encode(
-                Utilities.decodeString(
-                    ", ".join(cert.subjectInfo(
-                        QSslCertificate.SubjectInfo.CommonName))
-                )
-            )
-        )
-        
-        result += self.tr(
-            "<br/>Organization: {0}"
-        ).format(
-            Utilities.html_encode(
-                Utilities.decodeString(
-                    ", ".join(cert.subjectInfo(
-                        QSslCertificate.SubjectInfo.Organization))
-                )
-            )
-        )
-        
-        result += self.tr(
-            "<br/>Issuer: {0}"
-        ).format(
-            Utilities.html_encode(
-                Utilities.decodeString(
-                    ", ".join(cert.issuerInfo(
-                        QSslCertificate.SubjectInfo.CommonName))
-                )
-            )
-        )
-        result += self.tr(
-            "<br/>Not valid before: {0}<br/>Valid Until: {1}"
-        ).format(
-            Utilities.html_encode(
-                cert.effectiveDate().toString("yyyy-MM-dd")
-            ),
-            Utilities.html_encode(
-                cert.expiryDate().toString("yyyy-MM-dd")
-            )
-        )
-        
-        result += "</p>"
-        
-        return result
-    
-    def __getSystemCaCertificates(self):
-        """
-        Private method to get the list of system certificates.
-        
-        @return list of system certificates (list of QSslCertificate)
-        """
-        caList = QSslCertificate.fromData(Globals.toByteArray(
-            Preferences.Prefs.settings.value("Ssl/SystemCertificates")))
-        if not caList:
-            caList = QSslConfiguration.systemCaCertificates()
-        return caList
--- a/eric7/E5Network/E5SslInfoWidget.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2010 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a widget to show SSL information.
-"""
-
-from PyQt6.QtCore import Qt, QUrl, QPoint
-from PyQt6.QtWidgets import QMenu, QGridLayout, QLabel, QSizePolicy
-from PyQt6.QtNetwork import QSsl, QSslConfiguration, QSslCertificate
-
-import UI.PixmapCache
-import Utilities
-
-
-class E5SslInfoWidget(QMenu):
-    """
-    Class implementing a widget to show SSL certificate infos.
-    """
-    def __init__(self, url, configuration, parent=None):
-        """
-        Constructor
-        
-        @param url URL to show SSL info for (QUrl)
-        @param configuration SSL configuration (QSslConfiguration)
-        @param parent reference to the parent widget (QWidget)
-        """
-        super().__init__(parent)
-        
-        self.__url = QUrl(url)
-        self.__configuration = QSslConfiguration(configuration)
-        
-        self.setMinimumWidth(400)
-        
-        certList = self.__configuration.peerCertificateChain()
-        cert = certList[0] if certList else QSslCertificate()
-        
-        layout = QGridLayout(self)
-        rows = 0
-        
-        ##########################################
-        ## Identity Information
-        ##########################################
-        imageLabel = QLabel(self)
-        layout.addWidget(imageLabel, rows, 0, Qt.AlignmentFlag.AlignCenter)
-        
-        label = QLabel(self)
-        label.setWordWrap(True)
-        label.setSizePolicy(QSizePolicy.Policy.Expanding,
-                            QSizePolicy.Policy.Preferred)
-        label.setText(self.tr("Identity"))
-        font = label.font()
-        font.setBold(True)
-        label.setFont(font)
-        layout.addWidget(label, rows, 1)
-        rows += 1
-        
-        label = QLabel(self)
-        label.setWordWrap(True)
-        if cert.isNull():
-            label.setText(self.tr(
-                "Warning: this site is NOT carrying a certificate."))
-            imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityLow32"))
-        else:
-            valid = not cert.isBlacklisted()
-            if valid:
-                txt = ", ".join(
-                    cert.issuerInfo(QSslCertificate.SubjectInfo.CommonName))
-                label.setText(self.tr(
-                    "The certificate for this site is valid"
-                    " and has been verified by:\n{0}").format(
-                    Utilities.decodeString(txt)))
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityHigh32"))
-            else:
-                label.setText(self.tr(
-                    "The certificate for this site is NOT valid."))
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityLow32"))
-            layout.addWidget(label, rows, 1)
-            rows += 1
-            
-            label = QLabel(self)
-            label.setWordWrap(True)
-            label.setText(
-                '<a href="moresslinfos">' +
-                self.tr("Certificate Information") + "</a>")
-            label.linkActivated.connect(self.__showCertificateInfos)
-            layout.addWidget(label, rows, 1)
-            rows += 1
-        
-        ##########################################
-        ## Identity Information
-        ##########################################
-        imageLabel = QLabel(self)
-        layout.addWidget(imageLabel, rows, 0, Qt.AlignmentFlag.AlignCenter)
-        
-        label = QLabel(self)
-        label.setWordWrap(True)
-        label.setText(self.tr("Encryption"))
-        font = label.font()
-        font.setBold(True)
-        label.setFont(font)
-        layout.addWidget(label, rows, 1)
-        rows += 1
-        
-        cipher = self.__configuration.sessionCipher()
-        if cipher.isNull():
-            label = QLabel(self)
-            label.setWordWrap(True)
-            label.setText(self.tr(
-                'Your connection to "{0}" is NOT encrypted.\n').format(
-                self.__url.host()))
-            layout.addWidget(label, rows, 1)
-            imageLabel.setPixmap(UI.PixmapCache.getPixmap("securityLow32"))
-            rows += 1
-        else:
-            label = QLabel(self)
-            label.setWordWrap(True)
-            label.setText(self.tr(
-                'Your connection to "{0}" is encrypted.').format(
-                self.__url.host()))
-            layout.addWidget(label, rows, 1)
-            
-            proto = cipher.protocol()
-            if proto == QSsl.SslProtocol.SslV3:
-                sslVersion = "SSL 3.0"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityLow32"))
-            elif proto == QSsl.SslProtocol.TlsV1SslV3:
-                sslVersion = "TLS 1.0/SSL 3.0"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityLow32"))
-            elif proto == QSsl.SslProtocol.SslV2:
-                sslVersion = "SSL 2.0"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityLow32"))
-            else:
-                sslVersion = self.tr("unknown")
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityLow32"))
-            if proto == QSsl.SslProtocol.TlsV1_0:
-                sslVersion = "TLS 1.0"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityHigh32"))
-            elif proto == QSsl.SslProtocol.TlsV1_1:
-                sslVersion = "TLS 1.1"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityHigh32"))
-            elif proto == QSsl.SslProtocol.TlsV1_2:
-                sslVersion = "TLS 1.2"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityHigh32"))
-            elif proto == QSsl.SslProtocol.TlsV1_3:
-                sslVersion = "TLS 1.3"
-                imageLabel.setPixmap(
-                    UI.PixmapCache.getPixmap("securityHigh32"))
-            rows += 1
-            
-            label = QLabel(self)
-            label.setWordWrap(True)
-            label.setText(self.tr(
-                "It uses protocol: {0}").format(sslVersion))
-            layout.addWidget(label, rows, 1)
-            rows += 1
-            
-            label = QLabel(self)
-            label.setWordWrap(True)
-            label.setText(self.tr(
-                "It is encrypted using {0} at {1} bits, "
-                "with {2} for message authentication and "
-                "{3} as key exchange mechanism.\n\n").format(
-                cipher.encryptionMethod(),
-                cipher.usedBits(),
-                cipher.authenticationMethod(),
-                cipher.keyExchangeMethod()))
-            layout.addWidget(label, rows, 1)
-            rows += 1
-    
-    def showAt(self, pos):
-        """
-        Public method to show the widget.
-        
-        @param pos position to show at (QPoint)
-        """
-        self.adjustSize()
-        xpos = pos.x() - self.width()
-        if xpos < 0:
-            xpos = 10
-        p = QPoint(xpos, pos.y() + 10)
-        self.move(p)
-        self.show()
-    
-    def __showCertificateInfos(self):
-        """
-        Private slot to show certificate information.
-        """
-        from .E5SslCertificatesInfoDialog import E5SslCertificatesInfoDialog
-        dlg = E5SslCertificatesInfoDialog(
-            self.__configuration.peerCertificateChain())
-        dlg.exec()
-    
-    def accept(self):
-        """
-        Public method to accept the widget.
-        """
-        self.close()
--- a/eric7/E5Network/E5SslUtilities.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2015 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing SSL utility functions.
-"""
-
-
-def initSSL():
-    """
-    Function to initialize some global SSL stuff.
-    """
-    blacklist = [
-        "SRP-AES-256-CBC-SHA",          # open to MitM
-        "SRP-AES-128-CBC-SHA",          # open to MitM
-    ]
-    
-    try:
-        from PyQt6.QtNetwork import QSslConfiguration
-    except ImportError:
-        # no SSL available, so there is nothing to initialize
-        return
-    
-    strongCiphers = [c for c in QSslConfiguration.supportedCiphers()
-                     if c.name() not in blacklist and c.usedBits() >= 128]
-    defaultSslConfiguration = QSslConfiguration.defaultConfiguration()
-    defaultSslConfiguration.setCiphers(strongCiphers)
-    QSslConfiguration.setDefaultConfiguration(defaultSslConfiguration)
--- a/eric7/E5Network/E5TldExtractor.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,554 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2016 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing the TLD Extractor.
-"""
-
-#
-# This is a Python port of the TLDExtractor of Qupzilla
-# Copyright (C) 2014  Razi Alavizadeh <s.r.alavizadeh@gmail.com>
-#
-
-import collections
-import os
-import re
-
-from PyQt6.QtCore import QObject, QUrl, QFile, QFileInfo, qWarning
-
-from E5Gui import E5MessageBox
-
-
-class E5TldHostParts:
-    """
-    Class implementing the host parts helper.
-    """
-    def __init__(self):
-        """
-        Constructor
-        """
-        self.host = ""
-        self.tld = ""
-        self.domain = ""
-        self.registrableDomain = ""
-        self.subdomain = ""
-
-
-class E5TldExtractor(QObject):
-    """
-    Class implementing the TLD Extractor.
-    
-    Note: The module function instance() should be used to get a reference
-    to a global object to avoid overhead.
-    """
-    def __init__(self, withPrivate=False, parent=None):
-        """
-        Constructor
-        
-        @param withPrivate flag indicating to load private TLDs as well
-        @type bool
-        @param parent reference to the parent object
-        @type QObject
-        """
-        super().__init__(parent)
-        
-        self.__withPrivate = withPrivate
-        self.__dataFileName = ""
-        self.__dataSearchPaths = []
-        
-        self.__tldDict = collections.defaultdict(list)
-        # dict with list of str as values
-        
-        self.setDataSearchPaths()
-    
-    def isDataLoaded(self):
-        """
-        Public method to check, if the TLD data ia already loaded.
-        
-        @return flag indicating data is loaded
-        @rtype bool
-        """
-        return bool(self.__tldDict)
-    
-    def tld(self, host):
-        """
-        Public method to get the top level domain for a host.
-        
-        @param host host name to get TLD for
-        @type str
-        @return TLD for host
-        @rtype str
-        """
-        if not host or host.startswith("."):
-            return ""
-        
-        cleanHost = self.__normalizedHost(host)
-        
-        tldPart = cleanHost[cleanHost.rfind(".") + 1:]
-        cleanHost = bytes(QUrl.toAce(cleanHost)).decode("utf-8")
-        
-        self.__loadData()
-        
-        if tldPart not in self.__tldDict:
-            return tldPart
-        
-        tldRules = self.__tldDict[tldPart][:]
-        
-        if tldPart not in tldRules:
-            tldRules.append(tldPart)
-        
-        maxLabelCount = 0
-        isWildcardTLD = False
-        
-        for rule in tldRules:
-            labelCount = rule.count(".") + 1
-            
-            if rule.startswith("!"):
-                rule = rule[1:]
-                
-                rule = bytes(QUrl.toAce(rule)).decode("utf-8")
-                
-                # matches with exception TLD
-                if cleanHost.endswith(rule):
-                    tldPart = rule[rule.find(".") + 1:]
-                    break
-            
-            if rule.startswith("*"):
-                rule = rule[1:]
-                
-                if rule.startswith("."):
-                    rule = rule[1:]
-                
-                isWildcardTLD = True
-            else:
-                isWildcardTLD = False
-            
-            rule = bytes(QUrl.toAce(rule)).decode("utf-8")
-            testRule = "." + rule
-            testUrl = "." + cleanHost
-            
-            if labelCount > maxLabelCount and testUrl.endswith(testRule):
-                tldPart = rule
-                maxLabelCount = labelCount
-                
-                if isWildcardTLD:
-                    temp = cleanHost
-                    temp = temp[:temp.rfind(tldPart)]
-                    
-                    if temp.endswith("."):
-                        temp = temp[:-1]
-                    
-                    temp = temp[temp.rfind(".") + 1:]
-                    
-                    if temp:
-                        tldPart = temp + "." + rule
-                    else:
-                        tldPart = rule
-        
-        temp = self.__normalizedHost(host)
-        tldPart = ".".join(
-            temp.split(".")[temp.count(".") - tldPart.count("."):])
-        
-        return tldPart
-    
-    def domain(self, host):
-        """
-        Public method to get the domain for a host.
-        
-        @param host host name to get the domain for
-        @type str
-        @return domain for host
-        @rtype str
-        """
-        tldPart = self.tld(host)
-        
-        return self.__domainHelper(host, tldPart)
-    
-    def registrableDomain(self, host):
-        """
-        Public method to get the registrable domain for a host.
-        
-        @param host host name to get the registrable domain for
-        @type str
-        @return registrable domain for host
-        @rtype str
-        """
-        tldPart = self.tld(host)
-        
-        return self.__registrableDomainHelper(
-            self.__domainHelper(host, tldPart), tldPart)
-    
-    def subdomain(self, host):
-        """
-        Public method to get the subdomain for a host.
-        
-        @param host host name to get the subdomain for
-        @type str
-        @return subdomain for host
-        @rtype str
-        """
-        return self.__subdomainHelper(host, self.registrableDomain(host))
-    
-    def splitParts(self, host):
-        """
-        Public method to split a host address into its parts.
-        
-        @param host host address to be split
-        @type str
-        @return splitted host address
-        @rtype E5TldHostParts
-        """
-        hostParts = E5TldHostParts()
-        hostParts.host = host
-        hostParts.tld = self.tld(host)
-        hostParts.domain = self.__domainHelper(host, hostParts.tld)
-        hostParts.registrableDomain = self.__registrableDomainHelper(
-            hostParts.domain, hostParts.tld)
-        hostParts.subdomain = self.__subdomainHelper(
-            host, hostParts.registrableDomain)
-        
-        return hostParts
-    
-    def dataSearchPaths(self):
-        """
-        Public method to get the search paths for the TLD data file.
-        
-        @return search paths for the TLD data file
-        @rtype list of str
-        """
-        return self.__dataSearchPaths[:]
-    
-    def setDataSearchPaths(self, searchPaths=None):
-        """
-        Public method to set the search paths for the TLD data file.
-        
-        @param searchPaths search paths for the TLD data file or None,
-            if the default search paths shall be set
-        @type list of str
-        """
-        if searchPaths:
-            self.__dataSearchPaths = searchPaths[:]
-            self.__dataSearchPaths.extend(self.__defaultDataSearchPaths())
-        else:
-            self.__dataSearchPaths = self.__defaultDataSearchPaths()[:]
-        
-        # remove duplicates
-        paths = []
-        for p in self.__dataSearchPaths:
-            if p not in paths:
-                paths.append(p)
-        self.__dataSearchPaths = paths
-    
-    def __defaultDataSearchPaths(self):
-        """
-        Private method to get the default search paths for the TLD data file.
-        
-        @return default search paths for the TLD data file
-        @rtype list of str
-        """
-        return [os.path.join(os.path.dirname(__file__), "data")]
-    
-    def getTldDownloadUrl(self):
-        """
-        Public method to get the TLD data file download URL.
-        
-        @return download URL
-        @rtype QUrl
-        """
-        return QUrl(
-            "http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/"
-            "effective_tld_names.dat?raw=1")
-    
-    def __loadData(self):
-        """
-        Private method to load the TLD data.
-        """
-        if self.isDataLoaded():
-            return
-        
-        dataFileName = ""
-        parsedDataFileExist = False
-        
-        for path in self.__dataSearchPaths:
-            dataFileName = (
-                QFileInfo(path + "/effective_tld_names.dat").absoluteFilePath()
-            )
-            if QFileInfo(dataFileName).exists():
-                parsedDataFileExist = True
-                break
-        
-        if not parsedDataFileExist:
-            tldDataFileDownloadLink = (
-                "http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/"
-                "effective_tld_names.dat?raw=1"
-            )
-            E5MessageBox.information(
-                None,
-                self.tr("TLD Data File not found"),
-                self.tr("""<p>The file 'effective_tld_names.dat' was not"""
-                        """ found!<br/>You can download it from """
-                        """'<a href="{0}"><b>here</b></a>' to one of the"""
-                        """ following paths:</p><ul>{1}</ul>""").format(
-                    tldDataFileDownloadLink,
-                    "".join(["<li>{0}</li>".format(p)
-                             for p in self.__dataSearchPaths]))
-            )
-            return
-        
-        self.__dataFileName = dataFileName
-        if not self.__parseData(dataFileName,
-                                loadPrivateDomains=self.__withPrivate):
-            qWarning(
-                "E5TldExtractor: There are some parse errors for file: {0}"
-                .format(dataFileName))
-    
-    def __parseData(self, dataFile, loadPrivateDomains=False):
-        """
-        Private method to parse TLD data.
-        
-        @param dataFile name of the file containing the TLD data
-        @type str
-        @param loadPrivateDomains flag indicating to load private domains
-        @type bool
-        @return flag indicating success
-        @rtype bool
-        """
-        # start with a fresh dictionary
-        self.__tldDict = collections.defaultdict(list)
-        
-        file = QFile(dataFile)
-        
-        if not file.open(QFile.ReadOnly | QFile.Text):
-            return False
-        
-        seekToEndOfPrivateDomains = False
-        
-        while not file.atEnd():
-            line = bytes(file.readLine()).decode("utf-8").strip()
-            if not line:
-                continue
-            
-            if line.startswith("."):
-                line = line[1:]
-            
-            if line.startswith("//"):
-                if "===END PRIVATE DOMAINS===" in line:
-                    seekToEndOfPrivateDomains = False
-                
-                if (
-                    not loadPrivateDomains and
-                    "===BEGIN PRIVATE DOMAINS===" in line
-                ):
-                    seekToEndOfPrivateDomains = True
-                
-                continue
-            
-            if seekToEndOfPrivateDomains:
-                continue
-            
-            # only data up to the first whitespace is used
-            line = line.split(None, 1)[0]
-            
-            if "." not in line:
-                self.__tldDict[line].append(line)
-            else:
-                key = line[line.rfind(".") + 1:]
-                self.__tldDict[key].append(line)
-        
-        return self.isDataLoaded()
-    
-    def __domainHelper(self, host, tldPart):
-        """
-        Private method to get the domain name without TLD.
-        
-        @param host host address
-        @type str
-        @param tldPart TLD part of the host address
-        @type str
-        @return domain name
-        @rtype str
-        """
-        if not host or not tldPart:
-            return ""
-        
-        temp = self.__normalizedHost(host)
-        temp = temp[:temp.rfind(tldPart)]
-        
-        if temp.endswith("."):
-            temp = temp[:-1]
-        
-        return temp[temp.rfind(".") + 1:]
-    
-    def __registrableDomainHelper(self, domainPart, tldPart):
-        """
-        Private method to get the registrable domain (i.e. domain plus TLD).
-        
-        @param domainPart domain part of a host address
-        @type str
-        @param tldPart TLD part of a host address
-        @type str
-        @return registrable domain name
-        @rtype str
-        """
-        if not tldPart or not domainPart:
-            return ""
-        else:
-            return "{0}.{1}".format(domainPart, tldPart)
-    
-    def __subdomainHelper(self, host, registrablePart):
-        """
-        Private method to get the subdomain of a host address (i.e. domain part
-        without the registrable domain name).
-        
-        @param host host address
-        @type str
-        @param registrablePart registrable domain part of the host address
-        @type str
-        @return subdomain name
-        @rtype str
-        """
-        if not host or not registrablePart:
-            return ""
-        
-        subdomain = self.__normalizedHost(host)
-        
-        subdomain = subdomain[:subdomain.rfind(registrablePart)]
-        
-        if subdomain.endswith("."):
-            subdomain = subdomain[:-1]
-        
-        return subdomain
-    
-    def __normalizedHost(self, host):
-        """
-        Private method to get the normalized host for a host address.
-        
-        @param host host address to be normalized
-        @type str
-        @return normalized host address
-        @rtype str
-        """
-        return host.lower()
-    
-    #################################################################
-    ## Methods below are for testing purposes
-    #################################################################
-    
-    def test(self):
-        """
-        Public method to execute the tests.
-        
-        @return flag indicating the test result
-        @rtype bool
-        """
-        self.__withPrivate = True
-        self.__loadData()
-        if not self.__tldDict:
-            return False
-        
-        testDataFileName = ""
-        testDataFileExist = False
-        
-        for path in self.__dataSearchPaths:
-            testDataFileName = (
-                QFileInfo(path + "/test_psl.txt").absoluteFilePath()
-            )
-            if QFileInfo(testDataFileName).exists():
-                testDataFileExist = True
-                break
-        
-        if not testDataFileExist:
-            testFileDownloadLink = (
-                "http://mxr.mozilla.org/mozilla-central/source/netwerk/test/"
-                "unit/data/test_psl.txt?raw=1"
-            )
-            E5MessageBox.information(
-                None,
-                self.tr("TLD Data File not found"),
-                self.tr("""<p>The file 'test_psl.txt' was not found!"""
-                        """<br/>You can download it from '<a href="{0}">"""
-                        """<b>here</b></a>' to one of the following"""
-                        """ paths:</p><ul>{1}</ul>""").format(
-                    testFileDownloadLink,
-                    "".join(["<li>{0}</li>".format(p)
-                             for p in self.__dataSearchPaths]))
-            )
-            return False
-        
-        file = QFile(testDataFileName)
-        
-        if not file.open(QFile.ReadOnly | QFile.Text):
-            return False
-        
-        testRegExp = re.compile(
-            "checkPublicSuffix\\(('([^']+)'|null), ('([^']+)'|null)\\);")
-        allTestSuccess = True
-        
-        while not file.atEnd():
-            line = bytes(file.readLine()).decode("utf-8").strip()
-            if not line or line.startswith("//"):
-                continue
-            
-            match = testRegExp.search(line)
-            if match is None:
-                allTestSuccess = False
-            else:
-                hostName, registrableName = match.group(2, 4)
-                
-                if not self.__checkPublicSuffix(hostName, registrableName):
-                    allTestSuccess = False
-        
-        if allTestSuccess:
-            qWarning("E5TldExtractor: Test passed successfully.")
-        else:
-            qWarning("E5TldExtractor: Test finished with some errors!")
-        
-        # reset the TLD dictionary
-        self.__tldDict = collections.defaultdict(list)
-        
-        return allTestSuccess
-    
-    def __checkPublicSuffix(self, host, registrableName):
-        """
-        Private method to test a host name against a registrable name.
-        
-        @param host host name to test
-        @type str
-        @param registrableName registrable domain name to test against
-        @type str
-        @return flag indicating the check result
-        @rtype bool
-        """
-        regName = self.registrableDomain(host)
-        if regName != registrableName:
-            qWarning(
-                "E5TldExtractor Test Error: hostName: {0}\n"
-                "    Correct registrableName:    {1}\n"
-                "    Calculated registrableName: {2}".format(
-                    host, registrableName, regName))
-            return False
-        
-        return True
-
-
-_TLDExtractor = None
-
-
-def instance(withPrivate=False):
-    """
-    Global function to get a reference to the TLD extractor and create it, if
-    it hasn't been yet.
-    
-    @param withPrivate flag indicating to load private TLDs as well
-    @type bool
-    @return reference to the zoom manager object
-    @rtype E5TldExtractor
-    """
-    global _TLDExtractor
-    
-    if _TLDExtractor is None:
-        _TLDExtractor = E5TldExtractor(withPrivate=withPrivate)
-    
-    return _TLDExtractor
--- a/eric7/E5Network/E5UrlInfo.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,272 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2012 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a class replacing QUrlInfo.
-"""
-
-import enum
-
-from PyQt6.QtCore import QDateTime
-
-
-class E5UrlPermission(enum.IntEnum):
-    """
-    Class defining the URL permissions.
-    """
-    READ_OWNER = 0o0400
-    WRITE_OWNER = 0o0200
-    EXE_OWNER = 0o0100
-    READ_GROUP = 0o0040
-    WRITE_GROUP = 0o0020
-    EXE_GROUP = 0o0010
-    READ_OTHER = 0o0004
-    WRITE_OTHER = 0o0002
-    EXE_OTHER = 0o0001
-
-
-class E5UrlInfo:
-    """
-    Class implementing a replacement for QUrlInfo.
-    """
-    def __init__(self):
-        """
-        Constructor
-        """
-        self.__valid = False
-        
-        self.__permissions = 0
-        self.__size = 0
-        self.__isDir = False
-        self.__isFile = True
-        self.__isSymlink = False
-        self.__isWritable = True
-        self.__isReadable = True
-        self.__isExecutable = False
-        self.__name = ""
-        self.__owner = ""
-        self.__group = ""
-        self.__lastModified = QDateTime()
-        self.__lastRead = QDateTime()
-    
-    def isValid(self):
-        """
-        Public method to check the validity of the object.
-        
-        @return flag indicating validity (boolean)
-        """
-        return self.__valid
-    
-    def setName(self, name):
-        """
-        Public method to set the name.
-        
-        @param name name to be set (string)
-        """
-        self.__name = name
-        self.__valid = True
-    
-    def setPermissions(self, permissions):
-        """
-        Public method to set the permissions.
-        
-        @param permissions permissions to be set (integer)
-        """
-        self.__permissions = permissions
-        self.__valid = True
-    
-    def setDir(self, isDir):
-        """
-        Public method to indicate a directory.
-        
-        @param isDir flag indicating a directory (boolean)
-        """
-        self.__isDir = isDir
-        self.__valid = True
-    
-    def setFile(self, isFile):
-        """
-        Public method to indicate a file.
-        
-        @param isFile flag indicating a file (boolean)
-        """
-        self.__isFile = isFile
-        self.__valid = True
-    
-    def setSymLink(self, isSymLink):
-        """
-        Public method to indicate a symbolic link.
-        
-        @param isSymLink flag indicating a symbolic link (boolean)
-        """
-        self.__isSymLink = isSymLink
-        self.__valid = True
-    
-    def setOwner(self, owner):
-        """
-        Public method to set the owner.
-        
-        @param owner owner to be set (string)
-        """
-        self.__owner = owner
-        self.__valid = True
-    
-    def setGroup(self, group):
-        """
-        Public method to set the group.
-        
-        @param group group to be set (string)
-        """
-        self.__group = group
-        self.__valid = True
-    
-    def setSize(self, size):
-        """
-        Public method to set the size.
-        
-        @param size size to be set (integer)
-        """
-        self.__size = size
-        self.__valid = True
-    
-    def setWritable(self, isWritable):
-        """
-        Public method to a writable entry.
-        
-        @param isWritable flag indicating a writable entry (boolean)
-        """
-        self.__isWritable = isWritable
-        self.__valid = True
-    
-    def setReadable(self, isReadable):
-        """
-        Public method to a readable entry.
-        
-        @param isReadable flag indicating a readable entry (boolean)
-        """
-        self.__isReadable = isReadable
-        self.__valid = True
-    
-    def setLastModified(self, dt):
-        """
-        Public method to set the last modified date and time.
-        
-        @param dt date and time to set (QDateTime)
-        """
-        self.__lastModified = QDateTime(dt)
-        self.__valid = True
-    
-    def setLastRead(self, dt):
-        """
-        Public method to set the last read date and time.
-        
-        @param dt date and time to set (QDateTime)
-        """
-        self.__lastRead = QDateTime(dt)
-        self.__valid = True
-    
-    def name(self):
-        """
-        Public method to get the name.
-        
-        @return name (string)
-        """
-        return self.__name
-    
-    def permissions(self):
-        """
-        Public method to get the permissions.
-        
-        @return permissions (integer)
-        """
-        return self.__permissions
-    
-    def owner(self):
-        """
-        Public method to get the owner.
-        
-        @return owner (string)
-        """
-        return self.__owner
-    
-    def group(self):
-        """
-        Public method to get the group.
-        
-        @return group (string)
-        """
-        return self.__group
-    
-    def size(self):
-        """
-        Public method to get the size.
-        
-        @return size (integer)
-        """
-        return self.__size
-    
-    def lastModified(self):
-        """
-        Public method to get the last modified date and time.
-        
-        @return last modified date and time (QDateTime)
-        """
-        return QDateTime(self.__lastModified)
-    
-    def lastRead(self):
-        """
-        Public method to get the last read date and time.
-        
-        @return last read date and time (QDateTime)
-        """
-        return QDateTime(self.__lastRead)
-    
-    def isDir(self):
-        """
-        Public method to test, if the entry is a directory.
-        
-        @return flag indicating a directory (boolean)
-        """
-        return self.__isDir
-    
-    def isFile(self):
-        """
-        Public method to test, if the entry is a file.
-        
-        @return flag indicating a file (boolean)
-        """
-        return self.__isFile
-    
-    def isSymLink(self):
-        """
-        Public method to test, if the entry is a symbolic link.
-        
-        @return flag indicating a symbolic link (boolean)
-        """
-        return self.__isSymlink
-    
-    def isWritable(self):
-        """
-        Public method to test, if the entry is writable.
-        
-        @return flag indicating writable (boolean)
-        """
-        return self.__isWritable
-    
-    def isReadable(self):
-        """
-        Public method to test, if the entry is readable.
-        
-        @return flag indicating readable (boolean)
-        """
-        return self.__isReadable
-    
-    def isExecutable(self):
-        """
-        Public method to test, if the entry is executable.
-        
-        @return flag indicating executable (boolean)
-        """
-        return self.__isExecutable
--- a/eric7/E5Network/E5XmlRpcClient.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,139 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2015 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing a xmlrpc client for Qt.
-"""
-
-import xmlrpc.client as xmlrpc
-
-from PyQt6.QtCore import Qt, QObject, QUrl, QByteArray, QEventLoop
-from PyQt6.QtGui import QGuiApplication, QCursor
-from PyQt6.QtNetwork import (
-    QNetworkAccessManager, QNetworkRequest, QNetworkReply
-)
-
-from E5Network.E5NetworkProxyFactory import proxyAuthenticationRequired
-try:
-    from E5Network.E5SslErrorHandler import E5SslErrorHandler, E5SslErrorState
-    SSL_AVAILABLE = True
-except ImportError:
-    SSL_AVAILABLE = False
-
-
-class E5XmlRpcClient(QObject):
-    """
-    Class implementing a xmlrpc client for Qt.
-    """
-    def __init__(self, url, parent=None):
-        """
-        Constructor
-        
-        @param url xmlrpc handler URL (string or QUrl)
-        @param parent parent object (QObject)
-        """
-        super().__init__(parent)
-        
-        # attributes for the network objects
-        self.__networkManager = QNetworkAccessManager(self)
-        self.__networkManager.proxyAuthenticationRequired.connect(
-            proxyAuthenticationRequired)
-        self.__networkManager.finished.connect(self.__replyFinished)
-        if SSL_AVAILABLE:
-            self.__sslErrorHandler = E5SslErrorHandler(self)
-            self.__networkManager.sslErrors.connect(self.__sslErrors)
-        
-        self.__callmap = {}
-        
-        self.__request = QNetworkRequest(QUrl(url))
-        self.__request.setRawHeader(b"User-Agent", b"E5XmlRpcClient/1.0")
-        self.__request.setHeader(
-            QNetworkRequest.KnownHeaders.ContentTypeHeader, "text/xml")
-    
-    def setUrl(self, url):
-        """
-        Public slot to set the xmlrpc handler URL.
-        
-        @param url xmlrpc handler URL (string or QUrl)
-        """
-        url = QUrl(url)
-        if url.isValid():
-            self.__request.setUrl(url)
-    
-    def call(self, method, args, responseCallback, errorCallback):
-        """
-        Public method to call the remote server.
-        
-        @param method name of the remote method to be called (string)
-        @param args tuple of method arguments (tuple)
-        @param responseCallback method to be called with the returned
-            result as a tuple (function)
-        @param errorCallback method to be called in case of an error
-            with error code and error string (function)
-        @exception TypeError raised to indicate an illegal 'args' parameter
-            type
-        """
-        if not isinstance(args, tuple):
-            raise TypeError("argument 'args' must be tuple")
-        
-        QGuiApplication.setOverrideCursor(QCursor(Qt.CursorShape.WaitCursor))
-        QGuiApplication.processEvents(
-            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-        
-        data = xmlrpc.dumps(args, method).encode("utf-8")
-        reply = self.__networkManager.post(
-            self.__request, QByteArray(data))
-        self.__callmap[reply] = (responseCallback, errorCallback)
-    
-    def abort(self):
-        """
-        Public method to abort all calls.
-        """
-        for reply in list(self.__callmap):
-            if reply.isRunning():
-                reply.abort()
-    
-    def __sslErrors(self, reply, errors):
-        """
-        Private slot to handle SSL errors.
-        
-        @param reply reference to the reply object (QNetworkReply)
-        @param errors list of SSL errors (list of QSslError)
-        """
-        QGuiApplication.restoreOverrideCursor()
-        QGuiApplication.processEvents(
-            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-        
-        ignored = self.__sslErrorHandler.sslErrorsReply(reply, errors)[0]
-        if ignored == E5SslErrorState.NOT_IGNORED and reply in self.__callmap:
-            self.__callmap[reply][1](xmlrpc.TRANSPORT_ERROR, self.tr(
-                "SSL Error"))
-    
-    def __replyFinished(self, reply):
-        """
-        Private slot handling the receipt of a reply.
-        
-        @param reply reference to the finished reply (QNetworkReply)
-        """
-        if reply not in self.__callmap:
-            return
-        
-        QGuiApplication.restoreOverrideCursor()
-        QGuiApplication.processEvents(
-            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
-        
-        if reply.error() != QNetworkReply.NetworkError.NoError:
-            self.__callmap[reply][1](xmlrpc.TRANSPORT_ERROR,
-                                     reply.errorString())
-        else:
-            data = bytes(reply.readAll()).decode("utf-8")
-            try:
-                data = xmlrpc.loads(data)[0]
-                self.__callmap[reply][0](data)
-            except xmlrpc.Fault as fault:
-                self.__callmap[reply][1](fault.faultCode, fault.faultString)
-        
-        reply.deleteLater()
-        del self.__callmap[reply]
--- a/eric7/E5Network/__init__.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2009 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Package implementing some special network related objects and functions.
-"""
-
-from PyQt6.QtNetwork import QAbstractSocket, QHostAddress
-
-
-def isValidAddress(address):
-    """
-    Public function to check, if the given address is valid.
-    
-    @param address IPv4 or IPv6 address string
-    @type str
-    @return flag indicating validity
-    @rtype bool
-    """
-    h = QHostAddress(address)
-    return not h.isNull()
-
-
-def isValidIPv4Address(address):
-    """
-    Public function to check, if the given address is a valid IPv4 address.
-    
-    @param address IPv4 address string
-    @type str
-    @return flag indicating validity
-    @rtype bool
-    """
-    h = QHostAddress(address)
-    return (
-        not h.isNull() and
-        h.protocol() == QAbstractSocket.NetworkLayerProtocol.IPv4Protocol
-    )
-
-
-def isValidIPv6Address(address):
-    """
-    Public function to check, if the given address is a valid IPv6 address.
-    
-    @param address IPv6 address string
-    @type str
-    @return flag indicating validity
-    @rtype bool
-    """
-    h = QHostAddress(address)
-    return (
-        not h.isNull() and
-        h.protocol() == QAbstractSocket.NetworkLayerProtocol.IPv6Protocol
-    )
--- a/eric7/E5Network/data/__init__.py	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2016 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Package defining some data used by the networking code.
-"""
--- a/eric7/E5Network/data/effective_tld_names.dat	Sat May 22 12:54:57 2021 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11476 +0,0 @@
-// This Source Code Form is subject to the terms of the Mozilla Public
-// License, v. 2.0. If a copy of the MPL was not distributed with this
-// file, You can obtain one at https://mozilla.org/MPL/2.0/.
-
-// ===BEGIN ICANN DOMAINS===
-
-// ac : https://en.wikipedia.org/wiki/.ac
-ac
-com.ac
-edu.ac
-gov.ac
-net.ac
-mil.ac
-org.ac
-
-// ad : https://en.wikipedia.org/wiki/.ad
-ad
-nom.ad
-
-// ae : https://en.wikipedia.org/wiki/.ae
-// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php
-ae
-co.ae
-net.ae
-org.ae
-sch.ae
-ac.ae
-gov.ae
-mil.ae
-
-// aero : see https://www.information.aero/index.php?id=66
-aero
-accident-investigation.aero
-accident-prevention.aero
-aerobatic.aero
-aeroclub.aero
-aerodrome.aero
-agents.aero
-aircraft.aero
-airline.aero
-airport.aero
-air-surveillance.aero
-airtraffic.aero
-air-traffic-control.aero
-ambulance.aero
-amusement.aero
-association.aero
-author.aero
-ballooning.aero
-broker.aero
-caa.aero
-cargo.aero
-catering.aero
-certification.aero
-championship.aero
-charter.aero
-civilaviation.aero
-club.aero
-conference.aero
-consultant.aero
-consulting.aero
-control.aero
-council.aero
-crew.aero
-design.aero
-dgca.aero
-educator.aero
-emergency.aero
-engine.aero
-engineer.aero
-entertainment.aero
-equipment.aero
-exchange.aero
-express.aero
-federation.aero
-flight.aero
-freight.aero
-fuel.aero
-gliding.aero
-government.aero
-groundhandling.aero
-group.aero
-hanggliding.aero
-homebuilt.aero
-insurance.aero
-journal.aero
-journalist.aero
-leasing.aero
-logistics.aero
-magazine.aero
-maintenance.aero
-media.aero
-microlight.aero
-modelling.aero
-navigation.aero
-parachuting.aero
-paragliding.aero
-passenger-association.aero
-pilot.aero
-press.aero
-production.aero
-recreation.aero
-repbody.aero
-res.aero
-research.aero
-rotorcraft.aero
-safety.aero
-scientist.aero
-services.aero
-show.aero
-skydiving.aero
-software.aero
-student.aero
-trader.aero
-trading.aero
-trainer.aero
-union.aero
-workinggroup.aero
-works.aero
-
-// af : http://www.nic.af/help.jsp
-af
-gov.af
-com.af
-org.af
-net.af
-edu.af
-
-// ag : http://www.nic.ag/prices.htm
-ag
-com.ag
-org.ag
-net.ag
-co.ag
-nom.ag
-
-// ai : http://nic.com.ai/
-ai
-off.ai
-com.ai
-net.ai
-org.ai
-
-// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31
-al
-com.al
-edu.al
-gov.al
-mil.al
-net.al
-org.al
-
-// am : https://en.wikipedia.org/wiki/.am
-am
-
-// ao : https://en.wikipedia.org/wiki/.ao
-// http://www.dns.ao/REGISTR.DOC
-ao
-ed.ao
-gv.ao
-og.ao
-co.ao
-pb.ao
-it.ao
-
-// aq : https://en.wikipedia.org/wiki/.aq
-aq
-
-// ar : https://nic.ar/normativa-vigente.xhtml
-ar
-com.ar
-edu.ar
-gob.ar
-gov.ar
-int.ar
-mil.ar
-net.ar
-org.ar
-tur.ar
-
-// arpa : https://en.wikipedia.org/wiki/.arpa
-// Confirmed by registry <iana-questions@icann.org> 2008-06-18
-arpa
-e164.arpa
-in-addr.arpa
-ip6.arpa
-iris.arpa
-uri.arpa
-urn.arpa
-
-// as : https://en.wikipedia.org/wiki/.as
-as
-gov.as
-
-// asia : https://en.wikipedia.org/wiki/.asia
-asia
-
-// at : https://en.wikipedia.org/wiki/.at
-// Confirmed by registry <it@nic.at> 2008-06-17
-at
-ac.at
-co.at
-gv.at
-or.at
-
-// au : https://en.wikipedia.org/wiki/.au
-// http://www.auda.org.au/
-au
-// 2LDs
-com.au
-net.au
-org.au
-edu.au
-gov.au
-asn.au
-id.au
-// Historic 2LDs (closed to new registration, but sites still exist)
-info.au
-conf.au
-oz.au
-// CGDNs - http://www.cgdn.org.au/
-act.au
-nsw.au
-nt.au
-qld.au
-sa.au
-tas.au
-vic.au
-wa.au
-// 3LDs
-act.edu.au
-nsw.edu.au
-nt.edu.au
-qld.edu.au
-sa.edu.au
-tas.edu.au
-vic.edu.au
-wa.edu.au
-// act.gov.au  Bug 984824 - Removed at request of Greg Tankard
-// nsw.gov.au  Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au>
-// nt.gov.au  Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au>
-qld.gov.au
-sa.gov.au
-tas.gov.au
-vic.gov.au
-wa.gov.au
-
-// aw : https://en.wikipedia.org/wiki/.aw
-aw
-com.aw
-
-// ax : https://en.wikipedia.org/wiki/.ax
-ax
-
-// az : https://en.wikipedia.org/wiki/.az
-az
-com.az
-net.az
-int.az
-gov.az
-org.az
-edu.az
-info.az
-pp.az
-mil.az
-name.az
-pro.az
-biz.az
-
-// ba : https://en.wikipedia.org/wiki/.ba
-ba
-org.ba
-net.ba
-edu.ba
-gov.ba
-mil.ba
-unsa.ba
-unbi.ba
-co.ba
-com.ba
-rs.ba
-
-// bb : https://en.wikipedia.org/wiki/.bb
-bb
-biz.bb
-co.bb
-com.bb
-edu.bb
-gov.bb
-info.bb
-net.bb
-org.bb
-store.bb
-tv.bb
-
-// bd : https://en.wikipedia.org/wiki/.bd
-*.bd
-
-// be : https://en.wikipedia.org/wiki/.be
-// Confirmed by registry <tech@dns.be> 2008-06-08
-be
-ac.be
-
-// bf : https://en.wikipedia.org/wiki/.bf
-bf
-gov.bf
-
-// bg : https://en.wikipedia.org/wiki/.bg
-// https://www.register.bg/user/static/rules/en/index.html
-bg
-a.bg
-b.bg
-c.bg
-d.bg
-e.bg
-f.bg
-g.bg
-h.bg
-i.bg
-j.bg
-k.bg
-l.bg
-m.bg
-n.bg
-o.bg
-p.bg
-q.bg
-r.bg
-s.bg
-t.bg
-u.bg
-v.bg
-w.bg
-x.bg
-y.bg
-z.bg
-0.bg
-1.bg
-2.bg
-3.bg
-4.bg
-5.bg
-6.bg
-7.bg
-8.bg
-9.bg
-
-// bh : https://en.wikipedia.org/wiki/.bh
-bh
-com.bh
-edu.bh
-net.bh
-org.bh
-gov.bh
-
-// bi : https://en.wikipedia.org/wiki/.bi
-// http://whois.nic.bi/
-bi
-co.bi
-com.bi
-edu.bi
-or.bi
-org.bi
-
-// biz : https://en.wikipedia.org/wiki/.biz
-biz
-
-// bj : https://en.wikipedia.org/wiki/.bj
-bj
-asso.bj
-barreau.bj
-gouv.bj
-
-// bm : http://www.bermudanic.bm/dnr-text.txt
-bm
-com.bm
-edu.bm
-gov.bm
-net.bm
-org.bm
-
-// bn : https://en.wikipedia.org/wiki/.bn
-*.bn
-
-// bo : http://www.nic.bo/
-bo
-com.bo
-edu.bo
-gov.bo
-gob.bo
-int.bo
-org.bo
-net.bo
-mil.bo
-tv.bo
-
-// br : http://registro.br/dominio/categoria.html
-// Submitted by registry <fneves@registro.br>
-br
-adm.br
-adv.br
-agr.br
-am.br
-arq.br
-art.br
-ato.br
-b.br
-bio.br
-blog.br
-bmd.br
-cim.br
-cng.br
-cnt.br
-com.br
-coop.br
-ecn.br
-eco.br
-edu.br
-emp.br
-eng.br
-esp.br
-etc.br
-eti.br
-far.br
-flog.br
-fm.br
-fnd.br
-fot.br
-fst.br
-g12.br
-ggf.br
-gov.br
-imb.br
-ind.br
-inf.br
-jor.br
-jus.br
-leg.br
-lel.br
-mat.br
-med.br
-mil.br
-mp.br
-mus.br
-net.br
-*.nom.br
-not.br
-ntr.br
-odo.br
-org.br
-ppg.br
-pro.br
-psc.br
-psi.br
-qsl.br
-radio.br
-rec.br
-slg.br
-srv.br
-taxi.br
-teo.br
-tmp.br
-trd.br
-tur.br
-tv.br
-vet.br
-vlog.br
-wiki.br
-zlg.br
-
-// bs : http://www.nic.bs/rules.html
-bs
-com.bs
-net.bs
-org.bs
-edu.bs
-gov.bs
-
-// bt : https://en.wikipedia.org/wiki/.bt
-bt
-com.bt
-edu.bt
-gov.bt
-net.bt
-org.bt
-
-// bv : No registrations at this time.
-// Submitted by registry <jarle@uninett.no>
-bv
-
-// bw : https://en.wikipedia.org/wiki/.bw
-// http://www.gobin.info/domainname/bw.doc
-// list of other 2nd level tlds ?
-bw
-co.bw
-org.bw
-
-// by : https://en.wikipedia.org/wiki/.by
-// http://tld.by/rules_2006_en.html
-// list of other 2nd level tlds ?
-by
-gov.by
-mil.by
-// Official information does not indicate that com.by is a reserved
-// second-level domain, but it's being used as one (see www.google.com.by and
-// www.yahoo.com.by, for example), so we list it here for safety's sake.
-com.by
-
-// http://hoster.by/
-of.by
-
-// bz : https://en.wikipedia.org/wiki/.bz
-// http://www.belizenic.bz/
-bz
-com.bz
-net.bz
-org.bz
-edu.bz
-gov.bz
-
-// ca : https://en.wikipedia.org/wiki/.ca
-ca
-// ca geographical names
-ab.ca
-bc.ca
-mb.ca
-nb.ca
-nf.ca
-nl.ca
-ns.ca
-nt.ca
-nu.ca
-on.ca
-pe.ca
-qc.ca
-sk.ca
-yk.ca
-// gc.ca: https://en.wikipedia.org/wiki/.gc.ca
-// see also: http://registry.gc.ca/en/SubdomainFAQ
-gc.ca
-
-// cat : https://en.wikipedia.org/wiki/.cat
-cat
-
-// cc : https://en.wikipedia.org/wiki/.cc
-cc
-
-// cd : https://en.wikipedia.org/wiki/.cd
-// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1
-cd
-gov.cd
-
-// cf : https://en.wikipedia.org/wiki/.cf
-cf
-
-// cg : https://en.wikipedia.org/wiki/.cg
-cg
-
-// ch : https://en.wikipedia.org/wiki/.ch
-ch
-
-// ci : https://en.wikipedia.org/wiki/.ci
-// http://www.nic.ci/index.php?page=charte
-ci
-org.ci
-or.ci
-com.ci
-co.ci
-edu.ci
-ed.ci
-ac.ci
-net.ci
-go.ci
-asso.ci
-aéroport.ci
-int.ci
-presse.ci
-md.ci
-gouv.ci
-
-// ck : https://en.wikipedia.org/wiki/.ck
-*.ck
-!www.ck
-
-// cl : https://en.wikipedia.org/wiki/.cl
-cl
-gov.cl
-gob.cl
-co.cl
-mil.cl
-
-// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927
-cm
-co.cm
-com.cm
-gov.cm
-net.cm
-
-// cn : https://en.wikipedia.org/wiki/.cn
-// Submitted by registry <tanyaling@cnnic.cn>
-cn
-ac.cn
-com.cn
-edu.cn
-gov.cn
-net.cn
-org.cn
-mil.cn
-公司.cn
-网络.cn
-網絡.cn
-// cn geographic names
-ah.cn
-bj.cn
-cq.cn
-fj.cn
-gd.cn
-gs.cn
-gz.cn
-gx.cn
-ha.cn
-hb.cn
-he.cn
-hi.cn
-hl.cn
-hn.cn
-jl.cn
-js.cn
-jx.cn
-ln.cn
-nm.cn
-nx.cn
-qh.cn
-sc.cn
-sd.cn
-sh.cn
-sn.cn
-sx.cn
-tj.cn
-xj.cn
-xz.cn
-yn.cn
-zj.cn
-hk.cn
-mo.cn
-tw.cn
-
-// co : https://en.wikipedia.org/wiki/.co
-// Submitted by registry <tecnico@uniandes.edu.co>
-co
-arts.co
-com.co
-edu.co
-firm.co
-gov.co
-info.co
-int.co
-mil.co
-net.co
-nom.co
-org.co
-rec.co
-web.co
-
-// com : https://en.wikipedia.org/wiki/.com
-com
-
-// coop : https://en.wikipedia.org/wiki/.coop
-coop
-
-// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do
-cr
-ac.cr
-co.cr
-ed.cr
-fi.cr
-go.cr
-or.cr
-sa.cr
-
-// cu : https://en.wikipedia.org/wiki/.cu
-cu
-com.cu
-edu.cu
-org.cu
-net.cu
-gov.cu
-inf.cu
-
-// cv : https://en.wikipedia.org/wiki/.cv
-cv
-
-// cw : http://www.una.cw/cw_registry/
-// Confirmed by registry <registry@una.net> 2013-03-26
-cw
-com.cw
-edu.cw
-net.cw
-org.cw
-
-// cx : https://en.wikipedia.org/wiki/.cx
-// list of other 2nd level tlds ?
-cx
-gov.cx
-
-// cy : https://en.wikipedia.org/wiki/.cy
-ac.cy
-biz.cy
-com.cy
-ekloges.cy
-gov.cy
-ltd.cy
-name.cy
-net.cy
-org.cy
-parliament.cy
-press.cy
-pro.cy
-tm.cy
-
-// cz : https://en.wikipedia.org/wiki/.cz
-cz
-
-// de : https://en.wikipedia.org/wiki/.de
-// Confirmed by registry <ops@denic.de> (with technical
-// reservations) 2008-07-01
-de
-
-// dj : https://en.wikipedia.org/wiki/.dj
-dj
-
-// dk : https://en.wikipedia.org/wiki/.dk
-// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17
-dk
-
-// dm : https://en.wikipedia.org/wiki/.dm
-dm
-com.dm
-net.dm
-org.dm
-edu.dm
-gov.dm
-
-// do : https://en.wikipedia.org/wiki/.do
-do
-art.do
-com.do
-edu.do
-gob.do
-gov.do
-mil.do
-net.do
-org.do
-sld.do
-web.do
-
-// dz : https://en.wikipedia.org/wiki/.dz
-dz
-com.dz
-org.dz
-net.dz
-gov.dz
-edu.dz
-asso.dz
-pol.dz
-art.dz
-
-// ec : http://www.nic.ec/reg/paso1.asp
-// Submitted by registry <vabboud@nic.ec>
-ec
-com.ec
-info.ec
-net.ec
-fin.ec
-k12.ec
-med.ec
-pro.ec
-org.ec
-edu.ec
-gov.ec
-gob.ec
-mil.ec
-
-// edu : https://en.wikipedia.org/wiki/.edu
-edu
-
-// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B
-ee
-edu.ee
-gov.ee
-riik.ee
-lib.ee
-med.ee
-com.ee
-pri.ee
-aip.ee
-org.ee
-fie.ee
-
-// eg : https://en.wikipedia.org/wiki/.eg
-eg
-com.eg
-edu.eg
-eun.eg
-gov.eg
-mil.eg
-name.eg
-net.eg
-org.eg
-sci.eg
-
-// er : https://en.wikipedia.org/wiki/.er
-*.er
-
-// es : https://www.nic.es/site_ingles/ingles/dominios/index.html
-es
-com.es
-nom.es
-org.es
-gob.es
-edu.es
-
-// et : https://en.wikipedia.org/wiki/.et
-et
-com.et
-gov.et
-org.et
-edu.et
-biz.et
-name.et
-info.et
-net.et
-
-// eu : https://en.wikipedia.org/wiki/.eu
-eu
-
-// fi : https://en.wikipedia.org/wiki/.fi
-fi
-// aland.fi : https://en.wikipedia.org/wiki/.ax
-// This domain is being phased out in favor of .ax. As there are still many
-// domains under aland.fi, we still keep it on the list until aland.fi is
-// completely removed.
-// TODO: Check for updates (expected to be phased out around Q1/2009)
-aland.fi
-
-// fj : https://en.wikipedia.org/wiki/.fj
-*.fj
-
-// fk : https://en.wikipedia.org/wiki/.fk
-*.fk
-
-// fm : https://en.wikipedia.org/wiki/.fm
-fm
-
-// fo : https://en.wikipedia.org/wiki/.fo
-fo
-
-// fr : http://www.afnic.fr/
-// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs
-fr
-com.fr
-asso.fr
-nom.fr
-prd.fr
-presse.fr
-tm.fr
-// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels
-aeroport.fr
-assedic.fr
-avocat.fr
-avoues.fr
-cci.fr
-chambagri.fr
-chirurgiens-dentistes.fr
-experts-comptables.fr
-geometre-expert.fr
-gouv.fr
-greta.fr
-huissier-justice.fr
-medecin.fr
-notaires.fr
-pharmacien.fr
-port.fr
-veterinaire.fr
-
-// ga : https://en.wikipedia.org/wiki/.ga
-ga
-
-// gb : This registry is effectively dormant
-// Submitted by registry <Damien.Shaw@ja.net>
-gb
-
-// gd : https://en.wikipedia.org/wiki/.gd
-gd
-
-// ge : http://www.nic.net.ge/policy_en.pdf
-ge
-com.ge
-edu.ge
-gov.ge
-org.ge
-mil.ge
-net.ge
-pvt.ge
-
-// gf : https://en.wikipedia.org/wiki/.gf
-gf
-
-// gg : http://www.channelisles.net/register-domains/
-// Confirmed by registry <nigel@channelisles.net> 2013-11-28
-gg
-co.gg
-net.gg
-org.gg
-
-// gh : https://en.wikipedia.org/wiki/.gh
-// see also: http://www.nic.gh/reg_now.php
-// Although domains directly at second level are not possible at the moment,
-// they have been possible for some time and may come back.
-gh
-com.gh
-edu.gh
-gov.gh
-org.gh
-mil.gh
-
-// gi : http://www.nic.gi/rules.html
-gi
-com.gi
-ltd.gi
-gov.gi
-mod.gi
-edu.gi
-org.gi
-
-// gl : https://en.wikipedia.org/wiki/.gl
-// http://nic.gl
-gl
-co.gl
-com.gl
-edu.gl
-net.gl
-org.gl
-
-// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm
-gm
-
-// gn : http://psg.com/dns/gn/gn.txt
-// Submitted by registry <randy@psg.com>
-gn
-ac.gn
-com.gn
-edu.gn
-gov.gn
-org.gn
-net.gn
-
-// gov : https://en.wikipedia.org/wiki/.gov
-gov
-
-// gp : http://www.nic.gp/index.php?lang=en
-gp
-com.gp
-net.gp
-mobi.gp
-edu.gp
-org.gp
-asso.gp
-
-// gq : https://en.wikipedia.org/wiki/.gq
-gq
-
-// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html
-// Submitted by registry <segred@ics.forth.gr>
-gr
-com.gr
-edu.gr
-net.gr
-org.gr
-gov.gr
-
-// gs : https://en.wikipedia.org/wiki/.gs
-gs
-
-// gt : http://www.gt/politicas_de_registro.html
-gt
-com.gt
-edu.gt
-gob.gt
-ind.gt
-mil.gt
-net.gt
-org.gt
-
-// gu : http://gadao.gov.gu/registration.txt
-*.gu
-
-// gw : https://en.wikipedia.org/wiki/.gw
-gw
-
-// gy : https://en.wikipedia.org/wiki/.gy
-// http://registry.gy/
-gy
-co.gy
-com.gy
-edu.gy
-gov.gy
-net.gy
-org.gy
-
-// hk : https://www.hkdnr.hk
-// Submitted by registry <hk.tech@hkirc.hk>
-hk
-com.hk
-edu.hk
-gov.hk
-idv.hk
-net.hk
-org.hk
-公司.hk
-教育.hk
-敎育.hk
-政府.hk
-個人.hk
-个人.hk
-箇人.hk
-網络.hk
-网络.hk
-组織.hk
-網絡.hk
-网絡.hk
-组织.hk
-組織.hk
-組织.hk
-
-// hm : https://en.wikipedia.org/wiki/.hm
-hm
-
-// hn : http://www.nic.hn/politicas/ps02,,05.html
-hn
-com.hn
-edu.hn
-org.hn
-net.hn
-mil.hn
-gob.hn
-
-// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf
-hr
-iz.hr
-from.hr
-name.hr
-com.hr
-
-// ht : http://www.nic.ht/info/charte.cfm
-ht
-com.ht
-shop.ht
-firm.ht
-info.ht
-adult.ht
-net.ht
-pro.ht
-org.ht
-med.ht
-art.ht
-coop.ht
-pol.ht
-asso.ht
-edu.ht
-rel.ht
-gouv.ht
-perso.ht
-
-// hu : http://www.domain.hu/domain/English/sld.html
-// Confirmed by registry <pasztor@iszt.hu> 2008-06-12
-hu
-co.hu
-info.hu
-org.hu
-priv.hu
-sport.hu
-tm.hu
-2000.hu
-agrar.hu
-bolt.hu
-casino.hu
-city.hu
-erotica.hu
-erotika.hu
-film.hu
-forum.hu
-games.hu
-hotel.hu
-ingatlan.hu
-jogasz.hu
-konyvelo.hu
-lakas.hu
-media.hu
-news.hu
-reklam.hu
-sex.hu
-shop.hu
-suli.hu
-szex.hu
-tozsde.hu
-utazas.hu
-video.hu
-
-// id : https://register.pandi.or.id/
-id
-ac.id
-biz.id
-co.id
-desa.id
-go.id
-mil.id
-my.id
-net.id
-or.id
-sch.id
-web.id
-
-// ie : https://en.wikipedia.org/wiki/.ie
-ie
-gov.ie
-
-// il : http://www.isoc.org.il/domains/
-il
-ac.il
-co.il
-gov.il
-idf.il
-k12.il
-muni.il
-net.il
-org.il
-
-// im : https://www.nic.im/
-// Submitted by registry <info@nic.im>
-im
-ac.im
-co.im
-com.im
-ltd.co.im
-net.im
-org.im
-plc.co.im
-tt.im
-tv.im
-
-// in : https://en.wikipedia.org/wiki/.in
-// see also: https://registry.in/Policies
-// Please note, that nic.in is not an official eTLD, but used by most
-// government institutions.
-in
-co.in
-firm.in
-net.in
-org.in
-gen.in
-ind.in
-nic.in
-ac.in
-edu.in
-res.in
-gov.in
-mil.in
-
-// info : https://en.wikipedia.org/wiki/.info
-info
-
-// int : https://en.wikipedia.org/wiki/.int
-// Confirmed by registry <iana-questions@icann.org> 2008-06-18
-int
-eu.int
-
-// io : http://www.nic.io/rules.html
-// list of other 2nd level tlds ?
-io
-com.io
-
-// iq : http://www.cmc.iq/english/iq/iqregister1.htm
-iq
-gov.iq
-edu.iq
-mil.iq
-com.iq
-org.iq
-net.iq
-
-// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules
-// Also see http://www.nic.ir/Internationalized_Domain_Names
-// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16
-ir
-ac.ir
-co.ir
-gov.ir
-id.ir
-net.ir
-org.ir
-sch.ir
-// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH)
-ایران.ir
-// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH)
-ايران.ir
-
-// is : http://www.isnic.is/domain/rules.php
-// Confirmed by registry <marius@isgate.is> 2008-12-06
-is
-net.is
-com.is
-edu.is
-gov.is
-org.is
-int.is
-
-// it : https://en.wikipedia.org/wiki/.it
-it
-gov.it
-edu.it
-// Reserved geo-names:
-// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf
-// There is also a list of reserved geo-names corresponding to Italian municipalities
-// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here.
-// Regions
-abr.it
-abruzzo.it
-aosta-valley.it
-aostavalley.it
-bas.it
-basilicata.it
-cal.it
-calabria.it
-cam.it
-campania.it
-emilia-romagna.it
-emiliaromagna.it
-emr.it
-friuli-v-giulia.it
-friuli-ve-giulia.it
-friuli-vegiulia.it
-friuli-venezia-giulia.it
-friuli-veneziagiulia.it
-friuli-vgiulia.it
-friuliv-giulia.it
-friulive-giulia.it
-friulivegiulia.it
-friulivenezia-giulia.it
-friuliveneziagiulia.it
-friulivgiulia.it
-fvg.it
-laz.it
-lazio.it
-lig.it
-liguria.it
-lom.it
-lombardia.it
-lombardy.it
-lucania.it
-mar.it
-marche.it
-mol.it
-molise.it
-piedmont.it
-piemonte.it
-pmn.it
-pug.it
-puglia.it
-sar.it
-sardegna.it
-sardinia.it
-sic.it
-sicilia.it
-sicily.it
-taa.it
-tos.it
-toscana.it
-trentino-a-adige.it
-trentino-aadige.it
-trentino-alto-adige.it
-trentino-altoadige.it
-trentino-s-tirol.it
-trentino-stirol.it
-trentino-sud-tirol.it
-trentino-sudtirol.it
-trentino-sued-tirol.it
-trentino-suedtirol.it
-trentinoa-adige.it
-trentinoaadige.it
-trentinoalto-adige.it
-trentinoaltoadige.it
-trentinos-tirol.it
-trentinostirol.it
-trentinosud-tirol.it
-trentinosudtirol.it
-trentinosued-tirol.it
-trentinosuedtirol.it
-tuscany.it
-umb.it
-umbria.it
-val-d-aosta.it
-val-daosta.it
-vald-aosta.it
-valdaosta.it
-valle-aosta.it
-valle-d-aosta.it
-valle-daosta.it
-valleaosta.it
-valled-aosta.it
-valledaosta.it
-vallee-aoste.it
-valleeaoste.it
-vao.it
-vda.it
-ven.it
-veneto.it
-// Provinces
-ag.it
-agrigento.it
-al.it
-alessandria.it
-alto-adige.it
-altoadige.it
-an.it
-ancona.it
-andria-barletta-trani.it
-andria-trani-barletta.it
-andriabarlettatrani.it
-andriatranibarletta.it
-ao.it
-aosta.it
-aoste.it
-ap.it
-aq.it
-aquila.it
-ar.it
-arezzo.it
-ascoli-piceno.it
-ascolipiceno.it
-asti.it
-at.it
-av.it
-avellino.it
-ba.it
-balsan.it
-bari.it
-barletta-trani-andria.it
-barlettatraniandria.it
-belluno.it
-benevento.it
-bergamo.it
-bg.it
-bi.it
-biella.it
-bl.it
-bn.it
-bo.it
-bologna.it
-bolzano.it
-bozen.it
-br.it
-brescia.it
-brindisi.it
-bs.it
-bt.it
-bz.it
-ca.it
-cagliari.it
-caltanissetta.it
-campidano-medio.it
-campidanomedio.it
-campobasso.it
-carbonia-iglesias.it
-carboniaiglesias.it
-carrara-massa.it
-carraramassa.it
-caserta.it
-catania.it
-catanzaro.it
-cb.it
-ce.it
-cesena-forli.it
-cesenaforli.it
-ch.it
-chieti.it
-ci.it
-cl.it
-cn.it
-co.it
-como.it
-cosenza.it
-cr.it
-cremona.it
-crotone.it
-cs.it
-ct.it
-cuneo.it
-cz.it
-dell-ogliastra.it
-dellogliastra.it
-en.it
-enna.it
-fc.it
-fe.it
-fermo.it
-ferrara.it
-fg.it
-fi.it
-firenze.it
-florence.it
-fm.it
-foggia.it
-forli-cesena.it
-forlicesena.it
-fr.it
-frosinone.it
-ge.it
-genoa.it
-genova.it
-go.it
-gorizia.it
-gr.it
-grosseto.it
-iglesias-carbonia.it
-iglesiascarbonia.it
-im.it
-imperia.it
-is.it
-isernia.it
-kr.it
-la-spezia.it
-laquila.it
-laspezia.it
-latina.it
-lc.it
-le.it
-lecce.it
-lecco.it
-li.it
-livorno.it
-lo.it
-lodi.it
-lt.it
-lu.it
-lucca.it
-macerata.it
-mantova.it
-massa-carrara.it
-massacarrara.it
-matera.it
-mb.it
-mc.it
-me.it
-medio-campidano.it
-mediocampidano.it
-messina.it
-mi.it
-milan.it
-milano.it
-mn.it
-mo.it
-modena.it
-monza-brianza.it
-monza-e-della-brianza.it
-monza.it
-monzabrianza.it
-monzaebrianza.it
-monzaedellabrianza.it
-ms.it
-mt.it
-na.it
-naples.it
-napoli.it
-no.it
-novara.it
-nu.it
-nuoro.it
-og.it
-ogliastra.it
-olbia-tempio.it
-olbiatempio.it
-or.it
-oristano.it
-ot.it
-pa.it
-padova.it
-padua.it
-palermo.it
-parma.it
-pavia.it
-pc.it
-pd.it
-pe.it
-perugia.it
-pesaro-urbino.it
-pesarourbino.it
-pescara.it
-pg.it
-pi.it
-piacenza.it
-pisa.it
-pistoia.it
-pn.it
-po.it
-pordenone.it
-potenza.it
-pr.it
-prato.it
-pt.it
-pu.it
-pv.it
-pz.it
-ra.it
-ragusa.it
-ravenna.it
-rc.it
-re.it
-reggio-calabria.it
-reggio-emilia.it
-reggiocalabria.it
-reggioemilia.it
-rg.it
-ri.it
-rieti.it
-rimini.it
-rm.it
-rn.it
-ro.it
-roma.it
-rome.it
-rovigo.it
-sa.it
-salerno.it
-sassari.it
-savona.it
-si.it
-siena.it
-siracusa.it
-so.it
-sondrio.it
-sp.it
-sr.it
-ss.it
-suedtirol.it
-sv.it
-ta.it
-taranto.it
-te.it
-tempio-olbia.it
-tempioolbia.it
-teramo.it
-terni.it
-tn.it
-to.it
-torino.it
-tp.it
-tr.it
-trani-andria-barletta.it
-trani-barletta-andria.it
-traniandriabarletta.it
-tranibarlettaandria.it
-trapani.it
-trentino.it
-trento.it
-treviso.it
-trieste.it
-ts.it
-turin.it
-tv.it
-ud.it
-udine.it
-urbino-pesaro.it
-urbinopesaro.it
-va.it
-varese.it
-vb.it
-vc.it
-ve.it
-venezia.it
-venice.it
-verbania.it
-vercelli.it
-verona.it
-vi.it
-vibo-valentia.it
-vibovalentia.it
-vicenza.it
-viterbo.it
-vr.it
-vs.it
-vt.it
-vv.it
-
-// je : http://www.channelisles.net/register-domains/
-// Confirmed by registry <nigel@channelisles.net> 2013-11-28
-je
-co.je
-net.je
-org.je
-
-// jm : http://www.com.jm/register.html
-*.jm
-
-// jo : http://www.dns.jo/Registration_policy.aspx
-jo
-com.jo
-org.jo
-net.jo
-edu.jo
-sch.jo
-gov.jo
-mil.jo
-name.jo
-
-// jobs : https://en.wikipedia.org/wiki/.jobs
-jobs
-
-// jp : https://en.wikipedia.org/wiki/.jp
-// http://jprs.co.jp/en/jpdomain.html
-// Submitted by registry <info@jprs.jp>
-jp
-// jp organizational type names
-ac.jp
-ad.jp
-co.jp
-ed.jp
-go.jp
-gr.jp
-lg.jp
-ne.jp
-or.jp
-// jp prefecture type names
-aichi.jp
-akita.jp
-aomori.jp
-chiba.jp
-ehime.jp
-fukui.jp
-fukuoka.jp
-fukushima.jp
-gifu.jp
-gunma.jp
-hiroshima.jp
-hokkaido.jp
-hyogo.jp
-ibaraki.jp
-ishikawa.jp
-iwate.jp
-kagawa.jp
-kagoshima.jp
-kanagawa.jp
-kochi.jp
-kumamoto.jp
-kyoto.jp
-mie.jp
-miyagi.jp
-miyazaki.jp
-nagano.jp
-nagasaki.jp
-nara.jp
-niigata.jp
-oita.jp
-okayama.jp
-okinawa.jp
-osaka.jp
-saga.jp
-saitama.jp
-shiga.jp
-shimane.jp
-shizuoka.jp
-tochigi.jp
-tokushima.jp
-tokyo.jp
-tottori.jp
-toyama.jp
-wakayama.jp
-yamagata.jp
-yamaguchi.jp
-yamanashi.jp
-栃木.jp
-愛知.jp
-愛媛.jp
-兵庫.jp
-熊本.jp
-茨城.jp
-北海道.jp
-千葉.jp
-和歌山.jp
-長崎.jp
-長野.jp
-新潟.jp
-青森.jp
-静岡.jp
-東京.jp
-石川.jp
-埼玉.jp
-三重.jp
-京都.jp
-佐賀.jp
-大分.jp
-大阪.jp
-奈良.jp
-宮城.jp
-宮崎.jp
-富山.jp
-山口.jp
-山形.jp
-山梨.jp
-岩手.jp
-岐阜.jp
-岡山.jp
-島根.jp
-広島.jp
-徳島.jp
-沖縄.jp
-滋賀.jp
-神奈川.jp
-福井.jp
-福岡.jp
-福島.jp
-秋田.jp
-群馬.jp
-香川.jp
-高知.jp
-鳥取.jp
-鹿児島.jp
-// jp geographic type names
-// http://jprs.jp/doc/rule/saisoku-1.html
-*.kawasaki.jp
-*.kitakyushu.jp
-*.kobe.jp
-*.nagoya.jp
-*.sapporo.jp
-*.sendai.jp
-*.yokohama.jp
-!city.kawasaki.jp
-!city.kitakyushu.jp
-!city.kobe.jp
-!city.nagoya.jp
-!city.sapporo.jp
-!city.sendai.jp
-!city.yokohama.jp
-// 4th level registration
-aisai.aichi.jp
-ama.aichi.jp
-anjo.aichi.jp
-asuke.aichi.jp
-chiryu.aichi.jp
-chita.aichi.jp
-fuso.aichi.jp
-gamagori.aichi.jp
-handa.aichi.jp
-hazu.aichi.jp
-hekinan.aichi.jp
-higashiura.aichi.jp
-ichinomiya.aichi.jp
-inazawa.aichi.jp
-inuyama.aichi.jp
-isshiki.aichi.jp
-iwakura.aichi.jp
-kanie.aichi.jp
-kariya.aichi.jp
-kasugai.aichi.jp
-kira.aichi.jp
-kiyosu.aichi.jp
-komaki.aichi.jp
-konan.aichi.jp
-kota.aichi.jp
-mihama.aichi.jp
-miyoshi.aichi.jp
-nishio.aichi.jp
-nisshin.aichi.jp
-obu.aichi.jp
-oguchi.aichi.jp
-oharu.aichi.jp
-okazaki.aichi.jp
-owariasahi.aichi.jp
-seto.aichi.jp
-shikatsu.aichi.jp
-shinshiro.aichi.jp
-shitara.aichi.jp
-tahara.aichi.jp
-takahama.aichi.jp
-tobishima.aichi.jp
-toei.aichi.jp
-togo.aichi.jp
-tokai.aichi.jp
-tokoname.aichi.jp
-toyoake.aichi.jp
-toyohashi.aichi.jp
-toyokawa.aichi.jp
-toyone.aichi.jp
-toyota.aichi.jp
-tsushima.aichi.jp
-yatomi.aichi.jp
-akita.akita.jp
-daisen.akita.jp
-fujisato.akita.jp
-gojome.akita.jp
-hachirogata.akita.jp
-happou.akita.jp
-higashinaruse.akita.jp
-honjo.akita.jp
-honjyo.akita.jp
-ikawa.akita.jp
-kamikoani.akita.jp
-kamioka.akita.jp
-katagami.akita.jp
-kazuno.akita.jp
-kitaakita.akita.jp
-kosaka.akita.jp
-kyowa.akita.jp
-misato.akita.jp
-mitane.akita.jp
-moriyoshi.akita.jp
-nikaho.akita.jp
-noshiro.akita.jp
-odate.akita.jp
-oga.akita.jp
-ogata.akita.jp
-semboku.akita.jp
-yokote.akita.jp
-yurihonjo.akita.jp
-aomori.aomori.jp
-gonohe.aomori.jp
-hachinohe.aomori.jp
-hashikami.aomori.jp
-hiranai.aomori.jp
-hirosaki.aomori.jp
-itayanagi.aomori.jp
-kuroishi.aomori.jp
-misawa.aomori.jp
-mutsu.aomori.jp
-nakadomari.aomori.jp
-noheji.aomori.jp
-oirase.aomori.jp
-owani.aomori.jp
-rokunohe.aomori.jp
-sannohe.aomori.jp
-shichinohe.aomori.jp
-shingo.aomori.jp
-takko.aomori.jp
-towada.aomori.jp
-tsugaru.aomori.jp
-tsuruta.aomori.jp
-abiko.chiba.jp
-asahi.chiba.jp
-chonan.chiba.jp
-chosei.chiba.jp
-choshi.chiba.jp
-chuo.chiba.jp
-funabashi.chiba.jp
-futtsu.chiba.jp
-hanamigawa.chiba.jp
-ichihara.chiba.jp
-ichikawa.chiba.jp
-ichinomiya.chiba.jp
-inzai.chiba.jp
-isumi.chiba.jp
-kamagaya.chiba.jp
-kamogawa.chiba.jp
-kashiwa.chiba.jp
-katori.chiba.jp
-katsuura.chiba.jp
-kimitsu.chiba.jp
-kisarazu.chiba.jp
-kozaki.chiba.jp
-kujukuri.chiba.jp
-kyonan.chiba.jp
-matsudo.chiba.jp
-midori.chiba.jp
-mihama.chiba.jp
-minamiboso.chiba.jp
-mobara.chiba.jp
-mutsuzawa.chiba.jp
-nagara.chiba.jp
-nagareyama.chiba.jp
-narashino.chiba.jp
-narita.chiba.jp
-noda.chiba.jp
-oamishirasato.chiba.jp
-omigawa.chiba.jp
-onjuku.chiba.jp
-otaki.chiba.jp
-sakae.chiba.jp
-sakura.chiba.jp
-shimofusa.chiba.jp
-shirako.chiba.jp
-shiroi.chiba.jp
-shisui.chiba.jp
-sodegaura.chiba.jp
-sosa.chiba.jp
-tako.chiba.jp
-tateyama.chiba.jp
-togane.chiba.jp
-tohnosho.chiba.jp
-tomisato.chiba.jp
-urayasu.chiba.jp
-yachimata.chiba.jp
-yachiyo.chiba.jp
-yokaichiba.chiba.jp
-yokoshibahikari.chiba.jp
-yotsukaido.chiba.jp
-ainan.ehime.jp
-honai.ehime.jp
-ikata.ehime.jp
-imabari.ehime.jp
-iyo.ehime.jp
-kamijima.ehime.jp
-kihoku.ehime.jp
-kumakogen.ehime.jp
-masaki.ehime.jp
-matsuno.ehime.jp
-matsuyama.ehime.jp
-namikata.ehime.jp
-niihama.ehime.jp
-ozu.ehime.jp
-saijo.ehime.jp
-seiyo.ehime.jp
-shikokuchuo.ehime.jp
-tobe.ehime.jp
-toon.ehime.jp
-uchiko.ehime.jp
-uwajima.ehime.jp
-yawatahama.ehime.jp
-echizen.fukui.jp
-eiheiji.fukui.jp
-fukui.fukui.jp
-ikeda.fukui.jp
-katsuyama.fukui.jp
-mihama.fukui.jp
-minamiechizen.fukui.jp
-obama.fukui.jp
-ohi.fukui.jp
-ono.fukui.jp
-sabae.fukui.jp
-sakai.fukui.jp
-takahama.fukui.jp
-tsuruga.fukui.jp
-wakasa.fukui.jp
-ashiya.fukuoka.jp
-buzen.fukuoka.jp
-chikugo.fukuoka.jp
-chikuho.fukuoka.jp
-chikujo.fukuoka.jp
-chikushino.fukuoka.jp
-chikuzen.fukuoka.jp
-chuo.fukuoka.jp
-dazaifu.fukuoka.jp
-fukuchi.fukuoka.jp
-hakata.fukuoka.jp
-higashi.fukuoka.jp
-hirokawa.fukuoka.jp
-hisayama.fukuoka.jp
-iizuka.fukuoka.jp
-inatsuki.fukuoka.jp
-kaho.fukuoka.jp
-kasuga.fukuoka.jp
-kasuya.fukuoka.jp
-kawara.fukuoka.jp
-keisen.fukuoka.jp
-koga.fukuoka.jp
-kurate.fukuoka.jp
-kurogi.fukuoka.jp
-kurume.fukuoka.jp
-minami.fukuoka.jp
-miyako.fukuoka.jp
-miyama.fukuoka.jp
-miyawaka.fukuoka.jp
-mizumaki.fukuoka.jp
-munakata.fukuoka.jp
-nakagawa.fukuoka.jp
-nakama.fukuoka.jp
-nishi.fukuoka.jp
-nogata.fukuoka.jp
-ogori.fukuoka.jp
-okagaki.fukuoka.jp
-okawa.fukuoka.jp
-oki.fukuoka.jp
-omuta.fukuoka.jp
-onga.fukuoka.jp
-onojo.fukuoka.jp
-oto.fukuoka.jp
-saigawa.fukuoka.jp
-sasaguri.fukuoka.jp
-shingu.fukuoka.jp
-shinyoshitomi.fukuoka.jp
-shonai.fukuoka.jp
-soeda.fukuoka.jp
-sue.fukuoka.jp
-tachiarai.fukuoka.jp
-tagawa.fukuoka.jp
-takata.fukuoka.jp
-toho.fukuoka.jp
-toyotsu.fukuoka.jp
-tsuiki.fukuoka.jp
-ukiha.fukuoka.jp
-umi.fukuoka.jp
-usui.fukuoka.jp
-yamada.fukuoka.jp
-yame.fukuoka.jp
-yanagawa.fukuoka.jp
-yukuhashi.fukuoka.jp
-aizubange.fukushima.jp
-aizumisato.fukushima.jp
-aizuwakamatsu.fukushima.jp
-asakawa.fukushima.jp
-bandai.fukushima.jp
-date.fukushima.jp
-fukushima.fukushima.jp
-furudono.fukushima.jp
-futaba.fukushima.jp
-hanawa.fukushima.jp
-higashi.fukushima.jp
-hirata.fukushima.jp
-hirono.fukushima.jp
-iitate.fukushima.jp
-inawashiro.fukushima.jp
-ishikawa.fukushima.jp
-iwaki.fukushima.jp
-izumizaki.fukushima.jp
-kagamiishi.fukushima.jp
-kaneyama.fukushima.jp
-kawamata.fukushima.jp
-kitakata.fukushima.jp
-kitashiobara.fukushima.jp
-koori.fukushima.jp
-koriyama.fukushima.jp
-kunimi.fukushima.jp
-miharu.fukushima.jp
-mishima.fukushima.jp
-namie.fukushima.jp
-nango.fukushima.jp
-nishiaizu.fukushima.jp
-nishigo.fukushima.jp
-okuma.fukushima.jp
-omotego.fukushima.jp
-ono.fukushima.jp
-otama.fukushima.jp
-samegawa.fukushima.jp
-shimogo.fukushima.jp
-shirakawa.fukushima.jp
-showa.fukushima.jp
-soma.fukushima.jp
-sukagawa.fukushima.jp
-taishin.fukushima.jp
-tamakawa.fukushima.jp
-tanagura.fukushima.jp
-tenei.fukushima.jp
-yabuki.fukushima.jp
-yamato.fukushima.jp
-yamatsuri.fukushima.jp
-yanaizu.fukushima.jp
-yugawa.fukushima.jp
-anpachi.gifu.jp
-ena.gifu.jp
-gifu.gifu.jp
-ginan.gifu.jp
-godo.gifu.jp
-gujo.gifu.jp
-hashima.gifu.jp
-hichiso.gifu.jp
-hida.gifu.jp
-higashishirakawa.gifu.jp
-ibigawa.gifu.jp
-ikeda.gifu.jp
-kakamigahara.gifu.jp
-kani.gifu.jp
-kasahara.gifu.jp
-kasamatsu.gifu.jp
-kawaue.gifu.jp
-kitagata.gifu.jp
-mino.gifu.jp
-minokamo.gifu.jp
-mitake.gifu.jp
-mizunami.gifu.jp
-motosu.gifu.jp
-nakatsugawa.gifu.jp
-ogaki.gifu.jp
-sakahogi.gifu.jp
-seki.gifu.jp
-sekigahara.gifu.jp
-shirakawa.gifu.jp
-tajimi.gifu.jp
-takayama.gifu.jp
-tarui.gifu.jp
-toki.gifu.jp
-tomika.gifu.jp
-wanouchi.gifu.jp
-yamagata.gifu.jp
-yaotsu.gifu.jp
-yoro.gifu.jp
-annaka.gunma.jp
-chiyoda.gunma.jp
-fujioka.gunma.jp
-higashiagatsuma.gunma.jp
-isesaki.gunma.jp
-itakura.gunma.jp
-kanna.gunma.jp
-kanra.gunma.jp
-katashina.gunma.jp
-kawaba.gunma.jp
-kiryu.gunma.jp
-kusatsu.gunma.jp
-maebashi.gunma.jp
-meiwa.gunma.jp
-midori.gunma.jp
-minakami.gunma.jp
-naganohara.gunma.jp
-nakanojo.gunma.jp
-nanmoku.gunma.jp
-numata.gunma.jp
-oizumi.gunma.jp
-ora.gunma.jp
-ota.gunma.jp
-shibukawa.gunma.jp
-shimonita.gunma.jp
-shinto.gunma.jp
-showa.gunma.jp
-takasaki.gunma.jp
-takayama.gunma.jp
-tamamura.gunma.jp
-tatebayashi.gunma.jp
-tomioka.gunma.jp
-tsukiyono.gunma.jp
-tsumagoi.gunma.jp
-ueno.gunma.jp
-yoshioka.gunma.jp
-asaminami.hiroshima.jp
-daiwa.hiroshima.jp
-etajima.hiroshima.jp
-fuchu.hiroshima.jp
-fukuyama.hiroshima.jp
-hatsukaichi.hiroshima.jp
-higashihiroshima.hiroshima.jp
-hongo.hiroshima.jp
-jinsekikogen.hiroshima.jp
-kaita.hiroshima.jp
-kui.hiroshima.jp
-kumano.hiroshima.jp
-kure.hiroshima.jp
-mihara.hiroshima.jp
-miyoshi.hiroshima.jp
-naka.hiroshima.jp
-onomichi.hiroshima.jp
-osakikamijima.hiroshima.jp
-otake.hiroshima.jp
-saka.hiroshima.jp
-sera.hiroshima.jp
-seranishi.hiroshima.jp
-shinichi.hiroshima.jp
-shobara.hiroshima.jp
-takehara.hiroshima.jp
-abashiri.hokkaido.jp
-abira.hokkaido.jp
-aibetsu.hokkaido.jp
-akabira.hokkaido.jp
-akkeshi.hokkaido.jp
-asahikawa.hokkaido.jp
-ashibetsu.hokkaido.jp
-ashoro.hokkaido.jp
-assabu.hokkaido.jp
-atsuma.hokkaido.jp
-bibai.hokkaido.jp
-biei.hokkaido.jp
-bifuka.hokkaido.jp
-bihoro.hokkaido.jp
-biratori.hokkaido.jp
-chippubetsu.hokkaido.jp
-chitose.hokkaido.jp
-date.hokkaido.jp
-ebetsu.hokkaido.jp
-embetsu.hokkaido.jp
-eniwa.hokkaido.jp
-erimo.hokkaido.jp
-esan.hokkaido.jp
-esashi.hokkaido.jp
-fukagawa.hokkaido.jp
-fukushima.hokkaido.jp
-furano.hokkaido.jp
-furubira.hokkaido.jp
-haboro.hokkaido.jp
-hakodate.hokkaido.jp
-hamatonbetsu.hokkaido.jp
-hidaka.hokkaido.jp
-higashikagura.hokkaido.jp
-higashikawa.hokkaido.jp
-hiroo.hokkaido.jp
-hokuryu.hokkaido.jp
-hokuto.hokkaido.jp
-honbetsu.hokkaido.jp
-horokanai.hokkaido.jp
-horonobe.hokkaido.jp
-ikeda.hokkaido.jp
-imakane.hokkaido.jp
-ishikari.hokkaido.jp
-iwamizawa.hokkaido.jp
-iwanai.hokkaido.jp
-kamifurano.hokkaido.jp
-kamikawa.hokkaido.jp
-kamishihoro.hokkaido.jp
-kamisunagawa.hokkaido.jp
-kamoenai.hokkaido.jp
-kayabe.hokkaido.jp
-kembuchi.hokkaido.jp
-kikonai.hokkaido.jp
-kimobetsu.hokkaido.jp
-kitahiroshima.hokkaido.jp
-kitami.hokkaido.jp
-kiyosato.hokkaido.jp
-koshimizu.hokkaido.jp
-kunneppu.hokkaido.jp
-kuriyama.hokkaido.jp
-kuromatsunai.hokkaido.jp
-kushiro.hokkaido.jp
-kutchan.hokkaido.jp
-kyowa.hokkaido.jp
-mashike.hokkaido.jp
-matsumae.hokkaido.jp
-mikasa.hokkaido.jp
-minamifurano.hokkaido.jp
-mombetsu.hokkaido.jp
-moseushi.hokkaido.jp
-mukawa.hokkaido.jp
-muroran.hokkaido.jp
-naie.hokkaido.jp
-nakagawa.hokkaido.jp
-nakasatsunai.hokkaido.jp
-nakatombetsu.hokkaido.jp
-nanae.hokkaido.jp
-nanporo.hokkaido.jp
-nayoro.hokkaido.jp
-nemuro.hokkaido.jp
-niikappu.hokkaido.jp
-niki.hokkaido.jp
-nishiokoppe.hokkaido.jp
-noboribetsu.hokkaido.jp
-numata.hokkaido.jp
-obihiro.hokkaido.jp
-obira.hokkaido.jp
-oketo.hokkaido.jp
-okoppe.hokkaido.jp
-otaru.hokkaido.jp
-otobe.hokkaido.jp
-otofuke.hokkaido.jp
-otoineppu.hokkaido.jp
-oumu.hokkaido.jp
-ozora.hokkaido.jp
-pippu.hokkaido.jp
-rankoshi.hokkaido.jp
-rebun.hokkaido.jp
-rikubetsu.hokkaido.jp
-rishiri.hokkaido.jp
-rishirifuji.hokkaido.jp
-saroma.hokkaido.jp
-sarufutsu.hokkaido.jp
-shakotan.hokkaido.jp
-shari.hokkaido.jp
-shibecha.hokkaido.jp
-shibetsu.hokkaido.jp
-shikabe.hokkaido.jp
-shikaoi.hokkaido.jp
-shimamaki.hokkaido.jp
-shimizu.hokkaido.jp
-shimokawa.hokkaido.jp
-shinshinotsu.hokkaido.jp
-shintoku.hokkaido.jp
-shiranuka.hokkaido.jp
-shiraoi.hokkaido.jp
-shiriuchi.hokkaido.jp
-sobetsu.hokkaido.jp
-sunagawa.hokkaido.jp
-taiki.hokkaido.jp
-takasu.hokkaido.jp
-takikawa.hokkaido.jp
-takinoue.hokkaido.jp
-teshikaga.hokkaido.jp
-tobetsu.hokkaido.jp
-tohma.hokkaido.jp
-tomakomai.hokkaido.jp
-tomari.hokkaido.jp
-toya.hokkaido.jp
-toyako.hokkaido.jp
-toyotomi.hokkaido.jp
-toyoura.hokkaido.jp
-tsubetsu.hokkaido.jp
-tsukigata.hokkaido.jp
-urakawa.hokkaido.jp
-urausu.hokkaido.jp
-uryu.hokkaido.jp
-utashinai.hokkaido.jp
-wakkanai.hokkaido.jp
-wassamu.hokkaido.jp
-yakumo.hokkaido.jp
-yoichi.hokkaido.jp
-aioi.hyogo.jp
-akashi.hyogo.jp
-ako.hyogo.jp
-amagasaki.hyogo.jp
-aogaki.hyogo.jp
-asago.hyogo.jp
-ashiya.hyogo.jp
-awaji.hyogo.jp
-fukusaki.hyogo.jp
-goshiki.hyogo.jp
-harima.hyogo.jp
-himeji.hyogo.jp
-ichikawa.hyogo.jp
-inagawa.hyogo.jp
-itami.hyogo.jp
-kakogawa.hyogo.jp
-kamigori.hyogo.jp
-kamikawa.hyogo.jp
-kasai.hyogo.jp
-kasuga.hyogo.jp
-kawanishi.hyogo.jp
-miki.hyogo.jp
-minamiawaji.hyogo.jp
-nishinomiya.hyogo.jp
-nishiwaki.hyogo.jp
-ono.hyogo.jp
-sanda.hyogo.jp
-sannan.hyogo.jp
-sasayama.hyogo.jp
-sayo.hyogo.jp
-shingu.hyogo.jp
-shinonsen.hyogo.jp
-shiso.hyogo.jp
-sumoto.hyogo.jp
-taishi.hyogo.jp
-taka.hyogo.jp
-takarazuka.hyogo.jp
-takasago.hyogo.jp
-takino.hyogo.jp
-tamba.hyogo.jp
-tatsuno.hyogo.jp
-toyooka.hyogo.jp
-yabu.hyogo.jp
-yashiro.hyogo.jp
-yoka.hyogo.jp
-yokawa.hyogo.jp
-ami.ibaraki.jp
-asahi.ibaraki.jp
-bando.ibaraki.jp
-chikusei.ibaraki.jp
-daigo.ibaraki.jp
-fujishiro.ibaraki.jp
-hitachi.ibaraki.jp
-hitachinaka.ibaraki.jp
-hitachiomiya.ibaraki.jp
-hitachiota.ibaraki.jp
-ibaraki.ibaraki.jp
-ina.ibaraki.jp
-inashiki.ibaraki.jp
-itako.ibaraki.jp
-iwama.ibaraki.jp
-joso.ibaraki.jp
-kamisu.ibaraki.jp
-kasama.ibaraki.jp
-kashima.ibaraki.jp
-kasumigaura.ibaraki.jp
-koga.ibaraki.jp
-miho.ibaraki.jp
-mito.ibaraki.jp
-moriya.ibaraki.jp
-naka.ibaraki.jp
-namegata.ibaraki.jp
-oarai.ibaraki.jp
-ogawa.ibaraki.jp
-omitama.ibaraki.jp
-ryugasaki.ibaraki.jp
-sakai.ibaraki.jp
-sakuragawa.ibaraki.jp
-shimodate.ibaraki.jp
-shimotsuma.ibaraki.jp
-shirosato.ibaraki.jp
-sowa.ibaraki.jp
-suifu.ibaraki.jp
-takahagi.ibaraki.jp
-tamatsukuri.ibaraki.jp
-tokai.ibaraki.jp
-tomobe.ibaraki.jp
-tone.ibaraki.jp
-toride.ibaraki.jp
-tsuchiura.ibaraki.jp
-tsukuba.ibaraki.jp
-uchihara.ibaraki.jp
-ushiku.ibaraki.jp
-yachiyo.ibaraki.jp
-yamagata.ibaraki.jp
-yawara.ibaraki.jp
-yuki.ibaraki.jp
-anamizu.ishikawa.jp
-hakui.ishikawa.jp
-hakusan.ishikawa.jp
-kaga.ishikawa.jp
-kahoku.ishikawa.jp
-kanazawa.ishikawa.jp
-kawakita.ishikawa.jp
-komatsu.ishikawa.jp
-nakanoto.ishikawa.jp
-nanao.ishikawa.jp
-nomi.ishikawa.jp
-nonoichi.ishikawa.jp
-noto.ishikawa.jp
-shika.ishikawa.jp
-suzu.ishikawa.jp
-tsubata.ishikawa.jp
-tsurugi.ishikawa.jp
-uchinada.ishikawa.jp
-wajima.ishikawa.jp
-fudai.iwate.jp
-fujisawa.iwate.jp
-hanamaki.iwate.jp
-hiraizumi.iwate.jp
-hirono.iwate.jp
-ichinohe.iwate.jp
-ichinoseki.iwate.jp
-iwaizumi.iwate.jp
-iwate.iwate.jp
-joboji.iwate.jp
-kamaishi.iwate.jp
-kanegasaki.iwate.jp
-karumai.iwate.jp
-kawai.iwate.jp
-kitakami.iwate.jp
-kuji.iwate.jp
-kunohe.iwate.jp
-kuzumaki.iwate.jp
-miyako.iwate.jp
-mizusawa.iwate.jp
-morioka.iwate.jp
-ninohe.iwate.jp
-noda.iwate.jp
-ofunato.iwate.jp
-oshu.iwate.jp
-otsuchi.iwate.jp
-rikuzentakata.iwate.jp
-shiwa.iwate.jp
-shizukuishi.iwate.jp
-sumita.iwate.jp
-tanohata.iwate.jp
-tono.iwate.jp
-yahaba.iwate.jp
-yamada.iwate.jp
-ayagawa.kagawa.jp
-higashikagawa.kagawa.jp
-kanonji.kagawa.jp
-kotohira.kagawa.jp
-manno.kagawa.jp
-marugame.kagawa.jp
-mitoyo.kagawa.jp
-naoshima.kagawa.jp
-sanuki.kagawa.jp
-tadotsu.kagawa.jp
-takamatsu.kagawa.jp
-tonosho.kagawa.jp
-uchinomi.kagawa.jp
-utazu.kagawa.jp
-zentsuji.kagawa.jp
-akune.kagoshima.jp
-amami.kagoshima.jp
-hioki.kagoshima.jp
-isa.kagoshima.jp
-isen.kagoshima.jp
-izumi.kagoshima.jp
-kagoshima.kagoshima.jp
-kanoya.kagoshima.jp
-kawanabe.kagoshima.jp
-kinko.kagoshima.jp
-kouyama.kagoshima.jp
-makurazaki.kagoshima.jp
-matsumoto.kagoshima.jp
-minamitane.kagoshima.jp
-nakatane.kagoshima.jp
-nishinoomote.kagoshima.jp
-satsumasendai.kagoshima.jp
-soo.kagoshima.jp
-tarumizu.kagoshima.jp
-yusui.kagoshima.jp
-aikawa.kanagawa.jp
-atsugi.kanagawa.jp
-ayase.kanagawa.jp
-chigasaki.kanagawa.jp
-ebina.kanagawa.jp
-fujisawa.kanagawa.jp
-hadano.kanagawa.jp
-hakone.kanagawa.jp
-hiratsuka.kanagawa.jp
-isehara.kanagawa.jp
-kaisei.kanagawa.jp
-kamakura.kanagawa.jp
-kiyokawa.kanagawa.jp
-matsuda.kanagawa.jp
-minamiashigara.kanagawa.jp
-miura.kanagawa.jp
-nakai.kanagawa.jp
-ninomiya.kanagawa.jp
-odawara.kanagawa.jp
-oi.kanagawa.jp
-oiso.kanagawa.jp
-sagamihara.kanagawa.jp
-samukawa.kanagawa.jp
-tsukui.kanagawa.jp
-yamakita.kanagawa.jp
-yamato.kanagawa.jp
-yokosuka.kanagawa.jp
-yugawara.kanagawa.jp
-zama.kanagawa.jp
-zushi.kanagawa.jp
-aki.kochi.jp
-geisei.kochi.jp
-hidaka.kochi.jp
-higashitsuno.kochi.jp
-ino.kochi.jp
-kagami.kochi.jp
-kami.kochi.jp
-kitagawa.kochi.jp
-kochi.kochi.jp
-mihara.kochi.jp
-motoyama.kochi.jp
-muroto.kochi.jp
-nahari.kochi.jp
-nakamura.kochi.jp
-nankoku.kochi.jp
-nishitosa.kochi.jp
-niyodogawa.kochi.jp
-ochi.kochi.jp
-okawa.kochi.jp
-otoyo.kochi.jp
-otsuki.kochi.jp
-sakawa.kochi.jp
-sukumo.kochi.jp
-susaki.kochi.jp
-tosa.kochi.jp
-tosashimizu.kochi.jp
-toyo.kochi.jp
-tsuno.kochi.jp
-umaji.kochi.jp
-yasuda.kochi.jp
-yusuhara.kochi.jp
-amakusa.kumamoto.jp
-arao.kumamoto.jp
-aso.kumamoto.jp
-choyo.kumamoto.jp
-gyokuto.kumamoto.jp
-hitoyoshi.kumamoto.jp
-kamiamakusa.kumamoto.jp
-kashima.kumamoto.jp
-kikuchi.kumamoto.jp
-kosa.kumamoto.jp
-kumamoto.kumamoto.jp
-mashiki.kumamoto.jp
-mifune.kumamoto.jp
-minamata.kumamoto.jp
-minamioguni.kumamoto.jp
-nagasu.kumamoto.jp
-nishihara.kumamoto.jp
-oguni.kumamoto.jp
-ozu.kumamoto.jp
-sumoto.kumamoto.jp
-takamori.kumamoto.jp
-uki.kumamoto.jp
-uto.kumamoto.jp
-yamaga.kumamoto.jp
-yamato.kumamoto.jp
-yatsushiro.kumamoto.jp
-ayabe.kyoto.jp
-fukuchiyama.kyoto.jp
-higashiyama.kyoto.jp
-ide.kyoto.jp
-ine.kyoto.jp
-joyo.kyoto.jp
-kameoka.kyoto.jp
-kamo.kyoto.jp
-kita.kyoto.jp
-kizu.kyoto.jp
-kumiyama.kyoto.jp
-kyotamba.kyoto.jp
-kyotanabe.kyoto.jp
-kyotango.kyoto.jp
-maizuru.kyoto.jp
-minami.kyoto.jp
-minamiyamashiro.kyoto.jp
-miyazu.kyoto.jp
-muko.kyoto.jp
-nagaokakyo.kyoto.jp
-nakagyo.kyoto.jp
-nantan.kyoto.jp
-oyamazaki.kyoto.jp
-sakyo.kyoto.jp
-seika.kyoto.jp
-tanabe.kyoto.jp
-uji.kyoto.jp
-ujitawara.kyoto.jp
-wazuka.kyoto.jp
-yamashina.kyoto.jp
-yawata.kyoto.jp
-asahi.mie.jp
-inabe.mie.jp
-ise.mie.jp
-kameyama.mie.jp
-kawagoe.mie.jp
-kiho.mie.jp
-kisosaki.mie.jp
-kiwa.mie.jp
-komono.mie.jp
-kumano.mie.jp
-kuwana.mie.jp
-matsusaka.mie.jp
-meiwa.mie.jp
-mihama.mie.jp
-minamiise.mie.jp
-misugi.mie.jp
-miyama.mie.jp
-nabari.mie.jp
-shima.mie.jp
-suzuka.mie.jp
-tado.mie.jp
-taiki.mie.jp
-taki.mie.jp
-tamaki.mie.jp
-toba.mie.jp
-tsu.mie.jp
-udono.mie.jp
-ureshino.mie.jp
-watarai.mie.jp
-yokkaichi.mie.jp
-furukawa.miyagi.jp
-higashimatsushima.miyagi.jp
-ishinomaki.miyagi.jp
-iwanuma.miyagi.jp
-kakuda.miyagi.jp
-kami.miyagi.jp
-kawasaki.miyagi.jp
-kesennuma.miyagi.jp
-marumori.miyagi.jp
-matsushima.miyagi.jp
-minamisanriku.miyagi.jp
-misato.miyagi.jp
-murata.miyagi.jp
-natori.miyagi.jp
-ogawara.miyagi.jp
-ohira.miyagi.jp
-onagawa.miyagi.jp
-osaki.miyagi.jp
-rifu.miyagi.jp
-semine.miyagi.jp
-shibata.miyagi.jp
-shichikashuku.miyagi.jp
-shikama.miyagi.jp
-shiogama.miyagi.jp
-shiroishi.miyagi.jp
-tagajo.miyagi.jp
-taiwa.miyagi.jp
-tome.miyagi.jp
-tomiya.miyagi.jp
-wakuya.miyagi.jp
-watari.miyagi.jp
-yamamoto.miyagi.jp
-zao.miyagi.jp
-aya.miyazaki.jp
-ebino.miyazaki.jp
-gokase.miyazaki.jp
-hyuga.miyazaki.jp
-kadogawa.miyazaki.jp
-kawaminami.miyazaki.jp
-kijo.miyazaki.jp
-kitagawa.miyazaki.jp
-kitakata.miyazaki.jp
-kitaura.miyazaki.jp
-kobayashi.miyazaki.jp
-kunitomi.miyazaki.jp
-kushima.miyazaki.jp
-mimata.miyazaki.jp
-miyakonojo.miyazaki.jp
-miyazaki.miyazaki.jp
-morotsuka.miyazaki.jp
-nichinan.miyazaki.jp
-nishimera.miyazaki.jp
-nobeoka.miyazaki.jp
-saito.miyazaki.jp
-shiiba.miyazaki.jp
-shintomi.miyazaki.jp
-takaharu.miyazaki.jp
-takanabe.miyazaki.jp
-takazaki.miyazaki.jp
-tsuno.miyazaki.jp
-achi.nagano.jp
-agematsu.nagano.jp
-anan.nagano.jp
-aoki.nagano.jp
-asahi.nagano.jp
-azumino.nagano.jp
-chikuhoku.nagano.jp
-chikuma.nagano.jp
-chino.nagano.jp
-fujimi.nagano.jp
-hakuba.nagano.jp
-hara.nagano.jp
-hiraya.nagano.jp
-iida.nagano.jp
-iijima.nagano.jp
-iiyama.nagano.jp
-iizuna.nagano.jp
-ikeda.nagano.jp
-ikusaka.nagano.jp
-ina.nagano.jp
-karuizawa.nagano.jp
-kawakami.nagano.jp
-kiso.nagano.jp
-kisofukushima.nagano.jp
-kitaaiki.nagano.jp
-komagane.nagano.jp
-komoro.nagano.jp
-matsukawa.nagano.jp
-matsumoto.nagano.jp
-miasa.nagano.jp
-minamiaiki.nagano.jp
-minamimaki.nagano.jp
-minamiminowa.nagano.jp
-minowa.nagano.jp
-miyada.nagano.jp
-miyota.nagano.jp
-mochizuki.nagano.jp
-nagano.nagano.jp
-nagawa.nagano.jp
-nagiso.nagano.jp
-nakagawa.nagano.jp
-nakano.nagano.jp
-nozawaonsen.nagano.jp
-obuse.nagano.jp
-ogawa.nagano.jp
-okaya.nagano.jp
-omachi.nagano.jp
-omi.nagano.jp
-ookuwa.nagano.jp
-ooshika.nagano.jp
-otaki.nagano.jp
-otari.nagano.jp
-sakae.nagano.jp
-sakaki.nagano.jp
-saku.nagano.jp
-sakuho.nagano.jp
-shimosuwa.nagano.jp
-shinanomachi.nagano.jp
-shiojiri.nagano.jp
-suwa.nagano.jp
-suzaka.nagano.jp
-takagi.nagano.jp
-takamori.nagano.jp
-takayama.nagano.jp
-tateshina.nagano.jp
-tatsuno.nagano.jp
-togakushi.nagano.jp
-togura.nagano.jp
-tomi.nagano.jp
-ueda.nagano.jp
-wada.nagano.jp
-yamagata.nagano.jp
-yamanouchi.nagano.jp
-yasaka.nagano.jp
-yasuoka.nagano.jp
-chijiwa.nagasaki.jp
-futsu.nagasaki.jp
-goto.nagasaki.jp
-hasami.nagasaki.jp
-hirado.nagasaki.jp
-iki.nagasaki.jp
-isahaya.nagasaki.jp
-kawatana.nagasaki.jp
-kuchinotsu.nagasaki.jp
-matsuura.nagasaki.jp
-nagasaki.nagasaki.jp
-obama.nagasaki.jp
-omura.nagasaki.jp
-oseto.nagasaki.jp
-saikai.nagasaki.jp
-sasebo.nagasaki.jp
-seihi.nagasaki.jp
-shimabara.nagasaki.jp
-shinkamigoto.nagasaki.jp
-togitsu.nagasaki.jp
-tsushima.nagasaki.jp
-unzen.nagasaki.jp
-ando.nara.jp
-gose.nara.jp
-heguri.nara.jp
-higashiyoshino.nara.jp
-ikaruga.nara.jp
-ikoma.nara.jp
-kamikitayama.nara.jp
-kanmaki.nara.jp
-kashiba.nara.jp
-kashihara.nara.jp
-katsuragi.nara.jp
-kawai.nara.jp
-kawakami.nara.jp
-kawanishi.nara.jp
-koryo.nara.jp
-kurotaki.nara.jp
-mitsue.nara.jp
-miyake.nara.jp
-nara.nara.jp
-nosegawa.nara.jp
-oji.nara.jp
-ouda.nara.jp
-oyodo.nara.jp
-sakurai.nara.jp
-sango.nara.jp
-shimoichi.nara.jp
-shimokitayama.nara.jp
-shinjo.nara.jp
-soni.nara.jp
-takatori.nara.jp
-tawaramoto.nara.jp
-tenkawa.nara.jp
-tenri.nara.jp
-uda.nara.jp
-yamatokoriyama.nara.jp
-yamatotakada.nara.jp
-yamazoe.nara.jp
-yoshino.nara.jp
-aga.niigata.jp
-agano.niigata.jp
-gosen.niigata.jp
-itoigawa.niigata.jp
-izumozaki.niigata.jp
-joetsu.niigata.jp
-kamo.niigata.jp
-kariwa.niigata.jp
-kashiwazaki.niigata.jp
-minamiuonuma.niigata.jp
-mitsuke.niigata.jp
-muika.niigata.jp
-murakami.niigata.jp
-myoko.niigata.jp
-nagaoka.niigata.jp
-niigata.niigata.jp
-ojiya.niigata.jp
-omi.niigata.jp
-sado.niigata.jp
-sanjo.niigata.jp
-seiro.niigata.jp
-seirou.niigata.jp
-sekikawa.niigata.jp
-shibata.niigata.jp
-tagami.niigata.jp
-tainai.niigata.jp
-tochio.niigata.jp
-tokamachi.niigata.jp
-tsubame.niigata.jp
-tsunan.niigata.jp
-uonuma.niigata.jp
-yahiko.niigata.jp
-yoita.niigata.jp
-yuzawa.niigata.jp
-beppu.oita.jp
-bungoono.oita.jp
-bungotakada.oita.jp
-hasama.oita.jp
-hiji.oita.jp
-himeshima.oita.jp
-hita.oita.jp
-kamitsue.oita.jp
-kokonoe.oita.jp
-kuju.oita.jp
-kunisaki.oita.jp
-kusu.oita.jp
-oita.oita.jp
-saiki.oita.jp
-taketa.oita.jp
-tsukumi.oita.jp
-usa.oita.jp
-usuki.oita.jp
-yufu.oita.jp
-akaiwa.okayama.jp
-asakuchi.okayama.jp
-bizen.okayama.jp
-hayashima.okayama.jp
-ibara.okayama.jp
-kagamino.okayama.jp
-kasaoka.okayama.jp
-kibichuo.okayama.jp
-kumenan.okayama.jp
-kurashiki.okayama.jp
-maniwa.okayama.jp
-misaki.okayama.jp
-nagi.okayama.jp
-niimi.okayama.jp
-nishiawakura.okayama.jp
-okayama.okayama.jp
-satosho.okayama.jp
-setouchi.okayama.jp
-shinjo.okayama.jp
-shoo.okayama.jp
-soja.okayama.jp
-takahashi.okayama.jp
-tamano.okayama.jp
-tsuyama.okayama.jp
-wake.okayama.jp
-yakage.okayama.jp
-aguni.okinawa.jp
-ginowan.okinawa.jp
-ginoza.okinawa.jp
-gushikami.okinawa.jp
-haebaru.okinawa.jp
-higashi.okinawa.jp
-hirara.okinawa.jp
-iheya.okinawa.jp
-ishigaki.okinawa.jp
-ishikawa.okinawa.jp
-itoman.okinawa.jp
-izena.okinawa.jp
-kadena.okinawa.jp
-kin.okinawa.jp
-kitadaito.okinawa.jp
-kitanakagusuku.okinawa.jp
-kumejima.okinawa.jp
-kunigami.okinawa.jp
-minamidaito.okinawa.jp
-motobu.okinawa.jp
-nago.okinawa.jp
-naha.okinawa.jp
-nakagusuku.okinawa.jp
-nakijin.okinawa.jp
-nanjo.okinawa.jp
-nishihara.okinawa.jp
-ogimi.okinawa.jp
-okinawa.okinawa.jp
-onna.okinawa.jp
-shimoji.okinawa.jp
-taketomi.okinawa.jp
-tarama.okinawa.jp
-tokashiki.okinawa.jp
-tomigusuku.okinawa.jp
-tonaki.okinawa.jp
-urasoe.okinawa.jp
-uruma.okinawa.jp
-yaese.okinawa.jp
-yomitan.okinawa.jp
-yonabaru.okinawa.jp
-yonaguni.okinawa.jp
-zamami.okinawa.jp
-abeno.osaka.jp
-chihayaakasaka.osaka.jp
-chuo.osaka.jp
-daito.osaka.jp
-fujiidera.osaka.jp
-habikino.osaka.jp
-hannan.osaka.jp
-higashiosaka.osaka.jp
-higashisumiyoshi.osaka.jp
-higashiyodogawa.osaka.jp
-hirakata.osaka.jp
-ibaraki.osaka.jp
-ikeda.osaka.jp
-izumi.osaka.jp
-izumiotsu.osaka.jp
-izumisano.osaka.jp
-kadoma.osaka.jp
-kaizuka.osaka.jp
-kanan.osaka.jp
-kashiwara.osaka.jp
-katano.osaka.jp
-kawachinagano.osaka.jp
-kishiwada.osaka.jp
-kita.osaka.jp
-kumatori.osaka.jp
-matsubara.osaka.jp
-minato.osaka.jp
-minoh.osaka.jp
-misaki.osaka.jp
-moriguchi.osaka.jp
-neyagawa.osaka.jp
-nishi.osaka.jp
-nose.osaka.jp
-osakasayama.osaka.jp
-sakai.osaka.jp
-sayama.osaka.jp
-sennan.osaka.jp
-settsu.osaka.jp
-shijonawate.osaka.jp
-shimamoto.osaka.jp
-suita.osaka.jp
-tadaoka.osaka.jp
-taishi.osaka.jp
-tajiri.osaka.jp
-takaishi.osaka.jp
-takatsuki.osaka.jp
-tondabayashi.osaka.jp
-toyonaka.osaka.jp
-toyono.osaka.jp
-yao.osaka.jp
-ariake.saga.jp
-arita.saga.jp
-fukudomi.saga.jp
-genkai.saga.jp
-hamatama.saga.jp
-hizen.saga.jp
-imari.saga.jp
-kamimine.saga.jp
-kanzaki.saga.jp
-karatsu.saga.jp
-kashima.saga.jp
-kitagata.saga.jp
-kitahata.saga.jp
-kiyama.saga.jp
-kouhoku.saga.jp
-kyuragi.saga.jp
-nishiarita.saga.jp
-ogi.saga.jp
-omachi.saga.jp
-ouchi.saga.jp
-saga.saga.jp
-shiroishi.saga.jp
-taku.saga.jp
-tara.saga.jp
-tosu.saga.jp
-yoshinogari.saga.jp
-arakawa.saitama.jp
-asaka.saitama.jp
-chichibu.saitama.jp
-fujimi.saitama.jp
-fujimino.saitama.jp
-fukaya.saitama.jp
-hanno.saitama.jp
-hanyu.saitama.jp
-hasuda.saitama.jp
-hatogaya.saitama.jp
-hatoyama.saitama.jp
-hidaka.saitama.jp
-higashichichibu.saitama.jp
-higashimatsuyama.saitama.jp
-honjo.saitama.jp
-ina.saitama.jp
-iruma.saitama.jp
-iwatsuki.saitama.jp
-kamiizumi.saitama.jp
-kamikawa.saitama.jp
-kamisato.saitama.jp
-kasukabe.saitama.jp
-kawagoe.saitama.jp
-kawaguchi.saitama.jp
-kawajima.saitama.jp
-kazo.saitama.jp
-kitamoto.saitama.jp
-koshigaya.saitama.jp
-kounosu.saitama.jp
-kuki.saitama.jp
-kumagaya.saitama.jp
-matsubushi.saitama.jp
-minano.saitama.jp
-misato.saitama.jp
-miyashiro.saitama.jp
-miyoshi.saitama.jp
-moroyama.saitama.jp
-nagatoro.saitama.jp
-namegawa.saitama.jp
-niiza.saitama.jp
-ogano.saitama.jp
-ogawa.saitama.jp
-ogose.saitama.jp
-okegawa.saitama.jp
-omiya.saitama.jp
-otaki.saitama.jp
-ranzan.saitama.jp
-ryokami.saitama.jp
-saitama.saitama.jp
-sakado.saitama.jp
-satte.saitama.jp
-sayama.saitama.jp
-shiki.saitama.jp
-shiraoka.saitama.jp
-soka.saitama.jp
-sugito.saitama.jp
-toda.saitama.jp
-tokigawa.saitama.jp
-tokorozawa.saitama.jp
-tsurugashima.saitama.jp
-urawa.saitama.jp
-warabi.saitama.jp
-yashio.saitama.jp
-yokoze.saitama.jp
-yono.saitama.jp
-yorii.saitama.jp
-yoshida.saitama.jp
-yoshikawa.saitama.jp
-yoshimi.saitama.jp
-aisho.shiga.jp
-gamo.shiga.jp
-higashiomi.shiga.jp
-hikone.shiga.jp
-koka.shiga.jp
-konan.shiga.jp
-kosei.shiga.jp
-koto.shiga.jp
-kusatsu.shiga.jp
-maibara.shiga.jp
-moriyama.shiga.jp
-nagahama.shiga.jp
-nishiazai.shiga.jp
-notogawa.shiga.jp
-omihachiman.shiga.jp
-otsu.shiga.jp
-ritto.shiga.jp
-ryuoh.shiga.jp
-takashima.shiga.jp
-takatsuki.shiga.jp
-torahime.shiga.jp
-toyosato.shiga.jp
-yasu.shiga.jp
-akagi.shimane.jp
-ama.shimane.jp
-gotsu.shimane.jp
-hamada.shimane.jp
-higashiizumo.shimane.jp
-hikawa.shimane.jp
-hikimi.shimane.jp
-izumo.shimane.jp
-kakinoki.shimane.jp
-masuda.shimane.jp
-matsue.shimane.jp
-misato.shimane.jp
-nishinoshima.shimane.jp
-ohda.shimane.jp
-okinoshima.shimane.jp
-okuizumo.shimane.jp
-shimane.shimane.jp
-tamayu.shimane.jp
-tsuwano.shimane.jp
-unnan.shimane.jp
-yakumo.shimane.jp
-yasugi.shimane.jp
-yatsuka.shimane.jp
-arai.shizuoka.jp
-atami.shizuoka.jp
-fuji.shizuoka.jp
-fujieda.shizuoka.jp
-fujikawa.shizuoka.jp
-fujinomiya.shizuoka.jp
-fukuroi.shizuoka.jp
-gotemba.shizuoka.jp
-haibara.shizuoka.jp
-hamamatsu.shizuoka.jp
-higashiizu.shizuoka.jp
-ito.shizuoka.jp
-iwata.shizuoka.jp
-izu.shizuoka.jp
-izunokuni.shizuoka.jp
-kakegawa.shizuoka.jp
-kannami.shizuoka.jp
-kawanehon.shizuoka.jp
-kawazu.shizuoka.jp
-kikugawa.shizuoka.jp
-kosai.shizuoka.jp
-makinohara.shizuoka.jp
-matsuzaki.shizuoka.jp
-minamiizu.shizuoka.jp
-mishima.shizuoka.jp
-morimachi.shizuoka.jp
-nishiizu.shizuoka.jp
-numazu.shizuoka.jp
-omaezaki.shizuoka.jp
-shimada.shizuoka.jp
-shimizu.shizuoka.jp
-shimoda.shizuoka.jp
-shizuoka.shizuoka.jp
-susono.shizuoka.jp
-yaizu.shizuoka.jp
-yoshida.shizuoka.jp
-ashikaga.tochigi.jp
-bato.tochigi.jp
-haga.tochigi.jp
-ichikai.tochigi.jp
-iwafune.tochigi.jp
-kaminokawa.tochigi.jp
-kanuma.tochigi.jp
-karasuyama.tochigi.jp
-kuroiso.tochigi.jp
-mashiko.tochigi.jp
-mibu.tochigi.jp
-moka.tochigi.jp
-motegi.tochigi.jp
-nasu.tochigi.jp
-nasushiobara.tochigi.jp
-nikko.tochigi.jp
-nishikata.tochigi.jp
-nogi.tochigi.jp
-ohira.tochigi.jp
-ohtawara.tochigi.jp
-oyama.tochigi.jp
-sakura.tochigi.jp
-sano.tochigi.jp
-shimotsuke.tochigi.jp
-shioya.tochigi.jp
-takanezawa.tochigi.jp
-tochigi.tochigi.jp
-tsuga.tochigi.jp
-ujiie.tochigi.jp
-utsunomiya.tochigi.jp
-yaita.tochigi.jp
-aizumi.tokushima.jp
-anan.tokushima.jp
-ichiba.tokushima.jp
-itano.tokushima.jp
-kainan.tokushima.jp
-komatsushima.tokushima.jp
-matsushige.tokushima.jp
-mima.tokushima.jp
-minami.tokushima.jp
-miyoshi.tokushima.jp
-mugi.tokushima.jp
-nakagawa.tokushima.jp
-naruto.tokushima.jp
-sanagochi.tokushima.jp
-shishikui.tokushima.jp
-tokushima.tokushima.jp
-wajiki.tokushima.jp
-adachi.tokyo.jp
-akiruno.tokyo.jp
-akishima.tokyo.jp
-aogashima.tokyo.jp
-arakawa.tokyo.jp
-bunkyo.tokyo.jp
-chiyoda.tokyo.jp
-chofu.tokyo.jp
-chuo.tokyo.jp
-edogawa.tokyo.jp
-fuchu.tokyo.jp
-fussa.tokyo.jp
-hachijo.tokyo.jp
-hachioji.tokyo.jp
-hamura.tokyo.jp
-higashikurume.tokyo.jp
-higashimurayama.tokyo.jp
-higashiyamato.tokyo.jp
-hino.tokyo.jp
-hinode.tokyo.jp
-hinohara.tokyo.jp
-inagi.tokyo.jp
-itabashi.tokyo.jp
-katsushika.tokyo.jp
-kita.tokyo.jp
-kiyose.tokyo.jp
-kodaira.tokyo.jp
-koganei.tokyo.jp
-kokubunji.tokyo.jp
-komae.tokyo.jp
-koto.tokyo.jp
-kouzushima.tokyo.jp
-kunitachi.tokyo.jp
-machida.tokyo.jp
-meguro.tokyo.jp
-minato.tokyo.jp
-mitaka.tokyo.jp
-mizuho.tokyo.jp
-musashimurayama.tokyo.jp
-musashino.tokyo.jp
-nakano.tokyo.jp
-nerima.tokyo.jp
-ogasawara.tokyo.jp
-okutama.tokyo.jp
-ome.tokyo.jp
-oshima.tokyo.jp
-ota.tokyo.jp
-setagaya.tokyo.jp
-shibuya.tokyo.jp
-shinagawa.tokyo.jp
-shinjuku.tokyo.jp
-suginami.tokyo.jp
-sumida.tokyo.jp
-tachikawa.tokyo.jp
-taito.tokyo.jp
-tama.tokyo.jp
-toshima.tokyo.jp
-chizu.tottori.jp
-hino.tottori.jp
-kawahara.tottori.jp
-koge.tottori.jp
-kotoura.tottori.jp
-misasa.tottori.jp
-nanbu.tottori.jp
-nichinan.tottori.jp
-sakaiminato.tottori.jp
-tottori.tottori.jp
-wakasa.tottori.jp
-yazu.tottori.jp
-yonago.tottori.jp
-asahi.toyama.jp
-fuchu.toyama.jp
-fukumitsu.toyama.jp
-funahashi.toyama.jp
-himi.toyama.jp
-imizu.toyama.jp
-inami.toyama.jp
-johana.toyama.jp
-kamiichi.toyama.jp
-kurobe.toyama.jp
-nakaniikawa.toyama.jp
-namerikawa.toyama.jp
-nanto.toyama.jp
-nyuzen.toyama.jp
-oyabe.toyama.jp
-taira.toyama.jp
-takaoka.toyama.jp
-tateyama.toyama.jp
-toga.toyama.jp
-tonami.toyama.jp
-toyama.toyama.jp
-unazuki.toyama.jp
-uozu.toyama.jp
-yamada.toyama.jp
-arida.wakayama.jp
-aridagawa.wakayama.jp
-gobo.wakayama.jp
-hashimoto.wakayama.jp
-hidaka.wakayama.jp
-hirogawa.wakayama.jp
-inami.wakayama.jp
-iwade.wakayama.jp
-kainan.wakayama.jp
-kamitonda.wakayama.jp
-katsuragi.wakayama.jp
-kimino.wakayama.jp
-kinokawa.wakayama.jp
-kitayama.wakayama.jp
-koya.wakayama.jp
-koza.wakayama.jp
-kozagawa.wakayama.jp
-kudoyama.wakayama.jp
-kushimoto.wakayama.jp
-mihama.wakayama.jp
-misato.wakayama.jp
-nachikatsuura.wakayama.jp
-shingu.wakayama.jp
-shirahama.wakayama.jp
-taiji.wakayama.jp
-tanabe.wakayama.jp
-wakayama.wakayama.jp
-yuasa.wakayama.jp
-yura.wakayama.jp
-asahi.yamagata.jp
-funagata.yamagata.jp
-higashine.yamagata.jp
-iide.yamagata.jp
-kahoku.yamagata.jp
-kaminoyama.yamagata.jp
-kaneyama.yamagata.jp
-kawanishi.yamagata.jp
-mamurogawa.yamagata.jp
-mikawa.yamagata.jp
-murayama.yamagata.jp
-nagai.yamagata.jp
-nakayama.yamagata.jp
-nanyo.yamagata.jp
-nishikawa.yamagata.jp
-obanazawa.yamagata.jp
-oe.yamagata.jp
-oguni.yamagata.jp
-ohkura.yamagata.jp
-oishida.yamagata.jp
-sagae.yamagata.jp
-sakata.yamagata.jp
-sakegawa.yamagata.jp
-shinjo.yamagata.jp
-shirataka.yamagata.jp
-shonai.yamagata.jp
-takahata.yamagata.jp
-tendo.yamagata.jp
-tozawa.yamagata.jp
-tsuruoka.yamagata.jp
-yamagata.yamagata.jp
-yamanobe.yamagata.jp
-yonezawa.yamagata.jp
-yuza.yamagata.jp
-abu.yamaguchi.jp
-hagi.yamaguchi.jp
-hikari.yamaguchi.jp
-hofu.yamaguchi.jp
-iwakuni.yamaguchi.jp
-kudamatsu.yamaguchi.jp
-mitou.yamaguchi.jp
-nagato.yamaguchi.jp
-oshima.yamaguchi.jp
-shimonoseki.yamaguchi.jp
-shunan.yamaguchi.jp
-tabuse.yamaguchi.jp
-tokuyama.yamaguchi.jp
-toyota.yamaguchi.jp
-ube.yamaguchi.jp
-yuu.yamaguchi.jp
-chuo.yamanashi.jp
-doshi.yamanashi.jp
-fuefuki.yamanashi.jp
-fujikawa.yamanashi.jp
-fujikawaguchiko.yamanashi.jp
-fujiyoshida.yamanashi.jp
-hayakawa.yamanashi.jp
-hokuto.yamanashi.jp
-ichikawamisato.yamanashi.jp
-kai.yamanashi.jp
-kofu.yamanashi.jp
-koshu.yamanashi.jp
-kosuge.yamanashi.jp
-minami-alps.yamanashi.jp
-minobu.yamanashi.jp
-nakamichi.yamanashi.jp
-nanbu.yamanashi.jp
-narusawa.yamanashi.jp
-nirasaki.yamanashi.jp
-nishikatsura.yamanashi.jp
-oshino.yamanashi.jp
-otsuki.yamanashi.jp
-showa.yamanashi.jp
-tabayama.yamanashi.jp
-tsuru.yamanashi.jp
-uenohara.yamanashi.jp
-yamanakako.yamanashi.jp
-yamanashi.yamanashi.jp
-
-// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145
-*.ke
-
-// kg : http://www.domain.kg/dmn_n.html
-kg
-org.kg
-net.kg
-com.kg
-edu.kg
-gov.kg
-mil.kg
-
-// kh : http://www.mptc.gov.kh/dns_registration.htm
-*.kh
-
-// ki : http://www.ki/dns/index.html
-ki
-edu.ki
-biz.ki
-net.ki
-org.ki
-gov.ki
-info.ki
-com.ki
-
-// km : https://en.wikipedia.org/wiki/.km
-// http://www.domaine.km/documents/charte.doc
-km
-org.km
-nom.km
-gov.km
-prd.km
-tm.km
-edu.km
-mil.km
-ass.km
-com.km
-// These are only mentioned as proposed suggestions at domaine.km, but
-// https://en.wikipedia.org/wiki/.km says they're available for registration:
-coop.km
-asso.km
-presse.km
-medecin.km
-notaires.km
-pharmaciens.km
-veterinaire.km
-gouv.km
-
-// kn : https://en.wikipedia.org/wiki/.kn
-// http://www.dot.kn/domainRules.html
-kn
-net.kn
-org.kn
-edu.kn
-gov.kn
-
-// kp : http://www.kcce.kp/en_index.php
-kp
-com.kp
-edu.kp
-gov.kp
-org.kp
-rep.kp
-tra.kp
-
-// kr : https://en.wikipedia.org/wiki/.kr
-// see also: http://domain.nida.or.kr/eng/registration.jsp
-kr
-ac.kr
-co.kr
-es.kr
-go.kr
-hs.kr
-kg.kr
-mil.kr
-ms.kr
-ne.kr
-or.kr
-pe.kr
-re.kr
-sc.kr
-// kr geographical names
-busan.kr
-chungbuk.kr
-chungnam.kr
-daegu.kr
-daejeon.kr
-gangwon.kr
-gwangju.kr
-gyeongbuk.kr
-gyeonggi.kr
-gyeongnam.kr
-incheon.kr
-jeju.kr
-jeonbuk.kr
-jeonnam.kr
-seoul.kr
-ulsan.kr
-
-// kw : https://en.wikipedia.org/wiki/.kw
-*.kw
-
-// ky : http://www.icta.ky/da_ky_reg_dom.php
-// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17
-ky
-edu.ky
-gov.ky
-com.ky
-org.ky
-net.ky
-
-// kz : https://en.wikipedia.org/wiki/.kz
-// see also: http://www.nic.kz/rules/index.jsp
-kz
-org.kz
-edu.kz
-net.kz
-gov.kz
-mil.kz
-com.kz
-
-// la : https://en.wikipedia.org/wiki/.la
-// Submitted by registry <gavin.brown@nic.la>
-la
-int.la
-net.la
-info.la
-edu.la
-gov.la
-per.la
-com.la
-org.la
-
-// lb : https://en.wikipedia.org/wiki/.lb
-// Submitted by registry <randy@psg.com>
-lb
-com.lb
-edu.lb
-gov.lb
-net.lb
-org.lb
-
-// lc : https://en.wikipedia.org/wiki/.lc
-// see also: http://www.nic.lc/rules.htm
-lc
-com.lc
-net.lc
-co.lc
-org.lc
-edu.lc
-gov.lc
-
-// li : https://en.wikipedia.org/wiki/.li
-li
-
-// lk : http://www.nic.lk/seclevpr.html
-lk
-gov.lk
-sch.lk
-net.lk
-int.lk
-com.lk
-org.lk
-edu.lk
-ngo.lk
-soc.lk
-web.lk
-ltd.lk
-assn.lk
-grp.lk
-hotel.lk
-ac.lk
-
-// lr : http://psg.com/dns/lr/lr.txt
-// Submitted by registry <randy@psg.com>
-lr
-com.lr
-edu.lr
-gov.lr
-org.lr
-net.lr
-
-// ls : https://en.wikipedia.org/wiki/.ls
-ls
-co.ls
-org.ls
-
-// lt : https://en.wikipedia.org/wiki/.lt
-lt
-// gov.lt : http://www.gov.lt/index_en.php
-gov.lt
-
-// lu : http://www.dns.lu/en/
-lu
-
-// lv : http://www.nic.lv/DNS/En/generic.php
-lv
-com.lv
-edu.lv
-gov.lv
-org.lv
-mil.lv
-id.lv
-net.lv
-asn.lv
-conf.lv
-
-// ly : http://www.nic.ly/regulations.php
-ly
-com.ly
-net.ly
-gov.ly
-plc.ly
-edu.ly
-sch.ly
-med.ly
-org.ly
-id.ly
-
-// ma : https://en.wikipedia.org/wiki/.ma
-// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf
-ma
-co.ma
-net.ma
-gov.ma
-org.ma
-ac.ma
-press.ma
-
-// mc : http://www.nic.mc/
-mc
-tm.mc
-asso.mc
-
-// md : https://en.wikipedia.org/wiki/.md
-md
-
-// me : https://en.wikipedia.org/wiki/.me
-me
-co.me
-net.me
-org.me
-edu.me
-ac.me
-gov.me
-its.me
-priv.me
-
-// mg : http://nic.mg/nicmg/?page_id=39
-mg
-org.mg
-nom.mg
-gov.mg
-prd.mg
-tm.mg
-edu.mg
-mil.mg
-com.mg
-co.mg
-
-// mh : https://en.wikipedia.org/wiki/.mh
-mh
-
-// mil : https://en.wikipedia.org/wiki/.mil
-mil
-
-// mk : https://en.wikipedia.org/wiki/.mk
-// see also: http://dns.marnet.net.mk/postapka.php
-mk
-com.mk
-org.mk
-net.mk
-edu.mk
-gov.mk
-inf.mk
-name.mk
-
-// ml : http://www.gobin.info/domainname/ml-template.doc
-// see also: https://en.wikipedia.org/wiki/.ml
-ml
-com.ml
-edu.ml
-gouv.ml
-gov.ml
-net.ml
-org.ml
-presse.ml
-
-// mm : https://en.wikipedia.org/wiki/.mm
-*.mm
-
-// mn : https://en.wikipedia.org/wiki/.mn
-mn
-gov.mn
-edu.mn
-org.mn
-
-// mo : http://www.monic.net.mo/
-mo
-com.mo
-net.mo
-org.mo
-edu.mo
-gov.mo
-
-// mobi : https://en.wikipedia.org/wiki/.mobi
-mobi
-
-// mp : http://www.dot.mp/
-// Confirmed by registry <dcamacho@saipan.com> 2008-06-17
-mp
-
-// mq : https://en.wikipedia.org/wiki/.mq
-mq
-
-// mr : https://en.wikipedia.org/wiki/.mr
-mr
-gov.mr
-
-// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf
-ms
-com.ms
-edu.ms
-gov.ms
-net.ms
-org.ms
-
-// mt : https://www.nic.org.mt/go/policy
-// Submitted by registry <help@nic.org.mt>
-mt
-com.mt
-edu.mt
-net.mt
-org.mt
-
-// mu : https://en.wikipedia.org/wiki/.mu
-mu
-com.mu
-net.mu
-org.mu
-gov.mu
-ac.mu
-co.mu
-or.mu
-
-// museum : http://about.museum/naming/
-// http://index.museum/
-museum
-academy.museum
-agriculture.museum
-air.museum
-airguard.museum
-alabama.museum
-alaska.museum
-amber.museum
-ambulance.museum
-american.museum
-americana.museum
-americanantiques.museum
-americanart.museum
-amsterdam.museum
-and.museum
-annefrank.museum
-anthro.museum
-anthropology.museum
-antiques.museum
-aquarium.museum
-arboretum.museum
-archaeological.museum
-archaeology.museum
-architecture.museum
-art.museum
-artanddesign.museum
-artcenter.museum
-artdeco.museum
-arteducation.museum
-artgallery.museum
-arts.museum
-artsandcrafts.museum
-asmatart.museum
-assassination.museum
-assisi.museum
-association.museum
-astronomy.museum
-atlanta.museum
-austin.museum
-australia.museum
-automotive.museum
-aviation.museum
-axis.museum
-badajoz.museum
-baghdad.museum
-bahn.museum
-bale.museum
-baltimore.museum
-barcelona.museum
-baseball.museum
-basel.museum
-baths.museum
-bauern.museum
-beauxarts.museum
-beeldengeluid.museum
-bellevue.museum
-bergbau.museum
-berkeley.museum
-berlin.museum
-bern.museum
-bible.museum
-bilbao.museum
-bill.museum
-birdart.museum
-birthplace.museum
-bonn.museum
-boston.museum
-botanical.museum
-botanicalgarden.museum
-botanicgarden.museum
-botany.museum
-brandywinevalley.museum
-brasil.museum
-bristol.museum
-british.museum
-britishcolumbia.museum
-broadcast.museum
-brunel.museum
-brussel.museum
-brussels.museum
-bruxelles.museum
-building.museum
-burghof.museum
-bus.museum
-bushey.museum
-cadaques.museum
-california.museum
-cambridge.museum
-can.museum
-canada.museum
-capebreton.museum
-carrier.museum
-cartoonart.museum
-casadelamoneda.museum
-castle.museum
-castres.museum
-celtic.museum
-center.museum
-chattanooga.museum
-cheltenham.museum
-chesapeakebay.museum
-chicago.museum
-children.museum
-childrens.museum
-childrensgarden.museum
-chiropractic.museum
-chocolate.museum
-christiansburg.museum
-cincinnati.museum
-cinema.museum
-circus.museum
-civilisation.museum
-civilization.museum
-civilwar.museum
-clinton.museum
-clock.museum
-coal.museum
-coastaldefence.museum
-cody.museum
-coldwar.museum
-collection.museum
-colonialwilliamsburg.museum
-coloradoplateau.museum
-columbia.museum
-columbus.museum
-communication.museum
-communications.museum
-community.museum
-computer.museum
-computerhistory.museum
-comunicações.museum
-contemporary.museum
-contemporaryart.museum
-convent.museum
-copenhagen.museum
-corporation.museum
-correios-e-telecomunicações.museum
-corvette.museum
-costume.museum
-countryestate.museum
-county.museum
-crafts.museum
-cranbrook.museum
-creation.museum
-cultural.museum
-culturalcenter.museum
-culture.museum
-cyber.museum
-cymru.museum
-dali.museum
-dallas.museum
-database.museum
-ddr.museum
-decorativearts.museum
-delaware.museum
-delmenhorst.museum
-denmark.museum
-depot.museum
-design.museum
-detroit.museum
-dinosaur.museum
-discovery.museum
-dolls.museum
-donostia.museum
-durham.museum
-eastafrica.museum
-eastcoast.museum
-education.museum
-educational.museum
-egyptian.museum
-eisenbahn.museum
-elburg.museum
-elvendrell.museum
-embroidery.museum
-encyclopedic.museum
-england.museum
-entomology.museum
-environment.museum
-environmentalconservation.museum
-epilepsy.museum
-essex.museum
-estate.museum
-ethnology.museum
-exeter.museum
-exhibition.museum
-family.museum
-farm.museum
-farmequipment.museum
-farmers.museum
-farmstead.museum
-field.museum
-figueres.museum
-filatelia.museum
-film.museum
-fineart.museum
-finearts.museum
-finland.museum
-flanders.museum
-florida.museum
-force.museum
-fortmissoula.museum
-fortworth.museum
-foundation.museum
-francaise.museum
-frankfurt.museum
-franziskaner.museum
-freemasonry.museum
-freiburg.museum
-fribourg.museum
-frog.museum
-fundacio.museum
-furniture.museum
-gallery.museum
-garden.museum
-gateway.museum
-geelvinck.museum
-gemological.museum
-geology.museum
-georgia.museum
-giessen.museum
-glas.museum
-glass.museum
-gorge.museum
-grandrapids.museum
-graz.museum
-guernsey.museum
-halloffame.museum
-hamburg.museum
-handson.museum
-harvestcelebration.museum
-hawaii.museum
-health.museum
-heimatunduhren.museum
-hellas.museum
-helsinki.museum
-hembygdsforbund.museum
-heritage.museum
-histoire.museum
-historical.museum
-historicalsociety.museum
-historichouses.museum
-historisch.museum
-historisches.museum
-history.museum
-historyofscience.museum
-horology.museum
-house.museum
-humanities.museum
-illustration.museum
-imageandsound.museum
-indian.museum
-indiana.museum
-indianapolis.museum
-indianmarket.museum
-intelligence.museum
-interactive.museum
-iraq.museum
-iron.museum
-isleofman.museum
-jamison.museum
-jefferson.museum
-jerusalem.museum
-jewelry.museum
-jewish.museum
-jewishart.museum
-jfk.museum
-journalism.museum
-judaica.museum
-judygarland.museum
-juedisches.museum
-juif.museum
-karate.museum
-karikatur.museum
-kids.museum
-koebenhavn.museum
-koeln.museum
-kunst.museum
-kunstsammlung.museum
-kunstunddesign.museum
-labor.museum
-labour.museum
-lajolla.museum
-lancashire.museum
-landes.museum
-lans.museum
-läns.museum
-larsson.museum
-lewismiller.museum
-lincoln.museum
-linz.museum
-living.museum
-livinghistory.museum
-localhistory.museum
-london.museum
-losangeles.museum
-louvre.museum
-loyalist.museum
-lucerne.museum
-luxembourg.museum
-luzern.museum
-mad.museum
-madrid.museum
-mallorca.museum
-manchester.museum
-mansion.museum
-mansions.museum
-manx.museum
-marburg.museum
-maritime.museum
-maritimo.museum
-maryland.museum
-marylhurst.museum
-media.museum
-medical.museum
-medizinhistorisches.museum
-meeres.museum
-memorial.museum
-mesaverde.museum
-michigan.museum
-midatlantic.museum
-military.museum
-mill.museum
-miners.museum
-mining.museum
-minnesota.museum
-missile.museum
-missoula.museum
-modern.museum
-moma.museum
-money.museum
-monmouth.museum
-monticello.museum
-montreal.museum
-moscow.museum
-motorcycle.museum
-muenchen.museum
-muenster.museum
-mulhouse.museum
-muncie.museum
-museet.museum
-museumcenter.museum
-museumvereniging.museum
-music.museum
-national.museum
-nationalfirearms.museum
-nationalheritage.museum
-nativeamerican.museum
-naturalhistory.museum
-naturalhistorymuseum.museum
-naturalsciences.museum
-nature.museum
-naturhistorisches.museum
-natuurwetenschappen.museum
-naumburg.museum
-naval.museum
-nebraska.museum
-neues.museum
-newhampshire.museum
-newjersey.museum
-newmexico.museum
-newport.museum
-newspaper.museum
-newyork.museum
-niepce.museum
-norfolk.museum
-north.museum
-nrw.museum
-nuernberg.museum
-nuremberg.museum
-nyc.museum
-nyny.museum
-oceanographic.museum
-oceanographique.museum
-omaha.museum
-online.museum
-ontario.museum
-openair.museum
-oregon.museum
-oregontrail.museum
-otago.museum
-oxford.museum
-pacific.museum
-paderborn.museum
-palace.museum
-paleo.museum
-palmsprings.museum
-panama.museum
-paris.museum
-pasadena.museum
-pharmacy.museum
-philadelphia.museum
-philadelphiaarea.museum
-philately.museum
-phoenix.museum
-photography.museum
-pilots.museum
-pittsburgh.museum
-planetarium.museum
-plantation.museum
-plants.museum
-plaza.museum
-portal.museum
-portland.museum
-portlligat.museum
-posts-and-telecommunications.museum
-preservation.museum
-presidio.museum
-press.museum
-project.museum
-public.museum
-pubol.museum
-quebec.museum
-railroad.museum
-railway.museum
-research.museum
-resistance.museum
-riodejaneiro.museum
-rochester.museum
-rockart.museum
-roma.museum
-russia.museum
-saintlouis.museum
-salem.museum
-salvadordali.museum
-salzburg.museum
-sandiego.museum
-sanfrancisco.museum
-santabarbara.museum
-santacruz.museum
-santafe.museum
-saskatchewan.museum
-satx.museum
-savannahga.museum
-schlesisches.museum
-schoenbrunn.museum
-schokoladen.museum
-school.museum
-schweiz.museum
-science.museum
-scienceandhistory.museum
-scienceandindustry.museum
-sciencecenter.museum
-sciencecenters.museum
-science-fiction.museum
-sciencehistory.museum
-sciences.museum
-sciencesnaturelles.museum
-scotland.museum
-seaport.museum
-settlement.museum
-settlers.museum
-shell.museum
-sherbrooke.museum
-sibenik.museum
-silk.museum
-ski.museum
-skole.museum
-society.museum
-sologne.museum
-soundandvision.museum
-southcarolina.museum
-southwest.museum
-space.museum
-spy.museum
-square.museum
-stadt.museum
-stalbans.museum
-starnberg.museum
-state.museum
-stateofdelaware.museum
-station.museum
-steam.museum
-steiermark.museum
-stjohn.museum
-stockholm.museum
-stpetersburg.museum
-stuttgart.museum
-suisse.museum
-surgeonshall.museum
-surrey.museum
-svizzera.museum
-sweden.museum
-sydney.museum
-tank.museum
-tcm.museum
-technology.museum
-telekommunikation.museum
-television.museum
-texas.museum
-textile.museum
-theater.museum
-time.museum
-timekeeping.museum
-topology.museum
-torino.museum
-touch.museum
-town.museum
-transport.museum
-tree.museum
-trolley.museum
-trust.museum
-trustee.museum
-uhren.museum
-ulm.museum
-undersea.museum
-university.museum
-usa.museum
-usantiques.museum
-usarts.museum
-uscountryestate.museum
-usculture.museum
-usdecorativearts.museum
-usgarden.museum
-ushistory.museum
-ushuaia.museum
-uslivinghistory.museum
-utah.museum
-uvic.museum
-valley.museum
-vantaa.museum
-versailles.museum
-viking.museum
-village.museum
-virginia.museum
-virtual.museum
-virtuel.museum
-vlaanderen.museum
-volkenkunde.museum
-wales.museum
-wallonie.museum
-war.museum
-washingtondc.museum
-watchandclock.museum
-watch-and-clock.museum
-western.museum
-westfalen.museum
-whaling.museum
-wildlife.museum
-williamsburg.museum
-windmill.museum
-workshop.museum
-york.museum
-yorkshire.museum
-yosemite.museum
-youth.museum
-zoological.museum
-zoology.museum
-ירושלים.museum
-иком.museum
-
-// mv : https://en.wikipedia.org/wiki/.mv
-// "mv" included because, contra Wikipedia, google.mv exists.
-mv
-aero.mv
-biz.mv
-com.mv
-coop.mv
-edu.mv
-gov.mv
-info.mv
-int.mv
-mil.mv
-museum.mv
-name.mv
-net.mv
-org.mv
-pro.mv
-
-// mw : http://www.registrar.mw/
-mw
-ac.mw
-biz.mw
-co.mw
-com.mw
-coop.mw
-edu.mw
-gov.mw
-int.mw
-museum.mw
-net.mw
-org.mw
-
-// mx : http://www.nic.mx/
-// Submitted by registry <farias@nic.mx>
-mx
-com.mx
-org.mx
-gob.mx
-edu.mx
-net.mx
-
-// my : http://www.mynic.net.my/
-my
-com.my
-net.my
-org.my
-gov.my
-edu.my
-mil.my
-name.my
-
-// mz : http://www.gobin.info/domainname/mz-template.doc
-*.mz
-!teledata.mz
-
-// na : http://www.na-nic.com.na/
-// http://www.info.na/domain/
-na
-info.na
-pro.na
-name.na
-school.na
-or.na
-dr.na
-us.na
-mx.na
-ca.na
-in.na
-cc.na