{"action":"created","comment":{"url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/comments/85713596","pull_request_review_id":6412416,"id":85713596,"diff_hunk":"@@ -0,0 +1,211 @@\n+{-# LANGUAGE BangPatterns #-}\n+{-# LANGUAGE FlexibleInstances #-}\n+{-# LANGUAGE RecordWildCards #-}\n+{-# LANGUAGE NoImplicitPrelude #-}\n+{-# LANGUAGE ViewPatterns #-}\n+module Stackage.Package.Git.Types where\n+\n+import ClassyPrelude.Conduit\n+import qualified Data.ByteString.Builder as B\n+import qualified Data.ByteString.Builder.Extra as BE\n+import qualified Data.ByteString.Char8 as S8\n+import qualified Data.ByteString.Short as BS\n+import qualified Data.ByteString.Lazy as L\n+import qualified Data.ByteString.Unsafe as BU\n+import Data.Git.Ref\n+import Data.Hourglass (timeFromElapsed)\n+import qualified Data.Map as Map\n+import Foreign.Storable (peekByteOff)\n+import Time.System (timeCurrent)\n+\n+import qualified Data.Git as G\n+\n+-- | User that will be used for creating commits (both author and commiter) and\n+-- tags.\n+data GitUser = GitUser\n+  { userName :: ByteString\n+    -- ^ Full name\n+  , userEmail :: ByteString\n+    -- ^ Email\n+  , userGpgKey :: Maybe String\n+    -- ^ GPG public key.\n+  } deriving (Show)\n+\n+\n+-- | Information about the git repository.\n+data GitInfo = GitInfo\n+  { gitAddress :: String\n+    -- ^ Git address of the repository were it can be cloned from using SSH key.\n+  , gitBranchName :: String\n+    -- ^ Name of the branch that updates should be committed to. (Remote branch\n+    -- with the same name is expected to exist).\n+  , gitUser :: GitUser\n+    -- ^ User information to be used for the commits.\n+  , gitTagName :: Maybe ByteString\n+    -- ^ Create a tag of a commit.\n+  , gitLocalPath :: FilePath\n+    -- ^ Where in the file system this repository is located.\n+  , gitRootTree :: Maybe (WorkTree ShortRef ShortRef)\n+  }\n+\n+\n+data GitInstance = GitInstance\n+  { gitRepo :: G.Git\n+    -- ^ Git repository instance.\n+  , gitBranchRef :: MVar G.Ref\n+    -- ^ Reference of the commit, that current branch is pointing to.\n+  , gitWorkTree :: MVar (WorkTree ShortRef ShortRef, WorkTree () GitFile)\n+    -- ^ Current work tree written to the git store.\n+  }\n+\n+\n+-- | Everything that is necessary to operate on a repository.\n+data GitRepository = GitRepository\n+  { repoInstance :: GitInstance\n+  , repoInfo :: GitInfo\n+  }\n+\n+\n+\n+-- | A file that is prepared for being written into git store.\n+data GitFile = GitFile\n+  { gitFileRef :: !G.Ref\n+    -- ^ SHA1 of the blob.\n+  , gitFileType :: !FileType\n+    -- ^ One of the few possible file types.\n+  , gitFileZipped :: !ByteString\n+    -- ^ A blob object: marshalled and compressed file.\n+  } deriving (Show)\n+\n+type GitTree = G.Tree\n+\n+type GitCommit = G.Commit\n+\n+type GitTag = G.Tag\n+\n+-- | A file name as it is expected to look like by git. This data type is\n+-- crutial for keeping files properly sorted in the work tree, as it is expected\n+-- by git.\n+data FileName\n+  = FileName !BS.ShortByteString\n+    -- ^ Just a file name without a path to it.\n+  | DirectoryName !BS.ShortByteString\n+    -- ^ Directory name with a trailing slash, without it trees wouldn't get\n+    -- sorted properly: @(\"0.1\" > \"0.1.1\") /= (\"0.1/\" > \"0.1.1/\")@\n+  deriving (Show)\n+\n+\n+type TreePath = [FileName]\n+\n+\n+-- | Convert file path to a tree path.\n+toTreePath :: FilePath -> TreePath\n+toTreePath path = foldr toFileName [] splitPath'\n+  where\n+    splitPath' = S8.split '/' $ S8.pack path\n+    toFileName fName []\n+      | null fName =\n+        error $ \"Tree path should end with a file name, not a directory: \" ++ path\n+      | otherwise = [FileName $ BS.toShort fName]\n+    toFileName fDir tp = DirectoryName (BS.toShort $ S8.snoc fDir '/') : tp\n+\n+\n+instance Eq FileName where","path":"src/Stackage/Package/Git/Types.hs","position":113,"original_position":113,"commit_id":"c18603fdcd341c851fa15c39bcc409a274e3f8bc","original_commit_id":"c18603fdcd341c851fa15c39bcc409a274e3f8bc","user":{"login":"snoyberg","id":49415,"avatar_url":"https://avatars.githubusercontent.com/u/49415?v=3","gravatar_id":"","url":"https://api.github.com/users/snoyberg","html_url":"https://github.com/snoyberg","followers_url":"https://api.github.com/users/snoyberg/followers","following_url":"https://api.github.com/users/snoyberg/following{/other_user}","gists_url":"https://api.github.com/users/snoyberg/gists{/gist_id}","starred_url":"https://api.github.com/users/snoyberg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/snoyberg/subscriptions","organizations_url":"https://api.github.com/users/snoyberg/orgs","repos_url":"https://api.github.com/users/snoyberg/repos","events_url":"https://api.github.com/users/snoyberg/events{/privacy}","received_events_url":"https://api.github.com/users/snoyberg/received_events","type":"User","site_admin":false},"body":"I'm about 99% certain I understood that comment above, and that my suggested `normalize` function _would_ work. If not, then this comment needs a lot more explanation.\r\n\r\n```haskell\r\nnormalize :: FileName -> ByteString\r\nnormalize (FileName x) = BS.fromShort x\r\nnormalize (DirectoryName x) = S8.init $ BS.fromShort x\r\n```\r\n\r\nThere's a separate but related question about whether these kinds of instances are really appropriate at all, I'm not convinced that that's the case here, but I'm willing to leave it be. But it definitely needs to be commented: having an `Eq` instance where `x == y` but `x` and `y` are observably different is very confusing.","created_at":"2016-10-31T10:27:43Z","updated_at":"2016-10-31T10:27:43Z","html_url":"https://github.com/commercialhaskell/all-cabal-tool/pull/2#discussion_r85713596","pull_request_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/2","_links":{"self":{"href":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/comments/85713596"},"html":{"href":"https://github.com/commercialhaskell/all-cabal-tool/pull/2#discussion_r85713596"},"pull_request":{"href":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/2"}}},"pull_request":{"url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/2","id":91470903,"html_url":"https://github.com/commercialhaskell/all-cabal-tool/pull/2","diff_url":"https://github.com/commercialhaskell/all-cabal-tool/pull/2.diff","patch_url":"https://github.com/commercialhaskell/all-cabal-tool/pull/2.patch","issue_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/issues/2","number":2,"state":"open","locked":false,"title":"Implementation of repos' update using Hit and an in-memory work tree.","user":{"login":"lehins","id":2333894,"avatar_url":"https://avatars.githubusercontent.com/u/2333894?v=3","gravatar_id":"","url":"https://api.github.com/users/lehins","html_url":"https://github.com/lehins","followers_url":"https://api.github.com/users/lehins/followers","following_url":"https://api.github.com/users/lehins/following{/other_user}","gists_url":"https://api.github.com/users/lehins/gists{/gist_id}","starred_url":"https://api.github.com/users/lehins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lehins/subscriptions","organizations_url":"https://api.github.com/users/lehins/orgs","repos_url":"https://api.github.com/users/lehins/repos","events_url":"https://api.github.com/users/lehins/events{/privacy}","received_events_url":"https://api.github.com/users/lehins/received_events","type":"User","site_admin":false},"body":"Utilizing Hit, this PR contains implementation of updating repositories using an in-memory work tree, which allows operating on bare repositories totally avoiding usage of git's work tree and index. Although memory efficiency could be improved through optimizing Hit package, performance is already on a level.\n\nBelow are the RTS statistics of a single iteration update:\n\n```\n  86,587,352,176 bytes allocated in the heap\n   2,994,304,288 bytes copied during GC\n     330,834,832 bytes maximum residency (32 sample(s))\n      46,044,896 bytes maximum slop\n             754 MB total memory in use (0 MB lost due to fragmentation)\n\n                                     Tot time (elapsed)  Avg pause  Max pause\n  Gen  0     145612 colls,     0 par    3.192s   3.872s     0.0000s    0.0017s\n  Gen  1        32 colls,     0 par    2.016s   2.092s     0.0654s    0.1718s\n\n  TASKS: 5 (1 bound, 4 peak workers (4 total), using -N1)\n\n  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n\n  INIT    time    0.000s  (  0.001s elapsed)\n  MUT     time   60.888s  (125.369s elapsed)\n  GC      time    5.208s  (  5.964s elapsed)\n  EXIT    time    0.008s  (  0.016s elapsed)\n  Total   time   66.180s  (131.350s elapsed)\n\n  Alloc rate    1,422,075,814 bytes per MUT second\n\n  Productivity  92.1% of total user, 46.4% of total elapsed\n\ngc_alloc_block_sync: 0\nwhitehole_spin: 0\ngen[0].sync: 0\ngen[1].sync: 0\n\nreal    2m11.535s\nuser    1m6.320s\nsys 0m22.960s\n```\n","created_at":"2016-10-29T00:13:27Z","updated_at":"2016-10-31T10:27:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4ce975da3c8c8d21c8e772b4e058e77914ec8bc3","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/2/commits","review_comments_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/2/comments","review_comment_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/comments{/number}","comments_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/issues/2/comments","statuses_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/statuses/c18603fdcd341c851fa15c39bcc409a274e3f8bc","head":{"label":"lehins:master","ref":"master","sha":"c18603fdcd341c851fa15c39bcc409a274e3f8bc","user":{"login":"lehins","id":2333894,"avatar_url":"https://avatars.githubusercontent.com/u/2333894?v=3","gravatar_id":"","url":"https://api.github.com/users/lehins","html_url":"https://github.com/lehins","followers_url":"https://api.github.com/users/lehins/followers","following_url":"https://api.github.com/users/lehins/following{/other_user}","gists_url":"https://api.github.com/users/lehins/gists{/gist_id}","starred_url":"https://api.github.com/users/lehins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lehins/subscriptions","organizations_url":"https://api.github.com/users/lehins/orgs","repos_url":"https://api.github.com/users/lehins/repos","events_url":"https://api.github.com/users/lehins/events{/privacy}","received_events_url":"https://api.github.com/users/lehins/received_events","type":"User","site_admin":false},"repo":{"id":70157434,"name":"all-cabal-tool","full_name":"lehins/all-cabal-tool","owner":{"login":"lehins","id":2333894,"avatar_url":"https://avatars.githubusercontent.com/u/2333894?v=3","gravatar_id":"","url":"https://api.github.com/users/lehins","html_url":"https://github.com/lehins","followers_url":"https://api.github.com/users/lehins/followers","following_url":"https://api.github.com/users/lehins/following{/other_user}","gists_url":"https://api.github.com/users/lehins/gists{/gist_id}","starred_url":"https://api.github.com/users/lehins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lehins/subscriptions","organizations_url":"https://api.github.com/users/lehins/orgs","repos_url":"https://api.github.com/users/lehins/repos","events_url":"https://api.github.com/users/lehins/events{/privacy}","received_events_url":"https://api.github.com/users/lehins/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/lehins/all-cabal-tool","description":"Update the various all-cabal-* repos","fork":true,"url":"https://api.github.com/repos/lehins/all-cabal-tool","forks_url":"https://api.github.com/repos/lehins/all-cabal-tool/forks","keys_url":"https://api.github.com/repos/lehins/all-cabal-tool/keys{/key_id}","collaborators_url":"https://api.github.com/repos/lehins/all-cabal-tool/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/lehins/all-cabal-tool/teams","hooks_url":"https://api.github.com/repos/lehins/all-cabal-tool/hooks","issue_events_url":"https://api.github.com/repos/lehins/all-cabal-tool/issues/events{/number}","events_url":"https://api.github.com/repos/lehins/all-cabal-tool/events","assignees_url":"https://api.github.com/repos/lehins/all-cabal-tool/assignees{/user}","branches_url":"https://api.github.com/repos/lehins/all-cabal-tool/branches{/branch}","tags_url":"https://api.github.com/repos/lehins/all-cabal-tool/tags","blobs_url":"https://api.github.com/repos/lehins/all-cabal-tool/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/lehins/all-cabal-tool/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/lehins/all-cabal-tool/git/refs{/sha}","trees_url":"https://api.github.com/repos/lehins/all-cabal-tool/git/trees{/sha}","statuses_url":"https://api.github.com/repos/lehins/all-cabal-tool/statuses/{sha}","languages_url":"https://api.github.com/repos/lehins/all-cabal-tool/languages","stargazers_url":"https://api.github.com/repos/lehins/all-cabal-tool/stargazers","contributors_url":"https://api.github.com/repos/lehins/all-cabal-tool/contributors","subscribers_url":"https://api.github.com/repos/lehins/all-cabal-tool/subscribers","subscription_url":"https://api.github.com/repos/lehins/all-cabal-tool/subscription","commits_url":"https://api.github.com/repos/lehins/all-cabal-tool/commits{/sha}","git_commits_url":"https://api.github.com/repos/lehins/all-cabal-tool/git/commits{/sha}","comments_url":"https://api.github.com/repos/lehins/all-cabal-tool/comments{/number}","issue_comment_url":"https://api.github.com/repos/lehins/all-cabal-tool/issues/comments{/number}","contents_url":"https://api.github.com/repos/lehins/all-cabal-tool/contents/{+path}","compare_url":"https://api.github.com/repos/lehins/all-cabal-tool/compare/{base}...{head}","merges_url":"https://api.github.com/repos/lehins/all-cabal-tool/merges","archive_url":"https://api.github.com/repos/lehins/all-cabal-tool/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/lehins/all-cabal-tool/downloads","issues_url":"https://api.github.com/repos/lehins/all-cabal-tool/issues{/number}","pulls_url":"https://api.github.com/repos/lehins/all-cabal-tool/pulls{/number}","milestones_url":"https://api.github.com/repos/lehins/all-cabal-tool/milestones{/number}","notifications_url":"https://api.github.com/repos/lehins/all-cabal-tool/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/lehins/all-cabal-tool/labels{/name}","releases_url":"https://api.github.com/repos/lehins/all-cabal-tool/releases{/id}","deployments_url":"https://api.github.com/repos/lehins/all-cabal-tool/deployments","created_at":"2016-10-06T13:38:51Z","updated_at":"2016-10-06T13:38:52Z","pushed_at":"2016-10-28T23:58:07Z","git_url":"git://github.com/lehins/all-cabal-tool.git","ssh_url":"git@github.com:lehins/all-cabal-tool.git","clone_url":"https://github.com/lehins/all-cabal-tool.git","svn_url":"https://github.com/lehins/all-cabal-tool","homepage":null,"size":138,"stargazers_count":0,"watchers_count":0,"language":"Haskell","has_issues":false,"has_downloads":true,"has_wiki":true,"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":"commercialhaskell:master","ref":"master","sha":"5dbdd1ff4c574656bc23e29764a79790e041640e","user":{"login":"commercialhaskell","id":10633049,"avatar_url":"https://avatars.githubusercontent.com/u/10633049?v=3","gravatar_id":"","url":"https://api.github.com/users/commercialhaskell","html_url":"https://github.com/commercialhaskell","followers_url":"https://api.github.com/users/commercialhaskell/followers","following_url":"https://api.github.com/users/commercialhaskell/following{/other_user}","gists_url":"https://api.github.com/users/commercialhaskell/gists{/gist_id}","starred_url":"https://api.github.com/users/commercialhaskell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/commercialhaskell/subscriptions","organizations_url":"https://api.github.com/users/commercialhaskell/orgs","repos_url":"https://api.github.com/users/commercialhaskell/repos","events_url":"https://api.github.com/users/commercialhaskell/events{/privacy}","received_events_url":"https://api.github.com/users/commercialhaskell/received_events","type":"Organization","site_admin":false},"repo":{"id":68196734,"name":"all-cabal-tool","full_name":"commercialhaskell/all-cabal-tool","owner":{"login":"commercialhaskell","id":10633049,"avatar_url":"https://avatars.githubusercontent.com/u/10633049?v=3","gravatar_id":"","url":"https://api.github.com/users/commercialhaskell","html_url":"https://github.com/commercialhaskell","followers_url":"https://api.github.com/users/commercialhaskell/followers","following_url":"https://api.github.com/users/commercialhaskell/following{/other_user}","gists_url":"https://api.github.com/users/commercialhaskell/gists{/gist_id}","starred_url":"https://api.github.com/users/commercialhaskell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/commercialhaskell/subscriptions","organizations_url":"https://api.github.com/users/commercialhaskell/orgs","repos_url":"https://api.github.com/users/commercialhaskell/repos","events_url":"https://api.github.com/users/commercialhaskell/events{/privacy}","received_events_url":"https://api.github.com/users/commercialhaskell/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/commercialhaskell/all-cabal-tool","description":"Update the various all-cabal-* repos","fork":false,"url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool","forks_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/forks","keys_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/keys{/key_id}","collaborators_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/teams","hooks_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/hooks","issue_events_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/issues/events{/number}","events_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/events","assignees_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/assignees{/user}","branches_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/branches{/branch}","tags_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/tags","blobs_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/git/refs{/sha}","trees_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/git/trees{/sha}","statuses_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/statuses/{sha}","languages_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/languages","stargazers_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/stargazers","contributors_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/contributors","subscribers_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/subscribers","subscription_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/subscription","commits_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/commits{/sha}","git_commits_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/git/commits{/sha}","comments_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/comments{/number}","issue_comment_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/issues/comments{/number}","contents_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/contents/{+path}","compare_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/compare/{base}...{head}","merges_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/merges","archive_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/downloads","issues_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/issues{/number}","pulls_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls{/number}","milestones_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/milestones{/number}","notifications_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/labels{/name}","releases_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/releases{/id}","deployments_url":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/deployments","created_at":"2016-09-14T10:23:33Z","updated_at":"2016-10-16T09:33:37Z","pushed_at":"2016-10-29T00:13:27Z","git_url":"git://github.com/commercialhaskell/all-cabal-tool.git","ssh_url":"git@github.com:commercialhaskell/all-cabal-tool.git","clone_url":"https://github.com/commercialhaskell/all-cabal-tool.git","svn_url":"https://github.com/commercialhaskell/all-cabal-tool","homepage":null,"size":67,"stargazers_count":1,"watchers_count":1,"language":"Haskell","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/2"},"html":{"href":"https://github.com/commercialhaskell/all-cabal-tool/pull/2"},"issue":{"href":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/issues/2"},"comments":{"href":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/2/comments"},"review_comment":{"href":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/pulls/2/commits"},"statuses":{"href":"https://api.github.com/repos/commercialhaskell/all-cabal-tool/statuses/c18603fdcd341c851fa15c39bcc409a274e3f8bc"}}}}
{"actor":{"display_login":"snoyberg"}}