We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Logging out a source does not display a localized "Thank you for exiting your session!" message
# Bug

## Description

When a source clears their session via the logout button, their locale is popped as well. Thus, the following message is not displayed in the correct language.

```
Important!
Thank you for exiting your session! Please select "New Identity" from the green Onion
button in the Tor browser to clear all history of your SecureDrop usage from this device.
```

## Steps to Reproduce

1. Open source interface
2. Create new user
3. Submit doc
4. Log out

## Expected Behavior

The logout page displays the (quite important) log out message in the correct locale (including HTML with `dir="rtl"` set if needed).

## Actual Behavior

The page is displayed in the default locale.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `securedrop/source_app/main.py`
Content:
```
1 import operator
2 import os
3 
4 from datetime import datetime
5 from flask import (Blueprint, render_template, flash, redirect, url_for, g,
6                    session, current_app, request, Markup, abort)
7 from flask_babel import gettext
8 from sqlalchemy.exc import IntegrityError
9 
10 import crypto_util
11 import store
12 
13 from db import Source, db_session, Submission, Reply, get_one_or_else
14 from rm import srm
15 from source_app.decorators import login_required
16 from source_app.utils import (logged_in, generate_unique_codename,
17                               async_genkey, normalize_timestamps,
18                               valid_codename)
19 from source_app.forms import LoginForm
20 
21 
22 def make_blueprint(config):
23     view = Blueprint('main', __name__)
24 
25     @view.route('/')
26     def index():
27         return render_template('index.html')
28 
29     @view.route('/generate', methods=('GET', 'POST'))
30     def generate():
31         if logged_in():
32             flash(gettext(
33                 "You were redirected because you are already logged in. "
34                 "If you want to create a new account, you should log out "
35                 "first."),
36                   "notification")
37             return redirect(url_for('.lookup'))
38 
39         codename = generate_unique_codename()
40         session['codename'] = codename
41         session['new_user'] = True
42         return render_template('generate.html', codename=codename)
43 
44     @view.route('/create', methods=['POST'])
45     def create():
46         filesystem_id = crypto_util.hash_codename(session['codename'])
47 
48         source = Source(filesystem_id, crypto_util.display_id())
49         db_session.add(source)
50         try:
51             db_session.commit()
52         except IntegrityError as e:
53             db_session.rollback()
54             current_app.logger.error(
55                 "Attempt to create a source with duplicate codename: %s" %
56                 (e,))
57         else:
58             os.mkdir(store.path(filesystem_id))
59 
60         session['logged_in'] = True
61         return redirect(url_for('.lookup'))
62 
63     @view.route('/lookup', methods=('GET',))
64     @login_required
65     def lookup():
66         replies = []
67         for reply in g.source.replies:
68             reply_path = store.path(g.filesystem_id, reply.filename)
69             try:
70                 reply.decrypted = crypto_util.decrypt(
71                     g.codename,
72                     open(reply_path).read()).decode('utf-8')
73             except UnicodeDecodeError:
74                 current_app.logger.error("Could not decode reply %s" %
75                                          reply.filename)
76             else:
77                 reply.date = datetime.utcfromtimestamp(
78                     os.stat(reply_path).st_mtime)
79                 replies.append(reply)
80 
81         # Sort the replies by date
82         replies.sort(key=operator.attrgetter('date'), reverse=True)
83 
84         # Generate a keypair to encrypt replies from the journalist
85         # Only do this if the journalist has flagged the source as one
86         # that they would like to reply to. (Issue #140.)
87         if not crypto_util.getkey(g.filesystem_id) and g.source.flagged:
88             async_genkey(g.filesystem_id, g.codename)
89 
90         return render_template(
91             'lookup.html',
92             codename=g.codename,
93             replies=replies,
94             flagged=g.source.flagged,
95             new_user=session.get('new_user', None),
96             haskey=crypto_util.getkey(
97                 g.filesystem_id))
98 
99     @view.route('/submit', methods=('POST',))
100     @login_required
101     def submit():
102         msg = request.form['msg']
103         fh = request.files['fh']
104 
105         # Don't submit anything if it was an "empty" submission. #878
106         if not (msg or fh):
107             flash(gettext(
108                 "You must enter a message or choose a file to submit."),
109                   "error")
110             return redirect(url_for('main.lookup'))
111 
112         fnames = []
113         journalist_filename = g.source.journalist_filename
114         first_submission = g.source.interaction_count == 0
115 
116         if msg:
117             g.source.interaction_count += 1
118             fnames.append(
119                 store.save_message_submission(
120                     g.filesystem_id,
121                     g.source.interaction_count,
122                     journalist_filename,
123                     msg))
124         if fh:
125             g.source.interaction_count += 1
126             fnames.append(
127                 store.save_file_submission(
128                     g.filesystem_id,
129                     g.source.interaction_count,
130                     journalist_filename,
131                     fh.filename,
132                     fh.stream))
133 
134         if first_submission:
135             msg = render_template('first_submission_flashed_message.html')
136             flash(Markup(msg), "success")
137 
138         else:
139             if msg and not fh:
140                 html_contents = gettext('Thanks! We received your message.')
141             elif not msg and fh:
142                 html_contents = gettext('Thanks! We received your document.')
143             else:
144                 html_contents = gettext('Thanks! We received your message and '
145                                         'document.')
146 
147             msg = render_template('next_submission_flashed_message.html',
148                                   html_contents=html_contents)
149             flash(Markup(msg), "success")
150 
151         for fname in fnames:
152             submission = Submission(g.source, fname)
153             db_session.add(submission)
154 
155         if g.source.pending:
156             g.source.pending = False
157 
158             # Generate a keypair now, if there's enough entropy (issue #303)
159             entropy_avail = int(
160                 open('/proc/sys/kernel/random/entropy_avail').read())
161             if entropy_avail >= 2400:
162                 async_genkey(g.filesystem_id, g.codename)
163 
164         g.source.last_updated = datetime.utcnow()
165         db_session.commit()
166         normalize_timestamps(g.filesystem_id)
167 
168         return redirect(url_for('main.lookup'))
169 
170     @view.route('/delete', methods=('POST',))
171     @login_required
172     def delete():
173         query = Reply.query.filter(
174             Reply.filename == request.form['reply_filename'])
175         reply = get_one_or_else(query, current_app.logger, abort)
176         srm(store.path(g.filesystem_id, reply.filename))
177         db_session.delete(reply)
178         db_session.commit()
179 
180         flash(gettext("Reply deleted"), "notification")
181         return redirect(url_for('.lookup'))
182 
183     @view.route('/delete-all', methods=('POST',))
184     @login_required
185     def batch_delete():
186         replies = g.source.replies
187         if len(replies) == 0:
188             current_app.logger.error("Found no replies when at least one was "
189                                      "expected")
190             return redirect(url_for('.lookup'))
191 
192         for reply in replies:
193             srm(store.path(g.filesystem_id, reply.filename))
194             db_session.delete(reply)
195         db_session.commit()
196 
197         flash(gettext("All replies have been deleted"), "notification")
198         return redirect(url_for('.lookup'))
199 
200     @view.route('/login', methods=('GET', 'POST'))
201     def login():
202         form = LoginForm()
203         if form.validate_on_submit():
204             codename = request.form['codename'].strip()
205             if valid_codename(codename):
206                 session.update(codename=codename, logged_in=True)
207                 return redirect(url_for('.lookup', from_login='1'))
208             else:
209                 current_app.logger.info(
210                         "Login failed for invalid codename".format(codename))
211                 flash(gettext("Sorry, that is not a recognized codename."),
212                       "error")
213         return render_template('login.html', form=form)
214 
215     @view.route('/logout')
216     def logout():
217         if logged_in():
218             session.clear()
219             msg = render_template('logout_flashed_message.html')
220             flash(Markup(msg), "important hide-if-not-tor-browser")
221         return redirect(url_for('.index'))
222 
223     return view
224
```
--- 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/securedrop/source_app/main.py b/securedrop/source_app/main.py
--- a/securedrop/source_app/main.py
+++ b/securedrop/source_app/main.py
@@ -215,8 +215,11 @@
     @view.route('/logout')
     def logout():
         if logged_in():
