{"action":"created","comment":{"url":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/comments/76595217","id":76595217,"diff_hunk":"@@ -0,0 +1,529 @@\n+# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:\n+\n+# Copyright 2014-2016 Florian Bruhin (The Compiler) <mail@qutebrowser.org>\n+#\n+# This file is part of qutebrowser.\n+#\n+# qutebrowser is free software: you can redistribute it and/or modify\n+# it under the terms of the GNU General Public License as published by\n+# the Free Software Foundation, either version 3 of the License, or\n+# (at your option) any later version.\n+#\n+# qutebrowser is distributed in the hope that it will be useful,\n+# but WITHOUT ANY WARRANTY; without even the implied warranty of\n+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+# GNU General Public License for more details.\n+#\n+# You should have received a copy of the GNU General Public License\n+# along with qutebrowser.  If not, see <http://www.gnu.org/licenses/>.\n+\n+\"\"\"Evaluation of PAC scripts.\"\"\"\n+\n+import sys\n+import ipaddress\n+import fnmatch\n+import traceback\n+import itertools\n+import functools\n+from PyQt5.QtCore import QObject, QVariant, QMetaType, QDateTime, pyqtSlot\n+from PyQt5.QtQml import QJSEngine, QJSValue\n+from PyQt5.QtNetwork import QHostInfo, QNetworkProxy\n+\n+\n+class ParseProxyError(Exception):\n+    \"\"\"Error in parsing PAC result string.\"\"\"\n+\n+    pass\n+\n+\n+class EvalProxyError(Exception):\n+    \"\"\"Error in evaluating PAC script.\"\"\"\n+\n+    pass\n+\n+\n+class _PACContext(QObject):\n+    \"\"\"Implementation of PAC API.\n+\n+    See http://web.archive.org/web/20060424005037/wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html\n+    \"\"\"\n+\n+    #pylint: disable=no-method-argument\n+    def _js_slot(*args):\n+        \"\"\"Wrap a methos as a JavaScript function.\n+\n+        Register a PACContext method as a JavaScript function, and catch\n+        exceptions returning them as JavaScript Error objects.\n+\n+        Args:\n+            args: Types of method arguments.\n+\n+        Return: Wrapped method.\n+        \"\"\"\n+        def _decorator(method):\n+            @functools.wraps(method)\n+            def new_method(self, *args, **kwargs):\n+                try:\n+                    return method(self, *args, **kwargs)\n+                except:\n+                    traceback.print_exc()\n+                    e = sys.exc_info()[0]\n+                    #pylint: disable=protected-access\n+                    return self._error_con.callAsConstructor([str(e)])\n+            return pyqtSlot(*args, result=QJSValue)(new_method)\n+        return _decorator\n+\n+    def __init__(self, engine, fixed_dt=None):\n+        \"\"\"Create a new PAC API implementation instance.\n+\n+        Args:\n+            engine: QJSEngine which is used for running PAC.\n+            fixed_dt: Assume fixed date and time instead of system time.\n+        \"\"\"\n+        QObject.__init__(self)\n+        self._engine = engine\n+        self._error_con = engine.globalObject().property(\"Error\")\n+        self._fixed_dt = fixed_dt\n+\n+    @_js_slot(str)\n+    def isPlainHostName(self, host):\n+        \"\"\"Test is host is a plain hostname.\n+\n+        Return True if and only if there is no domain name in the hostname (no\n+        dots).\n+\n+        Args:\n+            host: The hostname from the URL (excluding port number).\n+        \"\"\"\n+        return '.' not in host\n+\n+    @_js_slot(str, str)\n+    def dnsDomainIs(self, host, domain):\n+        \"\"\"Test is host belongs to domain.\n+\n+        Return true if and only if the domain of hostname matches.\n+\n+        Args:\n+            host: The hostname from the URL.\n+            domain: The domain name to test the hostname against.\n+        \"\"\"\n+        return host.endswith(domain)\n+\n+    @_js_slot(str, str)\n+    def localHostOrDomainIs(self, host, hostdom):\n+        \"\"\"Test if host is local or belongs to domain.\n+\n+        Return true if the hostname matches exactly the specified hostname, or\n+        if there is no domain name part in the hostname, but the unqualified\n+        hostname matches.\n+\n+        Args:\n+            host: The hostname from the URL.\n+            hostdom: Fully qualified hostname to match against.\n+        \"\"\"\n+        (_, dot_host, _) = host.partition('.')\n+        (unqual_hostdom, _, _) = hostdom.partition('.')\n+        if dot_host == \"\":\n+            return host == unqual_hostdom\n+        else:\n+            return host == hostdom\n+\n+    @_js_slot(str)\n+    def isResolvable(self, host):\n+        \"\"\"Test if hostname is resolvable.\n+\n+        Tries to resolve the hostname. Return true if succeeds.\n+\n+        Args:\n+            host: The hostname from the URL.\n+        \"\"\"\n+        return self.dnsResolve(host) != \"\"\n+\n+    @_js_slot(str, str, str)\n+    def isInNet(self, host, pattern, mask):\n+        \"\"\"Test if host IP is in network.\n+\n+        Return True if and only if the IP address of the host matches the\n+        specified IP address pattern. Pattern and mask specification is done\n+        the same way as for SOCKS configuration.\n+\n+        Args:\n+            host: A DNS hostname, or IP address. If a hostname is passed, it\n+                  will be resolved into an IP address by this function.\n+            pattern: an IP address pattern in the dot-separated format.\n+            mask: mask for the IP address pattern informing which parts of\n+                  the IP address should be matched against. 0 means ignore,\n+                  255 means match.\n+        \"\"\"\n+        host_ip = ipaddress.ip_address(host)\n+        network = ipaddress.ip_network(\"{}/{}\".format(pattern, mask))\n+        return host_ip in network\n+\n+    @_js_slot(str)\n+    def dnsResolve(self, host):\n+        \"\"\"Resolve a DNS hostname.\n+\n+        Resolves the given DNS hostname into an IP address, and returns it\n+        in the dot-separated format as a string.\n+\n+        Args:\n+            host: hostname to resolve.\n+        \"\"\"\n+        ips = QHostInfo.fromName(host)\n+        if ips.error() != QHostInfo.NoError or len(ips.addresses()) == 0:\n+            return \"\"","path":"qutebrowser/browser/webkit/network/pac.py","position":174,"original_position":174,"commit_id":"e7097c52dc94fea9ce3e17149519f088268f46e2","original_commit_id":"e7097c52dc94fea9ce3e17149519f088268f46e2","user":{"login":"The-Compiler","id":625793,"avatar_url":"https://avatars.githubusercontent.com/u/625793?v=3","gravatar_id":"","url":"https://api.github.com/users/The-Compiler","html_url":"https://github.com/The-Compiler","followers_url":"https://api.github.com/users/The-Compiler/followers","following_url":"https://api.github.com/users/The-Compiler/following{/other_user}","gists_url":"https://api.github.com/users/The-Compiler/gists{/gist_id}","starred_url":"https://api.github.com/users/The-Compiler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/The-Compiler/subscriptions","organizations_url":"https://api.github.com/users/The-Compiler/orgs","repos_url":"https://api.github.com/users/The-Compiler/repos","events_url":"https://api.github.com/users/The-Compiler/events{/privacy}","received_events_url":"https://api.github.com/users/The-Compiler/received_events","type":"User","site_admin":false},"body":"I'd prefer `None` here as sentinel value, but I guess this makes more sense when the return value gets returned to JS?","created_at":"2016-08-29T12:03:14Z","updated_at":"2016-08-29T12:03:14Z","html_url":"https://github.com/The-Compiler/qutebrowser/pull/1891#discussion_r76595217","pull_request_url":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/1891","_links":{"self":{"href":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/comments/76595217"},"html":{"href":"https://github.com/The-Compiler/qutebrowser/pull/1891#discussion_r76595217"},"pull_request":{"href":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/1891"}}},"pull_request":{"url":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/1891","id":82634702,"html_url":"https://github.com/The-Compiler/qutebrowser/pull/1891","diff_url":"https://github.com/The-Compiler/qutebrowser/pull/1891.diff","patch_url":"https://github.com/The-Compiler/qutebrowser/pull/1891.patch","issue_url":"https://api.github.com/repos/The-Compiler/qutebrowser/issues/1891","number":1891,"state":"open","locked":false,"title":"Implement PAC support","user":{"login":"abbradar","id":1174810,"avatar_url":"https://avatars.githubusercontent.com/u/1174810?v=3","gravatar_id":"","url":"https://api.github.com/users/abbradar","html_url":"https://github.com/abbradar","followers_url":"https://api.github.com/users/abbradar/followers","following_url":"https://api.github.com/users/abbradar/following{/other_user}","gists_url":"https://api.github.com/users/abbradar/gists{/gist_id}","starred_url":"https://api.github.com/users/abbradar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abbradar/subscriptions","organizations_url":"https://api.github.com/users/abbradar/orgs","repos_url":"https://api.github.com/users/abbradar/repos","events_url":"https://api.github.com/users/abbradar/events{/privacy}","received_events_url":"https://api.github.com/users/abbradar/received_events","type":"User","site_admin":false},"body":"I don't feel confident in several things:\r\n\r\n* Handling of `QNetworkAccessManager` in `HTTPProxyResolver`. I want to get a signal and finish asynchronously but if someone has called `resolve` before that, to wait for its completion. Also I want to clean up after that (set things to `None`). I don't quite understand how signals work -- are `_finish` and `resolve` called from different threads?  When it's safe to remote `HTTPNetworkReply` so that completion signal is delivered to `QEventLoop`? If `resolve` is called long after signal is delivered, will it work? I feel not but I'm unsure how to get this right;\r\n* Code style;\r\n* Tests -- I haven't even run them because I don't know how.\r\n\r\nTo be honest, I haven't touched Python and Qt for a very long time, so I just used Google for every feature I felt I needed. It would be very nice to get a review.","created_at":"2016-08-24T23:26:42Z","updated_at":"2016-08-29T12:03:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"519edd7e6054b5171a2b10301aba489ed67ce050","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/1891/commits","review_comments_url":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/1891/comments","review_comment_url":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/comments{/number}","comments_url":"https://api.github.com/repos/The-Compiler/qutebrowser/issues/1891/comments","statuses_url":"https://api.github.com/repos/The-Compiler/qutebrowser/statuses/e7097c52dc94fea9ce3e17149519f088268f46e2","head":{"label":"abbradar:pac","ref":"pac","sha":"e7097c52dc94fea9ce3e17149519f088268f46e2","user":{"login":"abbradar","id":1174810,"avatar_url":"https://avatars.githubusercontent.com/u/1174810?v=3","gravatar_id":"","url":"https://api.github.com/users/abbradar","html_url":"https://github.com/abbradar","followers_url":"https://api.github.com/users/abbradar/followers","following_url":"https://api.github.com/users/abbradar/following{/other_user}","gists_url":"https://api.github.com/users/abbradar/gists{/gist_id}","starred_url":"https://api.github.com/users/abbradar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abbradar/subscriptions","organizations_url":"https://api.github.com/users/abbradar/orgs","repos_url":"https://api.github.com/users/abbradar/repos","events_url":"https://api.github.com/users/abbradar/events{/privacy}","received_events_url":"https://api.github.com/users/abbradar/received_events","type":"User","site_admin":false},"repo":{"id":66506540,"name":"qutebrowser","full_name":"abbradar/qutebrowser","owner":{"login":"abbradar","id":1174810,"avatar_url":"https://avatars.githubusercontent.com/u/1174810?v=3","gravatar_id":"","url":"https://api.github.com/users/abbradar","html_url":"https://github.com/abbradar","followers_url":"https://api.github.com/users/abbradar/followers","following_url":"https://api.github.com/users/abbradar/following{/other_user}","gists_url":"https://api.github.com/users/abbradar/gists{/gist_id}","starred_url":"https://api.github.com/users/abbradar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abbradar/subscriptions","organizations_url":"https://api.github.com/users/abbradar/orgs","repos_url":"https://api.github.com/users/abbradar/repos","events_url":"https://api.github.com/users/abbradar/events{/privacy}","received_events_url":"https://api.github.com/users/abbradar/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/abbradar/qutebrowser","description":"A keyboard-driven, vim-like browser based on PyQt5.","fork":true,"url":"https://api.github.com/repos/abbradar/qutebrowser","forks_url":"https://api.github.com/repos/abbradar/qutebrowser/forks","keys_url":"https://api.github.com/repos/abbradar/qutebrowser/keys{/key_id}","collaborators_url":"https://api.github.com/repos/abbradar/qutebrowser/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/abbradar/qutebrowser/teams","hooks_url":"https://api.github.com/repos/abbradar/qutebrowser/hooks","issue_events_url":"https://api.github.com/repos/abbradar/qutebrowser/issues/events{/number}","events_url":"https://api.github.com/repos/abbradar/qutebrowser/events","assignees_url":"https://api.github.com/repos/abbradar/qutebrowser/assignees{/user}","branches_url":"https://api.github.com/repos/abbradar/qutebrowser/branches{/branch}","tags_url":"https://api.github.com/repos/abbradar/qutebrowser/tags","blobs_url":"https://api.github.com/repos/abbradar/qutebrowser/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/abbradar/qutebrowser/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/abbradar/qutebrowser/git/refs{/sha}","trees_url":"https://api.github.com/repos/abbradar/qutebrowser/git/trees{/sha}","statuses_url":"https://api.github.com/repos/abbradar/qutebrowser/statuses/{sha}","languages_url":"https://api.github.com/repos/abbradar/qutebrowser/languages","stargazers_url":"https://api.github.com/repos/abbradar/qutebrowser/stargazers","contributors_url":"https://api.github.com/repos/abbradar/qutebrowser/contributors","subscribers_url":"https://api.github.com/repos/abbradar/qutebrowser/subscribers","subscription_url":"https://api.github.com/repos/abbradar/qutebrowser/subscription","commits_url":"https://api.github.com/repos/abbradar/qutebrowser/commits{/sha}","git_commits_url":"https://api.github.com/repos/abbradar/qutebrowser/git/commits{/sha}","comments_url":"https://api.github.com/repos/abbradar/qutebrowser/comments{/number}","issue_comment_url":"https://api.github.com/repos/abbradar/qutebrowser/issues/comments{/number}","contents_url":"https://api.github.com/repos/abbradar/qutebrowser/contents/{+path}","compare_url":"https://api.github.com/repos/abbradar/qutebrowser/compare/{base}...{head}","merges_url":"https://api.github.com/repos/abbradar/qutebrowser/merges","archive_url":"https://api.github.com/repos/abbradar/qutebrowser/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/abbradar/qutebrowser/downloads","issues_url":"https://api.github.com/repos/abbradar/qutebrowser/issues{/number}","pulls_url":"https://api.github.com/repos/abbradar/qutebrowser/pulls{/number}","milestones_url":"https://api.github.com/repos/abbradar/qutebrowser/milestones{/number}","notifications_url":"https://api.github.com/repos/abbradar/qutebrowser/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/abbradar/qutebrowser/labels{/name}","releases_url":"https://api.github.com/repos/abbradar/qutebrowser/releases{/id}","deployments_url":"https://api.github.com/repos/abbradar/qutebrowser/deployments","created_at":"2016-08-24T23:18:19Z","updated_at":"2016-08-24T23:18:22Z","pushed_at":"2016-08-26T20:49:56Z","git_url":"git://github.com/abbradar/qutebrowser.git","ssh_url":"git@github.com:abbradar/qutebrowser.git","clone_url":"https://github.com/abbradar/qutebrowser.git","svn_url":"https://github.com/abbradar/qutebrowser","homepage":"https://www.qutebrowser.org/","size":19559,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"The-Compiler:master","ref":"master","sha":"187bfa8fced8706b50d47dfb2ab18f1baf2df344","user":{"login":"The-Compiler","id":625793,"avatar_url":"https://avatars.githubusercontent.com/u/625793?v=3","gravatar_id":"","url":"https://api.github.com/users/The-Compiler","html_url":"https://github.com/The-Compiler","followers_url":"https://api.github.com/users/The-Compiler/followers","following_url":"https://api.github.com/users/The-Compiler/following{/other_user}","gists_url":"https://api.github.com/users/The-Compiler/gists{/gist_id}","starred_url":"https://api.github.com/users/The-Compiler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/The-Compiler/subscriptions","organizations_url":"https://api.github.com/users/The-Compiler/orgs","repos_url":"https://api.github.com/users/The-Compiler/repos","events_url":"https://api.github.com/users/The-Compiler/events{/privacy}","received_events_url":"https://api.github.com/users/The-Compiler/received_events","type":"User","site_admin":false},"repo":{"id":21244505,"name":"qutebrowser","full_name":"The-Compiler/qutebrowser","owner":{"login":"The-Compiler","id":625793,"avatar_url":"https://avatars.githubusercontent.com/u/625793?v=3","gravatar_id":"","url":"https://api.github.com/users/The-Compiler","html_url":"https://github.com/The-Compiler","followers_url":"https://api.github.com/users/The-Compiler/followers","following_url":"https://api.github.com/users/The-Compiler/following{/other_user}","gists_url":"https://api.github.com/users/The-Compiler/gists{/gist_id}","starred_url":"https://api.github.com/users/The-Compiler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/The-Compiler/subscriptions","organizations_url":"https://api.github.com/users/The-Compiler/orgs","repos_url":"https://api.github.com/users/The-Compiler/repos","events_url":"https://api.github.com/users/The-Compiler/events{/privacy}","received_events_url":"https://api.github.com/users/The-Compiler/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/The-Compiler/qutebrowser","description":"A keyboard-driven, vim-like browser based on PyQt5.","fork":false,"url":"https://api.github.com/repos/The-Compiler/qutebrowser","forks_url":"https://api.github.com/repos/The-Compiler/qutebrowser/forks","keys_url":"https://api.github.com/repos/The-Compiler/qutebrowser/keys{/key_id}","collaborators_url":"https://api.github.com/repos/The-Compiler/qutebrowser/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/The-Compiler/qutebrowser/teams","hooks_url":"https://api.github.com/repos/The-Compiler/qutebrowser/hooks","issue_events_url":"https://api.github.com/repos/The-Compiler/qutebrowser/issues/events{/number}","events_url":"https://api.github.com/repos/The-Compiler/qutebrowser/events","assignees_url":"https://api.github.com/repos/The-Compiler/qutebrowser/assignees{/user}","branches_url":"https://api.github.com/repos/The-Compiler/qutebrowser/branches{/branch}","tags_url":"https://api.github.com/repos/The-Compiler/qutebrowser/tags","blobs_url":"https://api.github.com/repos/The-Compiler/qutebrowser/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/The-Compiler/qutebrowser/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/The-Compiler/qutebrowser/git/refs{/sha}","trees_url":"https://api.github.com/repos/The-Compiler/qutebrowser/git/trees{/sha}","statuses_url":"https://api.github.com/repos/The-Compiler/qutebrowser/statuses/{sha}","languages_url":"https://api.github.com/repos/The-Compiler/qutebrowser/languages","stargazers_url":"https://api.github.com/repos/The-Compiler/qutebrowser/stargazers","contributors_url":"https://api.github.com/repos/The-Compiler/qutebrowser/contributors","subscribers_url":"https://api.github.com/repos/The-Compiler/qutebrowser/subscribers","subscription_url":"https://api.github.com/repos/The-Compiler/qutebrowser/subscription","commits_url":"https://api.github.com/repos/The-Compiler/qutebrowser/commits{/sha}","git_commits_url":"https://api.github.com/repos/The-Compiler/qutebrowser/git/commits{/sha}","comments_url":"https://api.github.com/repos/The-Compiler/qutebrowser/comments{/number}","issue_comment_url":"https://api.github.com/repos/The-Compiler/qutebrowser/issues/comments{/number}","contents_url":"https://api.github.com/repos/The-Compiler/qutebrowser/contents/{+path}","compare_url":"https://api.github.com/repos/The-Compiler/qutebrowser/compare/{base}...{head}","merges_url":"https://api.github.com/repos/The-Compiler/qutebrowser/merges","archive_url":"https://api.github.com/repos/The-Compiler/qutebrowser/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/The-Compiler/qutebrowser/downloads","issues_url":"https://api.github.com/repos/The-Compiler/qutebrowser/issues{/number}","pulls_url":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls{/number}","milestones_url":"https://api.github.com/repos/The-Compiler/qutebrowser/milestones{/number}","notifications_url":"https://api.github.com/repos/The-Compiler/qutebrowser/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/The-Compiler/qutebrowser/labels{/name}","releases_url":"https://api.github.com/repos/The-Compiler/qutebrowser/releases{/id}","deployments_url":"https://api.github.com/repos/The-Compiler/qutebrowser/deployments","created_at":"2014-06-26T14:59:34Z","updated_at":"2016-08-29T07:41:52Z","pushed_at":"2016-08-29T11:39:48Z","git_url":"git://github.com/The-Compiler/qutebrowser.git","ssh_url":"git@github.com:The-Compiler/qutebrowser.git","clone_url":"https://github.com/The-Compiler/qutebrowser.git","svn_url":"https://github.com/The-Compiler/qutebrowser","homepage":"https://www.qutebrowser.org/","size":23488,"stargazers_count":1457,"watchers_count":1457,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":220,"mirror_url":null,"open_issues_count":411,"forks":220,"open_issues":411,"watchers":1457,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/1891"},"html":{"href":"https://github.com/The-Compiler/qutebrowser/pull/1891"},"issue":{"href":"https://api.github.com/repos/The-Compiler/qutebrowser/issues/1891"},"comments":{"href":"https://api.github.com/repos/The-Compiler/qutebrowser/issues/1891/comments"},"review_comments":{"href":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/1891/comments"},"review_comment":{"href":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/The-Compiler/qutebrowser/pulls/1891/commits"},"statuses":{"href":"https://api.github.com/repos/The-Compiler/qutebrowser/statuses/e7097c52dc94fea9ce3e17149519f088268f46e2"}}}}
{"actor":{"display_login":"The-Compiler"}}