{"action":"created","comment":{"url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/comments/60249947","id":60249947,"diff_hunk":"@@ -0,0 +1,492 @@\n+package ru.spbau.mit;\n+\n+import java.io.*;\n+import java.net.InetSocketAddress;\n+import java.net.ServerSocket;\n+import java.net.Socket;\n+import java.nio.file.Files;\n+import java.nio.file.Path;\n+import java.nio.file.Paths;\n+import java.util.*;\n+import java.util.concurrent.ExecutorService;\n+import java.util.concurrent.Executors;\n+import java.util.concurrent.ScheduledExecutorService;\n+import java.util.concurrent.TimeUnit;\n+import java.util.concurrent.locks.ReadWriteLock;\n+import java.util.concurrent.locks.ReentrantReadWriteLock;\n+import java.util.stream.Collectors;\n+\n+import static ru.spbau.mit.TorrentP2PConnection.REQUEST_GET;\n+import static ru.spbau.mit.TorrentP2PConnection.REQUEST_STAT;\n+import static ru.spbau.mit.TorrentTrackerConnection.TRACKER_PORT;\n+import static ru.spbau.mit.TorrentTrackerConnection.UPDATE_DELAY;\n+\n+/**\n+ * Created by ldvsoft on 22.03.16.\n+ */\n+public class TorrentClient implements AutoCloseable {\n+    private static final long REST_DELAY = 1000;\n+    private static final String STATE_FILE = \"client-state.dat\";\n+    private static final String DOWNLOADS_DIR = \"downloads\";\n+\n+    private static final class FileState {\n+        private ReadWriteLock fileLock = new ReentrantReadWriteLock();\n+        private FileEntry entry;\n+        private PartsSet parts;\n+        private Path localPath;\n+\n+        private FileState(FileEntry entry, Path localPath, Path workingDir) throws IOException {\n+            this(entry, new PartsSet(entry.getPartsCount(), localPath != null), localPath, workingDir);\n+        }\n+\n+        private FileState(\n+                FileEntry entry,\n+                PartsSet parts,\n+                Path localPath,\n+                Path workingDir\n+        ) throws IOException {\n+            this.entry = entry;\n+            this.parts = parts;\n+            if (localPath == null) {\n+                this.localPath = workingDir.resolve(Paths.get(\n+                        DOWNLOADS_DIR,\n+                        Integer.toString(entry.getId()),\n+                        entry.getName()\n+                ));\n+                Files.createDirectories(this.localPath.getParent());\n+                try (RandomAccessFile file = new RandomAccessFile(this.localPath.toString(), \"rw\")) {\n+                    file.setLength(entry.getSize());\n+                }\n+            } else {\n+                this.localPath = localPath;\n+            }\n+        }\n+\n+        private void writeTo(DataOutputStream dos) throws IOException {\n+            entry.writeTo(dos);\n+            parts.writeTo(dos);\n+            dos.writeUTF(localPath.toString());\n+        }\n+\n+        private static FileState readFrom(DataInputStream dis) throws IOException {\n+            FileEntry fileEntry = FileEntry.readFrom(dis, true);\n+            PartsSet parts = PartsSet.readFrom(dis, fileEntry.getPartsCount());\n+            String localPath = dis.readUTF();\n+            return new FileState(fileEntry, parts, Paths.get(localPath), null);\n+        }\n+    }\n+\n+    public interface StatusCallbacks {\n+        void onTrackerUpdated(boolean result, Throwable e);\n+        void onDownloadIssue(FileEntry entry, String message, Throwable e);\n+        void onDownloadStart(FileEntry entry);\n+        void onDownloadPart(FileEntry entry, int partId);\n+        void onDownloadComplete(FileEntry entry);\n+        void onP2PServerIssue(Throwable e);\n+    }\n+\n+    private Path workingDir;\n+    private ReadWriteLock lock = new ReentrantReadWriteLock();\n+    private Map<Integer, FileState> files;\n+    private String host;\n+\n+    private StatusCallbacks callbacks = null;\n+    // For run\n+    private boolean isRunning = false;\n+    private ServerSocket serverSocket;\n+    private ExecutorService threadPool;\n+    private ScheduledExecutorService scheduler;\n+\n+    public TorrentClient(String host, Path workingDir) throws IOException {\n+        this.host = host;\n+        this.workingDir = workingDir;\n+        load();\n+    }\n+\n+    @Override\n+    public void close() throws IOException {\n+        if (isRunning) {\n+            try (LockHandler handler = LockHandler.lock(lock.writeLock())) {\n+                isRunning = false;\n+                serverSocket.close();\n+            }\n+            threadPool.shutdown();\n+            scheduler.shutdown();\n+        }\n+        store();","path":"src/main/java/ru/spbau/mit/TorrentClient.java","position":116,"original_position":116,"commit_id":"7204e11cc0c1678abc23ccb71fdc2fe80d45e7c1","original_commit_id":"7204e11cc0c1678abc23ccb71fdc2fe80d45e7c1","user":{"login":"dzharkov","id":863207,"avatar_url":"https://avatars.githubusercontent.com/u/863207?v=3","gravatar_id":"","url":"https://api.github.com/users/dzharkov","html_url":"https://github.com/dzharkov","followers_url":"https://api.github.com/users/dzharkov/followers","following_url":"https://api.github.com/users/dzharkov/following{/other_user}","gists_url":"https://api.github.com/users/dzharkov/gists{/gist_id}","starred_url":"https://api.github.com/users/dzharkov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dzharkov/subscriptions","organizations_url":"https://api.github.com/users/dzharkov/orgs","repos_url":"https://api.github.com/users/dzharkov/repos","events_url":"https://api.github.com/users/dzharkov/events{/privacy}","received_events_url":"https://api.github.com/users/dzharkov/received_events","type":"User","site_admin":false},"body":"Мне кажется, сохранять состояние только при закрытии, это слишком хрупко.\r\nУ тебя сетевое приложение, оно может упасть, когда угодно","created_at":"2016-04-19T15:12:47Z","updated_at":"2016-04-19T15:12:47Z","html_url":"https://github.com/LDVSOFT/spbau-java-assignments-torrent/pull/1#discussion_r60249947","pull_request_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/comments/60249947"},"html":{"href":"https://github.com/LDVSOFT/spbau-java-assignments-torrent/pull/1#discussion_r60249947"},"pull_request":{"href":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/1","id":65911652,"html_url":"https://github.com/LDVSOFT/spbau-java-assignments-torrent/pull/1","diff_url":"https://github.com/LDVSOFT/spbau-java-assignments-torrent/pull/1.diff","patch_url":"https://github.com/LDVSOFT/spbau-java-assignments-torrent/pull/1.patch","issue_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/issues/1","number":1,"state":"open","locked":false,"title":"Java 02. ДЗ 04, Лапшин Дмитрий, подгруппа 1","user":{"login":"LDVSOFT","id":5804255,"avatar_url":"https://avatars.githubusercontent.com/u/5804255?v=3","gravatar_id":"","url":"https://api.github.com/users/LDVSOFT","html_url":"https://github.com/LDVSOFT","followers_url":"https://api.github.com/users/LDVSOFT/followers","following_url":"https://api.github.com/users/LDVSOFT/following{/other_user}","gists_url":"https://api.github.com/users/LDVSOFT/gists{/gist_id}","starred_url":"https://api.github.com/users/LDVSOFT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LDVSOFT/subscriptions","organizations_url":"https://api.github.com/users/LDVSOFT/orgs","repos_url":"https://api.github.com/users/LDVSOFT/repos","events_url":"https://api.github.com/users/LDVSOFT/events{/privacy}","received_events_url":"https://api.github.com/users/LDVSOFT/received_events","type":"User","site_admin":false},"body":"@dzharkov Вот.","created_at":"2016-04-10T14:16:16Z","updated_at":"2016-04-19T15:12:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"882dd5f6fa33ba2e6b05ed363c4ee142bea230df","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/1/commits","review_comments_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/1/comments","review_comment_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/comments{/number}","comments_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/issues/1/comments","statuses_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/statuses/7204e11cc0c1678abc23ccb71fdc2fe80d45e7c1","head":{"label":"LDVSOFT:torrent-01","ref":"torrent-01","sha":"7204e11cc0c1678abc23ccb71fdc2fe80d45e7c1","user":{"login":"LDVSOFT","id":5804255,"avatar_url":"https://avatars.githubusercontent.com/u/5804255?v=3","gravatar_id":"","url":"https://api.github.com/users/LDVSOFT","html_url":"https://github.com/LDVSOFT","followers_url":"https://api.github.com/users/LDVSOFT/followers","following_url":"https://api.github.com/users/LDVSOFT/following{/other_user}","gists_url":"https://api.github.com/users/LDVSOFT/gists{/gist_id}","starred_url":"https://api.github.com/users/LDVSOFT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LDVSOFT/subscriptions","organizations_url":"https://api.github.com/users/LDVSOFT/orgs","repos_url":"https://api.github.com/users/LDVSOFT/repos","events_url":"https://api.github.com/users/LDVSOFT/events{/privacy}","received_events_url":"https://api.github.com/users/LDVSOFT/received_events","type":"User","site_admin":false},"repo":{"id":54455479,"name":"spbau-java-assignments-torrent","full_name":"LDVSOFT/spbau-java-assignments-torrent","owner":{"login":"LDVSOFT","id":5804255,"avatar_url":"https://avatars.githubusercontent.com/u/5804255?v=3","gravatar_id":"","url":"https://api.github.com/users/LDVSOFT","html_url":"https://github.com/LDVSOFT","followers_url":"https://api.github.com/users/LDVSOFT/followers","following_url":"https://api.github.com/users/LDVSOFT/following{/other_user}","gists_url":"https://api.github.com/users/LDVSOFT/gists{/gist_id}","starred_url":"https://api.github.com/users/LDVSOFT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LDVSOFT/subscriptions","organizations_url":"https://api.github.com/users/LDVSOFT/orgs","repos_url":"https://api.github.com/users/LDVSOFT/repos","events_url":"https://api.github.com/users/LDVSOFT/events{/privacy}","received_events_url":"https://api.github.com/users/LDVSOFT/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/LDVSOFT/spbau-java-assignments-torrent","description":"","fork":false,"url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent","forks_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/forks","keys_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/keys{/key_id}","collaborators_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/teams","hooks_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/hooks","issue_events_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/issues/events{/number}","events_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/events","assignees_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/assignees{/user}","branches_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/branches{/branch}","tags_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/tags","blobs_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/git/refs{/sha}","trees_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/git/trees{/sha}","statuses_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/statuses/{sha}","languages_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/languages","stargazers_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/stargazers","contributors_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/contributors","subscribers_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/subscribers","subscription_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/subscription","commits_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/commits{/sha}","git_commits_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/git/commits{/sha}","comments_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/comments{/number}","issue_comment_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/issues/comments{/number}","contents_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/contents/{+path}","compare_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/compare/{base}...{head}","merges_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/merges","archive_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/downloads","issues_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/issues{/number}","pulls_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls{/number}","milestones_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/milestones{/number}","notifications_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/labels{/name}","releases_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/releases{/id}","deployments_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/deployments","created_at":"2016-03-22T07:49:39Z","updated_at":"2016-03-22T07:53:52Z","pushed_at":"2016-04-10T17:37:44Z","git_url":"git://github.com/LDVSOFT/spbau-java-assignments-torrent.git","ssh_url":"git@github.com:LDVSOFT/spbau-java-assignments-torrent.git","clone_url":"https://github.com/LDVSOFT/spbau-java-assignments-torrent.git","svn_url":"https://github.com/LDVSOFT/spbau-java-assignments-torrent","homepage":null,"size":38,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"LDVSOFT:master","ref":"master","sha":"787bbe80587cd0ae413a65a8d5961baedaf3312e","user":{"login":"LDVSOFT","id":5804255,"avatar_url":"https://avatars.githubusercontent.com/u/5804255?v=3","gravatar_id":"","url":"https://api.github.com/users/LDVSOFT","html_url":"https://github.com/LDVSOFT","followers_url":"https://api.github.com/users/LDVSOFT/followers","following_url":"https://api.github.com/users/LDVSOFT/following{/other_user}","gists_url":"https://api.github.com/users/LDVSOFT/gists{/gist_id}","starred_url":"https://api.github.com/users/LDVSOFT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LDVSOFT/subscriptions","organizations_url":"https://api.github.com/users/LDVSOFT/orgs","repos_url":"https://api.github.com/users/LDVSOFT/repos","events_url":"https://api.github.com/users/LDVSOFT/events{/privacy}","received_events_url":"https://api.github.com/users/LDVSOFT/received_events","type":"User","site_admin":false},"repo":{"id":54455479,"name":"spbau-java-assignments-torrent","full_name":"LDVSOFT/spbau-java-assignments-torrent","owner":{"login":"LDVSOFT","id":5804255,"avatar_url":"https://avatars.githubusercontent.com/u/5804255?v=3","gravatar_id":"","url":"https://api.github.com/users/LDVSOFT","html_url":"https://github.com/LDVSOFT","followers_url":"https://api.github.com/users/LDVSOFT/followers","following_url":"https://api.github.com/users/LDVSOFT/following{/other_user}","gists_url":"https://api.github.com/users/LDVSOFT/gists{/gist_id}","starred_url":"https://api.github.com/users/LDVSOFT/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LDVSOFT/subscriptions","organizations_url":"https://api.github.com/users/LDVSOFT/orgs","repos_url":"https://api.github.com/users/LDVSOFT/repos","events_url":"https://api.github.com/users/LDVSOFT/events{/privacy}","received_events_url":"https://api.github.com/users/LDVSOFT/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/LDVSOFT/spbau-java-assignments-torrent","description":"","fork":false,"url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent","forks_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/forks","keys_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/keys{/key_id}","collaborators_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/teams","hooks_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/hooks","issue_events_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/issues/events{/number}","events_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/events","assignees_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/assignees{/user}","branches_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/branches{/branch}","tags_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/tags","blobs_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/git/refs{/sha}","trees_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/git/trees{/sha}","statuses_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/statuses/{sha}","languages_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/languages","stargazers_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/stargazers","contributors_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/contributors","subscribers_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/subscribers","subscription_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/subscription","commits_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/commits{/sha}","git_commits_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/git/commits{/sha}","comments_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/comments{/number}","issue_comment_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/issues/comments{/number}","contents_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/contents/{+path}","compare_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/compare/{base}...{head}","merges_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/merges","archive_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/downloads","issues_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/issues{/number}","pulls_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls{/number}","milestones_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/milestones{/number}","notifications_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/labels{/name}","releases_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/releases{/id}","deployments_url":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/deployments","created_at":"2016-03-22T07:49:39Z","updated_at":"2016-03-22T07:53:52Z","pushed_at":"2016-04-10T17:37:44Z","git_url":"git://github.com/LDVSOFT/spbau-java-assignments-torrent.git","ssh_url":"git@github.com:LDVSOFT/spbau-java-assignments-torrent.git","clone_url":"https://github.com/LDVSOFT/spbau-java-assignments-torrent.git","svn_url":"https://github.com/LDVSOFT/spbau-java-assignments-torrent","homepage":null,"size":38,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/1"},"html":{"href":"https://github.com/LDVSOFT/spbau-java-assignments-torrent/pull/1"},"issue":{"href":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/issues/1"},"comments":{"href":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/LDVSOFT/spbau-java-assignments-torrent/statuses/7204e11cc0c1678abc23ccb71fdc2fe80d45e7c1"}}}}