-            session.clear()
             msg = render_template('logout_flashed_message.html')
+
+            # clear the session after we render the message so it's localized
+            session.clear()
+
             flash(Markup(msg), "important hide-if-not-tor-browser")
         return redirect(url_for('.index'))

{"golden_diff": "diff --git a/securedrop/source_app/main.py b/securedrop/source_app/main.py\n--- a/securedrop/source_app/main.py\n+++ b/securedrop/source_app/main.py\n@@ -215,8 +215,11 @@\n     @view.route('/logout')\n     def logout():\n         if logged_in():\n-            session.clear()\n             msg = render_template('logout_flashed_message.html')\n+\n+            # clear the session after we render the message so it's localized\n+            session.clear()\n+\n             flash(Markup(msg), \"important hide-if-not-tor-browser\")\n         return redirect(url_for('.index'))\n", "issue": "Logging out a source does not display a localized \"Thank you for exiting your session!\" message\n# Bug\r\n\r\n## Description\r\n\r\nWhen a source clears their session via the logout button, their locale is popped as well. Thus, the following message is not displayed in the correct language.\r\n\r\n```\r\nImportant!\r\nThank you for exiting your session! Please select \"New Identity\" from the green Onion\r\nbutton in the Tor browser to clear all history of your SecureDrop usage from this device.\r\n```\r\n\r\n## Steps to Reproduce\r\n\r\n1. Open source interface\r\n2. Create new user\r\n3. Submit doc\r\n4. Log out\r\n\r\n## Expected Behavior\r\n\r\nThe logout page displays the (quite important) log out message in the correct locale (including HTML with `dir=\"rtl\"` set if needed).\r\n\r\n## Actual Behavior\r\n\r\nThe page is displayed in the default locale.\n", "before_files": [{"content": "import operator\nimport os\n\nfrom datetime import datetime\nfrom flask import (Blueprint, render_template, flash, redirect, url_for, g,\n                   session, current_app, request, Markup, abort)\nfrom flask_babel import gettext\nfrom sqlalchemy.exc import IntegrityError\n\nimport crypto_util\nimport store\n\nfrom db import Source, db_session, Submission, Reply, get_one_or_else\nfrom rm import srm\nfrom source_app.decorators import login_required\nfrom source_app.utils import (logged_in, generate_unique_codename,\n                              async_genkey, normalize_timestamps,\n                              valid_codename)\nfrom source_app.forms import LoginForm\n\n\ndef make_blueprint(config):\n    view = Blueprint('main', __name__)\n\n    @view.route('/')\n    def index():\n        return render_template('index.html')\n\n    @view.route('/generate', methods=('GET', 'POST'))\n    def generate():\n        if logged_in():\n            flash(gettext(\n                \"You were redirected because you are already logged in. \"\n                \"If you want to create a new account, you should log out \"\n                \"first.\"),\n                  \"notification\")\n            return redirect(url_for('.lookup'))\n\n        codename = generate_unique_codename()\n        session['codename'] = codename\n        session['new_user'] = True\n        return render_template('generate.html', codename=codename)\n\n    @view.route('/create', methods=['POST'])\n    def create():\n        filesystem_id = crypto_util.hash_codename(session['codename'])\n\n        source = Source(filesystem_id, crypto_util.display_id())\n        db_session.add(source)\n        try:\n            db_session.commit()\n        except IntegrityError as e:\n            db_session.rollback()\n            current_app.logger.error(\n                \"Attempt to create a source with duplicate codename: %s\" %\n                (e,))\n        else:\n            os.mkdir(store.path(filesystem_id))\n\n        session['logged_in'] = True\n        return redirect(url_for('.lookup'))\n\n    @view.route('/lookup', methods=('GET',))\n    @login_required\n    def lookup():\n        replies = []\n        for reply in g.source.replies:\n            reply_path = store.path(g.filesystem_id, reply.filename)\n            try:\n                reply.decrypted = crypto_util.decrypt(\n                    g.codename,\n                    open(reply_path).read()).decode('utf-8')\n            except UnicodeDecodeError:\n                current_app.logger.error(\"Could not decode reply %s\" %\n                                         reply.filename)\n            else:\n                reply.date = datetime.utcfromtimestamp(\n                    os.stat(reply_path).st_mtime)\n                replies.append(reply)\n\n        # Sort the replies by date\n        replies.sort(key=operator.attrgetter('date'), reverse=True)\n\n        # Generate a keypair to encrypt replies from the journalist\n        # Only do this if the journalist has flagged the source as one\n        # that they would like to reply to. (Issue #140.)\n        if not crypto_util.getkey(g.filesystem_id) and g.source.flagged:\n            async_genkey(g.filesystem_id, g.codename)\n\n        return render_template(\n            'lookup.html',\n            codename=g.codename,\n            replies=replies,\n            flagged=g.source.flagged,\n            new_user=session.get('new_user', None),\n            haskey=crypto_util.getkey(\n                g.filesystem_id))\n\n    @view.route('/submit', methods=('POST',))\n    @login_required\n    def submit():\n        msg = request.form['msg']\n        fh = request.files['fh']\n\n        # Don't submit anything if it was an \"empty\" submission. #878\n        if not (msg or fh):\n            flash(gettext(\n                \"You must enter a message or choose a file to submit.\"),\n                  \"error\")\n            return redirect(url_for('main.lookup'))\n\n        fnames = []\n        journalist_filename = g.source.journalist_filename\n        first_submission = g.source.interaction_count == 0\n\n        if msg:\n            g.source.interaction_count += 1\n            fnames.append(\n                store.save_message_submission(\n                    g.filesystem_id,\n                    g.source.interaction_count,\n                    journalist_filename,\n                    msg))\n        if fh:\n            g.source.interaction_count += 1\n            fnames.append(\n                store.save_file_submission(\n                    g.filesystem_id,\n                    g.source.interaction_count,\n                    journalist_filename,\n                    fh.filename,\n                    fh.stream))\n\n        if first_submission:\n            msg = render_template('first_submission_flashed_message.html')\n            flash(Markup(msg), \"success\")\n\n        else:\n            if msg and not fh:\n                html_contents = gettext('Thanks! We received your message.')\n            elif not msg and fh:\n                html_contents = gettext('Thanks! We received your document.')\n            else:\n                html_contents = gettext('Thanks! We received your message and '\n                                        'document.')\n\n            msg = render_template('next_submission_flashed_message.html',\n                                  html_contents=html_contents)\n            flash(Markup(msg), \"success\")\n\n        for fname in fnames:\n            submission = Submission(g.source, fname)\n            db_session.add(submission)\n\n        if g.source.pending:\n            g.source.pending = False\n\n            # Generate a keypair now, if there's enough entropy (issue #303)\n            entropy_avail = int(\n                open('/proc/sys/kernel/random/entropy_avail').read())\n            if entropy_avail >= 2400:\n                async_genkey(g.filesystem_id, g.codename)\n\n        g.source.last_updated = datetime.utcnow()\n        db_session.commit()\n        normalize_timestamps(g.filesystem_id)\n\n        return redirect(url_for('main.lookup'))\n\n    @view.route('/delete', methods=('POST',))\n    @login_required\n    def delete():\n        query = Reply.query.filter(\n            Reply.filename == request.form['reply_filename'])\n        reply = get_one_or_else(query, current_app.logger, abort)\n        srm(store.path(g.filesystem_id, reply.filename))\n        db_session.delete(reply)\n        db_session.commit()\n\n        flash(gettext(\"Reply deleted\"), \"notification\")\n        return redirect(url_for('.lookup'))\n\n    @view.route('/delete-all', methods=('POST',))\n    @login_required\n    def batch_delete():\n        replies = g.source.replies\n        if len(replies) == 0:\n            current_app.logger.error(\"Found no replies when at least one was \"\n                                     \"expected\")\n            return redirect(url_for('.lookup'))\n\n        for reply in replies:\n            srm(store.path(g.filesystem_id, reply.filename))\n            db_session.delete(reply)\n        db_session.commit()\n\n        flash(gettext(\"All replies have been deleted\"), \"notification\")\n        return redirect(url_for('.lookup'))\n\n    @view.route('/login', methods=('GET', 'POST'))\n    def login():\n        form = LoginForm()\n        if form.validate_on_submit():\n            codename = request.form['codename'].strip()\n            if valid_codename(codename):\n                session.update(codename=codename, logged_in=True)\n                return redirect(url_for('.lookup', from_login='1'))\n            else:\n                current_app.logger.info(\n                        \"Login failed for invalid codename\".format(codename))\n                flash(gettext(\"Sorry, that is not a recognized codename.\"),\n                      \"error\")\n        return render_template('login.html', form=form)\n\n    @view.route('/logout')\n    def logout():\n        if logged_in():\n            session.clear()\n            msg = render_template('logout_flashed_message.html')\n            flash(Markup(msg), \"important hide-if-not-tor-browser\")\n        return redirect(url_for('.index'))\n\n    return view\n", "path": "securedrop/source_app/main.py"}], "after_files": [{"content": "import operator\nimport os\n\nfrom datetime import datetime\nfrom flask import (Blueprint, render_template, flash, redirect, url_for, g,\n                   session, current_app, request, Markup, abort)\nfrom flask_babel import gettext\nfrom sqlalchemy.exc import IntegrityError\n\nimport crypto_util\nimport store\n\nfrom db import Source, db_session, Submission, Reply, get_one_or_else\nfrom rm import srm\nfrom source_app.decorators import login_required\nfrom source_app.utils import (logged_in, generate_unique_codename,\n                              async_genkey, normalize_timestamps,\n                              valid_codename)\nfrom source_app.forms import LoginForm\n\n\ndef make_blueprint(config):\n    view = Blueprint('main', __name__)\n\n    @view.route('/')\n    def index():\n        return render_template('index.html')\n\n    @view.route('/generate', methods=('GET', 'POST'))\n    def generate():\n        if logged_in():\n            flash(gettext(\n                \"You were redirected because you are already logged in. \"\n                \"If you want to create a new account, you should log out \"\n                \"first.\"),\n                  \"notification\")\n            return redirect(url_for('.lookup'))\n\n        codename = generate_unique_codename()\n        session['codename'] = codename\n        session['new_user'] = True\n        return render_template('generate.html', codename=codename)\n\n    @view.route('/create', methods=['POST'])\n    def create():\n        filesystem_id = crypto_util.hash_codename(session['codename'])\n\n        source = Source(filesystem_id, crypto_util.display_id())\n        db_session.add(source)\n        try:\n            db_session.commit()\n        except IntegrityError as e:\n            db_session.rollback()\n            current_app.logger.error(\n                \"Attempt to create a source with duplicate codename: %s\" %\n                (e,))\n        else:\n            os.mkdir(store.path(filesystem_id))\n\n        session['logged_in'] = True\n        return redirect(url_for('.lookup'))\n\n    @view.route('/lookup', methods=('GET',))\n    @login_required\n    def lookup():\n        replies = []\n        for reply in g.source.replies:\n            reply_path = store.path(g.filesystem_id, reply.filename)\n            try:\n                reply.decrypted = crypto_util.decrypt(\n                    g.codename,\n                    open(reply_path).read()).decode('utf-8')\n            except UnicodeDecodeError:\n                current_app.logger.error(\"Could not decode reply %s\" %\n                                         reply.filename)\n            else:\n                reply.date = datetime.utcfromtimestamp(\n                    os.stat(reply_path).st_mtime)\n                replies.append(reply)\n\n        # Sort the replies by date\n        replies.sort(key=operator.attrgetter('date'), reverse=True)\n\n        # Generate a keypair to encrypt replies from the journalist\n        # Only do this if the journalist has flagged the source as one\n        # that they would like to reply to. (Issue #140.)\n        if not crypto_util.getkey(g.filesystem_id) and g.source.flagged:\n            async_genkey(g.filesystem_id, g.codename)\n\n        return render_template(\n            'lookup.html',\n            codename=g.codename,\n            replies=replies,\n            flagged=g.source.flagged,\n            new_user=session.get('new_user', None),\n            haskey=crypto_util.getkey(\n                g.filesystem_id))\n\n    @view.route('/submit', methods=('POST',))\n    @login_required\n    def submit():\n        msg = request.form['msg']\n        fh = request.files['fh']\n\n        # Don't submit anything if it was an \"empty\" submission. #878\n        if not (msg or fh):\n            flash(gettext(\n                \"You must enter a message or choose a file to submit.\"),\n                  \"error\")\n            return redirect(url_for('main.lookup'))\n\n        fnames = []\n        journalist_filename = g.source.journalist_filename\n        first_submission = g.source.interaction_count == 0\n\n        if msg:\n            g.source.interaction_count += 1\n            fnames.append(\n                store.save_message_submission(\n                    g.filesystem_id,\n                    g.source.interaction_count,\n                    journalist_filename,\n                    msg))\n        if fh:\n            g.source.interaction_count += 1\n            fnames.append(\n                store.save_file_submission(\n                    g.filesystem_id,\n                    g.source.interaction_count,\n                    journalist_filename,\n                    fh.filename,\n                    fh.stream))\n\n        if first_submission:\n            msg = render_template('first_submission_flashed_message.html')\n            flash(Markup(msg), \"success\")\n\n        else:\n            if msg and not fh:\n                html_contents = gettext('Thanks! We received your message.')\n            elif not msg and fh:\n                html_contents = gettext('Thanks! We received your document.')\n            else:\n                html_contents = gettext('Thanks! We received your message and '\n                                        'document.')\n\n            msg = render_template('next_submission_flashed_message.html',\n                                  html_contents=html_contents)\n            flash(Markup(msg), \"success\")\n\n        for fname in fnames:\n            submission = Submission(g.source, fname)\n            db_session.add(submission)\n\n        if g.source.pending:\n            g.source.pending = False\n\n            # Generate a keypair now, if there's enough entropy (issue #303)\n            entropy_avail = int(\n                open('/proc/sys/kernel/random/entropy_avail').read())\n            if entropy_avail >= 2400:\n                async_genkey(g.filesystem_id, g.codename)\n\n        g.source.last_updated = datetime.utcnow()\n        db_session.commit()\n        normalize_timestamps(g.filesystem_id)\n\n        return redirect(url_for('main.lookup'))\n\n    @view.route('/delete', methods=('POST',))\n    @login_required\n    def delete():\n        query = Reply.query.filter(\n            Reply.filename == request.form['reply_filename'])\n        reply = get_one_or_else(query, current_app.logger, abort)\n        srm(store.path(g.filesystem_id, reply.filename))\n        db_session.delete(reply)\n        db_session.commit()\n\n        flash(gettext(\"Reply deleted\"), \"notification\")\n        return redirect(url_for('.lookup'))\n\n    @view.route('/delete-all', methods=('POST',))\n    @login_required\n    def batch_delete():\n        replies = g.source.replies\n        if len(replies) == 0:\n            current_app.logger.error(\"Found no replies when at least one was \"\n                                     \"expected\")\n            return redirect(url_for('.lookup'))\n\n        for reply in replies:\n            srm(store.path(g.filesystem_id, reply.filename))\n            db_session.delete(reply)\n        db_session.commit()\n\n        flash(gettext(\"All replies have been deleted\"), \"notification\")\n        return redirect(url_for('.lookup'))\n\n    @view.route('/login', methods=('GET', 'POST'))\n    def login():\n        form = LoginForm()\n        if form.validate_on_submit():\n            codename = request.form['codename'].strip()\n            if valid_codename(codename):\n                session.update(codename=codename, logged_in=True)\n                return redirect(url_for('.lookup', from_login='1'))\n            else:\n                current_app.logger.info(\n                        \"Login failed for invalid codename\".format(codename))\n                flash(gettext(\"Sorry, that is not a recognized codename.\"),\n                      \"error\")\n        return render_template('login.html', form=form)\n\n    @view.route('/logout')\n    def logout():\n        if logged_in():\n            msg = render_template('logout_flashed_message.html')\n\n            # clear the session after we render the message so it's localized\n            session.clear()\n\n            flash(Markup(msg), \"important hide-if-not-tor-browser\")\n        return redirect(url_for('.index'))\n\n    return view\n", "path": "securedrop/source_app/main.py"}]}