)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e3313dbe15a4c4eb41fbcfb0144dfdc8050d6e08","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Joshua Harlow \u003charlowja@yahoo-inc.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-09-23 14:45:38 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Create digestutils and include \u0027constant_time_compare\u0027 function"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This code (or a version of it) is being shared by at least nova"},{"line_number":10,"context_line":"and keystonemiddleware and it seems like a good idea to move it"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7a2fa921_415f7375","line":7,"updated":"2015-10-12 15:17:08.000000000","message":"I\u0027m not sure that we will find other utils to put into such name: \"digestutils\".\n\nCan we try to find a more generic name. Maybe \"securityutils\" or secretutils\"?\n\nFYI Python 3.6 may be a new \"secrets\" module: see http://lwn.net/Articles/659783/ (and http://lwn.net/Articles/659643/).","commit_id":"d3aa1c61bb90d27f3acedb2eb54fef806abad04e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"71a1b3dfa4d2e46907c81d5b89b0d07e15175996","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Joshua Harlow \u003charlowja@yahoo-inc.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-09-23 14:45:38 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Create digestutils and include \u0027constant_time_compare\u0027 function"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This code (or a version of it) is being shared by at least nova"},{"line_number":10,"context_line":"and keystonemiddleware and it seems like a good idea to move it"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7a2fa921_5f4e6e97","line":7,"in_reply_to":"7a2fa921_415f7375","updated":"2015-10-13 23:34:11.000000000","message":"Ya, maybe secretutils to match the potential 3.6 package.","commit_id":"d3aa1c61bb90d27f3acedb2eb54fef806abad04e"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e3313dbe15a4c4eb41fbcfb0144dfdc8050d6e08","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This code (or a version of it) is being shared by at least nova"},{"line_number":10,"context_line":"and keystonemiddleware and it seems like a good idea to move it"},{"line_number":11,"context_line":"to being common shared code (especially due to the importance"},{"line_number":12,"context_line":"of getting this code correct)."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This adds an initial digestutils (using the keystonemiddleware"},{"line_number":15,"context_line":"variation of this code) and adds tests for it."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7a2fa921_e1855fad","line":12,"updated":"2015-10-12 15:17:08.000000000","message":"Yeah, I remember that we fixed these functions for Python 3 twice :-) I remember that moving this code to Oslo was on my TODO list, and then I cleared my TODO list :-D","commit_id":"d3aa1c61bb90d27f3acedb2eb54fef806abad04e"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"71a1b3dfa4d2e46907c81d5b89b0d07e15175996","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This code (or a version of it) is being shared by at least nova"},{"line_number":10,"context_line":"and keystonemiddleware and it seems like a good idea to move it"},{"line_number":11,"context_line":"to being common shared code (especially due to the importance"},{"line_number":12,"context_line":"of getting this code correct)."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This adds an initial digestutils (using the keystonemiddleware"},{"line_number":15,"context_line":"variation of this code) and adds tests for it."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7a2fa921_ff42da67","line":12,"in_reply_to":"7a2fa921_e1855fad","updated":"2015-10-13 23:34:11.000000000","message":"Haha,","commit_id":"d3aa1c61bb90d27f3acedb2eb54fef806abad04e"}],"doc/source/api/secretutils.rst":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f659f8be132e4dc55b4b278dc26c95d1ce3348a9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":" secretutils"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a7b0d38_3b5ff142","line":1,"updated":"2015-12-23 16:43:51.000000000","message":"why isn\u0027t this auto-generated?","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"}],"oslo_utils/digestutils.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e3313dbe15a4c4eb41fbcfb0144dfdc8050d6e08","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import hmac"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import six"},{"line_number":18,"context_line":"from six.moves import zip as compat_zip"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_e191df53","line":18,"updated":"2015-10-12 15:17:08.000000000","message":"I\u0027m not sure that you need six here since hmac.compare_digest must be used on Python 3.\n\nhmac.compare_digest() is available since Python 3.3 and our current target minimum version is 3.4.","commit_id":"d3aa1c61bb90d27f3acedb2eb54fef806abad04e"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e3313dbe15a4c4eb41fbcfb0144dfdc8050d6e08","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        if len(first) !\u003d len(second):"},{"line_number":34,"context_line":"            return False"},{"line_number":35,"context_line":"        result \u003d 0"},{"line_number":36,"context_line":"        if six.PY3 and isinstance(first, six.binary_type) and \\"},{"line_number":37,"context_line":"           isinstance(second, six.binary_type):"},{"line_number":38,"context_line":"            for x, y in compat_zip(first, second):"},{"line_number":39,"context_line":"                result |\u003d x ^ y"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_010bbb7e","line":36,"updated":"2015-10-12 15:17:08.000000000","message":"Ditto: drop also Python 3 code here.","commit_id":"d3aa1c61bb90d27f3acedb2eb54fef806abad04e"}],"oslo_utils/secretutils.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"ed452fea79998a2088bd8a9d79dd573b7f7a5370","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    constant_time_compare \u003d hmac.compare_digest"},{"line_number":20,"context_line":"except AttributeError:"},{"line_number":21,"context_line":"    def constant_time_compare(first, second):"},{"line_number":22,"context_line":"        \"\"\"Returns True if both string inputs are equal, otherwise False."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"        This function should take a constant amount of time regardless of"},{"line_number":25,"context_line":"        how many characters in the strings match. This function uses an"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_16c35158","line":22,"updated":"2015-10-22 09:25:12.000000000","message":"You may mention that the string type: replace \"string\" with \"Unicode string\".","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"ed452fea79998a2088bd8a9d79dd573b7f7a5370","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        approach designed to prevent timing analysis by avoiding"},{"line_number":27,"context_line":"        content-based short circuiting behaviour, making it appropriate"},{"line_number":28,"context_line":"        for cryptography."},{"line_number":29,"context_line":"        \"\"\""},{"line_number":30,"context_line":"        if len(first) !\u003d len(second):"},{"line_number":31,"context_line":"            return False"},{"line_number":32,"context_line":"        result \u003d 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_36d20d29","line":29,"updated":"2015-10-22 09:25:12.000000000","message":"Hum, you may raise a TypeError if a parameter is not a Unicode string.","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"50b1f035ba50114c1dfd97de75ab88e85c1e8ede","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        approach designed to prevent timing analysis by avoiding"},{"line_number":27,"context_line":"        content-based short circuiting behaviour, making it appropriate"},{"line_number":28,"context_line":"        for cryptography."},{"line_number":29,"context_line":"        \"\"\""},{"line_number":30,"context_line":"        if len(first) !\u003d len(second):"},{"line_number":31,"context_line":"            return False"},{"line_number":32,"context_line":"        result \u003d 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_d6c2a084","line":29,"in_reply_to":"3a29b11f_36d20d29","updated":"2015-10-22 18:27:51.000000000","message":"Unsure about that because on py2.x it currently still supports byte strings and unicode strings... while on py3.x it only works with unicode strings...\n\nOn py2.7:\n\nhttps://gist.github.com/harlowja/772774b80838b5902951\n\nMixed unicode and bytes don\u0027t work, although non-mixed types do work.\n\nOn py3.x:\n\nhttps://gist.github.com/harlowja/f75f3840e2f8dea47dbb\n\nWhich mode do we want to work with, the py3.x one or something the py2.x one :-P","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"b6c3ca9bb6b10033d5d4c3805209c92d7bb5b1b7","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        approach designed to prevent timing analysis by avoiding"},{"line_number":27,"context_line":"        content-based short circuiting behaviour, making it appropriate"},{"line_number":28,"context_line":"        for cryptography."},{"line_number":29,"context_line":"        \"\"\""},{"line_number":30,"context_line":"        if len(first) !\u003d len(second):"},{"line_number":31,"context_line":"            return False"},{"line_number":32,"context_line":"        result \u003d 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_e9d44748","line":29,"in_reply_to":"3a29b11f_d1105802","updated":"2015-12-10 06:36:09.000000000","message":"See patch set #1 ;)\n\nI can move back to that version again, lol.\n\nOr I can just do this here, or something, lol.","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"28e8d06c86cbb47001ecc4aa38599c17d5a4a61e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        approach designed to prevent timing analysis by avoiding"},{"line_number":27,"context_line":"        content-based short circuiting behaviour, making it appropriate"},{"line_number":28,"context_line":"        for cryptography."},{"line_number":29,"context_line":"        \"\"\""},{"line_number":30,"context_line":"        if len(first) !\u003d len(second):"},{"line_number":31,"context_line":"            return False"},{"line_number":32,"context_line":"        result \u003d 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_d1105802","line":29,"in_reply_to":"3a29b11f_d6c2a084","updated":"2015-10-23 09:06:25.000000000","message":"You must also raise an error if the a and b don\u0027t have the same type:\n\n$ python3\nPython 3.4.2 (default, Jul  9 2015, 17:24:30) \n for more information.\n\u003e\u003e\u003e import hmac\n\u003e\u003e\u003e hmac.compare_digest(b\u0027abc\u0027, u\u0027abc\u0027)\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nTypeError: \u0027str\u0027 does not support the buffer interface\n\u003e\u003e\u003e hmac.compare_digest(u\u0027abc\u0027, b\u0027abc\u0027)\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nTypeError: \u0027str\u0027 does not support the buffer interface\n\nYou\u0027re right, the function works on Python 2 for bytes and Unicode. Maybe you should only raise the TypeError for bytes on Python 3 in this case. Or add directly support for bytes and Unicode for Python 2 and Python 3. But Doug said something about importing the current code and then enhance it. Maybe you should write a patch serie?\n\nI just fear that the comparison if not really \"time constant\" if you use two differen string types :-/","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"13ce5102cb9dd378bf00eef41141a2704b15d59a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            return False"},{"line_number":32,"context_line":"        result \u003d 0"},{"line_number":33,"context_line":"        for x, y in zip(first, second):"},{"line_number":34,"context_line":"            result |\u003d ord(x) ^ ord(y)"},{"line_number":35,"context_line":"        return result \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_5dea8cdc","line":34,"updated":"2015-11-26 16:03:59.000000000","message":"If  ord(x) ^ ord(y) equals 1  , I think we should break:\n\nwhat about:\nfor x, y in zip(first, second):\n    if ord(x) ^ ord(y) \u003d\u003d1:\n       return False\nreturn True","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"f4f4701238f16f6c187c3b78f3ed72cc2b1124cb","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            return False"},{"line_number":32,"context_line":"        result \u003d 0"},{"line_number":33,"context_line":"        for x, y in zip(first, second):"},{"line_number":34,"context_line":"            result |\u003d ord(x) ^ ord(y)"},{"line_number":35,"context_line":"        return result \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_9079bb84","line":34,"in_reply_to":"9a8ffd7b_5dea8cdc","updated":"2015-12-02 17:31:25.000000000","message":"\"\"\"\nwhat about:\nfor x, y in zip(first, second):\n    if ord(x) ^ ord(y) \u003d\u003d1:\n       return False\nreturn True\n\"\"\"\n\nI think that you misunderstood the whole purpose of the function :-( If you do that the function is no more \"constant time\".","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"8f7b2d826602d13d3b59685388e77a1d32314a62","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            return False"},{"line_number":32,"context_line":"        result \u003d 0"},{"line_number":33,"context_line":"        for x, y in zip(first, second):"},{"line_number":34,"context_line":"            result |\u003d ord(x) ^ ord(y)"},{"line_number":35,"context_line":"        return result \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_e9dd8fe0","line":34,"in_reply_to":"9a8ffd7b_69067f87","updated":"2015-12-03 13:43:29.000000000","message":"\u003e This is an example and output, your current method will loop as time as len(first).\n\nYes, it\u0027s expected and required. What\u0027s your point? Can you please elaborate?\n\nIt\u0027s a protection against side channel attack, especially timing attack:\nhttps://en.wikipedia.org/wiki/Timing_attack","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"c8f639ba898c1c521da29a27bd2a2d5b9f611d80","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            return False"},{"line_number":32,"context_line":"        result \u003d 0"},{"line_number":33,"context_line":"        for x, y in zip(first, second):"},{"line_number":34,"context_line":"            result |\u003d ord(x) ^ ord(y)"},{"line_number":35,"context_line":"        return result \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_69067f87","line":34,"in_reply_to":"9a8ffd7b_9079bb84","updated":"2015-12-03 13:39:42.000000000","message":"This is an example and output,  your current method will  loop  as time as len(first).\n\n[gcb@localhost tests]$ cat test_compare2.py\n\ndef compare(first, second):\n    if len(first) !\u003d len(second):\n        return False\n    result \u003d 0\n    index \u003d 0\n    for x, y in zip(first, second):\n        print(index)\n        index +\u003d 1\n        result|\u003d ord(x) ^ ord(y)\n    return result \u003d\u003d 0\n\ndef compare2(first, second):\n    if len(first) !\u003d len(second):\n        return False\n    index \u003d 0\n    for x, y in zip(first, second):\n        print(index)\n        index +\u003d 1\n        if ord(x) ^ ord(y) !\u003d 0:\n           return False\n\n    return True\n\nif __name__ \u003d\u003d \u0027__main__\u0027:\n   print(compare(\u0027aacdef\u0027, \u0027abcdef\u0027))\n   print(compare2(\u0027aacdef\u0027, \u0027abcdef\u0027))\n[gcb@localhost tests]$ python test_compare2.py\n0\n1\n2\n3\n4\n5\nFalse\n0\n1\nFalse","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"},{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"e55931ed8a0d5d5052e6d04c2ee2a8f534acc505","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            return False"},{"line_number":32,"context_line":"        result \u003d 0"},{"line_number":33,"context_line":"        for x, y in zip(first, second):"},{"line_number":34,"context_line":"            result |\u003d ord(x) ^ ord(y)"},{"line_number":35,"context_line":"        return result \u003d\u003d 0"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_5441a438","line":34,"in_reply_to":"9a8ffd7b_e9dd8fe0","updated":"2015-12-03 15:25:19.000000000","message":"never mind, just mean compare2 method  may take less time then compare in the example from programming side :-).  \nI  misunderstood the whole purpose of the function","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"}],"oslo_utils/tests/test_digestutils.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e3313dbe15a4c4eb41fbcfb0144dfdc8050d6e08","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.assertFalse(ctc(self.converter(u\"abcd1234\"),"},{"line_number":48,"context_line":"                             self.converter(u\"ABCD234\")))"},{"line_number":49,"context_line":"        self.assertFalse(ctc(self.converter(u\"abcd1234\"),"},{"line_number":50,"context_line":"                             self.converter(u\"a\")))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_21eb57b2","line":50,"updated":"2015-10-12 15:17:08.000000000","message":"I don\u0027t think that we need so much tests. One True test and one False test should be enough. What do you think?","commit_id":"d3aa1c61bb90d27f3acedb2eb54fef806abad04e"}],"oslo_utils/tests/test_secretutils.py":[{"author":{"_account_id":9796,"name":"ChangBo Guo","email":"glongwave@gmail.com","username":"gcb"},"change_message_id":"13ce5102cb9dd378bf00eef41141a2704b15d59a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                             self.converter(u\u0027abc\\x00\u0027)))"},{"line_number":43,"context_line":"        self.assertFalse(ctc(self.converter(u\u0027\u0027),"},{"line_number":44,"context_line":"                             self.converter(u\u0027abc\u0027)))"},{"line_number":45,"context_line":"        self.assertTrue(ctc(self.converter(u\"abcd1234\"),"},{"line_number":46,"context_line":"                            self.converter(u\"abcd1234\")))"},{"line_number":47,"context_line":"        self.assertFalse(ctc(self.converter(u\"abcd1234\"),"},{"line_number":48,"context_line":"                             self.converter(u\"ABCD234\")))"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_9d80f4f8","line":45,"updated":"2015-11-26 16:03:59.000000000","message":"add  another assertFalse ?\n   self.assertFalse(ctc(self.converter(u\"abcd1234\"),\n                           self.converter(u\"1234abcd\")))","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f659f8be132e4dc55b4b278dc26c95d1ce3348a9","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                             self.converter(u\u0027abc\\x00\u0027)))"},{"line_number":43,"context_line":"        self.assertFalse(ctc(self.converter(u\u0027\u0027),"},{"line_number":44,"context_line":"                             self.converter(u\u0027abc\u0027)))"},{"line_number":45,"context_line":"        self.assertTrue(ctc(self.converter(u\"abcd1234\"),"},{"line_number":46,"context_line":"                            self.converter(u\"abcd1234\")))"},{"line_number":47,"context_line":"        self.assertFalse(ctc(self.converter(u\"abcd1234\"),"},{"line_number":48,"context_line":"                             self.converter(u\"ABCD234\")))"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a7b0d38_7626f069","line":45,"range":{"start_line":45,"start_character":44,"end_line":45,"end_character":45},"updated":"2015-12-23 16:43:51.000000000","message":"suggest use \u0027 consistently.","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"cb85aef5831263622ecf45b5c79b6fb66c1489f9","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                             self.converter(u\u0027abc\\x00\u0027)))"},{"line_number":43,"context_line":"        self.assertFalse(ctc(self.converter(u\u0027\u0027),"},{"line_number":44,"context_line":"                             self.converter(u\u0027abc\u0027)))"},{"line_number":45,"context_line":"        self.assertTrue(ctc(self.converter(u\"abcd1234\"),"},{"line_number":46,"context_line":"                            self.converter(u\"abcd1234\")))"},{"line_number":47,"context_line":"        self.assertFalse(ctc(self.converter(u\"abcd1234\"),"},{"line_number":48,"context_line":"                             self.converter(u\"ABCD234\")))"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_24d3b2d6","line":45,"range":{"start_line":45,"start_character":44,"end_line":45,"end_character":45},"in_reply_to":"1a7b0d38_7626f069","updated":"2016-01-06 19:42:01.000000000","message":"Ya, I wonder why I switched, must of been the coffee, lol.","commit_id":"c0eb049d5f582210426d31a518eab21418b64086"}]}
