We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
GET on /masher/ errors with a 404 response
GET on `/masher` works, but GET on `/masher/` returns an HTTP 404 error code. We should add a route to allow the trailing slash on this URL.


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `bodhi/server/__init__.py`
Content:
```
1 # This program is free software; you can redistribute it and/or
2 # modify it under the terms of the GNU General Public License
3 # as published by the Free Software Foundation; either version 2
4 # of the License, or (at your option) any later version.
5 #
6 # This program is distributed in the hope that it will be useful,
7 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9 # GNU General Public License for more details.
10 #
11 # You should have received a copy of the GNU General Public License
12 # along with this program; if not, write to the Free Software
13 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
14 
15 from collections import defaultdict
16 from dogpile.cache import make_region
17 from munch import munchify
18 from sqlalchemy import engine_from_config
19 from sqlalchemy.orm import scoped_session, sessionmaker
20 from zope.sqlalchemy import ZopeTransactionExtension
21 
22 from pyramid.settings import asbool
23 from pyramid.security import unauthenticated_userid
24 from pyramid.config import Configurator
25 from pyramid.authentication import AuthTktAuthenticationPolicy
26 from pyramid.authorization import ACLAuthorizationPolicy
27 from pyramid.renderers import JSONP
28 from pyramid.exceptions import HTTPForbidden
29 
30 from . import buildsys
31 
32 import logging
33 
34 log = logging.getLogger(__name__)
35 
36 
37 # TODO -- someday move this externally to "fedora_flavored_markdown"
38 from bodhi.server import ffmarkdown
39 ffmarkdown.inject()
40 
41 #
42 # Request methods
43 #
44 
45 def get_dbsession(request):
46     engine = engine_from_config(request.registry.settings, 'sqlalchemy.')
47     Sess = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
48     Sess.configure(bind=engine)
49     session = Sess()
50 
51     def cleanup(request):
52         ## No need to do rollback/commit ourselves.  the zope transaction
53         ## manager takes care of that for us...
54         #if request.exception is not None:
55         #    session.rollback()
56         #else:
57         #    session.commit()
58         ## However, we may still want to explicitly close the session we opened
59         #log.debug("Closing session at the end of a request.")
60         session.close()
61 
62     request.add_finished_callback(cleanup)
63 
64     return session
65 
66 
67 def get_cacheregion(request):
68     region = make_region()
69     region.configure_from_config(request.registry.settings, "dogpile.cache.")
70     return region
71 
72 
73 def get_user(request):
74     from bodhi.server.models import User
75     userid = unauthenticated_userid(request)
76     if userid is not None:
77         user = request.db.query(User).filter_by(name=unicode(userid)).first()
78         # Why munch?  https://github.com/fedora-infra/bodhi/issues/473
79         return munchify(user.__json__(request=request))
80 
81 
82 def groupfinder(userid, request):
83     from bodhi.server.models import User
84     if request.user:
85         user = User.get(request.user.name, request.db)
86         return ['group:' + group.name for group in user.groups]
87 
88 
89 def get_koji(request):
90     return buildsys.get_session()
91 
92 
93 def get_buildinfo(request):
94     """
95     A per-request cache populated by the validators and shared with the views
96     to store frequently used package-specific data, like build tags and ACLs.
97     """
98     return defaultdict(dict)
99 
100 
101 def get_releases(request):
102     from bodhi.server.models import Release
103     return Release.all_releases(request.db)
104 
105 #
106 # Cornice filters
107 #
108 
109 def exception_filter(response, request):
110     """Log exceptions that get thrown up to cornice"""
111     if isinstance(response, Exception):
112         log.exception('Unhandled exception raised:  %r' % response)
113     return response
114 
115 from cornice.validators import DEFAULT_FILTERS
116 DEFAULT_FILTERS.insert(0, exception_filter)
117 
118 
119 #
120 # Bodhi initialization
121 #
122 
123 def main(global_config, testing=None, session=None, **settings):
124     """ This function returns a WSGI application """
125     # Setup our buildsystem
126     buildsys.setup_buildsystem(settings)
127 
128     # Sessions & Caching
129     from pyramid.session import SignedCookieSessionFactory
130     session_factory = SignedCookieSessionFactory(settings['session.secret'])
131 
132     # Construct a list of all groups we're interested in
133     default = ' '.join([settings.get(key, '') for key in [
134         'important_groups',
135         'admin_packager_groups',
136         'mandatory_packager_groups',
137         'admin_groups',
138     ]])
139     # pyramid_fas_openid looks for this setting
140     settings['openid.groups'] = settings.get('openid.groups', default).split()
141 
142     config = Configurator(settings=settings, session_factory=session_factory)
143 
144     # Plugins
145     config.include('pyramid_mako')
146     config.include('cornice')
147 
148     # Lazy-loaded memoized request properties
149     if session:
150         config.add_request_method(lambda _: session, 'db', reify=True)
151     else:
152         config.add_request_method(get_dbsession, 'db', reify=True)
153 
154     config.add_request_method(get_user, 'user', reify=True)
155     config.add_request_method(get_koji, 'koji', reify=True)
156     config.add_request_method(get_cacheregion, 'cache', reify=True)
157     config.add_request_method(get_buildinfo, 'buildinfo', reify=True)
158     config.add_request_method(get_releases, 'releases', reify=True)
159 
160     # Templating
161     config.add_mako_renderer('.html', settings_prefix='mako.')
162     config.add_static_view('static', 'bodhi:server/static')
163 
164     from bodhi.server.renderers import rss, jpeg
165     config.add_renderer('rss', rss)
166     config.add_renderer('jpeg', jpeg)
167     config.add_renderer('jsonp', JSONP(param_name='callback'))
168 
169     # i18n
170     config.add_translation_dirs('bodhi:server/locale/')
171 
172     # Authentication & Authorization
173     if testing:
174         # use a permissive security policy while running unit tests
175         config.testing_securitypolicy(userid=testing, permissive=True)
176     else:
177         config.set_authentication_policy(AuthTktAuthenticationPolicy(
178                 settings['authtkt.secret'],
179                 callback=groupfinder,
180                 secure=asbool(settings['authtkt.secure']),
181                 hashalg='sha512'))
182         config.set_authorization_policy(ACLAuthorizationPolicy())
183 
184     # Frontpage
185     config.add_route('home', '/')
186 
187     # Views for creating new objects
188     config.add_route('new_update', '/updates/new')
189     config.add_route('new_override', '/overrides/new')
190     config.add_route('new_stack', '/stacks/new')
191 
192     # Metrics
193     config.add_route('metrics', '/metrics')
194     config.add_route('masher_status', '/masher')
195 
196     # Auto-completion search
197     config.add_route('search_packages', '/search/packages')
198     config.add_route('latest_candidates', '/latest_candidates')
199     config.add_route('latest_builds', '/latest_builds')
200 
201     config.add_route('captcha_image', '/captcha/{cipherkey}/')
202 
203     # pyramid.openid
204     config.add_route('login', '/login')
205     config.add_view('bodhi.server.security.login', route_name='login')
206     config.add_view('bodhi.server.security.login', context=HTTPForbidden)
207     config.add_route('logout', '/logout')
208     config.add_view('bodhi.server.security.logout', route_name='logout')
209     config.add_route('verify_openid', pattern='/dologin.html')
210     config.add_view('pyramid_fas_openid.verify_openid', route_name='verify_openid')
211 
212     config.add_route('api_version', '/api_version')
213 
214     # The only user preference we have.
215     config.add_route('popup_toggle', '/popup_toggle')
216 
217     config.scan('bodhi.server.views')
218     config.scan('bodhi.server.services')
219     config.scan('bodhi.server.captcha')
220     config.scan('bodhi.server.events')
221 
222     return config.make_wsgi_app()
223
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/bodhi/server/__init__.py b/bodhi/server/__init__.py
--- a/bodhi/server/__init__.py
+++ b/bodhi/server/__init__.py
@@ -191,7 +191,7 @@
 
     # Metrics
     config.add_route('metrics', '/metrics')
-    config.add_route('masher_status', '/masher')
+    config.add_route('masher_status', '/masher/')
 
     # Auto-completion search
     config.add_route('search_packages', '/search/packages')

{"golden_diff": "diff --git a/bodhi/server/__init__.py b/bodhi/server/__init__.py\n--- a/bodhi/server/__init__.py\n+++ b/bodhi/server/__init__.py\n@@ -191,7 +191,7 @@\n \n     # Metrics\n     config.add_route('metrics', '/metrics')\n-    config.add_route('masher_status', '/masher')\n+    config.add_route('masher_status', '/masher/')\n \n     # Auto-completion search\n     config.add_route('search_packages', '/search/packages')\n", "issue": "GET on /masher/ errors with a 404 response\nGET on `/masher` works, but GET on `/masher/` returns an HTTP 404 error code. We should add a route to allow the trailing slash on this URL.\n\n", "before_files": [{"content": "# This program is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License\n# as published by the Free Software Foundation; either version 2\n# of the License, or (at your option) any later version.\n#\n# This program 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 this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n\nfrom collections import defaultdict\nfrom dogpile.cache import make_region\nfrom munch import munchify\nfrom sqlalchemy import engine_from_config\nfrom sqlalchemy.orm import scoped_session, sessionmaker\nfrom zope.sqlalchemy import ZopeTransactionExtension\n\nfrom pyramid.settings import asbool\nfrom pyramid.security import unauthenticated_userid\nfrom pyramid.config import Configurator\nfrom pyramid.authentication import AuthTktAuthenticationPolicy\nfrom pyramid.authorization import ACLAuthorizationPolicy\nfrom pyramid.renderers import JSONP\nfrom pyramid.exceptions import HTTPForbidden\n\nfrom . import buildsys\n\nimport logging\n\nlog = logging.getLogger(__name__)\n\n\n# TODO -- someday move this externally to \"fedora_flavored_markdown\"\nfrom bodhi.server import ffmarkdown\nffmarkdown.inject()\n\n#\n# Request methods\n#\n\ndef get_dbsession(request):\n    engine = engine_from_config(request.registry.settings, 'sqlalchemy.')\n    Sess = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))\n    Sess.configure(bind=engine)\n    session = Sess()\n\n    def cleanup(request):\n        ## No need to do rollback/commit ourselves.  the zope transaction\n        ## manager takes care of that for us...\n        #if request.exception is not None:\n        #    session.rollback()\n        #else:\n        #    session.commit()\n        ## However, we may still want to explicitly close the session we opened\n        #log.debug(\"Closing session at the end of a request.\")\n        session.close()\n\n    request.add_finished_callback(cleanup)\n\n    return session\n\n\ndef get_cacheregion(request):\n    region = make_region()\n    region.configure_from_config(request.registry.settings, \"dogpile.cache.\")\n    return region\n\n\ndef get_user(request):\n    from bodhi.server.models import User\n    userid = unauthenticated_userid(request)\n    if userid is not None:\n        user = request.db.query(User).filter_by(name=unicode(userid)).first()\n        # Why munch?  https://github.com/fedora-infra/bodhi/issues/473\n        return munchify(user.__json__(request=request))\n\n\ndef groupfinder(userid, request):\n    from bodhi.server.models import User\n    if request.user:\n        user = User.get(request.user.name, request.db)\n        return ['group:' + group.name for group in user.groups]\n\n\ndef get_koji(request):\n    return buildsys.get_session()\n\n\ndef get_buildinfo(request):\n    \"\"\"\n    A per-request cache populated by the validators and shared with the views\n    to store frequently used package-specific data, like build tags and ACLs.\n    \"\"\"\n    return defaultdict(dict)\n\n\ndef get_releases(request):\n    from bodhi.server.models import Release\n    return Release.all_releases(request.db)\n\n#\n# Cornice filters\n#\n\ndef exception_filter(response, request):\n    \"\"\"Log exceptions that get thrown up to cornice\"\"\"\n    if isinstance(response, Exception):\n        log.exception('Unhandled exception raised:  %r' % response)\n    return response\n\nfrom cornice.validators import DEFAULT_FILTERS\nDEFAULT_FILTERS.insert(0, exception_filter)\n\n\n#\n# Bodhi initialization\n#\n\ndef main(global_config, testing=None, session=None, **settings):\n    \"\"\" This function returns a WSGI application \"\"\"\n    # Setup our buildsystem\n    buildsys.setup_buildsystem(settings)\n\n    # Sessions & Caching\n    from pyramid.session import SignedCookieSessionFactory\n    session_factory = SignedCookieSessionFactory(settings['session.secret'])\n\n    # Construct a list of all groups we're interested in\n    default = ' '.join([settings.get(key, '') for key in [\n        'important_groups',\n        'admin_packager_groups',\n        'mandatory_packager_groups',\n        'admin_groups',\n    ]])\n    # pyramid_fas_openid looks for this setting\n    settings['openid.groups'] = settings.get('openid.groups', default).split()\n\n    config = Configurator(settings=settings, session_factory=session_factory)\n\n    # Plugins\n    config.include('pyramid_mako')\n    config.include('cornice')\n\n    # Lazy-loaded memoized request properties\n    if session:\n        config.add_request_method(lambda _: session, 'db', reify=True)\n    else:\n        config.add_request_method(get_dbsession, 'db', reify=True)\n\n    config.add_request_method(get_user, 'user', reify=True)\n    config.add_request_method(get_koji, 'koji', reify=True)\n    config.add_request_method(get_cacheregion, 'cache', reify=True)\n    config.add_request_method(get_buildinfo, 'buildinfo', reify=True)\n    config.add_request_method(get_releases, 'releases', reify=True)\n\n    # Templating\n    config.add_mako_renderer('.html', settings_prefix='mako.')\n    config.add_static_view('static', 'bodhi:server/static')\n\n    from bodhi.server.renderers import rss, jpeg\n    config.add_renderer('rss', rss)\n    config.add_renderer('jpeg', jpeg)\n    config.add_renderer('jsonp', JSONP(param_name='callback'))\n\n    # i18n\n    config.add_translation_dirs('bodhi:server/locale/')\n\n    # Authentication & Authorization\n    if testing:\n        # use a permissive security policy while running unit tests\n        config.testing_securitypolicy(userid=testing, permissive=True)\n    else:\n        config.set_authentication_policy(AuthTktAuthenticationPolicy(\n                settings['authtkt.secret'],\n                callback=groupfinder,\n                secure=asbool(settings['authtkt.secure']),\n                hashalg='sha512'))\n        config.set_authorization_policy(ACLAuthorizationPolicy())\n\n    # Frontpage\n    config.add_route('home', '/')\n\n    # Views for creating new objects\n    config.add_route('new_update', '/updates/new')\n    config.add_route('new_override', '/overrides/new')\n    config.add_route('new_stack', '/stacks/new')\n\n    # Metrics\n    config.add_route('metrics', '/metrics')\n    config.add_route('masher_status', '/masher')\n\n    # Auto-completion search\n    config.add_route('search_packages', '/search/packages')\n    config.add_route('latest_candidates', '/latest_candidates')\n    config.add_route('latest_builds', '/latest_builds')\n\n    config.add_route('captcha_image', '/captcha/{cipherkey}/')\n\n    # pyramid.openid\n    config.add_route('login', '/login')\n    config.add_view('bodhi.server.security.login', route_name='login')\n    config.add_view('bodhi.server.security.login', context=HTTPForbidden)\n    config.add_route('logout', '/logout')\n    config.add_view('bodhi.server.security.logout', route_name='logout')\n    config.add_route('verify_openid', pattern='/dologin.html')\n    config.add_view('pyramid_fas_openid.verify_openid', route_name='verify_openid')\n\n    config.add_route('api_version', '/api_version')\n\n    # The only user preference we have.\n    config.add_route('popup_toggle', '/popup_toggle')\n\n    config.scan('bodhi.server.views')\n    config.scan('bodhi.server.services')\n    config.scan('bodhi.server.captcha')\n    config.scan('bodhi.server.events')\n\n    return config.make_wsgi_app()\n", "path": "bodhi/server/__init__.py"}], "after_files": [{"content": "# This program is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License\n# as published by the Free Software Foundation; either version 2\n# of the License, or (at your option) any later version.\n#\n# This program 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 this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n\nfrom collections import defaultdict\nfrom dogpile.cache import make_region\nfrom munch import munchify\nfrom sqlalchemy import engine_from_config\nfrom sqlalchemy.orm import scoped_session, sessionmaker\nfrom zope.sqlalchemy import ZopeTransactionExtension\n\nfrom pyramid.settings import asbool\nfrom pyramid.security import unauthenticated_userid\nfrom pyramid.config import Configurator\nfrom pyramid.authentication import AuthTktAuthenticationPolicy\nfrom pyramid.authorization import ACLAuthorizationPolicy\nfrom pyramid.renderers import JSONP\nfrom pyramid.exceptions import HTTPForbidden\n\nfrom . import buildsys\n\nimport logging\n\nlog = logging.getLogger(__name__)\n\n\n# TODO -- someday move this externally to \"fedora_flavored_markdown\"\nfrom bodhi.server import ffmarkdown\nffmarkdown.inject()\n\n#\n# Request methods\n#\n\ndef get_dbsession(request):\n    engine = engine_from_config(request.registry.settings, 'sqlalchemy.')\n    Sess = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))\n    Sess.configure(bind=engine)\n    session = Sess()\n\n    def cleanup(request):\n        ## No need to do rollback/commit ourselves.  the zope transaction\n        ## manager takes care of that for us...\n        #if request.exception is not None:\n        #    session.rollback()\n        #else:\n        #    session.commit()\n        ## However, we may still want to explicitly close the session we opened\n        #log.debug(\"Closing session at the end of a request.\")\n        session.close()\n\n    request.add_finished_callback(cleanup)\n\n    return session\n\n\ndef get_cacheregion(request):\n    region = make_region()\n    region.configure_from_config(request.registry.settings, \"dogpile.cache.\")\n    return region\n\n\ndef get_user(request):\n    from bodhi.server.models import User\n    userid = unauthenticated_userid(request)\n    if userid is not None:\n        user = request.db.query(User).filter_by(name=unicode(userid)).first()\n        # Why munch?  https://github.com/fedora-infra/bodhi/issues/473\n        return munchify(user.__json__(request=request))\n\n\ndef groupfinder(userid, request):\n    from bodhi.server.models import User\n    if request.user:\n        user = User.get(request.user.name, request.db)\n        return ['group:' + group.name for group in user.groups]\n\n\ndef get_koji(request):\n    return buildsys.get_session()\n\n\ndef get_buildinfo(request):\n    \"\"\"\n    A per-request cache populated by the validators and shared with the views\n    to store frequently used package-specific data, like build tags and ACLs.\n    \"\"\"\n    return defaultdict(dict)\n\n\ndef get_releases(request):\n    from bodhi.server.models import Release\n    return Release.all_releases(request.db)\n\n#\n# Cornice filters\n#\n\ndef exception_filter(response, request):\n    \"\"\"Log exceptions that get thrown up to cornice\"\"\"\n    if isinstance(response, Exception):\n        log.exception('Unhandled exception raised:  %r' % response)\n    return response\n\nfrom cornice.validators import DEFAULT_FILTERS\nDEFAULT_FILTERS.insert(0, exception_filter)\n\n\n#\n# Bodhi initialization\n#\n\ndef main(global_config, testing=None, session=None, **settings):\n    \"\"\" This function returns a WSGI application \"\"\"\n    # Setup our buildsystem\n    buildsys.setup_buildsystem(settings)\n\n    # Sessions & Caching\n    from pyramid.session import SignedCookieSessionFactory\n    session_factory = SignedCookieSessionFactory(settings['session.secret'])\n\n    # Construct a list of all groups we're interested in\n    default = ' '.join([settings.get(key, '') for key in [\n        'important_groups',\n        'admin_packager_groups',\n        'mandatory_packager_groups',\n        'admin_groups',\n    ]])\n    # pyramid_fas_openid looks for this setting\n    settings['openid.groups'] = settings.get('openid.groups', default).split()\n\n    config = Configurator(settings=settings, session_factory=session_factory)\n\n    # Plugins\n    config.include('pyramid_mako')\n    config.include('cornice')\n\n    # Lazy-loaded memoized request properties\n    if session:\n        config.add_request_method(lambda _: session, 'db', reify=True)\n    else:\n        config.add_request_method(get_dbsession, 'db', reify=True)\n\n    config.add_request_method(get_user, 'user', reify=True)\n    config.add_request_method(get_koji, 'koji', reify=True)\n    config.add_request_method(get_cacheregion, 'cache', reify=True)\n    config.add_request_method(get_buildinfo, 'buildinfo', reify=True)\n    config.add_request_method(get_releases, 'releases', reify=True)\n\n    # Templating\n    config.add_mako_renderer('.html', settings_prefix='mako.')\n    config.add_static_view('static', 'bodhi:server/static')\n\n    from bodhi.server.renderers import rss, jpeg\n    config.add_renderer('rss', rss)\n    config.add_renderer('jpeg', jpeg)\n    config.add_renderer('jsonp', JSONP(param_name='callback'))\n\n    # i18n\n    config.add_translation_dirs('bodhi:server/locale/')\n\n    # Authentication & Authorization\n    if testing:\n        # use a permissive security policy while running unit tests\n        config.testing_securitypolicy(userid=testing, permissive=True)\n    else:\n        config.set_authentication_policy(AuthTktAuthenticationPolicy(\n                settings['authtkt.secret'],\n                callback=groupfinder,\n                secure=asbool(settings['authtkt.secure']),\n                hashalg='sha512'))\n        config.set_authorization_policy(ACLAuthorizationPolicy())\n\n    # Frontpage\n    config.add_route('home', '/')\n\n    # Views for creating new objects\n    config.add_route('new_update', '/updates/new')\n    config.add_route('new_override', '/overrides/new')\n    config.add_route('new_stack', '/stacks/new')\n\n    # Metrics\n    config.add_route('metrics', '/metrics')\n    config.add_route('masher_status', '/masher/')\n\n    # Auto-completion search\n    config.add_route('search_packages', '/search/packages')\n    config.add_route('latest_candidates', '/latest_candidates')\n    config.add_route('latest_builds', '/latest_builds')\n\n    config.add_route('captcha_image', '/captcha/{cipherkey}/')\n\n    # pyramid.openid\n    config.add_route('login', '/login')\n    config.add_view('bodhi.server.security.login', route_name='login')\n    config.add_view('bodhi.server.security.login', context=HTTPForbidden)\n    config.add_route('logout', '/logout')\n    config.add_view('bodhi.server.security.logout', route_name='logout')\n    config.add_route('verify_openid', pattern='/dologin.html')\n    config.add_view('pyramid_fas_openid.verify_openid', route_name='verify_openid')\n\n    config.add_route('api_version', '/api_version')\n\n    # The only user preference we have.\n    config.add_route('popup_toggle', '/popup_toggle')\n\n    config.scan('bodhi.server.views')\n    config.scan('bodhi.server.services')\n    config.scan('bodhi.server.captcha')\n    config.scan('bodhi.server.events')\n\n    return config.make_wsgi_app()\n", "path": "bodhi/server/__init__.py"}]}