<th>d/l</th>
</tr>
</thead><tbody>
- <% if @object then @object.files.sort_by{|f|f[1]}.each do |file| %>
+ <% if @object then @object.files.sort_by{|f|[f[0],f[1]]}.each do |file| %>
<% file_path = "#{file[0]}/#{file[1]}" %>
<tr>
<td>
-#!/usr/bin/env python
+#!/usr/bin/env python
import arvados
import hashlib
+import os
-arvados.job_setup.one_task_per_input_file(if_sequence=0, and_end_task=True)
+arvados.job_setup.one_task_per_input_file(if_sequence=0, and_end_task=True, input_as_path=True)
this_job = arvados.current_job()
this_task = arvados.current_task()
-this_task_input = this_task['parameters']['input']
if 'algorithm' in this_job['script_parameters']:
alg = this_job['script_parameters']['algorithm']
alg = 'md5'
digestor = hashlib.new(alg)
-input_file = list(arvados.CollectionReader(this_task_input).all_files())[0]
-while True:
- buf = input_file.read(2**20)
- if len(buf) == 0:
- break
- digestor.update(buf)
+input_file = arvados.get_task_param_mount('input')
+
+with open(input_file) as f:
+ while True:
+ buf = f.read(2**20)
+ if len(buf) == 0:
+ break
+ digestor.update(buf)
hexdigest = digestor.hexdigest()
-file_name = input_file.name()
-if input_file.stream_name() != '.':
- file_name = os.join(input_file.stream_name(), file_name)
+file_name = '/'.join(this_task['parameters']['input'].split('/')[1:])
out = arvados.CollectionWriter()
out.set_current_file_name("md5sum.txt")
On controller and all compute nodes:
* @apt-get install python-pip@
-* @pip install --upgrade google-api-python-client@
+* @pip install --upgrade virtualenv arvados-python-client@
h4. Likely crunch job dependencies
while sleep 60
do
cd /path/to/arvados/services/api
- setuidgid www-data env RAILS_ENV=production /usr/local/rvm/bin/rvm 2.0.0 do bundle exec ./script/import_commits.rb 2>&1
+ setuidgid www-data env RAILS_ENV=production /usr/local/rvm/bin/rvm-exec 2.0.0 bundle exec ./script/import_commits.rb 2>&1
done
</pre>
export PATH="$PATH":/path/to/arvados/services/crunch
export PERLLIB=/path/to/arvados/sdk/perl/lib:/path/to/warehouse-apps/libwarehouse-perl/lib
export ARVADOS_API_HOST={{ site.arvados_api_host }}
-export PYTHONPATH=/path/to/arvados/src/sdk/python
export CRUNCH_DISPATCH_LOCKFILE=/var/lock/crunch-dispatch
fuser -TERM -k $CRUNCH_DISPATCH_LOCKFILE || true
# export ARVADOS_API_HOST_INSECURE=yes
cd /path/to/arvados/services/api
-RAILS_ENV=production /usr/local/rvm/bin/rvm 2.0.0 do bundle exec ./script/crunch-dispatch.rb 2>&1
+export RAILS_ENV=production
+exec /usr/local/rvm/bin/rvm-exec 2.0.0 bundle exec ./script/crunch-dispatch.rb 2>&1
</pre>
<notextile>
<pre>
-$ <code class="userinput">pip install arvados-python-client</code>
+$ <code class="userinput">sudo apt-get install python-dev libattr1-dev libfuse-dev pkg-config</code>
+$ <code class="userinput">sudo pip install arvados-python-client</code>
</pre>
</notextile>
<notextile>
<pre>
+$ <code class="userinput">sudo apt-get install python-dev libattr1-dev libfuse-dev pkg-config</code>
$ <code class="userinput">git clone https://github.com/curoverse/arvados.git</code>
$ <code class="userinput">cd arvados/sdk/python</code>
$ <code class="userinput">./build.sh</code>
h3. Basic examples
Get record for current user
-@arv -h user current@
+@arv user current@
Get entire record for some specific user
-@arv -h user get --uuid 6dnxa-tpzed-iimd25zhzh84gbk@
+@arv user get --uuid 6dnxa-tpzed-iimd25zhzh84gbk@
Update user record
@arv user update --uuid 6dnxa-tpzed-iimd25zhzh84gbk --first-name "Bob"@
}
}
EOF</span>
-~/<b>you</b>/crunch_scripts$ <span class="userinput">arv -h job create --job "$(cat the_job)"</span>
+~/<b>you</b>/crunch_scripts$ <span class="userinput">arv job create --job "$(cat the_job)"</span>
{
...
"uuid":"qr1hi-xxxxx-xxxxxxxxxxxxxxx"
...
}
-~/<b>you</b>/crunch_scripts$ <span class="userinput">arv -h job get --uuid qr1hi-xxxxx-xxxxxxxxxxxxxxx</span>
+~/<b>you</b>/crunch_scripts$ <span class="userinput">arv job get --uuid qr1hi-xxxxx-xxxxxxxxxxxxxxx</span>
{
...
"output":"4d164b1658c261b9afc6b479130016a3+54",
Now start a job:
<notextile>
-<pre><code>~$ <span class="userinput">arv -h job create --job "$(cat the_job)"</span>
+<pre><code>~$ <span class="userinput">arv job create --job "$(cat the_job)"</span>
{
"href":"https://qr1hi.arvadosapi.com/arvados/v1/jobs/qr1hi-8i9sb-n9k7qyp7bs5b9d4",
"kind":"arvados#job",
}
}
EOF</span>
-~/<b>you</b>/crunch_scripts$ <span class="userinput">arv -h job create --job "$(cat ~/the_job)"</span>
+~/<b>you</b>/crunch_scripts$ <span class="userinput">arv job create --job "$(cat ~/the_job)"</span>
{
...
"uuid":"qr1hi-xxxxx-xxxxxxxxxxxxxxx"
...
}
-~/<b>you</b>/crunch_scripts$ <span class="userinput">arv -h job get --uuid qr1hi-xxxxx-xxxxxxxxxxxxxxx</span>
+~/<b>you</b>/crunch_scripts$ <span class="userinput">arv job get --uuid qr1hi-xxxxx-xxxxxxxxxxxxxxx</span>
{
...
"output":"e2ccd204bca37c77c0ba59fc470cd0f7+162",
$ make workbench-image
$ make sso-image
-Deploying
----------
-
-1. Make sure the `ARVADOS_DNS_SERVER` has been provisioned with the
- following DNS entries, resolving to the appropriate IP addresses
- where each service will be deployed.
-
- * $API_HOSTNAME
- * keep0.$API_HOSTNAME
- * compute0.$API_HOSTNAME
- * controller.$API_HOSTNAME
- * workbench.$API_HOSTNAME
-
-2. The `arvdock` script in this directory is used to start, stop and
- restart Arvados servers on your machine. Example usages:
-
- * `arvdock start`
- * `arvdock stop`
- * `arvdock restart`
- * `arvdock start --api --sso` to start just the API and SSO services.
- * `arvdock start --workbench=8000` starts just the Workbench service on port 8000.
- * `arvdock stop --keep` to stop just the Keep services.
+Running
+-------
+
+The `arvdock` script in this directory is used to start, stop and
+restart Arvados servers on your machine. The simplest and easiest way
+to use it is `./arvdock start` to start the full complement of Arvados
+servers, and `./arvdock stop` and `./arvdock restart` to stop and
+restart all servers, respectively.
+
+Developers who are working on individual servers can start, stop or
+restart just those containers, e.g.:
+
+* `./arvdock start --api --sso` to start just the API and SSO services.
+* `./arvdock stop --keep` to stop just the Keep services.
+* `./arvdock restart --workbench=8000` restarts just the Workbench service on port 8000.
+
+For a full set of arguments, use `./arvdock --help`.
-LoadModule passenger_module /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.23/buildout/apache2/mod_passenger.so
-PassengerRoot /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.23
-PassengerDefaultRuby /usr/local/rvm/wrappers/ruby-2.0.0-p353/ruby
+LoadModule passenger_module /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.23/buildout/apache2/mod_passenger.so
+PassengerRoot /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.23
+PassengerDefaultRuby /usr/local/rvm/wrappers/ruby-2.1.0/ruby
/bin/mkdir -p /root/.ssh && \
/bin/sed -ri 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
/usr/sbin/locale-gen && \
- curl -L https://get.rvm.io | bash -s stable --ruby=2.0.0 && \
+ curl -L https://get.rvm.io | bash -s stable --ruby=2.1.0 && \
git clone https://github.com/curoverse/arvados.git /usr/src/arvados-upstream
# Set up RVM environment. These are just the env variables created by
# /usr/local/rvm/scripts/rvm, which can't be run from a non-login shell.
# TODO(twp): figure out a less awful solution.
-ENV GEM_HOME /usr/local/rvm/gems/ruby-2.0.0-p353
-ENV GEM_PATH /usr/local/rvm/gems/ruby-2.0.0-p353:/usr/local/rvm/gems/ruby-2.0.0-p353@global
-ENV PATH /usr/local/rvm/gems/ruby-2.0.0-p353/bin:/usr/local/rvm/gems/ruby-2.0.0-p353@global/bin:/usr/local/rvm/rubies/ruby-2.0.0-p353/bin:/usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+ENV GEM_HOME /usr/local/rvm/gems/ruby-2.1.0
+ENV GEM_PATH /usr/local/rvm/gems/ruby-2.1.0:/usr/local/rvm/gems/ruby-2.1.0@global
+ENV PATH /usr/local/rvm/gems/ruby-2.1.0/bin:/usr/local/rvm/gems/ruby-2.1.0@global/bin:/usr/local/rvm/rubies/ruby-2.1.0/bin:/usr/local/rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Update gem. This (hopefully) fixes
# https://github.com/rubygems/rubygems.org/issues/613.
-LoadModule passenger_module /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.23/buildout/apache2/mod_passenger.so
-PassengerRoot /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.23
-PassengerDefaultRuby /usr/local/rvm/wrappers/ruby-2.0.0-p353/ruby
+LoadModule passenger_module /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.23/buildout/apache2/mod_passenger.so
+PassengerRoot /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.23
+PassengerDefaultRuby /usr/local/rvm/wrappers/ruby-2.1.0/ruby
-LoadModule passenger_module /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.23/buildout/apache2/mod_passenger.so
-PassengerRoot /usr/local/rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.23
-PassengerDefaultRuby /usr/local/rvm/wrappers/ruby-2.0.0-p353/ruby
+LoadModule passenger_module /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.23/buildout/apache2/mod_passenger.so
+PassengerRoot /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.23
+PassengerDefaultRuby /usr/local/rvm/wrappers/ruby-2.1.0/ruby
when 'keep'
ARGV.shift
@sub = ARGV.shift
- if ['get', 'put'].index @sub then
+ if ['get', 'put', 'ls', 'normalize'].index @sub then
# Native Arvados
exec `which arv-#{@sub}`.strip, *ARGV
- elsif ['ls', 'less', 'check'].index @sub then
+ elsif ['less', 'check'].index @sub then
# wh* shims
exec `which wh#{@sub}`.strip, *ARGV
else
--- /dev/null
+../../python/bin/arv-ls
\ No newline at end of file
--- /dev/null
+../../python/bin/arv-mount
\ No newline at end of file
--- /dev/null
+../../python/bin/arv-normalize
\ No newline at end of file
}
}
$ENV{"JOB_WORK"} = $ENV{"CRUNCH_TMP"} . "/work";
+$ENV{"CRUNCH_INSTALL"} = "$ENV{CRUNCH_TMP}/opt";
$ENV{"CRUNCH_WORK"} = $ENV{"JOB_WORK"}; # deprecated
mkdir ($ENV{"JOB_WORK"});
if ($skip_install)
{
$ENV{"CRUNCH_SRC"} = $Job->{script_version};
+ system("virtualenv", "$ENV{CRUNCH_TMP}/opt") == 0
+ or croak ("virtualenv $ENV{CRUNCH_TMP}/opt failed: exit ".($?>>8));
+ for my $src_path ("$ENV{CRUNCH_SRC}/arvados/sdk/python",
+ "$ENV{CRUNCH_SRC}/sdk/python") {
+ if (-d $src_path) {
+ system ("cd $src_path && \$CRUNCH_TMP/opt/bin/python setup.py install")
+ == 0
+ or croak ("setup.py in $src_path failed: exit ".($?>>8));
+ }
+ }
}
else
{
$ENV{"CRUNCH_SRC_COMMIT"} = $Job->{script_version};
$ENV{"CRUNCH_SRC"} = "$ENV{CRUNCH_TMP}/src";
- $ENV{"CRUNCH_INSTALL"} = "$ENV{CRUNCH_TMP}/opt";
my $commit;
my $git_archive;
$ENV{"TASK_SLOT_NODE"} = $slot[$childslot]->{node}->{name};
$ENV{"TASK_SLOT_NUMBER"} = $slot[$childslot]->{cpu};
$ENV{"TASK_WORK"} = $ENV{"JOB_WORK"}."/".$slot[$childslot]->{cpu};
+ $ENV{"TASK_KEEPMOUNT"} = $ENV{"TASK_WORK"}."/keep";
$ENV{"TASK_TMPDIR"} = $ENV{"TASK_WORK"}; # deprecated
$ENV{"CRUNCH_NODE_SLOTS"} = $slot[$childslot]->{node}->{ncpus};
+ $ENV{"PATH"} = $ENV{"CRUNCH_INSTALL"} . "/bin:" . $ENV{"PATH"};
$ENV{"GZIP"} = "-n";
my $build_script_to_send = "";
my $command =
"if [ -e $ENV{TASK_WORK} ]; then rm -rf $ENV{TASK_WORK}; fi; "
- ."mkdir -p $ENV{JOB_WORK} $ENV{CRUNCH_TMP} $ENV{TASK_WORK} "
+ ."mkdir -p $ENV{JOB_WORK} $ENV{CRUNCH_TMP} $ENV{TASK_WORK} $ENV{TASK_KEEPMOUNT} "
."&& cd $ENV{CRUNCH_TMP} ";
if ($build_script)
{
$ENV{"PYTHONPATH"} =~ s{^}{$ENV{CRUNCH_SRC}/arvados/sdk/python:}; # xxx hack
$ENV{"PYTHONPATH"} =~ s{$}{:/usr/local/arvados/src/sdk/python}; # xxx hack
$command .=
- "&& exec $ENV{CRUNCH_SRC}/crunch_scripts/" . $Job->{"script"};
+ "&& exec arv-mount $ENV{TASK_KEEPMOUNT} --exec $ENV{CRUNCH_SRC}/crunch_scripts/" . $Job->{"script"};
my @execargs = ('bash', '-c', $command);
srun (\@srunargs, \@execargs, undef, $build_script_to_send);
exit (111);
chomp ($pwd = `pwd`);
my $install_dir = $ENV{"CRUNCH_INSTALL"} || "$pwd/opt";
mkdir $install_dir;
+
+shell_or_die ("virtualenv", $install_dir);
+for my $src_path ("$destdir/arvados/sdk/python", "$destdir/sdk/python") {
+ if (-d $src_path) {
+ shell_or_die ("cd $src_path && $install_dir/bin/python setup.py install");
+ }
+}
+
if (-e "$destdir/crunch_scripts/install") {
shell_or_die ("$destdir/crunch_scripts/install", $install_dir);
} elsif (!-e "./install.sh" && -e "./tests/autotests.sh") {
def getjobparam(*args):
return current_job()['script_parameters'].get(*args)
+def get_job_param_mount(*args):
+ return os.path.join(os.environ['TASK_KEEPMOUNT'], current_job()['script_parameters'].get(*args))
+
+def get_task_param_mount(*args):
+ return os.path.join(os.environ['TASK_KEEPMOUNT'], current_task()['parameters'].get(*args))
+
class JobTask(object):
def __init__(self, parameters=dict(), runtime_constraints=dict()):
print "init jobtask %s %s" % (parameters, runtime_constraints)
class job_setup:
@staticmethod
- def one_task_per_input_file(if_sequence=0, and_end_task=True):
+ def one_task_per_input_file(if_sequence=0, and_end_task=True, input_as_path=False):
if if_sequence != current_task()['sequence']:
return
job_input = current_job()['script_parameters']['input']
cr = CollectionReader(job_input)
for s in cr.all_streams():
for f in s.all_files():
- task_input = f.as_manifest()
+ if input_as_path:
+ task_input = os.path.join(job_input, s.name(), f.name())
+ else:
+ task_input = f.as_manifest()
new_task_attrs = {
'job_uuid': current_job()['uuid'],
'created_by_job_task_uuid': current_task()['uuid'],
import config
import errors
+def normalize_stream(s, stream):
+ stream_tokens = [s]
+ sortedfiles = list(stream.keys())
+ sortedfiles.sort()
+
+ blocks = {}
+ streamoffset = 0L
+ for f in sortedfiles:
+ for b in stream[f]:
+ if b[arvados.LOCATOR] not in blocks:
+ stream_tokens.append(b[arvados.LOCATOR])
+ blocks[b[arvados.LOCATOR]] = streamoffset
+ streamoffset += b[arvados.BLOCKSIZE]
+
+ for f in sortedfiles:
+ current_span = None
+ fout = f.replace(' ', '\\040')
+ for segment in stream[f]:
+ segmentoffset = blocks[segment[arvados.LOCATOR]] + segment[arvados.OFFSET]
+ if current_span == None:
+ current_span = [segmentoffset, segmentoffset + segment[arvados.SEGMENTSIZE]]
+ else:
+ if segmentoffset == current_span[1]:
+ current_span[1] += segment[arvados.SEGMENTSIZE]
+ else:
+ stream_tokens.append("{0}:{1}:{2}".format(current_span[0], current_span[1] - current_span[0], fout))
+ current_span = [segmentoffset, segmentoffset + segment[arvados.SEGMENTSIZE]]
+
+ if current_span != None:
+ stream_tokens.append("{0}:{1}:{2}".format(current_span[0], current_span[1] - current_span[0], fout))
+
+ if len(stream[f]) == 0:
+ stream_tokens.append("0:0:{0}".format(fout))
+
+ return stream_tokens
+
+def normalize(collection):
+ streams = {}
+ for s in collection.all_streams():
+ for f in s.all_files():
+ filestream = s.name() + "/" + f.name()
+ r = filestream.rindex("/")
+ streamname = filestream[:r]
+ filename = filestream[r+1:]
+ if streamname not in streams:
+ streams[streamname] = {}
+ if filename not in streams[streamname]:
+ streams[streamname][filename] = []
+ for r in f.segments:
+ streams[streamname][filename].extend(s.locators_and_ranges(r[0], r[1]))
+
+ normalized_streams = []
+ sortedstreams = list(streams.keys())
+ sortedstreams.sort()
+ for s in sortedstreams:
+ normalized_streams.append(normalize_stream(s, streams[s]))
+ return normalized_streams
+
+
class CollectionReader(object):
def __init__(self, manifest_locator_or_text):
- if re.search(r'^\S+( [a-f0-9]{32,}(\+\S+)*)+( \d+:\d+:\S+)+\n', manifest_locator_or_text):
- self._manifest_text = manifest_locator_or_text
- self._manifest_locator = None
- else:
+ if re.search(r'^[a-f0-9]{32}\+\d+(\+\S)*$', manifest_locator_or_text):
self._manifest_locator = manifest_locator_or_text
self._manifest_text = None
+ else:
+ self._manifest_text = manifest_locator_or_text
+ self._manifest_locator = None
self._streams = None
def __enter__(self):
if stream_line != '':
stream_tokens = stream_line.split()
self._streams += [stream_tokens]
+ self._streams = normalize(self)
+
+ # now regenerate the manifest text based on the normalized stream
+
+ #print "normalizing", self._manifest_text
+ self._manifest_text = ''.join([StreamReader(stream).manifest_text() for stream in self._streams])
+ #print "result", self._manifest_text
+
def all_streams(self):
self._populate()
resp = []
for s in self._streams:
- resp += [StreamReader(s)]
+ resp.append(StreamReader(s))
return resp
def all_files(self):
def manifest_text(self):
self.finish_current_stream()
manifest = ''
+
for stream in self._finished_streams:
if not re.search(r'^\.(/.*)?$', stream[0]):
manifest += './'
manifest += stream[0].replace(' ', '\\040')
- for locator in stream[1]:
- manifest += " %s" % locator
- for sfile in stream[2]:
- manifest += " %d:%d:%s" % (sfile[0], sfile[1], sfile[2].replace(' ', '\\040'))
+ manifest += ' ' + ' '.join(stream[1])
+ manifest += ' ' + ' '.join("%d:%d:%s" % (sfile[0], sfile[1], sfile[2].replace(' ', '\\040')) for sfile in stream[2])
manifest += "\n"
- return manifest
+
+ #print 'writer',manifest
+ #print 'after reader',CollectionReader(manifest).manifest_text()
+
+ return CollectionReader(manifest).manifest_text()
def data_locators(self):
ret = []
--- /dev/null
+#
+# FUSE driver for Arvados Keep
+#
+
+import os
+import sys
+
+import llfuse
+import errno
+import stat
+import threading
+import arvados
+import argparse
+import pprint
+
+from time import time
+from llfuse import FUSEError
+
+class Directory(object):
+ '''Generic directory object, backed by a dict.
+ Consists of a set of entries with the key representing the filename
+ and the value referencing a File or Directory object.
+ '''
+
+ def __init__(self, parent_inode):
+ self.inode = None
+ self.parent_inode = parent_inode
+ self._entries = {}
+
+ def __getitem__(self, item):
+ return self._entries[item]
+
+ def __setitem__(self, key, item):
+ self._entries[key] = item
+
+ def __iter__(self):
+ return self._entries.iterkeys()
+
+ def items(self):
+ return self._entries.items()
+
+ def __contains__(self, k):
+ return k in self._entries
+
+ def size(self):
+ return 0
+
+class MagicDirectory(Directory):
+ '''A special directory that logically contains the set of all extant
+ keep locators. When a file is referenced by lookup(), it is tested
+ to see if it is a valid keep locator to a manifest, and if so, loads the manifest
+ contents as a subdirectory of this directory with the locator as the directory name.
+ Since querying a list of all extant keep locators is impractical, only loaded collections
+ are visible to readdir().'''
+
+ def __init__(self, parent_inode, inodes):
+ super(MagicDirectory, self).__init__(parent_inode)
+ self.inodes = inodes
+
+ def __contains__(self, k):
+ if k in self._entries:
+ return True
+ try:
+ if arvados.Keep.get(k):
+ return True
+ else:
+ return False
+ except Exception as e:
+ #print 'exception keep', e
+ return False
+
+ def __getitem__(self, item):
+ if item not in self._entries:
+ collection = arvados.CollectionReader(arvados.Keep.get(item))
+ self._entries[item] = self.inodes.add_entry(Directory(self.inode))
+ self.inodes.load_collection(self._entries[item], collection)
+ return self._entries[item]
+
+class File(object):
+ '''Wraps a StreamFileReader for use by Directory.'''
+
+ def __init__(self, parent_inode, reader):
+ self.inode = None
+ self.parent_inode = parent_inode
+ self.reader = reader
+
+ def size(self):
+ return self.reader.size()
+
+class FileHandle(object):
+ '''Connects a numeric file handle to a File or Directory object that has
+ been opened by the client.'''
+
+ def __init__(self, fh, entry):
+ self.fh = fh
+ self.entry = entry
+
+class Inodes(object):
+ '''Manage the set of inodes. This is the mapping from a numeric id
+ to a concrete File or Directory object'''
+
+ def __init__(self):
+ self._entries = {}
+ self._counter = llfuse.ROOT_INODE
+
+ def __getitem__(self, item):
+ return self._entries[item]
+
+ def __setitem__(self, key, item):
+ self._entries[key] = item
+
+ def __iter__(self):
+ return self._entries.iterkeys()
+
+ def items(self):
+ return self._entries.items()
+
+ def __contains__(self, k):
+ return k in self._entries
+
+ def load_collection(self, parent_dir, collection):
+ '''parent_dir is the Directory object that will be populated by the collection.
+ collection is the arvados.CollectionReader to use as the source'''
+ for s in collection.all_streams():
+ cwd = parent_dir
+ for part in s.name().split('/'):
+ if part != '' and part != '.':
+ if part not in cwd:
+ cwd[part] = self.add_entry(Directory(cwd.inode))
+ cwd = cwd[part]
+ for k, v in s.files().items():
+ cwd[k] = self.add_entry(File(cwd.inode, v))
+
+ def add_entry(self, entry):
+ entry.inode = self._counter
+ self._entries[entry.inode] = entry
+ self._counter += 1
+ return entry
+
+class Operations(llfuse.Operations):
+ '''This is the main interface with llfuse. The methods on this object are
+ called by llfuse threads to service FUSE events to query and read from
+ the file system.
+
+ llfuse has its own global lock which is acquired before calling a request handler,
+ so request handlers do not run concurrently unless the lock is explicitly released
+ with llfuse.lock_released.'''
+
+ def __init__(self, uid, gid):
+ super(Operations, self).__init__()
+
+ self.inodes = Inodes()
+ self.uid = uid
+ self.gid = gid
+
+ # dict of inode to filehandle
+ self._filehandles = {}
+ self._filehandles_counter = 1
+
+ # Other threads that need to wait until the fuse driver
+ # is fully initialized should wait() on this event object.
+ self.initlock = threading.Event()
+
+ def init(self):
+ # Allow threads that are waiting for the driver to be finished
+ # initializing to continue
+ self.initlock.set()
+
+ def access(self, inode, mode, ctx):
+ return True
+
+ def getattr(self, inode):
+ e = self.inodes[inode]
+
+ entry = llfuse.EntryAttributes()
+ entry.st_ino = inode
+ entry.generation = 0
+ entry.entry_timeout = 300
+ entry.attr_timeout = 300
+
+ entry.st_mode = stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH
+ if isinstance(e, Directory):
+ entry.st_mode |= stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH | stat.S_IFDIR
+ else:
+ entry.st_mode |= stat.S_IFREG
+
+ entry.st_nlink = 1
+ entry.st_uid = self.uid
+ entry.st_gid = self.gid
+ entry.st_rdev = 0
+
+ entry.st_size = e.size()
+
+ entry.st_blksize = 1024
+ entry.st_blocks = e.size()/1024
+ if e.size()/1024 != 0:
+ entry.st_blocks += 1
+ entry.st_atime = 0
+ entry.st_mtime = 0
+ entry.st_ctime = 0
+
+ return entry
+
+ def lookup(self, parent_inode, name):
+ #print "lookup: parent_inode", parent_inode, "name", name
+ inode = None
+
+ if name == '.':
+ inode = parent_inode
+ else:
+ if parent_inode in self.inodes:
+ p = self.inodes[parent_inode]
+ if name == '..':
+ inode = p.parent_inode
+ elif name in p:
+ inode = p[name].inode
+
+ if inode != None:
+ return self.getattr(inode)
+ else:
+ raise llfuse.FUSEError(errno.ENOENT)
+
+ def open(self, inode, flags):
+ if inode in self.inodes:
+ p = self.inodes[inode]
+ else:
+ raise llfuse.FUSEError(errno.ENOENT)
+
+ if (flags & os.O_WRONLY) or (flags & os.O_RDWR):
+ raise llfuse.FUSEError(errno.EROFS)
+
+ if isinstance(p, Directory):
+ raise llfuse.FUSEError(errno.EISDIR)
+
+ fh = self._filehandles_counter
+ self._filehandles_counter += 1
+ self._filehandles[fh] = FileHandle(fh, p)
+ return fh
+
+ def read(self, fh, off, size):
+ #print "read", fh, off, size
+ if fh in self._filehandles:
+ handle = self._filehandles[fh]
+ else:
+ raise llfuse.FUSEError(errno.EBADF)
+
+ try:
+ with llfuse.lock_released:
+ return handle.entry.reader.readfrom(off, size)
+ except:
+ raise llfuse.FUSEError(errno.EIO)
+
+ def release(self, fh):
+ if fh in self._filehandles:
+ del self._filehandles[fh]
+
+ def opendir(self, inode):
+ #print "opendir: inode", inode
+
+ if inode in self.inodes:
+ p = self.inodes[inode]
+ else:
+ raise llfuse.FUSEError(errno.ENOENT)
+
+ if not isinstance(p, Directory):
+ raise llfuse.FUSEError(errno.ENOTDIR)
+
+ fh = self._filehandles_counter
+ self._filehandles_counter += 1
+ if p.parent_inode in self.inodes:
+ parent = self.inodes[p.parent_inode]
+ else:
+ parent = None
+ self._filehandles[fh] = FileHandle(fh, [('.', p), ('..', parent)] + list(p.items()))
+ return fh
+
+ def readdir(self, fh, off):
+ #print "readdir: fh", fh, "off", off
+
+ if fh in self._filehandles:
+ handle = self._filehandles[fh]
+ else:
+ raise llfuse.FUSEError(errno.EBADF)
+
+ #print "handle.entry", handle.entry
+
+ e = off
+ while e < len(handle.entry):
+ yield (handle.entry[e][0], self.getattr(handle.entry[e][1].inode), e+1)
+ e += 1
+
+ def releasedir(self, fh):
+ del self._filehandles[fh]
+
+ def statfs(self):
+ st = llfuse.StatvfsData()
+ st.f_bsize = 1024 * 1024
+ st.f_blocks = 0
+ st.f_files = 0
+
+ st.f_bfree = 0
+ st.f_bavail = 0
+
+ st.f_ffree = 0
+ st.f_favail = 0
+
+ st.f_frsize = 0
+ return st
+
+ # The llfuse documentation recommends only overloading functions that
+ # are actually implemented, as the default implementation will raise ENOSYS.
+ # However, there is a bug in the llfuse default implementation of create()
+ # "create() takes exactly 5 positional arguments (6 given)" which will crash
+ # arv-mount.
+ # The workaround is to implement it with the proper number of parameters,
+ # and then everything works out.
+ def create(self, p1, p2, p3, p4, p5):
+ raise llfuse.FUSEError(errno.EROFS)
import fcntl
import time
import threading
+import timer
global_client_object = None
def __init__(self):
self.lock = threading.Lock()
self.service_roots = None
+ self._cache_lock = threading.Lock()
+ self._cache = []
+ # default 256 megabyte cache
+ self.cache_max = 256 * 1024 * 1024
def shuffled_service_roots(self, hash):
if self.service_roots == None:
self.lock.acquire()
- keep_disks = arvados.api().keep_disks().list().execute()['items']
- roots = (("http%s://%s:%d/" %
- ('s' if f['service_ssl_flag'] else '',
- f['service_host'],
- f['service_port']))
- for f in keep_disks)
- self.service_roots = sorted(set(roots))
- logging.debug(str(self.service_roots))
- self.lock.release()
+ try:
+ keep_disks = arvados.api().keep_disks().list().execute()['items']
+ roots = (("http%s://%s:%d/" %
+ ('s' if f['service_ssl_flag'] else '',
+ f['service_host'],
+ f['service_port']))
+ for f in keep_disks)
+ self.service_roots = sorted(set(roots))
+ logging.debug(str(self.service_roots))
+ finally:
+ self.lock.release()
+
seed = hash
pool = self.service_roots[:]
pseq = []
logging.debug(str(pseq))
return pseq
+ class CacheSlot(object):
+ def __init__(self, locator):
+ self.locator = locator
+ self.ready = threading.Event()
+ self.content = None
+
+ def get(self):
+ self.ready.wait()
+ return self.content
+
+ def set(self, value):
+ self.content = value
+ self.ready.set()
+
+ def size(self):
+ if self.content == None:
+ return 0
+ else:
+ return len(self.content)
+
+ def cap_cache(self):
+ '''Cap the cache size to self.cache_max'''
+ self._cache_lock.acquire()
+ try:
+ self._cache = filter(lambda c: not (c.ready.is_set() and c.content == None), self._cache)
+ sm = sum([slot.size() for slot in self._cache])
+ while sm > self.cache_max:
+ del self._cache[-1]
+ sm = sum([slot.size() for a in self._cache])
+ finally:
+ self._cache_lock.release()
+
+ def reserve_cache(self, locator):
+ '''Reserve a cache slot for the specified locator,
+ or return the existing slot.'''
+ self._cache_lock.acquire()
+ try:
+ # Test if the locator is already in the cache
+ for i in xrange(0, len(self._cache)):
+ if self._cache[i].locator == locator:
+ n = self._cache[i]
+ if i != 0:
+ # move it to the front
+ del self._cache[i]
+ self._cache.insert(0, n)
+ return n, False
+
+ # Add a new cache slot for the locator
+ n = KeepClient.CacheSlot(locator)
+ self._cache.insert(0, n)
+ return n, True
+ finally:
+ self._cache_lock.release()
+
def get(self, locator):
+ #logging.debug("Keep.get %s" % (locator))
+
if re.search(r',', locator):
return ''.join(self.get(x) for x in locator.split(','))
if 'KEEP_LOCAL_STORE' in os.environ:
return KeepClient.local_store_get(locator)
expect_hash = re.sub(r'\+.*', '', locator)
- for service_root in self.shuffled_service_roots(expect_hash):
- url = service_root + expect_hash
- api_token = config.get('ARVADOS_API_TOKEN')
- headers = {'Authorization': "OAuth2 %s" % api_token,
- 'Accept': 'application/octet-stream'}
- blob = self.get_url(url, headers, expect_hash)
- if blob:
- return blob
- for location_hint in re.finditer(r'\+K@([a-z0-9]+)', locator):
- instance = location_hint.group(1)
- url = 'http://keep.' + instance + '.arvadosapi.com/' + expect_hash
- blob = self.get_url(url, {}, expect_hash)
- if blob:
- return blob
+
+ slot, first = self.reserve_cache(expect_hash)
+ #logging.debug("%s %s %s" % (slot, first, expect_hash))
+
+ if not first:
+ v = slot.get()
+ return v
+
+ try:
+ for service_root in self.shuffled_service_roots(expect_hash):
+ url = service_root + expect_hash
+ api_token = config.get('ARVADOS_API_TOKEN')
+ headers = {'Authorization': "OAuth2 %s" % api_token,
+ 'Accept': 'application/octet-stream'}
+ blob = self.get_url(url, headers, expect_hash)
+ if blob:
+ slot.set(blob)
+ self.cap_cache()
+ return blob
+
+ for location_hint in re.finditer(r'\+K@([a-z0-9]+)', locator):
+ instance = location_hint.group(1)
+ url = 'http://keep.' + instance + '.arvadosapi.com/' + expect_hash
+ blob = self.get_url(url, {}, expect_hash)
+ if blob:
+ slot.set(blob)
+ self.cap_cache()
+ return blob
+ except:
+ slot.set(None)
+ self.cap_cache()
+ raise
+
+ slot.set(None)
+ self.cap_cache()
raise arvados.errors.NotFoundError("Block not found: %s" % expect_hash)
def get_url(self, url, headers, expect_hash):
h = httplib2.Http()
try:
- resp, content = h.request(url.encode('utf-8'), 'GET',
- headers=headers)
+ logging.info("Request: GET %s" % (url))
+ with timer.Timer() as t:
+ resp, content = h.request(url.encode('utf-8'), 'GET',
+ headers=headers)
+ logging.info("Received %s bytes in %s msec (%s MiB/sec)" % (len(content),
+ t.msecs,
+ (len(content)/(1024*1024))/t.secs))
if re.match(r'^2\d\d$', resp['status']):
m = hashlib.new('md5')
m.update(content)
import fcntl
import time
import threading
+import collections
from keep import *
import config
import errors
+LOCATOR = 0
+BLOCKSIZE = 1
+OFFSET = 2
+SEGMENTSIZE = 3
+
+def locators_and_ranges(data_locators, range_start, range_size, debug=False):
+ '''
+ Get blocks that are covered by the range
+ data_locators: list of [locator, block_size, block_start], assumes that blocks are in order and contigous
+ range_start: start of range
+ range_size: size of range
+ returns list of [block locator, blocksize, segment offset, segment size] that satisfies the range
+ '''
+ if range_size == 0:
+ return []
+ resp = []
+ range_start = long(range_start)
+ range_size = long(range_size)
+ range_end = range_start + range_size
+ block_start = 0L
+
+ # range_start/block_start is the inclusive lower bound
+ # range_end/block_end is the exclusive upper bound
+
+ hi = len(data_locators)
+ lo = 0
+ i = int((hi + lo) / 2)
+ block_size = data_locators[i][BLOCKSIZE]
+ block_start = data_locators[i][OFFSET]
+ block_end = block_start + block_size
+ if debug: print '---'
+
+ # perform a binary search for the first block
+ # assumes that all of the blocks are contigious, so range_start is guaranteed
+ # to either fall into the range of a block or be outside the block range entirely
+ while not (range_start >= block_start and range_start < block_end):
+ if lo == i:
+ # must be out of range, fail
+ return []
+ if range_start > block_start:
+ lo = i
+ else:
+ hi = i
+ i = int((hi + lo) / 2)
+ if debug: print lo, i, hi
+ block_size = data_locators[i][BLOCKSIZE]
+ block_start = data_locators[i][OFFSET]
+ block_end = block_start + block_size
+
+ while i < len(data_locators):
+ locator, block_size, block_start = data_locators[i]
+ block_end = block_start + block_size
+ if debug:
+ print locator, "range_start", range_start, "block_start", block_start, "range_end", range_end, "block_end", block_end
+ if range_end <= block_start:
+ # range ends before this block starts, so don't look at any more locators
+ break
+
+ #if range_start >= block_end:
+ # range starts after this block ends, so go to next block
+ # we should always start at the first block due to the binary above, so this test is redundant
+ #next
+
+ if range_start >= block_start and range_end <= block_end:
+ # range starts and ends in this block
+ resp.append([locator, block_size, range_start - block_start, range_size])
+ elif range_start >= block_start and range_end > block_end:
+ # range starts in this block
+ resp.append([locator, block_size, range_start - block_start, block_end - range_start])
+ elif range_start < block_start and range_end > block_end:
+ # range starts in a previous block and extends to further blocks
+ resp.append([locator, block_size, 0L, block_size])
+ elif range_start < block_start and range_end <= block_end:
+ # range starts in a previous block and ends in this block
+ resp.append([locator, block_size, 0L, range_end - block_start])
+ block_start = block_end
+ i += 1
+ return resp
+
+
class StreamFileReader(object):
- def __init__(self, stream, pos, size, name):
+ def __init__(self, stream, segments, name):
self._stream = stream
- self._pos = pos
- self._size = size
+ self.segments = segments
self._name = name
- self._filepos = 0
+ self._filepos = 0L
def name(self):
return self._name
def decompressed_name(self):
return re.sub('\.(bz2|gz)$', '', self._name)
- def size(self):
- return self._size
-
def stream_name(self):
return self._stream.name()
- def read(self, size, **kwargs):
- self._stream.seek(self._pos + self._filepos)
- data = self._stream.read(min(size, self._size - self._filepos))
- self._filepos += len(data)
+ def seek(self, pos):
+ self._filepos = min(max(pos, 0L), self.size())
+
+ def tell(self):
+ return self._filepos
+
+ def size(self):
+ n = self.segments[-1]
+ return n[OFFSET] + n[BLOCKSIZE]
+
+ def read(self, size):
+ """Read up to 'size' bytes from the stream, starting at the current file position"""
+ if size == 0:
+ return ''
+
+ data = ''
+ for locator, blocksize, segmentoffset, segmentsize in locators_and_ranges(self.segments, self._filepos, size):
+ data += self._stream.readfrom(locator+segmentoffset, segmentsize)
+ self._filepos += len(data)
+ return data
+
+ def readfrom(self, start, size):
+ """Read up to 'size' bytes from the stream, starting at 'start'"""
+ if size == 0:
+ return ''
+
+ data = ''
+ for locator, blocksize, segmentoffset, segmentsize in locators_and_ranges(self.segments, start, size):
+ data += self._stream.readfrom(locator+segmentoffset, segmentsize)
return data
- def readall(self, size=2**20, **kwargs):
+ def readall(self, size=2**20):
while True:
- data = self.read(size, **kwargs)
+ data = self.read(size)
if data == '':
break
yield data
- def seek(self, pos):
- self._filepos = pos
-
- def bunzip2(self, size):
- decompressor = bz2.BZ2Decompressor()
- for chunk in self.readall(size):
- data = decompressor.decompress(chunk)
- if data and data != '':
- yield data
-
- def gunzip(self, size):
- decompressor = zlib.decompressobj(16+zlib.MAX_WBITS)
- for chunk in self.readall(size):
- data = decompressor.decompress(decompressor.unconsumed_tail + chunk)
+ def decompress(self, decompress, size):
+ for segment in self.readall(size):
+ data = decompress(segment)
if data and data != '':
yield data
def readall_decompressed(self, size=2**20):
- self._stream.seek(self._pos + self._filepos)
+ self.seek(0)
if re.search('\.bz2$', self._name):
- return self.bunzip2(size)
+ dc = bz2.BZ2Decompressor()
+ return self.decompress(lambda segment: dc.decompress(segment), size)
elif re.search('\.gz$', self._name):
- return self.gunzip(size)
+ dc = zlib.decompressobj(16+zlib.MAX_WBITS)
+ return self.decompress(lambda segment: dc.decompress(dc.unconsumed_tail + segment), size)
else:
return self.readall(size)
if decompress:
datasource = self.readall_decompressed()
else:
- self._stream.seek(self._pos + self._filepos)
datasource = self.readall()
data = ''
for newdata in datasource:
yield data
def as_manifest(self):
- if self.size() == 0:
- return ("%s %s 0:0:%s\n"
- % (self._stream.name(), config.EMPTY_BLOCK_LOCATOR, self.name()))
- return string.join(self._stream.tokens_for_range(self._pos, self._size),
- " ") + "\n"
+ manifest_text = ['.']
+ manifest_text.extend([d[LOCATOR] for d in self._stream._data_locators])
+ manifest_text.extend(["{}:{}:{}".format(seg[LOCATOR], seg[BLOCKSIZE], self.name().replace(' ', '\\040')) for seg in self.segments])
+ return arvados.CollectionReader(' '.join(manifest_text) + '\n').manifest_text()
class StreamReader(object):
- def __init__(self, tokens):
- self._tokens = tokens
- self._current_datablock_data = None
- self._current_datablock_pos = 0
- self._current_datablock_index = -1
- self._pos = 0
-
+ def __init__(self, tokens, keep=None, debug=False, _empty=False):
self._stream_name = None
- self.data_locators = []
- self.files = []
+ self._data_locators = []
+ self._files = collections.OrderedDict()
+
+ if keep != None:
+ self._keep = keep
+ else:
+ self._keep = Keep.global_client_object()
+
+ streamoffset = 0L
- for tok in self._tokens:
+ # parse stream
+ for tok in tokens:
+ if debug: print 'tok', tok
if self._stream_name == None:
self._stream_name = tok.replace('\\040', ' ')
- elif re.search(r'^[0-9a-f]{32}(\+\S+)*$', tok):
- self.data_locators += [tok]
- elif re.search(r'^\d+:\d+:\S+', tok):
- pos, size, name = tok.split(':',2)
- self.files += [[int(pos), int(size), name.replace('\\040', ' ')]]
- else:
- raise errors.SyntaxError("Invalid manifest format")
-
- def tokens(self):
- return self._tokens
-
- def tokens_for_range(self, range_start, range_size):
- resp = [self._stream_name]
- return_all_tokens = False
- block_start = 0
- token_bytes_skipped = 0
- for locator in self.data_locators:
- sizehint = re.search(r'\+(\d+)', locator)
- if not sizehint:
- return_all_tokens = True
- if return_all_tokens:
- resp += [locator]
- next
- blocksize = int(sizehint.group(0))
- if range_start + range_size <= block_start:
- break
- if range_start < block_start + blocksize:
- resp += [locator]
- else:
- token_bytes_skipped += blocksize
- block_start += blocksize
- for f in self.files:
- if ((f[0] < range_start + range_size)
- and
- (f[0] + f[1] > range_start)
- and
- f[1] > 0):
- resp += ["%d:%d:%s" % (f[0] - token_bytes_skipped, f[1], f[2])]
- return resp
+ continue
+
+ s = re.match(r'^[0-9a-f]{32}\+(\d+)(\+\S+)*$', tok)
+ if s:
+ blocksize = long(s.group(1))
+ self._data_locators.append([tok, blocksize, streamoffset])
+ streamoffset += blocksize
+ continue
+
+ s = re.search(r'^(\d+):(\d+):(\S+)', tok)
+ if s:
+ pos = long(s.group(1))
+ size = long(s.group(2))
+ name = s.group(3).replace('\\040', ' ')
+ if name not in self._files:
+ self._files[name] = StreamFileReader(self, [[pos, size, 0]], name)
+ else:
+ n = self._files[name]
+ n.segments.append([pos, size, n.size()])
+ continue
+
+ raise errors.SyntaxError("Invalid manifest format")
def name(self):
return self._stream_name
+ def files(self):
+ return self._files
+
def all_files(self):
- for f in self.files:
- pos, size, name = f
- yield StreamFileReader(self, pos, size, name)
-
- def nextdatablock(self):
- if self._current_datablock_index < 0:
- self._current_datablock_pos = 0
- self._current_datablock_index = 0
- else:
- self._current_datablock_pos += self.current_datablock_size()
- self._current_datablock_index += 1
- self._current_datablock_data = None
-
- def current_datablock_data(self):
- if self._current_datablock_data == None:
- self._current_datablock_data = Keep.get(self.data_locators[self._current_datablock_index])
- return self._current_datablock_data
-
- def current_datablock_size(self):
- if self._current_datablock_index < 0:
- self.nextdatablock()
- sizehint = re.search('\+(\d+)', self.data_locators[self._current_datablock_index])
- if sizehint:
- return int(sizehint.group(0))
- return len(self.current_datablock_data())
+ return self._files.values()
- def seek(self, pos):
- """Set the position of the next read operation."""
- self._pos = pos
-
- def really_seek(self):
- """Find and load the appropriate data block, so the byte at
- _pos is in memory.
- """
- if self._pos == self._current_datablock_pos:
- return True
- if (self._current_datablock_pos != None and
- self._pos >= self._current_datablock_pos and
- self._pos <= self._current_datablock_pos + self.current_datablock_size()):
- return True
- if self._pos < self._current_datablock_pos:
- self._current_datablock_index = -1
- self.nextdatablock()
- while (self._pos > self._current_datablock_pos and
- self._pos > self._current_datablock_pos + self.current_datablock_size()):
- self.nextdatablock()
+ def size(self):
+ n = self._data_locators[-1]
+ return n[OFFSET] + n[BLOCKSIZE]
- def read(self, size):
- """Read no more than size bytes -- but at least one byte,
- unless _pos is already at the end of the stream.
- """
+ def locators_and_ranges(self, range_start, range_size):
+ return locators_and_ranges(self._data_locators, range_start, range_size)
+
+ def readfrom(self, start, size):
+ """Read up to 'size' bytes from the stream, starting at 'start'"""
if size == 0:
return ''
- self.really_seek()
- while self._pos >= self._current_datablock_pos + self.current_datablock_size():
- self.nextdatablock()
- if self._current_datablock_index >= len(self.data_locators):
- return None
- data = self.current_datablock_data()[self._pos - self._current_datablock_pos : self._pos - self._current_datablock_pos + size]
- self._pos += len(data)
+ data = ''
+ for locator, blocksize, segmentoffset, segmentsize in locators_and_ranges(self._data_locators, start, size):
+ data += self._keep.get(locator)[segmentoffset:segmentoffset+segmentsize]
return data
+
+ def manifest_text(self):
+ manifest_text = [self.name().replace(' ', '\\040')]
+ manifest_text.extend([d[LOCATOR] for d in self._data_locators])
+ manifest_text.extend([' '.join(["{}:{}:{}".format(seg[LOCATOR], seg[BLOCKSIZE], f.name().replace(' ', '\\040'))
+ for seg in f.segments])
+ for f in self._files.values()])
+ return ' '.join(manifest_text) + '\n'
--- /dev/null
+import time
+
+class Timer(object):
+ def __init__(self, verbose=False):
+ self.verbose = verbose
+
+ def __enter__(self):
+ self.start = time.time()
+ return self
+
+ def __exit__(self, *args):
+ self.end = time.time()
+ self.secs = self.end - self.start
+ self.msecs = self.secs * 1000 # millisecs
+ if self.verbose:
+ print 'elapsed time: %f ms' % self.msecs
--- /dev/null
+#!/usr/bin/env python
+
+import argparse
+import hashlib
+import os
+import re
+import string
+import sys
+import logging
+
+logger = logging.getLogger(os.path.basename(sys.argv[0]))
+
+parser = argparse.ArgumentParser(
+ description='List contents of a manifest')
+
+parser.add_argument('locator', type=str,
+ help="""
+Collection locator
+""")
+
+parser.add_argument('-s', action='store_true', help="""List file sizes, in KiB.""")
+
+args = parser.parse_args()
+
+import arvados
+
+cr = arvados.CollectionReader(arvados.Keep.get(args.locator))
+
+for f in cr.all_files():
+ if args.s:
+ print "{:>10} {}".format(f.size() / 1024, f.stream_name() + "/" + f.name())
+ else:
+ print f.stream_name() + "/" + f.name()
#!/usr/bin/env python
-import argparse
-import hashlib
-import os
-import re
-import string
-import sys
-import logging
-import fuse
-import errno
-import stat
+from arvados.fuse import *
import arvados
-import time
+import subprocess
-class KeepMount(fuse.LoggingMixIn, fuse.Operations):
- 'Read-only Keep mount.'
-
- def __init__(self):
- self.arv = arvados.api('v1')
- self.reader = None
- self.collections = {}
- self.audited = dict(read={})
+if __name__ == '__main__':
+ api = arvados.api()
- def load_collection(self, uuid):
- if uuid in self.collections:
- return
- now = time.time()
- reader = arvados.CollectionReader(uuid)
- files = {}
- files[''] = dict(
- stat=dict(
- st_mode=(stat.S_IFDIR | 0755), st_ctime=now,
- st_mtime=now, st_atime=now, st_nlink=2))
- try:
- for s in reader.all_streams():
- for f in s.all_files():
- path = re.sub(r'^\./', '', os.path.join(s.name(), f.name()))
- files[path] = dict(
- stat=dict(
- st_mode=(stat.S_IFREG | 0444),
- st_size=f.size(), st_nlink=1,
- st_ctime=now, st_mtime=now, st_atime=now),
- arv_file=f)
- logger.debug("collection.load: %s: %s" % (uuid, path))
- except:
- # TODO: propagate real error, don't assume ENOENT
- raise fuse.FuseOSError(errno.ENOENT)
- self.collections[uuid] = dict(reader=reader, files=files)
- logger.info("collection.load %s" % uuid)
+ # Handle command line parameters
+ parser = argparse.ArgumentParser(
+ description='Mount Keep data under the local filesystem.',
+ epilog="""
+Note: When using the --exec feature, you must either specify the
+mountpoint before --exec, or mark the end of your --exec arguments
+with "--".
+""")
+ parser.add_argument('mountpoint', type=str, help="""Mount point.""")
+ parser.add_argument('--collection', type=str, help="""Collection locator""")
+ parser.add_argument('--debug', action='store_true', help="""Debug mode""")
+ parser.add_argument('--exec', type=str, nargs=argparse.REMAINDER,
+ dest="exec_args", metavar=('command', 'args', '...', '--'),
+ help="""Mount, run a command, then unmount and exit""")
- def setup_reader(self, path):
- logger.debug("%s", path.split('/'))
- return True
+ args = parser.parse_args()
- def set_args(self, args):
- self.args = args
+ # Create the request handler
+ operations = Operations(os.getuid(), os.getgid())
- def parse_and_load(self, path):
- parts = path.split(os.path.sep, 2)
- while len(parts) < 3:
- parts += ['']
- if not re.match(r'[0-9a-f]{32,}(\+\S+?)*', parts[1]):
- raise fuse.FuseOSError(errno.ENOENT)
- if self.args.collection != []:
- if parts[1] not in self.args.collection:
- raise fuse.FuseOSError(errno.EPERM)
- self.load_collection(parts[1])
- return parts[0:3]
+ if args.collection != None:
+ # Set up the request handler with the collection at the root
+ e = operations.inodes.add_entry(Directory(llfuse.ROOT_INODE))
+ operations.inodes.load_collection(e, arvados.CollectionReader(arvados.Keep.get(args.collection)))
+ else:
+ # Set up the request handler with the 'magic directory' at the root
+ operations.inodes.add_entry(MagicDirectory(llfuse.ROOT_INODE, operations.inodes))
- def audit_read(self, uuid):
- if self.args.audit and uuid not in self.audited['read']:
- self.audited['read'][uuid] = True
- logger.info("collection.read %s" % uuid)
+ # FUSE options, see mount.fuse(8)
+ opts = []
- def read(self, path, size, offset, fh):
- _, uuid, target = self.parse_and_load(path)
- if (uuid not in self.collections or
- target not in self.collections[uuid]['files']):
- raise fuse.FuseOSError(errno.ENOENT)
- self.audit_read(uuid)
- f = self.collections[uuid]['files'][target]['arv_file']
- f.seek(offset)
- return f.read(size)
+ # Enable FUSE debugging (logs each FUSE request)
+ if args.debug:
+ opts += ['debug']
+
+ # Initialize the fuse connection
+ llfuse.init(operations, args.mountpoint, opts)
- def readdir(self, path, fh):
- if path == '/':
- raise fuse.FuseOSError(errno.EPERM)
- _, uuid, target = self.parse_and_load(path)
- if uuid not in self.collections:
- raise fuse.FuseOSError(errno.ENOENT)
- if target != '' and target[-1] != os.path.sep:
- target += os.path.sep
- dirs = {}
- for filepath in self.collections[uuid]['files']:
- if filepath != '':
- logger.debug(filepath)
- if target == '' or 0 == string.find(filepath, target):
- dirs[filepath[len(target):].split(os.path.sep)[0]] = True
- return ['.', '..'] + dirs.keys()
+ if args.exec_args:
+ t = threading.Thread(None, lambda: llfuse.main())
+ t.start()
- def getattr(self, path, fh=None):
- if path == '/':
- now = time.time()
- return dict(st_mode=(stat.S_IFDIR | 0111), st_ctime=now,
- st_mtime=now, st_atime=now, st_nlink=2)
- _, uuid, target = self.parse_and_load(path)
- if uuid not in self.collections:
- raise fuse.FuseOSError(errno.ENOENT)
- if target in self.collections[uuid]['files']:
- return self.collections[uuid]['files'][target]['stat']
- for filepath in self.collections[uuid]['files']:
- if filepath != '':
- if target == '' or 0 == string.find(filepath, target + '/'):
- return self.collections[uuid]['files']['']['stat']
- raise fuse.FuseOSError(errno.ENOENT)
+ # wait until the driver is finished initializing
+ operations.initlock.wait()
-def parse_args():
- parser = argparse.ArgumentParser(
- description='Mount Keep data under the local filesystem.')
- parser.add_argument('mountpoint', type=str,
- help="""
-Mount point.
-""")
- parser.add_argument('--collection', type=str, action='append', default=[],
- help="""
-Collection locator. If none supplied, provide access to all readable
-manifests.
-""")
- parser.add_argument('--audit', action='store_true',
- help="""
-Print the collection uuid on stderr the first time a given collection
-is read.
-""")
- parser.add_argument('--debug', action='store_true',
- help="""
-Print debug messages.
-""")
- parser.add_argument('--foreground', action='store_true',
- help="""
-Run in foreground, instead of detaching and running as a daemon.
-""")
- args = parser.parse_args()
- return args
+ try:
+ rc = subprocess.call(args.exec_args, shell=False)
+ except:
+ rc = 255
+ finally:
+ subprocess.call(["fusermount", "-u", "-z", args.mountpoint])
-if __name__ == '__main__':
- args = parse_args()
- logger = logging.getLogger(os.path.basename(sys.argv[0]))
- if args.audit:
- logging.basicConfig(level=logging.INFO)
- if args.debug:
- logging.basicConfig(level=logging.DEBUG)
- mounter = KeepMount()
- mounter.set_args(args)
- fuse = fuse.FUSE(mounter,
- args.mountpoint,
- foreground=args.foreground,
- fsname='arv-mount')
+ exit(rc)
+ else:
+ llfuse.main()
--- /dev/null
+#!/usr/bin/env python
+
+import argparse
+import hashlib
+import os
+import re
+import string
+import sys
+import logging
+
+logger = logging.getLogger(os.path.basename(sys.argv[0]))
+
+parser = argparse.ArgumentParser(
+ description='Read manifest on standard input and put normalized manifest on standard output.')
+
+args = parser.parse_args()
+
+import arvados
+
+r = sys.stdin.read()
+
+cr = arvados.CollectionReader(r)
+
+print cr.manifest_text()
parser = argparse.ArgumentParser(
description='Copy data from the local filesystem to Keep.')
+
parser.add_argument('paths', metavar='path', type=str, nargs='*',
help="""
Local file or directory. Default: read from standard input.
""")
+
parser.add_argument('--max-manifest-depth', type=int, metavar='N', default=-1,
help="""
Maximum depth of directory tree to represent in the manifest
a single stream. Default: -1 (unlimited), i.e., exactly one manifest
stream per filesystem directory that contains files.
""")
+
group = parser.add_mutually_exclusive_group()
+
group.add_argument('--as-stream', action='store_true', dest='stream',
help="""
Synonym for --stream.
""")
+
group.add_argument('--stream', action='store_true',
help="""
Store the file content and display the resulting manifest on
stdout. Do not write the manifest to Keep or save a Collection object
in Arvados.
""")
+
group.add_argument('--as-manifest', action='store_true', dest='manifest',
help="""
Synonym for --manifest.
""")
+
group.add_argument('--in-manifest', action='store_true', dest='manifest',
help="""
Synonym for --manifest.
""")
+
group.add_argument('--manifest', action='store_true',
help="""
Store the file data and resulting manifest in Keep, save a Collection
object in Arvados, and display the manifest locator (Collection uuid)
on stdout. This is the default behavior.
""")
+
group.add_argument('--as-raw', action='store_true', dest='raw',
help="""
Synonym for --raw.
""")
+
group.add_argument('--raw', action='store_true',
help="""
Store the file content and display the data block locators on stdout,
separated by commas, with a trailing newline. Do not store a
manifest.
""")
+
parser.add_argument('--use-filename', type=str, default=None, dest='filename',
help="""
Synonym for --filename.
""")
+
parser.add_argument('--filename', type=str, default=None,
help="""
Use the given filename in the manifest, instead of the name of the
input file. It can be used only if there is exactly one path given and
it is not a directory. Implies --manifest.
""")
+
group = parser.add_mutually_exclusive_group()
group.add_argument('--progress', action='store_true',
help="""
percentage of total data size). This is the default behavior when
stderr is a tty.
""")
+
group.add_argument('--no-progress', action='store_true',
help="""
Do not display human-readable progress on stderr, even if stderr is a
tty.
""")
+
group.add_argument('--batch-progress', action='store_true',
help="""
Display machine-readable progress on stderr (bytes and, if known,
self.bytes_expected >> 20, pct))
else:
sys.stderr.write('\r%d ' % self.bytes_flushed)
+
def manifest_text(self, *args, **kwargs):
manifest_text = (super(CollectionWriterWithProgress, self)
.manifest_text(*args, **kwargs))
--- /dev/null
+apt-get install python-dev libattr1-dev libfuse-dev pkg-config
httplib2==0.8
python-gflags==2.0
urllib3==1.7.1
-fusepy==2.0.2
+llfuse==0.40
'bin/arv-get',
'bin/arv-put',
'bin/arv-mount',
+ 'bin/arv-ls',
],
install_requires=[
'python-gflags',
'google-api-python-client',
'httplib2',
'urllib3',
- 'fusepy',
+ 'llfuse'
],
zip_safe=False)
cw.set_current_file_name('baz.txt')
hash = cw.finish()
self.assertEqual(hash,
- '23ca013983d6239e98931cc779e68426+114',
- 'resulting manifest hash is not what I expected')
+ 'd6c3b8e571f1b81ebb150a45ed06c884+114',
+ "resulting manifest hash was {0}, expecting d6c3b8e571f1b81ebb150a45ed06c884+114".format(hash))
class LocalCollectionReaderTest(unittest.TestCase):
def setUp(self):
os.environ['KEEP_LOCAL_STORE'] = '/tmp'
LocalCollectionWriterTest().runTest()
def runTest(self):
- cr = arvados.CollectionReader('23ca013983d6239e98931cc779e68426+114')
+ cr = arvados.CollectionReader('d6c3b8e571f1b81ebb150a45ed06c884+114')
got = []
for s in cr.all_streams():
for f in s.all_files():
got += [[f.size(), f.stream_name(), f.name(), f.read(2**26)]]
- expected = [[3, '.', 'foo.txt', 'foo'],
- [3, '.', 'bar.txt', 'bar'],
+ expected = [[3, '.', 'bar.txt', 'bar'],
+ [3, '.', 'foo.txt', 'foo'],
[3, './baz', 'baz.txt', 'baz']]
self.assertEqual(got,
- expected,
- 'resulting file list is not what I expected')
+ expected)
stream0 = cr.all_streams()[0]
- self.assertEqual(stream0.read(0),
+ self.assertEqual(stream0.readfrom(0, 0),
'',
'reading zero bytes should have returned empty string')
- self.assertEqual(stream0.read(2**26),
+ self.assertEqual(stream0.readfrom(0, 2**26),
'foobar',
'reading entire stream failed')
- self.assertEqual(stream0.read(2**26),
- None,
- 'reading past end of stream should have returned None')
- self.assertEqual(stream0.read(0),
+ self.assertEqual(stream0.readfrom(2**26, 0),
'',
'reading zero bytes should have returned empty string')
os.environ['KEEP_LOCAL_STORE'] = '/tmp'
LocalCollectionWriterTest().runTest()
def runTest(self):
- self._runTest('23ca013983d6239e98931cc779e68426+114',
- [[3, '.', 'foo.txt', 'foo'],
- [3, '.', 'bar.txt', 'bar'],
+ self._runTest('d6c3b8e571f1b81ebb150a45ed06c884+114',
+ [[3, '.', 'bar.txt', 'bar'],
+ [3, '.', 'foo.txt', 'foo'],
[3, './baz', 'baz.txt', 'baz']])
self._runTest((". %s %s 0:3:foo.txt 3:3:bar.txt\n" %
(arvados.Keep.put("foo"),
arvados.Keep.put("bar"))),
- [[3, '.', 'foo.txt', 'foo'],
- [3, '.', 'bar.txt', 'bar']])
+ [[3, '.', 'bar.txt', 'bar'],
+ [3, '.', 'foo.txt', 'foo']])
self._runTest((". %s %s 0:2:fo.txt 2:4:obar.txt\n" %
(arvados.Keep.put("foo"),
arvados.Keep.put("bar"))),
self._runTest((". %s %s 0:2:fo.txt 2:0:zero.txt 2:2:ob.txt 4:2:ar.txt\n" %
(arvados.Keep.put("foo"),
arvados.Keep.put("bar"))),
- [[2, '.', 'fo.txt', 'fo'],
- [0, '.', 'zero.txt', ''],
+ [[2, '.', 'ar.txt', 'ar'],
+ [2, '.', 'fo.txt', 'fo'],
[2, '.', 'ob.txt', 'ob'],
- [2, '.', 'ar.txt', 'ar']])
+ [0, '.', 'zero.txt', '']])
+
def _runTest(self, collection, expected):
cr = arvados.CollectionReader(collection)
- manifest_subsets = []
for s in cr.all_streams():
- for f in s.all_files():
- manifest_subsets += [f.as_manifest()]
- expect_i = 0
- for m in manifest_subsets:
- cr = arvados.CollectionReader(m)
- for f in cr.all_files():
- got = [f.size(), f.stream_name(), f.name(), "".join(f.readall(2**26))]
- self.assertEqual(got,
- expected[expect_i],
- 'all_files|as_manifest did not preserve manifest contents: got %s expected %s' % (got, expected[expect_i]))
- expect_i += 1
+ for ex in expected:
+ if ex[0] == s:
+ f = s.files()[ex[2]]
+ got = [f.size(), f.stream_name(), f.name(), "".join(f.readall(2**26))]
+ self.assertEqual(got,
+ ex,
+ 'all_files|as_manifest did not preserve manifest contents: got %s expected %s' % (got, ex))
class LocalCollectionReadlineTest(unittest.TestCase):
def setUp(self):
cw = arvados.CollectionWriter()
cw.start_new_file('zero.txt')
cw.write('')
+
+ self.assertEqual(cw.manifest_text(), ". 0:0:zero.txt\n")
self.check_manifest_file_sizes(cw.manifest_text(), [0])
cw = arvados.CollectionWriter()
cw.start_new_file('zero.txt')
cw.start_new_stream('foo')
cw.start_new_file('zero.txt')
cw.write('')
- self.check_manifest_file_sizes(cw.manifest_text(), [0,1,0])
+ self.check_manifest_file_sizes(cw.manifest_text(), [1,0,0])
+
def check_manifest_file_sizes(self, manifest_text, expect_sizes):
cr = arvados.CollectionReader(manifest_text)
got_sizes = []
bz2_manifest = cw.manifest_text()
cr = arvados.CollectionReader(bz2_manifest)
+
got = 0
for x in list(cr.all_files())[0].readlines():
self.assertEqual(x, "abc\n", "decompression returned wrong data: %s" % x)
self.assertEqual(got,
n_lines_in,
"decompression returned %d lines instead of %d" % (got, n_lines_in))
+
+class NormalizedCollectionTest(unittest.TestCase):
+ def runTest(self):
+ m1 = """. 5348b82a029fd9e971a811ce1f71360b+43 0:43:md5sum.txt
+. 085c37f02916da1cad16f93c54d899b7+41 0:41:md5sum.txt
+. 8b22da26f9f433dea0a10e5ec66d73ba+43 0:43:md5sum.txt"""
+ self.assertEqual(arvados.CollectionReader(m1).manifest_text(),
+ """. 5348b82a029fd9e971a811ce1f71360b+43 085c37f02916da1cad16f93c54d899b7+41 8b22da26f9f433dea0a10e5ec66d73ba+43 0:127:md5sum.txt
+""")
+
+ m2 = """. 204e43b8a1185621ca55a94839582e6f+67108864 b9677abbac956bd3e86b1deb28dfac03+67108864 fc15aff2a762b13f521baf042140acec+67108864 323d2a3ce20370c4ca1d3462a344f8fd+25885655 0:227212247:var-GS000016015-ASM.tsv.bz2
+"""
+ self.assertEqual(arvados.CollectionReader(m2).manifest_text(), m2)
+
+ m3 = """. 5348b82a029fd9e971a811ce1f71360b+43 3:40:md5sum.txt
+. 085c37f02916da1cad16f93c54d899b7+41 0:41:md5sum.txt
+. 8b22da26f9f433dea0a10e5ec66d73ba+43 0:43:md5sum.txt"""
+ self.assertEqual(arvados.CollectionReader(m3).manifest_text(),
+ """. 5348b82a029fd9e971a811ce1f71360b+43 085c37f02916da1cad16f93c54d899b7+41 8b22da26f9f433dea0a10e5ec66d73ba+43 3:124:md5sum.txt
+""")
+
+ m4 = """. 204e43b8a1185621ca55a94839582e6f+67108864 0:3:foo/bar
+./zzz 204e43b8a1185621ca55a94839582e6f+67108864 0:999:zzz
+./foo 323d2a3ce20370c4ca1d3462a344f8fd+25885655 0:3:bar"""
+ self.assertEqual(arvados.CollectionReader(m4).manifest_text(),
+ """./foo 204e43b8a1185621ca55a94839582e6f+67108864 323d2a3ce20370c4ca1d3462a344f8fd+25885655 0:3:bar 67108864:3:bar
+./zzz 204e43b8a1185621ca55a94839582e6f+67108864 0:999:zzz
+""")
+
+ m5 = """. 204e43b8a1185621ca55a94839582e6f+67108864 0:3:foo/bar
+./zzz 204e43b8a1185621ca55a94839582e6f+67108864 0:999:zzz
+./foo 204e43b8a1185621ca55a94839582e6f+67108864 3:3:bar"""
+ self.assertEqual(arvados.CollectionReader(m5).manifest_text(),
+ """./foo 204e43b8a1185621ca55a94839582e6f+67108864 0:6:bar
+./zzz 204e43b8a1185621ca55a94839582e6f+67108864 0:999:zzz
+""")
+
+ with open('testdata/1000G_ref_manifest') as f6:
+ m6 = f6.read()
+ self.assertEqual(arvados.CollectionReader(m6).manifest_text(), m6)
+
+ with open('testdata/jlake_manifest') as f7:
+ m7 = f7.read()
+ self.assertEqual(arvados.CollectionReader(m7).manifest_text(), m7)
+
+ m8 = """./a\\040b\\040c 59ca0efa9f5633cb0371bbc0355478d8+13 0:13:hello\\040world.txt
+"""
+ self.assertEqual(arvados.CollectionReader(m8).manifest_text(), m8)
+
+class LocatorsAndRangesTest(unittest.TestCase):
+ def runTest(self):
+ blocks2 = [['a', 10, 0],
+ ['b', 10, 10],
+ ['c', 10, 20],
+ ['d', 10, 30],
+ ['e', 10, 40],
+ ['f', 10, 50]]
+
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 2, 2), [['a', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 12, 2), [['b', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 22, 2), [['c', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 32, 2), [['d', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 42, 2), [['e', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 52, 2), [['f', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 62, 2), [])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, -2, 2), [])
+
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 0, 2), [['a', 10, 0, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 10, 2), [['b', 10, 0, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 20, 2), [['c', 10, 0, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 30, 2), [['d', 10, 0, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 40, 2), [['e', 10, 0, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 50, 2), [['f', 10, 0, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 60, 2), [])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, -2, 2), [])
+
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 9, 2), [['a', 10, 9, 1], ['b', 10, 0, 1]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 19, 2), [['b', 10, 9, 1], ['c', 10, 0, 1]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 29, 2), [['c', 10, 9, 1], ['d', 10, 0, 1]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 39, 2), [['d', 10, 9, 1], ['e', 10, 0, 1]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 49, 2), [['e', 10, 9, 1], ['f', 10, 0, 1]])
+ self.assertEqual(arvados.locators_and_ranges(blocks2, 59, 2), [['f', 10, 9, 1]])
+
+
+ blocks3 = [['a', 10, 0],
+ ['b', 10, 10],
+ ['c', 10, 20],
+ ['d', 10, 30],
+ ['e', 10, 40],
+ ['f', 10, 50],
+ ['g', 10, 60]]
+
+ self.assertEqual(arvados.locators_and_ranges(blocks3, 2, 2), [['a', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks3, 12, 2), [['b', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks3, 22, 2), [['c', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks3, 32, 2), [['d', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks3, 42, 2), [['e', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks3, 52, 2), [['f', 10, 2, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks3, 62, 2), [['g', 10, 2, 2]])
+
+
+ blocks = [['a', 10, 0],
+ ['b', 15, 10],
+ ['c', 5, 25]]
+ self.assertEqual(arvados.locators_and_ranges(blocks, 1, 0), [])
+ self.assertEqual(arvados.locators_and_ranges(blocks, 0, 5), [['a', 10, 0, 5]])
+ self.assertEqual(arvados.locators_and_ranges(blocks, 3, 5), [['a', 10, 3, 5]])
+ self.assertEqual(arvados.locators_and_ranges(blocks, 0, 10), [['a', 10, 0, 10]])
+
+ self.assertEqual(arvados.locators_and_ranges(blocks, 0, 11), [['a', 10, 0, 10],
+ ['b', 15, 0, 1]])
+ self.assertEqual(arvados.locators_and_ranges(blocks, 1, 11), [['a', 10, 1, 9],
+ ['b', 15, 0, 2]])
+ self.assertEqual(arvados.locators_and_ranges(blocks, 0, 25), [['a', 10, 0, 10],
+ ['b', 15, 0, 15]])
+
+ self.assertEqual(arvados.locators_and_ranges(blocks, 0, 30), [['a', 10, 0, 10],
+ ['b', 15, 0, 15],
+ ['c', 5, 0, 5]])
+ self.assertEqual(arvados.locators_and_ranges(blocks, 1, 30), [['a', 10, 1, 9],
+ ['b', 15, 0, 15],
+ ['c', 5, 0, 5]])
+ self.assertEqual(arvados.locators_and_ranges(blocks, 0, 31), [['a', 10, 0, 10],
+ ['b', 15, 0, 15],
+ ['c', 5, 0, 5]])
+
+ self.assertEqual(arvados.locators_and_ranges(blocks, 15, 5), [['b', 15, 5, 5]])
+
+ self.assertEqual(arvados.locators_and_ranges(blocks, 8, 17), [['a', 10, 8, 2],
+ ['b', 15, 0, 15]])
+
+ self.assertEqual(arvados.locators_and_ranges(blocks, 8, 20), [['a', 10, 8, 2],
+ ['b', 15, 0, 15],
+ ['c', 5, 0, 3]])
+
+ self.assertEqual(arvados.locators_and_ranges(blocks, 26, 2), [['c', 5, 1, 2]])
+
+ self.assertEqual(arvados.locators_and_ranges(blocks, 9, 15), [['a', 10, 9, 1],
+ ['b', 15, 0, 14]])
+ self.assertEqual(arvados.locators_and_ranges(blocks, 10, 15), [['b', 15, 0, 15]])
+ self.assertEqual(arvados.locators_and_ranges(blocks, 11, 15), [['b', 15, 1, 14],
+ ['c', 5, 0, 1]])
+
+class FileStreamTest(unittest.TestCase):
+ class MockStreamReader(object):
+ def __init__(self, content):
+ self.content = content
+
+ def readfrom(self, start, size):
+ return self.content[start:start+size]
+
+ def runTest(self):
+ content = 'abcdefghijklmnopqrstuvwxyz0123456789'
+ msr = FileStreamTest.MockStreamReader(content)
+ segments = [[0, 10, 0],
+ [10, 15, 10],
+ [25, 5, 25]]
+
+ sfr = arvados.StreamFileReader(msr, segments, "test")
+
+ self.assertEqual(sfr.name(), "test")
+ self.assertEqual(sfr.size(), 30)
+
+ self.assertEqual(sfr.readfrom(0, 30), content[0:30])
+ self.assertEqual(sfr.readfrom(2, 30), content[2:30])
+
+ self.assertEqual(sfr.readfrom(2, 8), content[2:10])
+ self.assertEqual(sfr.readfrom(0, 10), content[0:10])
+
+ self.assertEqual(sfr.tell(), 0)
+ self.assertEqual(sfr.read(5), content[0:5])
+ self.assertEqual(sfr.tell(), 5)
+ self.assertEqual(sfr.read(5), content[5:10])
+ self.assertEqual(sfr.tell(), 10)
+ self.assertEqual(sfr.read(5), content[10:15])
+ self.assertEqual(sfr.tell(), 15)
+ self.assertEqual(sfr.read(5), content[15:20])
+ self.assertEqual(sfr.tell(), 20)
+ self.assertEqual(sfr.read(5), content[20:25])
+ self.assertEqual(sfr.tell(), 25)
+ self.assertEqual(sfr.read(5), content[25:30])
+ self.assertEqual(sfr.tell(), 30)
+ self.assertEqual(sfr.read(5), '')
+ self.assertEqual(sfr.tell(), 30)
+
+ segments = [[26, 10, 0],
+ [0, 15, 10],
+ [15, 5, 25]]
+
+ sfr = arvados.StreamFileReader(msr, segments, "test")
+
+ self.assertEqual(sfr.size(), 30)
+
+ self.assertEqual(sfr.readfrom(0, 30), content[26:36] + content[0:20])
+ self.assertEqual(sfr.readfrom(2, 30), content[28:36] + content[0:20])
+
+ self.assertEqual(sfr.readfrom(2, 8), content[28:36])
+ self.assertEqual(sfr.readfrom(0, 10), content[26:36])
+
+ self.assertEqual(sfr.tell(), 0)
+ self.assertEqual(sfr.read(5), content[26:31])
+ self.assertEqual(sfr.tell(), 5)
+ self.assertEqual(sfr.read(5), content[31:36])
+ self.assertEqual(sfr.tell(), 10)
+ self.assertEqual(sfr.read(5), content[0:5])
+ self.assertEqual(sfr.tell(), 15)
+ self.assertEqual(sfr.read(5), content[5:10])
+ self.assertEqual(sfr.tell(), 20)
+ self.assertEqual(sfr.read(5), content[10:15])
+ self.assertEqual(sfr.tell(), 25)
+ self.assertEqual(sfr.read(5), content[15:20])
+ self.assertEqual(sfr.tell(), 30)
+ self.assertEqual(sfr.read(5), '')
+ self.assertEqual(sfr.tell(), 30)
+
+
+class StreamReaderTest(unittest.TestCase):
+
+ class MockKeep(object):
+ def __init__(self, content):
+ self.content = content
+
+ def get(self, locator):
+ return self.content[locator]
+
+ def runTest(self):
+ keepblocks = {'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+10': 'abcdefghij',
+ 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb+15': 'klmnopqrstuvwxy',
+ 'cccccccccccccccccccccccccccccccc+5': 'z0123'}
+ mk = StreamReaderTest.MockKeep(keepblocks)
+
+ sr = arvados.StreamReader([".", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa+10", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb+15", "cccccccccccccccccccccccccccccccc+5", "0:30:foo"], mk)
+
+ content = 'abcdefghijklmnopqrstuvwxyz0123456789'
+
+ self.assertEqual(sr.readfrom(0, 30), content[0:30])
+ self.assertEqual(sr.readfrom(2, 30), content[2:30])
+
+ self.assertEqual(sr.readfrom(2, 8), content[2:10])
+ self.assertEqual(sr.readfrom(0, 10), content[0:10])
+
+ self.assertEqual(sr.readfrom(0, 5), content[0:5])
+ self.assertEqual(sr.readfrom(5, 5), content[5:10])
+ self.assertEqual(sr.readfrom(10, 5), content[10:15])
+ self.assertEqual(sr.readfrom(15, 5), content[15:20])
+ self.assertEqual(sr.readfrom(20, 5), content[20:25])
+ self.assertEqual(sr.readfrom(25, 5), content[25:30])
+ self.assertEqual(sr.readfrom(30, 5), '')
+
+class ExtractFileTest(unittest.TestCase):
+ def runTest(self):
+ m1 = """. 5348b82a029fd9e971a811ce1f71360b+43 0:43:md5sum.txt
+. 085c37f02916da1cad16f93c54d899b7+41 0:41:md6sum.txt
+. 8b22da26f9f433dea0a10e5ec66d73ba+43 0:43:md7sum.txt
+. 085c37f02916da1cad16f93c54d899b7+41 5348b82a029fd9e971a811ce1f71360b+43 8b22da26f9f433dea0a10e5ec66d73ba+43 47:80:md8sum.txt
+. 085c37f02916da1cad16f93c54d899b7+41 5348b82a029fd9e971a811ce1f71360b+43 8b22da26f9f433dea0a10e5ec66d73ba+43 40:80:md9sum.txt"""
+
+ m2 = arvados.CollectionReader(m1)
+
+ self.assertEqual(m2.manifest_text(),
+ ". 5348b82a029fd9e971a811ce1f71360b+43 085c37f02916da1cad16f93c54d899b7+41 8b22da26f9f433dea0a10e5ec66d73ba+43 0:43:md5sum.txt 43:41:md6sum.txt 84:43:md7sum.txt 6:37:md8sum.txt 84:43:md8sum.txt 83:1:md9sum.txt 0:43:md9sum.txt 84:36:md9sum.txt\n")
+
+ self.assertEqual(arvados.CollectionReader(m1).all_streams()[0].files()['md5sum.txt'].as_manifest(),
+ ". 5348b82a029fd9e971a811ce1f71360b+43 0:43:md5sum.txt\n")
+ self.assertEqual(arvados.CollectionReader(m1).all_streams()[0].files()['md6sum.txt'].as_manifest(),
+ ". 085c37f02916da1cad16f93c54d899b7+41 0:41:md6sum.txt\n")
+ self.assertEqual(arvados.CollectionReader(m1).all_streams()[0].files()['md7sum.txt'].as_manifest(),
+ ". 8b22da26f9f433dea0a10e5ec66d73ba+43 0:43:md7sum.txt\n")
+ self.assertEqual(arvados.CollectionReader(m1).all_streams()[0].files()['md9sum.txt'].as_manifest(),
+ ". 085c37f02916da1cad16f93c54d899b7+41 5348b82a029fd9e971a811ce1f71360b+43 8b22da26f9f433dea0a10e5ec66d73ba+43 40:80:md9sum.txt\n")
--- /dev/null
+import unittest
+import arvados
+import arvados.fuse as fuse
+import threading
+import time
+import os
+import llfuse
+import tempfile
+import shutil
+import subprocess
+import glob
+
+class FuseMountTest(unittest.TestCase):
+ def setUp(self):
+ self.keeptmp = tempfile.mkdtemp()
+ os.environ['KEEP_LOCAL_STORE'] = self.keeptmp
+
+ cw = arvados.CollectionWriter()
+
+ cw.start_new_file('thing1.txt')
+ cw.write("data 1")
+ cw.start_new_file('thing2.txt')
+ cw.write("data 2")
+ cw.start_new_stream('dir1')
+
+ cw.start_new_file('thing3.txt')
+ cw.write("data 3")
+ cw.start_new_file('thing4.txt')
+ cw.write("data 4")
+
+ cw.start_new_stream('dir2')
+ cw.start_new_file('thing5.txt')
+ cw.write("data 5")
+ cw.start_new_file('thing6.txt')
+ cw.write("data 6")
+
+ cw.start_new_stream('dir2/dir3')
+ cw.start_new_file('thing7.txt')
+ cw.write("data 7")
+
+ cw.start_new_file('thing8.txt')
+ cw.write("data 8")
+
+ self.testcollection = cw.finish()
+
+ def runTest(self):
+ # Create the request handler
+ operations = fuse.Operations(os.getuid(), os.getgid())
+ e = operations.inodes.add_entry(fuse.Directory(llfuse.ROOT_INODE))
+ operations.inodes.load_collection(e, arvados.CollectionReader(arvados.Keep.get(self.testcollection)))
+
+ self.mounttmp = tempfile.mkdtemp()
+
+ llfuse.init(operations, self.mounttmp, [])
+ t = threading.Thread(None, lambda: llfuse.main())
+ t.start()
+
+ # wait until the driver is finished initializing
+ operations.initlock.wait()
+
+ # now check some stuff
+ d1 = os.listdir(self.mounttmp)
+ d1.sort()
+ self.assertEqual(d1, ['dir1', 'dir2', 'thing1.txt', 'thing2.txt'])
+
+ d2 = os.listdir(os.path.join(self.mounttmp, 'dir1'))
+ d2.sort()
+ self.assertEqual(d2, ['thing3.txt', 'thing4.txt'])
+
+ d3 = os.listdir(os.path.join(self.mounttmp, 'dir2'))
+ d3.sort()
+ self.assertEqual(d3, ['dir3', 'thing5.txt', 'thing6.txt'])
+
+ d4 = os.listdir(os.path.join(self.mounttmp, 'dir2/dir3'))
+ d4.sort()
+ self.assertEqual(d4, ['thing7.txt', 'thing8.txt'])
+
+ files = {'thing1.txt': 'data 1',
+ 'thing2.txt': 'data 2',
+ 'dir1/thing3.txt': 'data 3',
+ 'dir1/thing4.txt': 'data 4',
+ 'dir2/thing5.txt': 'data 5',
+ 'dir2/thing6.txt': 'data 6',
+ 'dir2/dir3/thing7.txt': 'data 7',
+ 'dir2/dir3/thing8.txt': 'data 8'}
+
+ for k, v in files.items():
+ with open(os.path.join(self.mounttmp, k)) as f:
+ self.assertEqual(f.read(), v)
+
+
+ def tearDown(self):
+ # llfuse.close is buggy, so use fusermount instead.
+ #llfuse.close(unmount=True)
+ subprocess.call(["fusermount", "-u", self.mounttmp])
+
+ os.rmdir(self.mounttmp)
+ shutil.rmtree(self.keeptmp)
+
+class FuseMagicTest(unittest.TestCase):
+ def setUp(self):
+ self.keeptmp = tempfile.mkdtemp()
+ os.environ['KEEP_LOCAL_STORE'] = self.keeptmp
+
+ cw = arvados.CollectionWriter()
+
+ cw.start_new_file('thing1.txt')
+ cw.write("data 1")
+
+ self.testcollection = cw.finish()
+
+ def runTest(self):
+ # Create the request handler
+ operations = fuse.Operations(os.getuid(), os.getgid())
+ e = operations.inodes.add_entry(fuse.MagicDirectory(llfuse.ROOT_INODE, operations.inodes))
+
+ self.mounttmp = tempfile.mkdtemp()
+
+ llfuse.init(operations, self.mounttmp, [])
+ t = threading.Thread(None, lambda: llfuse.main())
+ t.start()
+
+ # wait until the driver is finished initializing
+ operations.initlock.wait()
+
+ # now check some stuff
+ d1 = os.listdir(self.mounttmp)
+ d1.sort()
+ self.assertEqual(d1, [])
+
+ d2 = os.listdir(os.path.join(self.mounttmp, self.testcollection))
+ d2.sort()
+ self.assertEqual(d2, ['thing1.txt'])
+
+ d3 = os.listdir(self.mounttmp)
+ d3.sort()
+ self.assertEqual(d3, [self.testcollection])
+
+ files = {}
+ files[os.path.join(self.mounttmp, self.testcollection, 'thing1.txt')] = 'data 1'
+
+ for k, v in files.items():
+ with open(os.path.join(self.mounttmp, k)) as f:
+ self.assertEqual(f.read(), v)
+
+
+ def tearDown(self):
+ # llfuse.close is buggy, so use fusermount instead.
+ #llfuse.close(unmount=True)
+ subprocess.call(["fusermount", "-u", self.mounttmp])
+
+ os.rmdir(self.mounttmp)
+ shutil.rmtree(self.keeptmp)
--- /dev/null
+. 231e69ef8840dcdb883b934a008f0eeb+67108864+K@qr1hi e14a59b578206d2d32dd858715645e0b+67108864+K@qr1hi 27a4b87e4cf1f85dc3fd917d2c388641+67108864+K@qr1hi 06b3ff80cf45bda52aca0711059a0bd6+67108864+K@qr1hi b036f1120ca429d0a148a5e8312663d9+67108864+K@qr1hi 83dc6b43bf27ce28da50967cd7dd23c3+67108864+K@qr1hi 3f6a4512b125bca64e1fa3d82f1e638d+67108864+K@qr1hi c0a8af66954841dae178e9417a82b710+67108864+K@qr1hi b3b4fb7120fae8b8f804849e36de9b55+67108864+K@qr1hi 2323ea3c93cc9664f35b6f90493ad01e+67108864+K@qr1hi e0b0f131d6f4669d0eaafbd4d72e0268+67108864+K@qr1hi 4274ff53c12dd5821c9ff6b12c4678f2+67108864+K@qr1hi 5d7af6348037a8161b1f932edcf32fae+67108864+K@qr1hi b7d88946691cc0d0f3c22dc3619b2ef3+67108864+K@qr1hi 799dd7f25556ad3a90604e094b538149+67108864+K@qr1hi 41b4d1c38afbcc48c0d463ad37adbdb7+67108864+K@qr1hi 6adcba8494cb0a6f6563e4c92a5c002a+67108864+K@qr1hi d0b7417a3872a5889cdc66daff4da326+67108864+K@qr1hi 7a5aeeb69132524c3e35cf454683fabe+67108864+K@qr1hi 9b09a732903086533e58e1acefc5df1f+67108864+K@qr1hi cdd07f6573f9e1239ef83ba8a02d6bf4+67108864+K@qr1hi 3d802b3e5b532210397b6992d9d9caff+67108864+K@qr1hi 5ce57221bdb69beb1376479a00dc839c+67108864+K@qr1hi 9173b38ec40c457fa3bd36ef89e562fc+67108864+K@qr1hi 05c712dee07f2115b657bb83d18f77dc+67108864+K@qr1hi 5764176e6aa0e8dd1195eb37c10ff921+67108864+K@qr1hi ce5d4f465c761cdfce6a7075e75e4c8d+67108864+K@qr1hi 2f594f1a5028e5954b14aba3cc7edc5d+67108864+K@qr1hi 9cb165ce899a80dc0aba79290d054f2e+67108864+K@qr1hi 9c5c8f5ad6dd0a23dbdd7bae47d9b77c+67108864+K@qr1hi b7afd688ca053e6cdd44f7c7add74c88+67108864+K@qr1hi 0b6c92b166993dbf4ebe65b130a18531+67108864+K@qr1hi 9c0e13bc1825573446cdb2e0d2a13057+67108864+K@qr1hi a64e372054ceb89494e7da42e1869a19+67108864+K@qr1hi 04b9acc199d01058c413c0b61474fa42+67108864+K@qr1hi 4d3f26dd05c50bbc5dac61ffc45f4a36+67108864+K@qr1hi f7f4400a463b1950a9422d3d798ae4e4+67108864+K@qr1hi 88814bec594bc5207ed70b52da08c964+67108864+K@qr1hi e645deb6e2cb633d175636327432b547+67108864+K@qr1hi 82249761efba1a759a94533a0f0225ee+67108864+K@qr1hi ff981edca6999dddb04e2b3528be376a+67108864+K@qr1hi d6e5f14509a26363492aab3775b070a7+67108864+K@qr1hi 20395032fda158a8fddd68281559b706+67108864+K@qr1hi f8dce2bf8d30bfa2306715f355e14702+67108864+K@qr1hi 937e9736f130276bd99c5a3cfd419f01+67108864+K@qr1hi c5ce8d646b2e1f8ceda6a88bdaa42354+67108864+K@qr1hi e82f42c6458660ba3e4aba0bf9f2fa83+67108864+K@qr1hi d2940d4c7155a94dfb31caf6951d9a59+67108864+K@qr1hi 165ffca3eae18d12aebfc395f4565547+67108864+K@qr1hi 8500ebaa55b2b377414c1d627e9a1982+67108864+K@qr1hi 594501b0e794179d7a04170d668358a8+67108864+K@qr1hi cd353db66ea7bba1ce4aa9fcd78fbf47+67108864+K@qr1hi 63b0e03e3a11c00f2b36de1384325756+67108864+K@qr1hi ac811ad87a8a5bc4e23130d2cc8ab588+67108864+K@qr1hi bb2c282f29b1ff680e1ecf82ba2902a9+67108864+K@qr1hi 5d3dbfa93769c1cba4406e616cc15d92+67108864+K@qr1hi 4f70517fc34def9e912ca98c127e8568+67108864+K@qr1hi 7da6aeb8a23b001ef8324ac28996f79d+67108864+K@qr1hi bcaba7f5eb10668c62c366527c5b7225+67108864+K@qr1hi 6fe50b949e8ace7e7bbe4a443b15cd89+67108864+K@qr1hi 7f104154192f4f15ef6760cd8ef836b4+67108864+K@qr1hi 9e528cc6e61ac04ab4806b1eca14473b+67108864+K@qr1hi b9af9ac127033b9639a32b4b4d21a033+67108864+K@qr1hi 724d08ad32a6de2dea78c357367f4de8+67108864+K@qr1hi 8afc63f0435da749a1a58544c290a792+67108864+K@qr1hi 7b6ea56cbf9bfce245fab717b02bc5c7+67108864+K@qr1hi c5903ce244515bb870dbad04acd7b482+67108864+K@qr1hi 491f4228b75e5d9af5c10eb4c7960d63+67108864+K@qr1hi 252bcf6db697723c6bcea11f601be4b0+67108864+K@qr1hi 81244819a14415d52b26a340d0b9a367+67108864+K@qr1hi 40336ab12de8a3c192dc4275c65e0b16+67108864+K@qr1hi 991ffe3960f9510b26352f5f925c23ba+67108864+K@qr1hi 0331ed4cfbc01ce07053691a31568c55+67108864+K@qr1hi b7d63f0ae6507c7f828c376ef2861e1c+67108864+K@qr1hi 548c0041481a1795913f62321944a81b+67108864+K@qr1hi b804bd2af77b7a3a32ac9512380d94e2+67108864+K@qr1hi a1702dad1c2354c9c85b02191800d5df+67108864+K@qr1hi 8e314c6cbda431e328e2de30ed0bacf0+67108864+K@qr1hi 8930eda1c1c868067fe4514c86cb0006+67108864+K@qr1hi 8ab6885d8e7a65fdff1a64fae78f83cb+67108864+K@qr1hi bb9ca8c63316097110e34d49f9b1a551+67108864+K@qr1hi 280e1ceb75a5db7a72d23b0705e2de94+67108864+K@qr1hi 47172b0b71e03d88fe560c68c3ca5b13+67108864+K@qr1hi 3f985d99b0929ab8869c2d6ee78ebe06+67108864+K@qr1hi f99ce1f7543bf5d6b92bbf1d74bf341b+67108864+K@qr1hi 2d1073b508cde7fdb47d3e0045f12ba1+67108864+K@qr1hi 66d40bfdb5d04f954745e47bd958c959+67108864+K@qr1hi 423753509d9fb12a3b99eb463a8e6441+67108864+K@qr1hi 5d7676bf15ff2c73c84da0d6a1b21ec9+67108864+K@qr1hi 17dd674093f3ec22acb79db4d3c958e8+67108864+K@qr1hi 792f960e48650f1ff4397400d61e4868+67108864+K@qr1hi e44a4987cc0df77331131a4b7ee5408e+67108864+K@qr1hi 1d5b68a793bde89b35afd0abfffa1e91+67108864+K@qr1hi 93474190338acbc799a96e095c1ce6e1+67108864+K@qr1hi 19ad3d61a0729bd779608cefcefd3f17+67108864+K@qr1hi 4effea732567c4def12cb91616fcadab+67108864+K@qr1hi 00313b354ef436c75e89b7d9abb83d4f+67108864+K@qr1hi df5e63c2a4f060d462436f512c54858a+67108864+K@qr1hi ce8b016b1c46ebc3cf3872b26a799ec1+67108864+K@qr1hi 87163cb8078652223da89aa3d2f902f3+67108864+K@qr1hi f85e64b456e64bbb679dfaa2c462a033+67108864+K@qr1hi de8050929d7d89303e809d8f27c422dc+67108864+K@qr1hi adf643ec5085bf757fcc59a47813288a+67108864+K@qr1hi 7d2b01ba0f9be07644927cca7c459e43+67108864+K@qr1hi a5dc9a1d620b49be2da2098bef54ab18+67108864+K@qr1hi d24da6679ba48e4cbe29af40b5f36968+67108864+K@qr1hi 7d9f73079ff9aeeda056e21e64cddadc+67108864+K@qr1hi 47e45f31917f41385dd79c9316e1cefc+67108864+K@qr1hi a8f9a8ca17809b7c2f64aba9a0c13b1f+67108864+K@qr1hi d8d534661a3af310b085323d496f6d44+67108864+K@qr1hi 899756d962d283156f681a461c0588ce+67108864+K@qr1hi 0f28d102f6e05dca547d5a019fe85b61+67108864+K@qr1hi ddd31b0c369f60219e0a65a071772018+67108864+K@qr1hi 7ff925b478d6a51806982f1a32ecdb5a+67108864+K@qr1hi b7afe2d94145776bc7fecb7a8385527d+67108864+K@qr1hi c77b5ee8577c6c89533114803b5efc9b+67108864+K@qr1hi 884661029ffb441e16ca87a248bcf394+67108864+K@qr1hi cd22c4e3fd707f54818545004da24a1c+67108864+K@qr1hi a90b6f132d31540d6a1c9a5e426997f7+67108864+K@qr1hi c9f699cdb3ab822dd0bd9c345926c86d+67108864+K@qr1hi 4b0abce1b72d97eebb652fb438c1b3be+67108864+K@qr1hi d4568db71967719cda57374a9963a6dc+67108864+K@qr1hi cfb15250fb5eb9ac69a18f64eaeb3e31+67108864+K@qr1hi 4d3ac3e4c5a278b91cda0d890db84e3a+67108864+K@qr1hi 40b137b57f8d83e4d508a1a4b95ac134+67108864+K@qr1hi c86b47517a22f1303bb519a7a244e57d+67108864+K@qr1hi 712681dd526dd49add64af4f168254d0+67108864+K@qr1hi b5abb03c2b4fbd01e8997f8c755bf347+67108864+K@qr1hi 50245663fc28f000c536a9b85ae05d52+67108864+K@qr1hi 89e2b1ece4b8a34700a48bd5625c1ddc+67108864+K@qr1hi a06799afa99163b7ba2471f4bc2da4a2+67108864+K@qr1hi 4cecb752f0015ca1b70a95c1b4497c7b+67108864+K@qr1hi e0b110c9e392c0126787a7b1635f4923+67108864+K@qr1hi f32788adf3c77d67b09abc43f2922012+67108864+K@qr1hi fb6e48fa0feb6ee3d6356beb765a98a4+67108864+K@qr1hi 52a464c2209f6e262dc72e485b5df16c+67108864+K@qr1hi 50ed10e5d3dfedbd18f1fbff62048487+67108864+K@qr1hi b4d649a55f537c628bc337729857a2cd+67108864+K@qr1hi d8d5fa84e7199021ed7f3daa9e1d3c6a+67108864+K@qr1hi 7ea980aec5a6d9bc7ae8353b34145daa+67108864+K@qr1hi f9b989d982bbc5b3587a2a06df2f7bdc+67108864+K@qr1hi 27c8ba6cc8208fa1c220657768e8780e+67108864+K@qr1hi 3ec1187853bc27c62ecc02c7a27f0587+67108864+K@qr1hi 9b34e5a81de59c416255d6e23de498fc+67108864+K@qr1hi 469f6398ee90d5dd398c21ad06b05fe3+67108864+K@qr1hi d0969eae2340c1e1d34d311cc4815fde+67108864+K@qr1hi 2e3e6b8823e39e08d5e697adc2120339+67108864+K@qr1hi 224fc36688f7adb2ec5cc088b09e8463+42902639+K@qr1hi 0:51549666:1000G_omni2.5.b37.vcf.gz 51549666:95:1000G_omni2.5.b37.vcf.gz.md5 51549761:475087:1000G_omni2.5.b37.vcf.idx.gz 52024848:99:1000G_omni2.5.b37.vcf.idx.gz.md5 52024947:45036197:1000G_phase1.indels.b37.vcf.gz 97061144:101:1000G_phase1.indels.b37.vcf.gz.md5 97061245:333605:1000G_phase1.indels.b37.vcf.idx.gz 97394850:105:1000G_phase1.indels.b37.vcf.idx.gz.md5 97394955:550102132:CEUTrio.HiSeq.WGS.b37.bestPractices.phased.b37.vcf.gz 647497087:124:CEUTrio.HiSeq.WGS.b37.bestPractices.phased.b37.vcf.gz.md5 647497211:3555843:CEUTrio.HiSeq.WGS.b37.bestPractices.phased.b37.vcf.idx.gz 651053054:128:CEUTrio.HiSeq.WGS.b37.bestPractices.phased.b37.vcf.idx.gz.md5 651053182:19868212:Mills_and_1000G_gold_standard.indels.b37.vcf.gz 670921394:118:Mills_and_1000G_gold_standard.indels.b37.vcf.gz.md5 670921512:547962:Mills_and_1000G_gold_standard.indels.b37.vcf.idx.gz 671469474:122:Mills_and_1000G_gold_standard.indels.b37.vcf.idx.gz.md5 671469596:29993649:NA12878.HiSeq.WGS.bwa.cleaned.raw.subset.b37.sites.vcf.gz 701463245:128:NA12878.HiSeq.WGS.bwa.cleaned.raw.subset.b37.sites.vcf.gz.md5 701463373:578447:NA12878.HiSeq.WGS.bwa.cleaned.raw.subset.b37.sites.vcf.idx.gz 702041820:132:NA12878.HiSeq.WGS.bwa.cleaned.raw.subset.b37.sites.vcf.idx.gz.md5 702041952:38839441:NA12878.HiSeq.WGS.bwa.cleaned.raw.subset.b37.vcf.gz 740881393:122:NA12878.HiSeq.WGS.bwa.cleaned.raw.subset.b37.vcf.gz.md5 740881515:605289:NA12878.HiSeq.WGS.bwa.cleaned.raw.subset.b37.vcf.idx.gz 741486804:126:NA12878.HiSeq.WGS.bwa.cleaned.raw.subset.b37.vcf.idx.gz.md5 741486930:6040047539:NA12878.HiSeq.WGS.bwa.cleaned.recal.b37.20.bam 6781534469:113749:NA12878.HiSeq.WGS.bwa.cleaned.recal.b37.20.bam.bai.gz 6781648218:124:NA12878.HiSeq.WGS.bwa.cleaned.recal.b37.20.bam.bai.gz.md5 6781648342:117:NA12878.HiSeq.WGS.bwa.cleaned.recal.b37.20.bam.md5 6781648459:3928395:NA12878.HiSeq.WGS.bwa.cleaned.recal.b37.20.vcf.gz 6785576854:120:NA12878.HiSeq.WGS.bwa.cleaned.recal.b37.20.vcf.gz.md5 6785576974:66113:NA12878.HiSeq.WGS.bwa.cleaned.recal.b37.20.vcf.idx.gz 6785643087:124:NA12878.HiSeq.WGS.bwa.cleaned.recal.b37.20.vcf.idx.gz.md5 6785643211:282374229:dbsnp_137.b37.excluding_sites_after_129.vcf.gz 7068017440:117:dbsnp_137.b37.excluding_sites_after_129.vcf.gz.md5 7068017557:3824375:dbsnp_137.b37.excluding_sites_after_129.vcf.idx.gz 7071841932:121:dbsnp_137.b37.excluding_sites_after_129.vcf.idx.gz.md5 7071842053:1022107667:dbsnp_137.b37.vcf.gz 8093949720:91:dbsnp_137.b37.vcf.gz.md5 8093949811:3982568:dbsnp_137.b37.vcf.idx.gz 8097932379:95:dbsnp_137.b37.vcf.idx.gz.md5 8097932474:59819710:hapmap_3.3.b37.vcf.gz 8157752184:92:hapmap_3.3.b37.vcf.gz.md5 8157752276:1022297:hapmap_3.3.b37.vcf.idx.gz 8158774573:96:hapmap_3.3.b37.vcf.idx.gz.md5 8158774669:2597:human_g1k_v37.dict.gz 8158777266:92:human_g1k_v37.dict.gz.md5 8158777358:1044:human_g1k_v37.fasta.fai.gz 8158778402:97:human_g1k_v37.fasta.fai.gz.md5 8158778499:869925027:human_g1k_v37.fasta.gz 9028703526:93:human_g1k_v37.fasta.gz.md5 9028703619:85:human_g1k_v37.stats.gz 9028703704:93:human_g1k_v37.stats.gz.md5 9028703797:2689:human_g1k_v37_decoy.dict.gz 9028706486:98:human_g1k_v37_decoy.dict.gz.md5 9028706584:1095:human_g1k_v37_decoy.fasta.fai.gz 9028707679:103:human_g1k_v37_decoy.fasta.fai.gz.md5 9028707782:879197576:human_g1k_v37_decoy.fasta.gz 9907905358:99:human_g1k_v37_decoy.fasta.gz.md5 9907905457:91:human_g1k_v37_decoy.stats.gz 9907905548:99:human_g1k_v37_decoy.stats.gz.md5
--- /dev/null
+./PG0002577-DNA-jlake-germline ec9ae2be7620af8b6efd96809e5e75e0+1917833 0:6148:.DS_Store 6148:4096:._.DS_Store 10244:1904161:PG0002577-DNA.pdf 1914405:76:PersonalGenome_Mac.command 1914481:704:PersonalGenome_Windows.bat 1915185:2648:md5sum.txt
+./PG0002577-DNA-jlake-germline/Assembly 42a43977e2303a4337129331577d122a+10244 0:6148:.DS_Store 6148:4096:._.DS_Store
+./PG0002577-DNA-jlake-germline/Assembly/conf 95747f01cc916acc1f385ea2d018841a+165976 0:61440:dirs.tar 61440:11245:project.conf 72685:61440:project.dirs.tar 134125:31851:run.conf.xml
+./PG0002577-DNA-jlake-germline/Assembly/genome 6762e2e508fc8eb451f7ec0ea0faee33+10244 0:6148:.DS_Store 6148:4096:._.DS_Store
+./PG0002577-DNA-jlake-germline/Assembly/genome/bam 5a854b86da65e1ff3572f17e088633fe+67108864 9c6c77dd7511dada2e631a3b038b5fa1+67108864 54c6025d7dd4cd8ecccfe573499a2176+67108864 c9cfd86fe5df4b83c6ad8dddd901becc+67108864 c9d7be11850c860e2d5cb0c9e1a44915+67108864 3fb42e18373c8710aed8620fa81db3c1+67108864 f419d215df8195df08394865f719fbca+67108864 d263423f327da62e24867f22fc490706+67108864 40ef57add0dfbee66836365ae0fd7d06+67108864 0fea4b759d870ab6decbb632176fbeb5+67108864 c109c9e484cdafee14c53198c0d6b610+67108864 103f902681b7d40dcde1dce0b79b17c8+67108864 b6b93a2b846620c39e38302f1f7ffe10+67108864 e38be01100ab8d220f06b800b7cd62dd+67108864 f5812ce719898a4d2cb06eebcafdacc0+67108864 6f5fc3c25e8abeb9c079ef801d0f9450+67108864 d9ad4e7e17a79487817ae2ad8e534498+67108864 e5a15e06712a2090e74f78e678b490f6+67108864 69d57fee8eb8dd67906c9a7e9e3e5cac+67108864 68395295a64f0d0b75117a2400a4c1ee+67108864 497dbca0f9dd89eeb2e8dd8aed9796fa+67108864 d14e96347585f714ed527fb0e2e78be5+67108864 03bcad873029c5778e59dd4c4109f5d7+67108864 0bb736900002c0c2b2ab31a6f8009fdb+67108864 22509a92aca7813b2363661ab233772f+67108864 c23528b87c5581e6d6ad538ff007e3a8+67108864 784f055bea23e35078c9437eaa233e0e+67108864 76a724595ce0b01bb51c6a948fa2f5a4+67108864 c52e5205c23728d439e90378267ee382+67108864 e4f2400071c39af9661de0662018e984+67108864 66b8a86b349902d359dc6ac9788e0246+67108864 98353a4694dbc5eae4c3960d2cd7baf9+67108864 130d8c29af7d0a5468b854bb1758dd4d+67108864 9741fb84b07c6282bd6b6a002ecdc15e+67108864 7eaa6674cf09efc2adfd14a7b169e357+67108864 4071ca2915995af71dd9da03e8c6c4c1+67108864 888673ec3ca2787511dca770f090c138+67108864 21d21d390663b32c3738bebdd97c32e8+67108864 f575e7b15bc194bf98e346bb4b2788a4+67108864 b5d983d92f990f90622be2232ced743b+67108864 0e6bd01b5b9e49b1969b5d3817499476+67108864 481144b5d5ab8a1ab7235fe64bdc872b+67108864 6c8f5fe6d45e5719fc6270748015db12+67108864 68966f5d47a96aa8731c5950fd1f467d+67108864 4d48317b33738dfa96174bd5a1dcc841+67108864 24f75fafbe546fe366f7a6d465240f8d+67108864 8711ad611384bd7f0e89c400c90cfb7e+67108864 2ae54914c5bf92a8cbdad755e8135b1b+67108864 e11116820a72cfed92d64bced7172187+67108864 4cf0a16d830cb8c91837b3f24093ca2a+67108864 196a74cb26cd1bd8e540d22e46fa4302+67108864 92982486ba3b6d370cc31ccfddfd8110+67108864 6c5e160bb75c99ed338bdbbe9c968955+67108864 d0a48c19f2a00ad5b3709326c428b3d9+67108864 877890001e22c2d88375892890e634fa+67108864 f3cad932b80e8d20c8f67f4239a5c279+67108864 15d980c196e5d7690de660a3c3400154+67108864 964bb3d46fe32c7b3ff9077c96a32a0d+67108864 60107013728b9a04d9822588613cc1bb+67108864 e265d4a367e48f740f6fc1c881fcb053+67108864 4808ac7dbb6393908ebf47f453e659c2+67108864 1442fbee68d6d39576d7de798d293859+67108864 c9a16c84c579e83b7423358b7141d66f+67108864 36874b0c65f95e43a0656adad0734d8f+67108864 b174dadbcc463d64b80980a4cdd3fe41+67108864 518c5f4c27b2d5d2b42863e2132e0320+67108864 ab658f08b58b199860913a4b55d68d1d+67108864 92d9f01091907ec183981cedf2f26b37+67108864 539a6fe604549facefb68c4cfc7b204f+67108864 31e641b640af914fe6a2e4bcc31c1948+67108864 ba1e9349e65c068170b62f655a300d3b+67108864 131ff6d51b65974c9d366e81cd608d57+67108864 4ff4d286591293acdd3610373bce6f11+67108864 07cf4b86c65559b68689849c85d8cd64+67108864 051cf1cbf95a08df5c18fc2e98f705a5+67108864 2737c7e7ea93ff9a2c5b2cfd76c06022+67108864 60c00403a73e9b0c40d4b137870abe53+67108864 64068170004d472feb843e4448d8d121+67108864 e955ab9f87979be9d09753e843d36b10+67108864 180692a3f95576c265370680a2a2e052+67108864 cd7a1d16bdef3fa9474ca0a5b21264a2+67108864 4ac9f4d038b4be59a9a2808fef0fea43+67108864 c4947ab9755e190b5ebc9ee9bdc609da+67108864 96ff83a8ceb80097fa25b893b88104f0+67108864 e893caeea6fc8b2f39695b48bbc16362+67108864 254628d570c39863ee1c7fd1a0750196+67108864 2e24dd5c0c0696e79e674e85a3f12934+67108864 1990250dc54ed2e708dca7b4f9a41c18+67108864 8e6e40e53a663018974749ceebb1b98a+67108864 d84c21e61a9cb82dc9c2a7674a51657f+67108864 95f61628504580fa779eeeb96c0577cd+67108864 19f4baba83495e69c94ad52d22ccc2e7+67108864 0b9a91c910d6bee96f8c1caf129a10c9+67108864 0fb342be2b7e50536485fad5fd98280d+67108864 482ccfbf6dc6d3cec1c3a58982f40db4+67108864 b51612ee241fc06eeac1d823abd70858+67108864 14ff4c77a9a151b0062338c1d5b30242+67108864 9c37ab2ca3179d71544b2793cab38918+67108864 3947527126983bccbcc795c2a922dbb3+67108864 df6e54c39b918a1a26a3f557fc61c69c+67108864 94ae725934b1aeee78db89dec7e629b9+67108864 b08756a57d798709bcbb60d448cfe703+67108864 50de90bf9d8cf7fdc8ff54a5a6ff6f5b+67108864 24c451aa9481b72c0f989ed264198730+67108864 b1f79cc8b5729ae7523bd5d0d7c840b0+67108864 9b5f5392fb4d814ae13d5106bec28696+67108864 55d49c99f24cd778295f3637daddbd4f+67108864 e18e2c5dac882f932e1e4e4cf557b572+67108864 453f3aa0d1a9832e2dd99c44b30cd3ed+67108864 57f19b58f8da911138af4351c6aea5a9+67108864 5e3843ce5bfaf6170a16f26b4e4b1aac+67108864 597919fdf8ff48500c264d0c9f7439f5+67108864 b51bb4c6be8618ab377787f180560048+67108864 ff6a60a658e75febf565ca3cecdd90fb+67108864 9c993d598ac6a696591249ca115169b0+67108864 283ecc93e81dbae4a4cc8523e0260fbf+67108864 ad8ad32aec1b8df99ae91a3580908f96+67108864 d3c0d337118c727705fc5de57e05c235+67108864 7fc7f73d3ccd5c6205c80f845aae7ed3+67108864 4e555e6ce17d792bb5982232fcf70405+67108864 320bd68a5462576ad726c129f6941844+67108864 7ffbde2e853e1e9b0fbfdae63be37dab+67108864 ae25a4cc941178b62929aae15831ef8b+67108864 ba24657691267443b2e7bf6b6964e051+67108864 1e9e12b68f26db8c8f7c7cc788945df0+67108864 edf4acc2527cddf0e20d009f4486d7d2+67108864 baefb0589e1516ed42fced78370f8710+67108864 c037629c703f4a2c1df194202cecff0a+67108864 944ceef59fc6dc1e2dac2d8bc71ef6fb+67108864 d955e2eee34d9873d36065870fe6904b+67108864 eb4b9530be56e0bb33b9827279990dd6+67108864 559d40ebfeb35b1d88e797a3e9f8fdd7+67108864 623e4c4f5a5ae8c466a7b52bcf6e830c+67108864 5790327fc52b0d57357ec948331ca387+67108864 232a548bccb18ba351c681ddb0f84d4a+67108864 e4797b5eea62b9980478d01e7092a05c+67108864 6b888368142e02359ae8241daa0ba99c+67108864 57969f6dd6f8f56064c57ed4929d6c09+67108864 10f07bd7b6c3b8bd55e990cc6b65de37+67108864 ce126a25374dfe6e4cd91d27239e3606+67108864 536c1ff25f7334b3eee12fd61cd4c88c+67108864 07f03c33b0a0ca3d76d31e65aec87a05+67108864 156cc2e702d5706c6dcbfc65937e0ced+67108864 ed19220354dd45366dda185aa6fcdda9+67108864 f8f3c1650d6d9fd1fb81defcef4f5e37+67108864 157836f6e84cb522a520b8e00cbdddb1+67108864 ea34080f4a2c67c8eac2d204adae0214+67108864 ceff9152067f3579158d38f67ccfe3ee+67108864 d42fd7b0f9afa30622f19cdad886e510+67108864 ca252dacf27733bcd1bbb0fee73dbcf1+67108864 74bd8949c0a3ad016dd2fe0dff389217+67108864 c198a863ca7030e39d8876e0f84ac8fe+67108864 6c63203260faceabf16fed782bee1e6a+67108864 d5d3f52e5615f06c301d8ffd43bdcaf1+67108864 921c874804339001b4122f0302cef8cc+67108864 e0c59c1f377fe5cd9d6ba345edb4f519+67108864 fced978955c7d8526a6dbc344eeff8ed+67108864 4da3bdacd3c86355934b49b053f09650+67108864 973880f2f3c56727b95dedcaa4d0a60e+67108864 caf2b7a8550df7b241e371efa2fe692d+67108864 d7cddaecf10aa58a54daa2b7b2a02e11+67108864 2bc6e177da10b99fcd6d091fd23fb155+67108864 de817551ab1a9cd5dd51c6e81e0e44bf+67108864 f137d5fffb9fd4cfcf7aa4926f3e99c0+67108864 9d17da7cf8b872e2a826fff2c5374142+67108864 5830325f09fd13cd12bce3f691aad968+67108864 8215a5983c95e23a63c687b642f13083+67108864 11f76f54f3d0552c10299367a10cdb22+67108864 6efb7fad52edf9859561e9499cf510e0+67108864 a088c12c4f3927e74ce4a4c5f8760621+67108864 e0f969e633f92e756b1094e28839bd5e+67108864 ab0b88f96c9ee1916797ef424b683167+67108864 dbb6ddb82e96ffecd55bf7b7f7a512ed+67108864 9a055029ec6bd836c85dc954fdf7bbc9+67108864 c5f10798cc176c312c605fff373b3a17+67108864 05ed65cc2bb638c886bcf4ffce6dfeac+67108864 c4a3be0b33972b566228dbd5f47d7e5b+67108864 57ef58cc15ea5d8b8ebbe8420cd06b55+67108864 274c1514d474e64f3de02c179a82956f+67108864 810a77d1d7ba6a20e82c8910f5e70763+67108864 42a4f5e30a2f86bf11fe622f7a618ae6+67108864 9ff7eeca6c1879bd22dd86ce89349276+67108864 913bb4a677d4b4c7c131fd3b1cbebf06+67108864 9ba24586a78d824ace0337f321d2c100+67108864 2f892d650527a819ed7d499a7e09a3f3+67108864 b25bda0cfe2c4344d1703fcf3a6d4b8a+67108864 2784662ce216490c73fe67fbd52130fa+67108864 e79a6367f486e2fae9e54d0020b0db17+67108864 2f24bfab56da9e223c37b44e1f1ce9b2+67108864 b50f659dd903cb6f9c707f699d21af72+67108864 b94162503a41517f5a419ee397340005+67108864 6231562ab94c3be051ea9087fb8401c9+67108864 ef51cf3cd05f7810b6f322adc187ba6d+67108864 5d621ca36e6f35cb4f057b117d372e50+67108864 8b8239bd23a8adc2cee1f8a156d85e85+67108864 66676e37602149cc7d37ccebe484fc03+67108864 f91cb726e6ac09145c242752c4404e1f+67108864 ce73c7682c4fe26b98ee72a730010746+67108864 8f1642675b8f47e6cef4ce6a65e7dddb+67108864 a0c772eee3f139b1831cca60ce49b347+67108864 547699429dc8c3cfcb1e77e7618f2f17+67108864 02df0efc955879c3f2501fa8b0bcc801+67108864 a701fcf88e400f11220ddc2cbd83a73e+67108864 4c1721a042b1a9437c3eef71a58754dd+67108864 0a5fe95394f9f497e66217c117bfeb42+67108864 f23e04ce1d188c78e33f258b45c5ac8d+67108864 f3c7badf1ec40e33b375e62971320278+67108864 d2242648880ab86690ccea9f98275e43+67108864 8b397dfb9224fdfed3859ce86d74ad0e+67108864 09153d492860fc9d412c01785340798a+67108864 c3350ac90cf4d559a7295a730f18d20a+67108864 baebf81afe44cb6b42f5f6e6290ec0fe+67108864 96cd500b282c3113007c697612444603+67108864 a73c14020805ae3c1925ce55eb2e5971+67108864 433ae5411010c6213478f28ad6cab58a+67108864 3e042ee7b88f2d28bfe5b98b44f3be6a+67108864 fd9dde59a76b04cef85e85d61d02e6ad+67108864 d16f4bbcf2a0e8fdf932b54e35695844+67108864 efe1099652662006f509b99df819f1b7+67108864 613fef2dfc96ad3305006cdb8dea0728+67108864 b3eedbfe69eb52fb6bf7d21ea1c3bd5e+67108864 2f1784343b9d2cc4682ee293d051500d+67108864 62ac15c401cabc308f91639667229e0d+67108864 2afc3e34c284f72faded649c0ec3b72c+67108864 1399e4bff224e69402319a61c6db3dd2+67108864 533d737e352255f8f1b65622d92fe9c7+67108864 203eeb4e4410b7a59230eeac6d8e6e71+67108864 c8bacf1552def30bf0a3525bb90d4ee3+67108864 de0d669dd7c9cc7c394eade1f4a11100+67108864 b995714c0553fb41ae5ab417579381f6+67108864 5f6be59b124ec208b9e4d461fe0e5321+67108864 fd8f0a64895e2d28f52b94e980d4a6e3+67108864 776afe2ccc11fc9b9b9bcd1637ef346d+67108864 95b8cdfe70f64a49bc570565107ecf5f+67108864 26479dc9fe565e63bfff3f5850d77998+67108864 8da85395f1b08cd52869d77a7364249f+67108864 66f76a05e19e0580251ede71e2958e92+67108864 5ff92a30a1aa13ab0a42320b77cfea45+67108864 6f3f8613d13412c9530801a9a3f35c1b+67108864 50dc0b3a14dbeffd71b69058275b2d37+67108864 cf19857fbd6aa6f6c3c258431674a106+67108864 e0b084b9493be695c18f5d3cb42fbaf6+67108864 3aef149ddbecaa8ade6fa0afbc9de9e9+67108864 3854fb0bc82e15b33cb2966f5be46239+67108864 06b43ce1c20a4bd948750f7214e40f4e+67108864 2ee5b68ddb703c975e18319a67621c7d+67108864 2306d047cf9aa09caa1b2a9a0c541896+67108864 af2c70d38e589ebd8c7649a90cb065fa+67108864 71bc4c0a4c2d00cc34988fb0ecd1285c+67108864 0c2c0cbfe580ec70c9cdf1b8ef31d4f9+67108864 cb15da81b8aab0167e184f2ee2b78b2e+67108864 003e15c44f959ec8e46327b05e79d599+67108864 6ff440ea12517ebcc7636b07f840b7ab+67108864 7a40e62a496ee3bb3b5fdadf6d2af3ae+67108864 db1e814bd3ae2f39083a62aff4381f90+67108864 7c68aa83cb27f585291a835b4ac5ced3+67108864 c7a7efb80d3347d4f7a13618ba5aa3f0+67108864 1411ce7884539214a1e92568231f235b+67108864 02a2b2122889b53f45667af2a120d01f+67108864 ad22b2a76908ccde5aa8adc29df538c0+67108864 280e52e831b65105f06a38a4f67b6402+67108864 a5f9439149211f3a7d25fa11de178fd1+67108864 0bb88f24287ad72b8d58c536c2e34663+67108864 417d3b1862cb8df75a7e8a210f15e3a0+67108864 a441aa0f23faba7c3cf66def56e66004+67108864 f55322a307d173bb797924fc5f4afbc3+67108864 5a9a3ad6dd8ae415a0e696dcd40a2b7f+67108864 0bab46dbc9501d08a4625629f4d5b860+67108864 67893ccbe30016c1eabe3d2c8a80692f+67108864 cc8357e24fe32c5cb15b5bc8057b9f4a+67108864 9e9673069303440d7f9fbfbbd4092044+67108864 f0c3f8cddd5792cf5eebe8b79dcc1bbe+67108864 21ce8204bbdb6f016f11fe9ae5f6020a+67108864 0f8a1598ee8c418b9ce7c34c175bf9c1+67108864 d7c5a77e5397635ce1430ed537183d5f+67108864 56b7099cd423ebba5cbbf10d5e0d2e7c+67108864 1c9804af0c110daa81ce966a7fbf41ea+67108864 163197488a7121c0e9a33bc0fde5ec51+67108864 374b8b0e3949983e1ac9fba65a3e4024+67108864 ced30f4e0c46e5659f364248955c1667+67108864 5988fa40843d6a1ca07b957e77c8ec12+67108864 fe2111482b8ba2c58e2accfb309b3b72+67108864 87a7d5a127d9273d55f5dd0ff4760a13+67108864 a64150d31725405d33e689ab39377efe+67108864 c8abd310e6150bd4afadfe16e7d256ac+67108864 027fe6eb0b09a4cb755d1d62b0a1423f+67108864 a9b655be082bfc1c61e21e0510153776+67108864 aa2a094dca5481091ce7ba08852b0903+67108864 eab0206180b5c06bdc9202aa6d7e0eaf+67108864 d84e88e3bf76cb3a4a44bf98eee1d262+67108864 9d39e5294e994cda2d993e06770d9b7f+67108864 427b9a850025c42f01274fd92bc4ad51+67108864 6155de11d88a0a5e81c04d75e240bf37+67108864 b700a6e431b551630b28368317194aa7+67108864 2d5a90b6e65546928056048116c45dd9+67108864 c9ed6f6d6dbf42ffb3b377973ca7dba7+67108864 08302c1433b0fb80ca8dfff9e6f74681+67108864 92db4d53c6888a14602556bbb79f835c+67108864 c21fba4899004a955ef88e4ab3d38941+67108864 de1b9dbb2f511d2ece9d9837323101f1+67108864 54180d64a3cb966eca0356ffaea49f26+67108864 381354a3022c66550fb4e44d8034a141+67108864 597876a4a4464de636f8a5fbf3e543f5+67108864 c29963efcbdeee5b08f5f1575a1d6092+67108864 fce9d2b920f580ea8779f72fbea8d964+67108864 2effefe2d35c5ba29c9e2e6acc03ed4c+67108864 e04da28dc87c175eb01704e4b51fb4c7+67108864 f4adcd9d6ecdbdb8c2b91ac2ad591d59+67108864 53f8e4d2781414ad30e4479605b589c3+67108864 301c286433798a684f2d721c7d1f5c03+67108864 4f5e4d9c261ec572be8c117135ccd8fb+67108864 d9feb7b8981f846190b4e4f8c3075164+67108864 ff9343ec031079a66cd0a5560e4ae9ac+67108864 c4abd8ab5a655d3bdded0516ee442db1+67108864 db082ef8f2e3ee42677b34ccca86b5e3+67108864 6fc83a81ea15c177c41b2a56a736a098+67108864 c09ed63c14f57b8218470f6b0ba1435b+67108864 3c87cc66c90c9f0d995408df69305209+67108864 9c9e9b96e4d2970f55ff3f5930495d44+67108864 7572a36b461e6c3fee3512d8582aeb61+67108864 948d1d1e7c8ddf237fa910623c963568+67108864 84fea0e98e7718e039bc9d6c1632586c+67108864 9eb6eee60f28e1d075f71d5cc0447bae+67108864 3f36fc2738992c1135a4e80a28b28b75+67108864 db81cde123e9bcd6c291209d385129c4+67108864 e14d1a2b49e62d23b81fc9383322dd19+67108864 c79fa6a3288e27bcedee730a1f0d54f3+67108864 80679d686e1a55b5b22a9d250023c2f0+67108864 114434b3a95875165370385cd5adfcb3+67108864 83c5ee9bf0da6e2419913d4954d28e35+67108864 8c26ea89fb32a840068c2b049380ac15+67108864 afd1f950225dc30b68260e0a85297e72+67108864 35ca9657c4d2ad957b3d5f9f56a3f2c1+67108864 6bbffec1991d0308e6fefaa7a260097f+67108864 0e9f68eab1ff4f688863e192a374846d+67108864 eb672833bd531bfe24f1246628a3dd8e+67108864 7a3eb4e715458a189579184ebdec2215+67108864 1f34c4808c3503e1993ccd80ce850ed1+67108864 041b3c92294ed8be56bad1009ebde213+67108864 a88c8e6b793f189af93f8c2bae915bc8+67108864 af77c7d4cadc116f4c78f46f9f648edc+67108864 4890bb9d239182d6b11b12f4322b3097+67108864 4707a2b5d2951423b9cb5cdf32141783+67108864 35ba9cc88e7ad5b5c98e43a921f7ff56+67108864 2eb75b8978046345cde58d2176af7170+67108864 add1039d192c6e42526cf2b6afa9bd42+67108864 9a477df1480fd7592fd2ce32c39f7406+67108864 6fcace189ae0cf89e39c98ae8738a85d+67108864 5bf37955e0e45794d0390850401964a0+67108864 446e566fd032785f676ebdd3ba1dfafa+67108864 fdf9c3e975893f7c3df285eaaef9d69c+67108864 9befa5fbe2f43cbcd728b81508369f97+67108864 d862dfb30026a97111e96504a3058e04+67108864 78f0cd0b88f301624b5f104fa30858f5+67108864 4ab8f486d99a3b4fe66c9c348d6fd907+67108864 580601b7db8d4a0c9adbb2e4fbfdd486+67108864 9cff8f97cc34a751dd58feb19e416e37+67108864 63ddfe988e3fc9c4b88365d69996f4e1+67108864 b56ecf4f9b696c9453ee8dc948fe17ad+67108864 81c2eebdfa8ea6950cf57b863175e2a9+67108864 da2e52c5fa244bff3d5c86f7b702bb25+67108864 462e9f5d6031574b2a22ad60f8cab54d+67108864 c445d18f7531e24f0a160a7630b1b8ff+67108864 1974531544580a294bc8ed247b5786a4+67108864 21e93b14a1f1e35264a62d1ad97a3501+67108864 5c634b78ab66b25b93a6c019dd10307e+67108864 40c7314f60f524b551a121a98a3b89e5+67108864 1677007ea98f9147329aa04fd618fe2b+67108864 a79c00d0291a392abe73c0c162649ac3+67108864 15bf1499acf1c24c8b66ddb5c2f7588c+67108864 2eaea836bff8cde4519db6cf2e69b05e+67108864 1e5ec5554dce9eede58caf8933ce3596+67108864 ac1078460e08af47d6c5d2ae1dd3b746+67108864 a6dea03259087ab7207a5f5a1ef679d0+67108864 78ed9f9db2e9643daf166658b952c127+67108864 c5d12b1cff4bca0c8d15e1bd73dae1d0+67108864 c883939a7cf896bcd2f85d850e71b07d+67108864 fc16e276e1588daaee99de8018df0571+67108864 7a21a92e38106e93ee8ae7a7381329a7+67108864 8eb5b51ffdc62129fe0eb28e9e38b489+67108864 d9c70a717133085d230e29c83b495676+67108864 2eedcd7fe3d79c6a9f2b4aaeaad04164+67108864 da5e919680b6ea8d41b8758e7086133e+67108864 d1cc0d339784a72a4f0d263464e071d8+67108864 124967dc391185cd924e86e2d9ff3745+67108864 e6b68f6b97dc9e2426b699b3140564a9+67108864 6cc20ee8b272deff8980d2b3a4477e90+67108864 dad069a6ba6c47b35483cc9fa3885d53+67108864 b0eda0c60528e29f5b216012d4616b1f+67108864 eb5e3a335f47c063adfef05de7b4667c+67108864 b545b5ad590984a3f478998f5696a72b+67108864 f73ddc8d5914626ddd50bcaae6abdeef+67108864 62793b6bdb743f9448ccd5740b33680f+67108864 1a84b04f18a2bf3cbf38ee71592361c6+67108864 518bbaeeb370f12d449c8d63946966e2+67108864 5457694f602380c630b15f36ec30981b+67108864 b8b72eacb6589d8103d1bd9c05759d9c+67108864 122d43c6dd8f63428580de4e2a3b7e31+67108864 5f5bf06a26037d6e683b088559a7853e+67108864 487e0c8983c7aa7a9660dced20fd75a4+67108864 0c4bab937d54d2b41d64874d05266304+67108864 e585812acfbdcef8b863cc1c55d3f070+67108864 a636fd1e57ba72c9710a20b0615c9c36+67108864 7ec1d0e5a83afbfe0848b1d11a192977+67108864 6206fde59d76ea51aa58dea598f35df7+67108864 5541b1f4b2ea70f386f99fe2bec7ca8e+67108864 2765d0875069650b3ded5bcf1057748b+67108864 76fc47f77e38cd9e600e0eeaf9e30b6b+67108864 c158c77c833392aa67e8499812e5f83e+67108864 b180e70bae15ed646c3f53e3e741651c+67108864 c9270bff3ed8f8b6676299d470ca10b5+67108864 50e72e004bc6fafcc55c95af20b38cb9+67108864 c4b5047e53e0330b9312be395cae7de8+67108864 8471c29a2e2a64144cfcf81102567306+67108864 edce7e124a06247a4eeaa5961def2fc8+67108864 83623c9a99c45b228a04d4099be110ff+67108864 98c5f2deab5676fc460e553c792fd5d5+67108864 583fd68a679773af986ddea8c2bb2323+67108864 2bcdc93ccfb5601210573e985f54dfb1+67108864 b36651e5cd042a6d221dbbb370fdf595+67108864 e815d8da6a24f58b6079500dcb6dde92+67108864 3ecbd8481a063f405a5b87ada486e229+67108864 559159e2bbe19ec78551d4f04ca71219+67108864 207965435d3dfa7dd6b872205ecee670+67108864 09c39df8dd0ed895f2f06f5fdf331f44+67108864 222acaaf41033f052ace00e4f633f8de+67108864 3bfca4b0dddb38adf015657390aa84b7+67108864 ca141e093060662c7fda108ce8467b9f+67108864 b72c6eda282461590d16f05cc5b6b6be+67108864 ee2d50ded50608024eeb6e2a375775c4+67108864 97aa77b8d241de99d3ca107876e59577+67108864 5fbe7fb61babb4c6ea78353db046577e+67108864 22eeffd26c93bc1832c08664e567f2c5+67108864 ee46575fb609641bfc79f45d0a552263+67108864 af222b7594ef2a21968e8f5a355f602f+67108864 a3196fe7b6d2a992ca31d59eb86a4884+67108864 f86726c23cb938537bda8f12bed90a0b+67108864 92f65da548b38c97fb87baeb414b985a+67108864 6a379105ad86d53af712cf270cf201c2+67108864 a6342eb8f300adce14b3dceb65c48042+67108864 68c0b82d38f8f55f234c8b864f3124aa+67108864 9f836e76ec05bc98614f88104805ce94+67108864 9698568c75af9181b50fb1aaa248a17d+67108864 ba20012679f7e77e55d5c0c8d4c9795e+67108864 ca7637fe43241795a070542007cc0fb1+67108864 73b586d5f610791131e73f5e5e2bbb33+67108864 ebaa2386120e44e5c3b003ed9afb1a1a+67108864 fe94d8e9d03089abdc49b5a91bd0a5f4+67108864 549a252c97994224d3f1878bdb2d3bd2+67108864 b4f2c8c6c2a363005dd59ed295f7a372+67108864 4d3df1f5848bad821d9aa9ba4b906e5d+67108864 29214f6eba324b577f3e57eeed313d8a+67108864 c2b2b768109ee7a185389bb2c03c9463+67108864 430763efd090fd67b9d34648ec769ff3+67108864 0b45e8e8635ce07dbe95511a0f73a58c+67108864 9672ae65f691a9906a30eaaf1f412456+67108864 2790ff8d6a65162c64a8020737c056ca+67108864 71deb0da8ab7b2cb8ac31bbbd2153b7a+67108864 0176831f5ced03159f23d1605f09c0b5+67108864 a214e08c45eb9659412f7e1da66f8393+67108864 082f6320725c4353e1713e5543896ceb+67108864 2ea08c52cc0a421cdb787af6093d6a8f+67108864 293b457808839b5fb1c96b4ad5307f64+67108864 a8bd1439b2bf08516f48867f2649c92b+67108864 7fd29dc64c3dd3945eaff1cb9159fbbb+67108864 e9de19748265de7ae96d9b7d9bc4f021+67108864 2990043a6a02592178b3d515cebbeabb+67108864 3e22d44e8668c64b812e6a69e3fc9ba1+67108864 17a9aedc84771d8b0b2a3a8004f1b5af+67108864 58015b5a67f8bd5924732d5821c0cf6c+67108864 00b48587ac18be30d2ee3be476f753c7+67108864 8c6e61d5713cbe261f9bda849810b113+67108864 6687b061aedcac8b3c0397ca06cd7454+67108864 a680a002f3165cea16d65e66ae764e6f+67108864 6a5f349fc52033d3e94f98904ab425a7+67108864 51eb722ed0402ac5da6cca70a5ec5c17+67108864 0b71fc77e9ac56ad924716419c4b14b9+67108864 cfd35aa4526e8ace42fe58ae778310ba+67108864 c189e3b91cf3fdedd4f16420da6edada+67108864 90414e8a86c002ad919e3fca22698f24+67108864 4548a56cc0285c88b12cbd149a8c33b9+67108864 57ad0742333b640abaf99d2d76251bbb+67108864 c96c7bfb6e4e5e91eaa95ef4a7f0063b+67108864 0a2432298689a7930310d505a8b72b25+67108864 68bf60dbfd64b9e42a4ffe985ec0ed1c+67108864 82af1dfa30b23d296c8c492ff49d363d+67108864 52012e0f2502a53d1a7e6bd0b53c1f7f+67108864 b7a38a5eb68c133166608d6894c40323+67108864 99a474347fe2aa2f885d3e03b41c5a13+67108864 3a7812b49e18c60e8ffc7e06f3f611c1+67108864 bbf3832ed3621c86917153a27bcd6c96+67108864 f7c80aa5a5c8912c7b374d17e53f8812+67108864 31d27c0506420d4dae49bf3500171123+67108864 5bf3a9a223b785637a976d8a2314d15b+67108864 0e2e4d0f02b414d814bd8f142a63c611+67108864 e0cd118bff0722657e8af9d6f7ab9387+67108864 aafbd2e68aaddc80b1b2c9a58d34d912+67108864 31bf19492fca47885d25ff1f03458eed+67108864 22ec120fd0738b9f641e45b0062eba27+67108864 218c385c10060cb8ce8d1af4df3199f9+67108864 1662e09426794ba9017f0b2ee3bbe056+67108864 62814cac58ffa10896b0e1efe404ab07+67108864 aaf6128b4e32d506c09fc2ff789e4659+67108864 fa9132261ef770571d448da6e820f05c+67108864 7a155a0ecd60a1a3802f9a3dbbdac312+67108864 b5c9b5769ba7f38b516dbad74e4b85f5+67108864 7738f2fa92dbe1dfdb7baf21db826cbd+67108864 07d0c63d6265000dbb3900229e27ff72+67108864 ad08ac30caaa64b0b1c6ae78ef1eeb70+67108864 14373867dd0ea7c9c7ef2f5c8f6ab326+67108864 6bdce1b8e03734102e07a68a1cedafe6+67108864 582c8263766cceff15f0e1aff84998b1+67108864 e71f57598751ea906c68ff46c478c76b+67108864 a4804871f087cd8fe93b888e274ee024+67108864 144967b90aacf70d4265a83656223e35+67108864 4da6c6e79f38ceca986d250f6e932096+67108864 9bae8b1ff4292019c53888841f72a982+67108864 f0ee2e68deba6b63c248003cb82f71c7+67108864 a5ec67f66515b948dfa49ebf4c85222f+67108864 04c73a8657409844f66619031721cf93+67108864 1da9010012af695023de6802e1f4cd96+67108864 d7e4035ba647ca2aeb4f218a5fba7f65+67108864 ea989512fa8076eb0fd44a028d460924+67108864 c8e3fe48f7b331d0b264f302275818b4+67108864 a1f498f4b71bf600f5416509cfb3e65a+67108864 24b0c787a8d21be9435748465ec26515+67108864 d11ca8b28ae1b8bdba9ea71a78ff73e7+67108864 0017d2c46a2e0250eb5c6d75a9045f92+67108864 bc156095174bc4814efae2ed49367fe8+67108864 7f127376f0cf418c605c5950a4bfec42+67108864 bb9e9b067b0363c6f1502b444c0b4472+67108864 2f6b3a746f5e8cc2254ed9cc08450a3d+67108864 196f05634db6db0b069ba240e6a646cf+67108864 5493c7d92b9710993ae12ae788904d3a+67108864 845f7edc40ff2731224713ec3deb2575+67108864 f050395dfec775d38db5b0d57ea0a581+67108864 4e5b768d18d85067d93a6a519ffd10ef+67108864 5cf888ffe5474f587318b36460ce0ad7+67108864 c3be66ebe0fd039a13cf0fae05774afe+67108864 303023470389e4048aae95d8bb34fe7e+67108864 af06698e1893e2704e03f722959d7831+67108864 57e7124fdd21f6c580c4ac374861a026+67108864 7dbb565e8fbae60e3597eb711921acdd+67108864 3e6550d9f748d441dca47757cf98ef22+67108864 178423073bb92104feabc8f7708164f0+67108864 98eeab6311f4d210e230573b9d5d43aa+67108864 8e3feb1831e7ad494dab2ba877831944+67108864 32ad56f602dcee3ecd0b26b33f439705+67108864 13fc3c90af586e0171cff2c1ced46af5+67108864 15cab69619aca7efbd9dc84dda97c2be+67108864 f734bc52b02ff5e7d00ff35469495084+67108864 2eae852de4af35923e335c11ab9a707f+67108864 fcfcdae7f7368cd3f4cbdf5bbe4c9218+67108864 da45807d889e3a9c7fff8d5184101bfd+67108864 9b877fb32436c4b8b207244e01e1874a+67108864 fb1c79d9d336df91ee9e8f16acab2866+67108864 cc45d4bc6c390fcc65ac41cb478414ea+67108864 abe9501379c619480d0894455896c4bf+67108864 8272118879a5ba38ade3942a7678dfbb+67108864 e94ed5c5ae2b7b30088b5b0f15f7b070+67108864 56586f0d6388bf0a191685aea2884b17+67108864 2f78d776307e364cac16d82b7ce20c3f+67108864 819cbd489af5fa54f388dc255e156012+67108864 023ea9e60186ddf1cf51b39abd8d9b89+67108864 52aa46153ceef085ac1c81b22f8fc7d6+67108864 e79234af9de91a7a55c5c96097fde9a2+67108864 eaeb9ddcac5b8cb42cd5c311995e5923+67108864 3c98cf812311fbd27ca8562640969aee+67108864 b8b1496bfe192d3863aed28169a1a5a1+67108864 7c0055922279d093c461459d93be5d6c+67108864 89109de3468e0c004a5df2e6ab4aaa5f+67108864 9fdcec9a7189a195b82946f477e8bcf6+67108864 2e924831c2241f3f8a9deeb44013e8d3+67108864 1cf6e8b97738a95881063cff3c1d11d5+67108864 7cc135fab1e7d88c70034bef501ff218+67108864 b1e2ed6915c6103dd5b854cc064271d7+67108864 7734fa966c13cea05fc1d67fec540a83+67108864 983e5f5a2f2632e9ac307f343ab18362+67108864 7d0fc77105fc9c1326e81baedadc2611+67108864 8e623fe4072c4e9ebd146d836c725076+67108864 06494a14aa546919573fde57a86ba94c+67108864 ba0b2cba826fae4c98c807b96fda418e+67108864 ed01c980866649a1a8dee6d43017aac6+67108864 f65de1fbbaa627a0e8388905bb9c2272+67108864 ce6ce58654540a18de19258cccf39b0d+67108864 a496b4869c4b258a443a9ef49073838f+67108864 d5522d98d48cc32f511b54efc4b85076+67108864 d82c6c2cfcdcacbf396f782a66f5a0b5+67108864 e16c8092f0a4ea3b0810f3d428581d36+67108864 a3882f1484c0817d39c5cf4a9e5f5cb6+67108864 c047df254090031ac754fd1518dda335+67108864 adf67c2a1461a1f3d31825563e9f591a+67108864 490c76dad1f70cd18fb91d4ae73227f3+67108864 6b5df83749324e88e4201030f97c203b+67108864 428d3fc9733f6833c773d207bc48b3bb+67108864 ecfcfcd10eeadeb5d551475d6ca99d8d+67108864 c79936bfbe83976274d8841a55edc0a0+67108864 3690834378f8713ddb8b209ca5dbdc60+67108864 7995163ac59ad78033956399183c6f80+67108864 19a11565a6e351a70b1f081490adee4f+67108864 0e629545f3e092533656aae73161ef7a+67108864 1c89e4d1ead0d3962c6a5a476ab7259d+67108864 94bb9ba880fc950bf008fdfe31926d18+67108864 ef92797ef7501d6748c0565527b78e13+67108864 1ceae0b2ee74bfd514655fbff18f185a+67108864 08fb4aa7c2e95ecf51a7b9edb6ca8abf+67108864 0005f0aae91d1b8aafa7cdf811aba9ad+67108864 821b28d84dd2717999becb924400b2a1+67108864 62fc209aa8daf7ed5e7d3e368a959715+67108864 a51feb570bc08c90109f072a00a86e6a+67108864 3a43bf7c8329e803d5a5b946f3d2eeb2+67108864 5fbaefefd0e33c0561d2d1ad02243cc2+67108864 70125926487b5e14434f4ee652e57f5c+67108864 266db112d5741f7cc0033a9a5d892a02+67108864 6402d4e9e089275626ada0a304569b08+67108864 ac89f489e384afdeca6f675efc065d03+67108864 7d712d4ce185e805bdc1f4824a2c2013+67108864 5365fec63b04a937ce25921cc74fe5f4+67108864 6ad1ceacaac14aa728bc5a0dbbb1cb8e+67108864 34435c0dedd729486c3629f8cf9f577d+67108864 79bdaa7e0686a43759a8bc554afe288f+67108864 976edc9593c14a6bd89b17d64b960e39+67108864 64b9bf319d1625a1ab43bcf702beb1a9+67108864 10f927dec0765488bc0c4e4ad5864fa4+67108864 f49bef52b8d0fb6b617da9c2e7f9670c+67108864 455129b3c82cc5883065979d29eee373+67108864 021ab29d986daf4d3eac5016202f7133+67108864 7a6b5fa82b5504061c240832980b5fb3+67108864 66ef0cabcdb0a0597c1d0cda9ea80ccd+67108864 7162f8592aaef6ba81eaec040513748b+67108864 616a218103d3bb29469d3a114a161b28+67108864 943d9da1352428c411e9dc7481a048bb+67108864 63afb9a885c0eeca44dc27b09bd5e08d+67108864 c4a6f3d00323af98bb03f4036d534f66+67108864 0caf3534294ff0737818091a223b39c1+67108864 8ff5a74aa3014ff730a4b2cc7fa19f8d+67108864 ea60fb9aadfd2b7dd2c2ec8311a78917+67108864 664f1859521ffa626e2180080a86da49+67108864 39c2b35af70b0cbbd185e525b6811d12+67108864 9cd080c53f594249856240fd8fe3befd+67108864 46c00423ce315e452ef072f1fd2f446c+67108864 791ec75ea6e41fb6569b906340c8359a+67108864 d6171b1a4a7cd7e7151181da6e355389+67108864 db9124b010b6d85517bf6c19df1fbcea+67108864 9d342295e2fa66cab7a9bf525e423cad+67108864 ebfb6d5d8da2c885ab89ccaab22addee+67108864 edc6f46d9e98132e8a70a5dba6d0a524+67108864 c3a3a1a69c7d06724eb506231ebaa4ad+67108864 a5efeed9314f0ed8d8cd098d27899fdc+67108864 6357216e884f403729f9ed85a1e156ff+67108864 4e2e7af2debd0ac7334125eb148736ea+67108864 ee9885bbe6fabb1d20ecf5075c3ef1ce+67108864 2e082c8cee844f71be6d3a8dc63a3275+67108864 8204308ba14a9b7cf1cd14e26ae231c9+67108864 49656b0e77291783b56dff27f69054f3+67108864 bce59a39ca6e7171f413c737a80771dc+67108864 90818e71eec72d6ba69f87a2ae552885+67108864 713752842990e7e98f4c6aaf4174847b+67108864 c9c4f210937340bc0741740dc0bfed2c+67108864 37abdd6893d4b1104ed0aab3031e28d8+67108864 29da5ad57f46c5105f97b87db4e080b4+67108864 e482af928333956a09b440dbddf00088+67108864 08b9e84d1f6841abd8a994210db3c69a+67108864 213b94ad5bbc43168711864b441349ad+67108864 c703506d76acb781ec09c3285fb0381f+67108864 31c7fb70b7eb1832377c81509aac937a+67108864 6bfc148caa4b734b423d889d3b0602b0+67108864 110e00453a504570e90799b4daa042a0+67108864 6bc9e6edf15a1168249ed54795464f41+67108864 0bfe1332f9773d4056009cb1f1a8eab7+67108864 ba552c6d88ca5c6005143c6a7e85e7c0+67108864 11f93451e28ff65ce40de89091b62f8f+67108864 6acdc268644d8ad70e90e68210e8852d+67108864 7eabb04f5237edf30c0152c632ccdbcf+67108864 a038c58f9dda274d06736df758a29436+67108864 9aa9974c9fbc581261e09d59e9224680+67108864 6e5398224bfc952fe566de3ea89076d7+67108864 265eb4465984d2f68fc639657fdde4db+67108864 0b2b8a7e74cc58cb8594cfbf75e5cf7a+67108864 7d19acd58426a5b4d7cd2a8cd4e4ce55+67108864 7ac5458db9dc2cff8f961850d4959771+67108864 eedd1feb836fce4707d7f44ece26b086+67108864 82e86b19ac612bbcc31206c40fa9b883+67108864 41d7129bb2145abcdeaa257b3b31312d+67108864 6e1240f3fda156181fe0a1d52ca5fd05+67108864 3180a5269907a15aa42c4e448724f816+67108864 ddeb2b08aeda71f0655c6cc786f2a85a+67108864 7db290b6db7f6d60386f08bf00518e68+67108864 4379e303cb12df9a9f28a0f86756737c+67108864 5621082de6125cae13913cad7cd546e3+67108864 be1af8242fce966ba091fdcdf5d3d769+67108864 1e714951ba26e3b7a010ba78ac5dc9ca+67108864 68921acf53a6b458cd6e5b8e0ed1a374+67108864 7c6d8b960e16168a32805ee8373f8eb4+67108864 5a3b518f9b1529a7c144d569521b7731+67108864 a0bae5564daf95e14cce3b8842b15535+67108864 4406c2de1a9787f1b589789ce2f4e768+67108864 118f08b4245eb3857a46276e45bab1e9+67108864 3d8d6effccf3b0342af688187dc4f3e6+67108864 d192c8d6741a6adee036f5aba554edef+67108864 965ae2d62cada40f496ac05b403e827b+67108864 81258bfeaf7a9fc15666ae10af305953+67108864 ae23e489f9d9eaaf7d2945855e972c75+67108864 297187be9f6fa75f3445720cf961ac77+67108864 2bcb1194581501e8c20f00264256ed58+67108864 16bafb9d0cc7730239d180101520734c+67108864 976cc5ddaee712bede5542e7b003b0bd+67108864 bcd02f6a3b00f4550730440a5aabfa9a+67108864 a455a0dd014194ae08007ea6e8ffc203+67108864 6495f63085f1eda582bb0475a44bb34b+67108864 76f39563689b46c281fc5af603fe744c+67108864 3c730aa83b0c01bc36b5cd8d666a35c4+67108864 637a2ec9a7840d248259466fd9025b05+67108864 0fc5ed24a204865033809c785cb7c5cf+67108864 4a3908945ac82bff0c9c133a42a60035+67108864 a2bd743f3304c65fedbdb7904f76c6db+67108864 b4b548164626fb0fb5bd4e1027c65634+67108864 b8ada412683bdaded98f4d772bfc0b72+67108864 b6230517ca29374241efe1fe500f3bf4+67108864 c2219a2c649a50b03e63447d7cf76290+67108864 7d5c44bcd5631650e79c979faa3ff1f5+67108864 e8589cfe03cac2b0958c8d8182005944+67108864 2e2260880ffdf589dd731679669d4162+67108864 ce30ca4d2ee870a4b645641fe46f4bb4+67108864 222aa06cfae2d5fdc4c54e31e0a2f7cf+67108864 7a5e6c5b9e962ad698ef50a3546e50f7+67108864 cbaa5957827447ed2f2548c044c98c2e+67108864 1316d790c4a0c56c96042c27c774d417+67108864 539b1ff5b0cf43d24364c8a2ddada430+67108864 d297a6c4ce2c3b5738afb24bfaf4112c+67108864 9c28f3fe301bb8359609a38272b99166+67108864 b14881938bd2985ee9780c543d79cd0a+67108864 b9131f8ccc3d3fb4d7879d3f6ca6ba8c+67108864 7b9bd91dff75a3da7898c54341a84797+67108864 d729676cb8f2032aa5068c0b6f3edded+67108864 36fd3979f82c521e0ac49591c38a1399+67108864 621f831d2103670dd086fbf74a2baeeb+67108864 434b0edbde1d7c8ccc524754ca511336+67108864 6191761726b291039971013e456860b2+67108864 81f56aa9beee03bf95e2d96e10331e6a+67108864 478af52460b6c572c4586067e621ecb7+67108864 d1b46bdc141e6beb00f573c7aa2eb76a+67108864 95e9acc5d676161bd4011c915d35cebb+67108864 31fb0b0f97de60f84cbbb9c6bae275fd+67108864 68383b28acd96e9a23087138fd3f67c9+67108864 06e7e4d9dd82b4dd307805302f59b6a8+67108864 f01d7a68a50b47c25636a61615fb2dcb+67108864 3d92fe7f228b5db0eb83a955ac765284+67108864 22543080bfb2cafc6276f067344b6c95+67108864 c777be42a3b970dbbfae050a59db63c0+67108864 523ed14e70faffe938d9562bda81b006+67108864 52e0dd73df65a5c28727088a336ca9f8+67108864 5d3735e054e694a998cd7d656afc498b+67108864 1a8a3f179210a12402a6308381e78a1f+67108864 8406bc8043e9a249e9575354b90420ec+67108864 a8aafb1fc4c208d712afd441c10ce110+67108864 7ef66e1c5a9aa8ddf12e37881a3fad5b+67108864 1cc5c7bebb389cb5d7cb2768aaae7a8d+67108864 de67652071ea4c8bd9fca0485d687406+67108864 bccb14bacc9d2bf516903dafeba159ce+67108864 208b6c5356a84735b523bdf1ee8c3352+67108864 cc6678ac9df8cfd452e5cf84e7382119+67108864 d05d3afe72f85020cbf1c47619e08137+67108864 811a2caffe5295fda0c20cfe07eb9e7c+67108864 91b6e3aad7844631e03a4b4691b7467e+67108864 3b36c286695fd13293960956a1d9ec79+67108864 e7cf08e2fa2b68acefe9c7ed126b1924+67108864 01756f89511027e9f7afdc51155f9c68+67108864 b63bc9636a6bf211183727f9e124888b+67108864 b36a38a8b9a5b2bc0c42ed1f58e75175+67108864 059efb6daa914416834e244e34b2f7ad+67108864 30cdfb63916ff1e609bf2e53895b77d1+67108864 9ccff5d27dbbdcc68dd1805afb4a0015+67108864 9bdbbec05d44b0c1ef1198a474dc0ef2+67108864 e98c4216d9976c63f8a7237d8aac1732+67108864 a8d8205ea2e1356fad587c2e7bc8c8b2+67108864 49d5ecb84c5327966e083984c43d218f+67108864 702343649c578c8961b92373eb5e6324+67108864 81b31e5e42d1e0dc2499686be84a5a0f+67108864 92e94d7be66176d50ef2c7b75df8388b+67108864 e052099368f8175e3cfd319a69b88e5f+67108864 50e2cacd47f698549ee368fe0b86af2f+67108864 067a888f2fcf0e334a59b76efb988f16+67108864 ea973e82d757f6027d79169dec882267+67108864 d6ba6ba9cd7ed076c6ca75a666c1cde0+67108864 f970793e593c3b7b273dd64f3278b06b+67108864 181e4e39f6fe1eff305c7ca124de8df9+67108864 81d3e93e5fed970958ba33baf6514018+67108864 d94d8d656d73e7c22a9fc21d61814021+67108864 cba3f4ddd207d8d6550929d3d6f59e6b+67108864 ec09778d02b57020f1df80e19fc43df7+67108864 31f7f1ac9de231b22b0756f9f90cd1c2+67108864 f7f69f67fc00841c81539220938061ec+67108864 9a4e943bbc8002c7973b34877d3a8832+67108864 8b2dbd591511b111aade4ac6dbe7e9ba+67108864 3f048fe65ab2388790762965f79018a6+67108864 7295219eaa859a1050df9fd769a109a2+67108864 d414303c3465d3c676cbd88bf62751de+67108864 e2cc7f0c2a6f8f2be16566448187fb9f+67108864 67d498ecf74a5b2bffef378249de6986+67108864 3dc7cde461783f6603ae130c886747b7+67108864 20bb90dab534b0fe6740d0f9a91b69ef+67108864 c341fcf8c17f3f0bc8fb77b1c38a87dc+67108864 4f6b22463d3bbbcd1ec223769a991c35+67108864 49b7d5714200d8fc8065cb7867feedc2+67108864 3fe374cf036f57b052f5bfac5e777536+67108864 849a12126e6e77ef89c6a6fd40b3b50e+67108864 d6597ebb50acf6026937d7e34e0fe5f5+67108864 1db60c0d626a7dd6931ad9a8f012a7a3+67108864 c541492c1dd39a9652a12929de6c132d+67108864 133456ad3ef89c02c15255894c8b4c38+67108864 ac762257261e25124d0f3bff34d87e5a+67108864 902a5877d0ca144be4e64e49ddbc6a84+67108864 4bed9dae329bb5a139487c26f77beadf+67108864 cd57fdb99ce8f02a528e55adf394c3c9+67108864 ddded9688f0f1d644ffdd0713a418434+67108864 c78069eef75782c7ca73f2cd4b222e5b+67108864 770652d2d600ea9467c19cd6b25318f0+67108864 e15caa477a7f2919ac7f50421fd4add1+67108864 4313b9b47b2af2652e84b57faff175cc+67108864 c7d7e55181b1614e5db644302b89d7b2+67108864 be4e2c5abe2b975abbfbbe05481205c9+67108864 0eebb9ad647ca490eecc8fd85f9e3130+67108864 b81284f74640253d18110baf27b2edb1+67108864 1bf994344e46cefef0ef528a65b16616+67108864 5b4e51780ab0d2c620dd4a09607c914e+67108864 a369023a52d53a580c9ac2e5b6414298+67108864 1ca1cc6b116631ef9042b7fcc1a71069+67108864 4c238ef73d518fe846db3da59e7f3371+67108864 9cff0ccf69f6718db3e2a2c814d5e93d+67108864 7c08baa884bceb5a721a2d1c3631303a+67108864 3c4632c93c3d96608d76a1835fb7c53f+67108864 21a1e400a720f29ad5ef0c398447ab96+67108864 e03a0738f567dd01ead1cdf5195482c2+67108864 31b21120078f7cfa2ed8f365e7d4ae67+67108864 72b9f9dfd2dcf67316d397d592515465+67108864 ec2acd07100379e405ee88c69baf8700+67108864 ed0e5cf5845d7b4d029579396edaa93f+67108864 2d6e8325ae138e53a69daf270a6a7143+67108864 165b7b0a9b59a0779078b237a0f43859+67108864 5426931979acf526c7dac829940b4744+67108864 a19f2f3722ba8b743f37ad4fc1de7efd+67108864 7899a1f6dba4a7561613ac8c346be233+67108864 d4af28e803d3acf8baf02343704771e9+67108864 c0acd238a240fe5d887796ebf2c59928+67108864 81c9046e203b9ea21a3854a08be3b6c7+67108864 19be9dc41ce37336f95cdfdcb9bcb1bc+67108864 592955756e6e716301b545670dee9519+67108864 664791aa59678b7f35d91490ef0e98e9+67108864 871796aec9cfe0957e02a973e6929aae+67108864 a29cbb99c16228863e2b94aeb52a4d9b+67108864 21529a807f3ca8c79de6985f65c229e6+67108864 65d73e789e7e2afb2398350501c94582+67108864 ab0f11f1bbf28776c8a942cc66a9fa24+67108864 f26f4e283ff6b79edb5b518483eb5698+67108864 eac4a53e663ffe1ba44350304e4f80eb+67108864 4bc565e82bb421fb178737d8b35e4de7+67108864 d6c94182c341a2cefb3c471fbca1aa5a+67108864 93053012095770ee0ec3efbbe5250dfa+67108864 861d66ba010c5138d68feb386a8929a6+67108864 c7ef775c4324deba52152a63d56e22ba+67108864 120c437c1605010561ae054991e0f06d+67108864 62fcc121f247bddeb2e4690e8794ce04+67108864 b219871e84e96e5e15caf19df374730e+67108864 7a3b52d2d071fe20ec7e4d1ebc3181c7+67108864 462271a7aace014a37e2278bad547c57+67108864 cac6ec7d98ff4b14bc19090ad1e7b5b8+67108864 dda917590a670289dba64ebf4ec81e7c+67108864 d8ed3cb70550899546ade41043264a91+67108864 5476c343b293ceb581ff79577c026993+67108864 bdd564f80a3ccf32c745be5e1b379712+67108864 674c08db645cb5081699beb789581124+67108864 de7b66c8448497df3b29bd147a6a372e+67108864 ff6d3e917e61990074f704fd680c8795+67108864 188c19e8e02c3d94e78a8e87ffc3d808+67108864 84c8d082ff79b3358a206846466a5bc3+67108864 3908b9e0a2e7cccf8d84e417e9742311+67108864 b03f0a17946803d7ac479ed9e24de52e+67108864 bad1eefd25bde16ef8234917d2200934+67108864 05b1547d6a2c9ccbc8ca098ceb9cd56e+67108864 227b71d3bc344620f24ca2bdd096d1f9+67108864 4e3a911661430007959d4d3c8195683b+67108864 e003b58fda6183184169d6cc75ddce25+67108864 7fad6f2dbdccee6cbbdb08cf1baec185+67108864 5b7acabe0b10aef1faf11f84606ee771+67108864 9fd97f1a0b485c0fec8b1b3719e7c077+67108864 31032fec03d16b41492a4f4be3dd436c+67108864 084d081193ca6c8ffecca056ea8f49c1+67108864 dae3aab6f390dc7e5356e53c9fd96e4d+67108864 f3f9b46cb5fe5960dc39ae0aff326805+67108864 c1c90111b2966da38021e23ef7624d2d+67108864 58d9d76b23af01b0b8a79ed6c8adaeb0+67108864 1b7ae7ec0e2a8eecf3b104c6a69b4557+67108864 0a32a1d91c8ce9e4139f1175eaaecdc4+67108864 31ca474df7cc3539f1811768bc88b1ab+67108864 1096ff9961700c784e2d8602f32be34d+67108864 85baad3a44ea3d1e052f9f065cbae2ef+67108864 e1fbe64ae53e81697580c7fe706dd637+67108864 00af57013678b23cd6701d2462c7cb45+67108864 66ed4630ae4c7f5650b77019778501d7+67108864 c53eba1250783154d4d6c796519b0743+67108864 2509db5b0048a95a99c8a05141d25a08+67108864 7bca0e2f4ed3f7975da1eb96e5e991b7+67108864 6dbc441cf6a53df1e0ccb2c458147187+67108864 9e68be13f859009d018bc89f013e2a5d+67108864 0b3260c834bcb8b24957ec1bdd834828+67108864 8fc3818ed7233f087dff6035d0d0e68c+67108864 af889dedf0f936ab5cc7751a3d8e273c+67108864 9619e43d50be73c63668dbe0143d7848+67108864 b172946e97fe8377517616b10aa6f5cd+67108864 483a1c541268bda2ae26f5babd1a3e4e+67108864 b849c2251770ba0a27b8cde071a7a8ea+67108864 21ad98835da14f125e0ddf3e5f641d1b+67108864 e746bc97b5689c1f05824139e6268be3+67108864 4bc2175232d8e03caf985f0de1d57ef5+67108864 0770fd6f7d5be477b1cd57357c65f2f3+67108864 215aeaa9a9883a9608751c8426340bfb+67108864 c30527b55a4841c52206b2ac388fd09c+67108864 109da8a7a4f5d899cfc2aec78f10417d+67108864 cc6b5a96b78c9f72186ab904b53bf6cb+67108864 45d85dd5079605ea72b2956e178936b7+67108864 511290d203b744c2f205f8e391565aee+67108864 292c5c76e08184652dc6b016cdf7bd69+67108864 b6b9f3aa332b32172b12227452fb9a0d+67108864 3faf30b6e440a7e63ec5b33026c4e8f2+67108864 287c54f2ededd394a348db4a51f31d73+67108864 86ea3ab570a70fcfb97cad610f30b2ad+67108864 b0ca221dd6800789a2b0e3ea3b3735ce+67108864 bf170401d62007080905447557163bd0+67108864 845e02d0645ac0bcc74f12573af46cbf+67108864 a7074ebcbd3bc6e477d74789565cb2b6+67108864 dfed9499e9f1aabe61841af5db7e32d4+67108864 aac55aad3070c0f1decd3648bb8dc75d+67108864 1e430b86330b7c4f20235ad50934e29d+67108864 8e6952bca44fa90f55d7df7efa35c24b+67108864 c9bd6e4d596358098d46e9c9852ba08a+67108864 f0481b0838851da2d672fecb8bed0ed1+67108864 39351d86071a678a156bd6685830852f+67108864 6f405976b4fd4b9f0d0fc482f11cdbb2+67108864 b99d1829308454f6a6d4c1f7fa67fc22+67108864 a65479a2abf49e006fff628f524c64d8+67108864 384fc792211710c36090828945f633b3+67108864 1b0ef2edf16035aa787a2234a2773678+67108864 2997683ebe6be9bbdf19777e6dcb7f85+67108864 a97176ce1a49dcead6f98c5d21e21f4f+67108864 fd8b3633b4da408c5348c901ee991c5f+67108864 05846a8b6bac781a0d5f0ae93da95c31+67108864 60bd664d28ab876ab2e4561f45a81413+67108864 4b2333ef5f5d87b933c943f993baf855+67108864 6b6cb6b3c49d63ac5b8c27a7287ffaa5+67108864 5c4c18633f8ca72ce9e4762b8e39c5ed+67108864 cda8a7e76d682bf2724dc36dfd628fd0+67108864 251af4c3c4c0297371c9cbc18f5391b7+67108864 3d9cb1ee432726b6704f4f062242a15f+67108864 d9be281b494fda2b2e097ecee73951ae+67108864 64097a37bcb45de638b1d1f3d02525e8+67108864 ad7c99315b582d3eee02a188986bbb06+67108864 7dbbcd083f126383c604d25a36318240+67108864 953dd0cc0f65581a304a69d1d8c6c074+67108864 6a4717fd23889c9e57e2fc16702b2ddc+67108864 ce2cc9afe4e799d38ac872ada6dd1c76+67108864 4874f67fe3f584f4bceb296e08e902fe+67108864 2eb3f1c36065e4d1356e30f849ef3887+67108864 8224b179ede992888735c59abe61208d+67108864 3bfb71ec8ce2fe06abdc1c072d2109f9+67108864 95b077361de7df58fac636a8c63f084d+67108864 34ce1eabb9b94098ffdde1971958457b+67108864 f6dcbab5c3c046737e2603deab056786+67108864 97381d8b85c75d95e4060e90ed0429cb+67108864 8009035222650ae111fc04889f6a91a0+67108864 7de4cff45fb41d2ab43da4ca4787a1b6+67108864 56e158d2d96c87c61ab07aec79a3f83d+67108864 80446cb5b295a6f943c345d60ca60fc4+67108864 014e252601f01f531ccca2232756c299+67108864 4521c10e47a426b0c8837cc808e20877+67108864 acc6f83179ba69237c125d8fbb85f5fb+67108864 b3c6f417342f1b43da8d644c10d2728f+67108864 f7d991cf5cfb8923681dd841fec2c3a6+67108864 81a497293d206956365b5e5994acd53f+67108864 6bbec259f46456e0ecdbd4cb4b3e38a8+67108864 6920db353f03e0b89a17c6eba721024d+67108864 11e1346974f9c5c99ab4e116c8b6e721+67108864 dc85c5e79ca12b3ce241634db0887a63+67108864 02ba2753b14df08c6065fe3d8067f520+67108864 512295f97d8196f4a3ee96fa7fbf28a8+67108864 167e357fef386e6fba3be79338c6b242+67108864 be1203699a729599cb62682276d7912f+67108864 57af384e85fbf8f3794f7187dd66da47+67108864 47551bb1052fd5456d8146be45ed0553+67108864 b96a537acec586386129a748be6210f0+67108864 5d9ebd409950ea6daacbf4fc81f0b8d7+67108864 efde5b728f3dcf9f88d791b2796d155f+67108864 2d0b282d815567c51d601a70fcddd68d+67108864 c4ceff02ed6b0513cafc9e3246d1457c+67108864 d84624307b9c2ff7948a79ab9f98646b+67108864 c1a0198f44e5bb6317988e9bdd613650+67108864 41e517c6cfc94a2f01f4f3d8391a9c66+67108864 c88cb112ac786c60539be3892adfa4e8+67108864 5ccbe64ef42d17e7d9a5efb4e555bcbd+67108864 98d2f0a55f84aeb228eac5d2f1bfb880+67108864 c065beef0ef2df2a3e046c13d2f13c21+67108864 6d029e69045be3737979e2711bd50ea7+67108864 384231d48e990757125f8ed75de83b6b+67108864 0a12b9a19ca1cfdb25ffee4cc3b79f33+67108864 5b8cb8cc4670684db3308db01c15e426+67108864 de0a828daef9037a9c79f2c631c1e0c5+67108864 02673dc624408ab64b89325ed9758ccf+67108864 7e3379b52437c0063d65dec9c0d425e4+67108864 fb6874cbe8aad09ac938aec059f8a64e+67108864 6f7e3055a1d27198d59b9db66e7f9fdf+67108864 592c577ce395168ab1e2b7f169f2810d+67108864 8dc6e1551248f7597693d128f0099708+67108864 8e59539a8b9c76e300824cb4c6e77400+67108864 e06cfaba57b978a4a60ed0d92830019c+67108864 fdc786f66bbe0ed72d008a9a93507238+67108864 df834d931b666e9892346816d1e023dd+67108864 5abd6568f3f49075aec50be5deb08b24+67108864 51c3db0547419829724af016a34376f4+67108864 5532f28919c3e73e4b311532f5173885+67108864 9f35d38d94c833e4bbecd64e2a5d820f+67108864 b9a010eb74aaea97ec508e46d2724635+67108864 96c729f98c1cc39b094e65e9912bd47b+67108864 37e46f23c8deef3b89bf4003034d3d0d+67108864 9bdfb8ab69c3f939c089658364e408b7+67108864 36e9ee64d69e5e766673cc0ff3568784+67108864 141e5f5a866f40a332481f8f0b5a02c4+67108864 13759de2988ae2c61bdc0646bd3f20c9+67108864 cbaffeea577a3e3022dd528979dd66a5+67108864 47d71f445f8a913639c2de35748ca1ac+67108864 c96f556870b01298a200c984c1b6a485+67108864 9101f4c9077a4999b25a816c5c7d4577+67108864 ac67846ccbaf979a06869dbe9b339b67+67108864 ae04dd6dc18bccc506d4a6c154ab0984+67108864 a7b1d2031b7790d6285ec6ceb9bc7caa+67108864 51cc682f1e4ca25e919b805449c99db0+67108864 dd675b1ce02a4cdb5010c23b8b8effc8+67108864 5402750a6d0d6b745bfb62cbc7a0ef41+67108864 abb173de47c177a5513b6eafc8e067fd+67108864 821c634696374641e713d263226f585f+67108864 312745c720c1dc832b990494ec21d328+67108864 ec41d509395490b699cbb5371748dc0e+67108864 571af59f889abd5666ebddc4acbf26e1+67108864 d13ec87ec18d2fa7c8594a7a683b2b87+67108864 c27783a42ed1b39611c5b4e56b898f89+67108864 256e0bd60301b630d4d9ae492fdac4ca+67108864 25e79caf8013afb12230195662f86195+67108864 06a2e7c753f64011e34974e7c2190b41+67108864 534e4134093ef3418c0546c6e4365783+67108864 4f973a9f34db9004c06c99a3e74b3586+67108864 37f3d57d8b0d46fd66be22d20504c3e4+67108864 f36e3a3343c70e8f6754d037b029ceef+67108864 8998b57cb2f3a4d4478b18b1a915ef22+67108864 e9a0de38f943bbf35ee736689b88ca2d+67108864 9f4b3c74f27a057b41ea1409c4da74e3+67108864 06b20eaa64f9d3dab4c529a8272248f8+67108864 6aea7ee9338fd608ce1ca71c8138dd16+67108864 add48912237a5d2310566a14e713fb5f+67108864 58471508500ae0331ebed69b053b3c1f+67108864 0f9c0aedb6cac897b66f462066aad408+67108864 7ae5b8003a518e6e73e0789744698564+67108864 f4997614ed3b49007c5ab44d55f9b2db+67108864 dee630fde59d34a16f13e06d696ff961+67108864 b24b9f7e6ef3ce54460e0c642229d8d5+67108864 cb98440ebce12bccf65c6b0d03dda757+67108864 1657ddc3534304afa69ecf8aba171de8+67108864 8136646433203d0f92305094371a044a+67108864 86980ec972ce5b94fd523b0005ae531e+67108864 25dc54c2c9ef76bf73baef782e9426ef+67108864 426c837fdc0e955984bd4abd2af4bf49+67108864 41fa3f238068fbebfeb9b5158ac624b0+67108864 c8d5838a82ffe2b1d160d9ecdac6dddf+67108864 cb8d6dd2800967ce59054dd528a34523+67108864 9d217fcc11e3c1cc0db31410b9725c2b+67108864 11fa34b137060862b6066b0c38583c64+67108864 47bc8a59acaac90e96cd61fa2c0f7dae+67108864 26c46447138d5f96e00b9a3501c1fdf7+67108864 3d28f5a3dfbdc118eaf758d5ff3e4d06+67108864 ff609548cd6699e0c060fedff5bc0ed4+67108864 9a6590c4f9bc00bbf1da8e0f06a5e152+67108864 7ebaf211e7365e86f04e9a8580c64ed6+67108864 0ff0d02833920ca107acb6f023f561bf+67108864 ba4f70a5ac053173f79d60ce3b03930f+67108864 055da2c4cee6215dea4d53f147b23004+67108864 b5e1a6ec785aba278cef39e0a6448a44+67108864 5512c19387b1dbf55b0966fea0996859+67108864 8a7d3fe39533cc44993f6f7021b101b4+67108864 b4b285ea1691d70835d477003691f40d+67108864 fb143f5264c383b1f9bb0aecd311040a+67108864 d990e38d43a13dbd04583b2509464048+67108864 66589506c3fdb72c89b4d57d2010f82d+67108864 fd266e7a1f8a3075f258c1884e8aa28c+67108864 148463ea6fed5dda988f4dd6cca2386e+67108864 a486f29b29d8b941513c8c0fb1c6e228+67108864 8cae319912b2b63bac4ca1ff0293cdd6+67108864 c2175b5c46aad00cae0dc874fa78d735+67108864 94fe5a4d987ae23d32ddd942654dbf34+67108864 366fee4ebcc1c4436e09886307d594a7+67108864 145819f02f913ab57b95aa6e687c7b65+67108864 021b8921b8a0be01fcfaf6a8f432ed1e+67108864 44aa8530fcda59a7386ab753d852af90+67108864 84c95c93dba1c2335c5132aea1bfbde9+67108864 ccad6eed58375535d5888a94dfacf051+67108864 8c70c1572583289f4f886b3e7e36f4ac+67108864 1f282e0018a1ad18505c191cddea2cab+67108864 c95e3457eeeda4ebe2db198892985d53+67108864 0cadf623f5acbd4c9bd62125de6a7a84+67108864 88bbe2bd406b21002e577196b7dec646+67108864 01a85e867d8f17994c267ae9f28802de+67108864 254a198d49a7cd9abc7ae6f9472ff938+67108864 765c620ae8b180b36e1dd15b9e46415f+67108864 b3bf18d1866f90046c14b21e1a49aeb6+67108864 64586178bfbf5919d7331c5417f343d5+67108864 b9780d2f2273ff02a535f9aa1d3ebd85+67108864 3e91ea1b91d943edcdc02ec2d2748f41+67108864 9b98df65c1d3b5b33e49b97177ec1b00+67108864 06c841928cb336b39a3fbef2ec27a411+67108864 f8d137eaf5bda678bf7822fa07e1d5f9+67108864 69843b1ca92cf826a802693ef2b2ae44+67108864 992a200bb822df303b43a2351bf302a0+67108864 3d20c7b9643d676eb2d2618d34c98270+67108864 31a88741befd885c16bcadebfd5a8cee+67108864 49ad328a8d37103e54a16dbae4c3055c+67108864 215e0e9cd05d16694b8cccd48dfa5abb+67108864 987fa48895459fc6f33853ab57fb6dc1+67108864 a65ac062423a006d76fcad051d72a65d+67108864 a7f805ac6a34145fc3b8d667ec43d576+67108864 dadabefe4c732ddf56e988a0ce034093+67108864 00e73b019e926773bd8b44e55ebfe89b+67108864 87869dda7d5df3ccda8050b44416b584+67108864 76c6be6d066a24b1b9b0aba1e3673f70+67108864 2c754bd71ef5bd4f72ade61d4434a7d4+67108864 7550d3c5d929e2433f167307593e468c+67108864 38113aec6f56566d7e9567c3a17f28f7+67108864 f7be1e07c0d71923a78e80fe90404bd3+67108864 7cd4833b1898db8aa453b9004e25c4ba+67108864 c68a382c523a60f0fbb0ab6073ea910e+67108864 0b771a04b9796e9f96c8da6c0e6b0fd9+67108864 8693722335dbf3c7b959c615e0fe6924+67108864 5cb47ebfba5a7db4b42dcc7fca2bb870+67108864 636be78a2c685b4da74e97cbcc124105+67108864 551b759b58ac10312ec353b7b0a267e0+67108864 ceeffeb5315ea9e54ee2050526b23bb8+67108864 c4e5252e8b0c6089c22ff9da672467dc+67108864 ebbf8c423715faf70b3af0077088bc6e+67108864 991c7c2448f265e70b0ac16ca43472e2+67108864 7c47a1a33a8d8e9588fa45f42518cc20+67108864 245c2168cde621737996c3fbd6c470ba+67108864 79047629ccbfef51995de48da7f3725e+67108864 e4bc4d51564c761c1f0fcdf1c80c6699+67108864 f14f733fe67b971cd66fd8b36564e29a+67108864 7eb7a28632a62a963e209bf8bd38f332+67108864 32ac8dcc12935fdd2d9171bcdfb015de+67108864 618f64f3ab4219f2b2923086be90d457+67108864 c2ce069535fe3beca8f628f18f73e653+67108864 39f9feacd8ee8a9165529930e6fa944d+67108864 6b97fba9adeab93c0021133ba08b2b47+67108864 5fad45965eea86e0f32f7631f852ced7+67108864 5c2fd36a54b250d15c4a04d6f4c9ef1a+67108864 46e18f793a73586043daafe0e013799b+67108864 1f5d09b11cd22a8f39d80e6162754274+67108864 a7333383f35cfe90ea57639ecd5e0795+67108864 2092efd510100ab4a93d08b240d4e551+67108864 6c8aa179f44bfd647c47eb5b5e04face+67108864 848379844fc6af50f86090526fe222e0+67108864 aff62043ce5de2aedcb03544e6e5db57+67108864 cd791e50bb80cefe40b2ef1b2ca85526+67108864 2ccde8a4341f0c8775c3539877e53fd8+67108864 7e2c4ca905113146e57920b996f8938b+67108864 c1ab3da1fccde2e04b990b3f54e7e7e0+67108864 2f152fe6cd43ff4bc5f9870189c5fd91+67108864 362763218d47cb2ad1be8827c7b51aea+67108864 9525519796bea462fd67a883c547d60f+67108864 13689b46f56b81757265379951f4bbb3+67108864 b9a0e158c2ff00011baff7d0db7e0e35+67108864 ba1a9edd255ca7957fa64b6c578f0de4+67108864 9b63e5f3b4d733d33de31dc2a6a79b48+67108864 5ef12f13166b39bed94977b68310fcd5+67108864 a515cd79b3361536326bcf2abe9b48f7+67108864 cf2eb5da8e95bda57de0836808c3b40b+67108864 65570f99a823ad70b69fb603c400f355+67108864 02c5238434e15f45094ca29aeda3c35c+67108864 596b6c24fd2f6414fb2d29b4bea5b104+67108864 3c017435093274bcb039d83568a7131a+67108864 47c1b455a5604fea60e6b906fa91488d+67108864 e074b3d5b5c478986b821cbc88f9dd77+67108864 4408bb38d2012b2cc8d856a83f8d9dc3+67108864 7d5a0460cc1d38fe20c194a673d6461d+67108864 3e79d38393f59cf7eaf7eeeb4b5ee82d+67108864 452a7aefccfad5289e42a3a3f8709ef4+67108864 6d0398bd5641472117545815d7906eb4+67108864 63f43499c4fdd70f9ca016a997777d63+67108864 ea130df56228d6d0e99397a1e5213ba3+67108864 da9b41f4c338e33f0a913e925f5ceaab+67108864 e1c79b8efd129398d6e8dc84daf0c65f+67108864 727b14298f8be46bae6553c7705eaef2+67108864 d7d9955f80c1b8f7f22d75ab64599aa9+67108864 fec64254c1e06da83c769861a48e0abf+67108864 2cc3c9076ca84d0b3d1424ff23f5e18d+67108864 be0315b12077acb758fb6d607ec0d9db+67108864 609a5aed43714ac588ceef16be5cf0bd+67108864 e8528687518544546f15d104e42ab36c+67108864 7590add63fc192d47386d025f96a8bf4+67108864 010654a6ae811cf3c911c34a7c306282+67108864 ff72a1acc0072ed5dfdd967da0830b6b+67108864 df6f44a67ada6387036e07449b2def8c+67108864 14405c4605e26f7114cfee29afc12e8e+67108864 e3f76e3d0906afeb8e3491e7890386ef+67108864 04df6b259de0b2cab861456dcff4707c+67108864 e9c9c7dfa8627d8b69a3d37361965a8b+67108864 a8f2caecea074252e7d7268f161c3ad6+67108864 a3f0b7cf9f5285990bd09a991e9046fb+67108864 5f08577621f017b31fcb40955fc95fdb+67108864 e4f5c8e2127f0e6c3387acb41b84f331+67108864 eaab7103ab17f9ef849287e24857b9c6+67108864 01dfbcc8bc5d7689f5f9b0969b1f50d7+67108864 dd0e627ba4e7cd97cfd07a89f34ab2d3+67108864 628e500b4a1e5739827242184dcc55f0+67108864 c1bd7e3cd8f6cb893c6691a1c132e41d+67108864 a8ce57e72e494f6ff16c01416a715388+67108864 e5e4d21216c2be92faead68dd4a7cbb8+67108864 fba18a980ef743d02623bdac1fdc11bf+67108864 fd35ea347e664d2bba5a06cc5b5859ae+67108864 c7c3772463ffddc941f864cb561196cf+67108864 e3d4d8d4c0582df9c4d9d7df34eb7254+67108864 0e96910a0a2a49a887f7c4afd7c6111f+67108864 d7d0ad947a996de69cf6d20f34dd0a75+67108864 7513ee25f082164fc1e2dd9303fd6dfa+67108864 ba35f2c1e66448e18ee94a7567e901ca+67108864 ab894212dd52e4048db5db39267af038+67108864 0fe5d7c56c2cf526a0fefff4361cc41b+67108864 6a72fbbf322b4efaffec4c17e16f0337+67108864 7d7ec2f367837d0a99c45f13e2a72ec4+67108864 e531e5a0f983b625b97dbeb6c8c75e39+67108864 141cca3d2ef79428c45e31b8196680ef+67108864 f5797709703765504615673f3a7798a1+67108864 42a7d894d9bb750583981d721fc0b43a+67108864 3538a8dbec2f3bfe2752d45a71e70b89+67108864 c80e07e5d0ca589894bf774edc001f37+67108864 47337a94882b8e782b9f52f5cbe47df7+67108864 989387d2308d63dfa14f1984764daa1d+67108864 ec0611f2664f96a0a146e82efe340723+67108864 fdfe2ea11dcc789a16d09e7f57bd724e+67108864 ed1c5b025df4101ce2d0453c52bcf44d+67108864 c871836dba44d682c2e9bd5068184083+67108864 da3e03f6d48247957ddf1138cffcb069+67108864 f0a4baf3d0c7b390005017316d5f2466+67108864 6c4a4f37c8d1c2e96ebed82c2112f2a5+67108864 b16a1edfe99ff8fac55049dd1838e3a9+67108864 830da62d52b0970e8486e09146d3c380+67108864 4f8285c1c54f0bb0e2a3548a709ca801+67108864 715993ca1791faa1c2318927f99e7cde+67108864 4620f01f02827a655dc211e6d19da234+67108864 ff6e868275e6ad24c573e4c158b5d36f+67108864 6cc04d5bd2dbf95a8bf51c3b4514e756+67108864 c81fcfdc4df6edb054225b043a3d0006+67108864 7eb19468c9690ff9f5ed0606e76f1ecb+67108864 df142d2444521375a0b3419e4ddf289c+67108864 85839ad5cd690b60fc3c9ffde0b16a48+67108864 a48acdc808f3f6871c5b1ddb61b856e7+67108864 0702af55adf78844d8447ae2edc612b8+67108864 6df29acca1f5512741144462c9965066+67108864 2772528da2379d504ee0a2f2f8f6d654+67108864 9a48c99615d21cc3803bab1109d01b74+67108864 c43285f8335705ff5db5c273649c1abc+67108864 95f810aee86d91c03e830b0b07c35802+67108864 fe441d6f0df7600e82f39bb8b783d689+67108864 a5fb5cd4c8bafefe7295d832d54d153f+67108864 fc3d46569b39762465fe0a52a4794e53+67108864 604abe47fe48c7ee596be8cd8593a48b+67108864 b363fd001c92188e289b26d54a1b2ff6+67108864 fe882c56c35ff21dcc34f96531254c5b+67108864 76ef911b4fdd4f71d93b74bdcbc9c090+67108864 e2ea51150b31146e112e909f64164267+67108864 d2c5b720e097815e664f6c87f0cf4ed2+67108864 97e7507df7dd00de336a42dabfc2c2a3+67108864 4491090d96143ccd1901779e9f00aeab+67108864 931d4a0940ec2eb34fef01cfb8dd9595+67108864 b7b81ce4af050cd0a01a0dc86a794805+67108864 77b4e0d34dbc3684fc6cca5120bc3456+67108864 ae2f71e229dc701bb379bcbfd00fed30+67108864 03e3daacfd7829c88c098033ccab1fa6+67108864 a6304b94717ba7d063489a01fec40e1b+67108864 cd4755b79ef2912a216fcac641af5635+67108864 3add1f551929e2bb8465bf103566afe2+67108864 575f0da37b5e9d2041faa60d5949af03+67108864 ab5a61475c7255b70370fcee5dd9d94f+67108864 30634d01c7f400d31d611cc7a7673d92+67108864 e31a7d521389ce6891f698cf268437b5+67108864 846f9a6630755b7a8b882effb86d2020+67108864 52e1eaf4662a1bed7e63d5310a893a43+67108864 8d09fac511f0037c94037b818268a2b6+67108864 774e3872523f78fdfd6b6ebce2b68c2c+67108864 ea5f1d513ec4f40d70c8f8e0a8726002+67108864 ac296ba33f17bdb4e9159024f8e4cdd1+67108864 c9a195ffbfd1259b22153695b36a2bbd+67108864 38b4931a017a78fcb6fc16b0e72f3ce0+67108864 702d41530330c10a587400342185ed59+67108864 05ab5fde413857fed335ff0deb326a30+67108864 2651b1e0e66b3014f752bede5e011723+67108864 a12615fc13b38ebdca36487bb3591724+67108864 e2992d9c680a9f7e11270af1b133e529+67108864 fae3470df006aae3f2bb2cfbb0953ed3+67108864 701c0290354a64872ad219a9244fb8c2+67108864 b93e0aee1e4f38b7f7fb4e16ff8d1ffc+67108864 8964e1e6e989bcafe111522b00d47713+67108864 51e9e5dab456ab0eb7b59279c4ec06ca+67108864 725c44c44536b8ac3fa0a9ae25d9baa1+67108864 4f39315c0645812f34179bde2133fa19+67108864 7bd82c0b2754702ec71a0634a9dc1d17+67108864 5de934e6e85aca1a204a89c3e99824a2+67108864 7bfe74cb7feff036a0ee21f370712821+67108864 0fc5fcddb3c53f5b53808cd958295800+67108864 d3f20cd29545736bbd57bd50f07b1579+67108864 0c64435faf1ab3845fcbb0e32d82e999+67108864 ea441e811b3520c2822c6a953144413a+67108864 d2b394a3ab92e0856a230fc11ce9065e+67108864 aa0c5f125034b3dba21fdfa3695d6a01+67108864 a8f0b4118ce8b8cbd6b7774679032512+67108864 339ee569c3993742cf8f7be8d874045d+67108864 1b38e6bebb07ff094362ee79fcbb6989+67108864 7c0e35f1ecceaf8a7588dfc8d3aa076c+67108864 fe15358161d85528453800ca110a449f+67108864 e13a94ecade9c1334056f51001161f0e+67108864 5ca9d755a0db3f62206b87f8489fa84c+67108864 1005fd30a8e26c4c04f5b39911722e7e+67108864 21d7603eb5492c507fca121f14b8d132+67108864 b1c8f98dee262a8a2084e1382454942a+67108864 1be9511623dfe333fe39bd2677811406+67108864 e6439cbf2bd93d45b11141be27fa80fd+67108864 12e41768e400ded7a86e78ed33446b65+67108864 3d99f810b556b5eac4247c3317b8616d+67108864 23632aa22a1a08cfe7a899f568511e87+67108864 42b10f75f25df8d105919717d081a850+67108864 aed75190ef2bd0c0fb2fad3e8a943934+67108864 fc57fc90c814367b5b34429fd52b4ec1+67108864 53da1e5576aacde23c1c86e1624d7b18+67108864 ebaf7a0946e3fc47a636389faed47d09+67108864 7066d5399a64e1dd669506972b53bdf9+67108864 077a6247a557f0f648fb492308f4cd74+67108864 0e0a5887a578b38577464d267e2b6df9+67108864 577478f28f10be523db58f30a56c13cd+67108864 df2840943cf215aea832ffe6252eda34+67108864 da6f29900f7677fe60efb9729da88c66+67108864 fcb41e115ba071a96b0a3b49e8bf0103+67108864 8a753ce795051334874fdae207855829+67108864 b13343e612361dd8e39ae29e41176e5b+67108864 704361fc939d60722e7bf633ae91d53d+67108864 a1cc9ac3b719fd41cfc2bc0d94c1bd2a+67108864 cd40ded00769b3b4bd845841c20c9b34+67108864 7c72ce73e8a5ad438ba8cdf99a65f9e9+67108864 d932108c4d3a8476491092cd581a905f+67108864 910a317116b2dcba43584187fdf33ad2+67108864 71178cdee4f382d77af80021d908457d+67108864 847b3fbb23de4510d6a10f216b1a210a+67108864 3950c35ae2852796a55eeb319f22f6f3+67108864 bfb8801bef84493b831ae34a5f73ca4f+67108864 955a59ef5011ab222a40de7cf3b507a7+67108864 e519cb7c85edabb54261110d8060de80+67108864 da074887680e187ef1db4ba128997cf1+67108864 b18567fc4c64b4aa0c0c0f204a01ff97+67108864 a41418794f481bf2b8409ec6e4267ffe+67108864 eb9b344f48720cefc217da3cce124e8a+67108864 ff92e78105ed0cb6cc6cdc3270faabf2+67108864 a2d0285e1207083dd58bf9002abc7fc2+67108864 147a9ed33d92f99fb89b685140a732d4+67108864 3f0138f29d10d2a73cdfa2a83d5653e4+67108864 4247f786d38761001e7fcdaa703e9b6b+67108864 e2974a5009436d37873f17608e406605+67108864 d491febe0a56b11ce2278deec0f617b0+67108864 8d9439a2a051307fd164906bd5c6bda2+67108864 8c5cfbbbfb6c3666eb4459a98921c954+67108864 d5ce682bd4f98463fdb3d773f518acae+67108864 e9dd69a37fc45ee1db12d0162fc7e165+67108864 52eeca7caec19ca02a391ce6bfa9be07+67108864 d64c37f9d21f14bf9487d5628a30eca1+67108864 f033519daee269196bfe92d70af67b39+67108864 c1282ca6aceba771a171f726d6a6ac16+67108864 1f2ca1e52852d72e5a57a1b16cbc3f74+67108864 54636fff02ff0270fa05e4d8cf29d7d2+67108864 0d39d0910ead42e48d1961bddf7ff5b2+67108864 44da2d272ba8acd54826bf012eb40e59+67108864 d80fe9f849963e7eeae297a546fcb845+67108864 0b9047663ab22c2a7dead55b79a368ea+67108864 0e0fd7eb8ae183106e9983da4f46532e+67108864 aa6d7435fdb5b00a690e3582f82cd6df+67108864 59b2fd0c4db35ecb13fa5e4dd3160df6+67108864 d1c103ecd75bdae037a7e4697a41333e+67108864 1d8679726c26461224e0a2e5cb0acc5f+67108864 f61e8db26fd4758f7cc84569ab2b028a+67108864 a2cb1b000b5332b21f725178bba5c4b5+67108864 0251aba53ffd3f3ba6da0fe53e80f315+67108864 0adc72a031deea5b21caeb4d49dbfd1a+67108864 da64eff1540d79841d656ca7191aad04+67108864 fb2b14ddb10660379ce55f727527ff2b+67108864 d4338af18b258bb8ce4931ca7ed05064+67108864 b59bccdac8c48e1a690fec35b6f8a8a4+67108864 e44379d4229ff8d166628aa4ad441afc+67108864 a2edd9b7190d04989e9ace2fad760116+67108864 efb094f97d5e1e44ea6534fabc8bc67d+67108864 8cfbbe4f5451f1a9a7667413b67abb00+67108864 8801376aba9e6efec6549b0c3e29c978+67108864 f8fcc193b53dd209a896d007327bee7d+67108864 7de9ca296a062cf33faf9ea8f312ccb3+67108864 8d69bae5e32e7a4ae1f6dd57e0d4bc27+67108864 09cb36b4aac4a4230b0f1933ff032e99+67108864 1b69f061dd6daa99762976d61c707490+67108864 b54b276356bf5e28514a9224be56eb30+67108864 2d95083444f68bd2384ab2482c545a93+67108864 8169dcd201cdabc17a0c651d69ddb5b9+67108864 8fea21ea4fde472cf5b9222bd2966fb4+67108864 bbf9e95ef3f9cd4eb43f143091ea7d31+67108864 081f91f057e44a5703a96560bb310e23+67108864 b696d01611c9215f4a93fc7684638ef9+67108864 498b72c742dc776c2b0e1525dbe16c2b+67108864 56b958bd8492a7d864ce60438db57311+67108864 333bf76155e916a6e4d72531c12b3b61+67108864 512c2e49f16514c68dd06a242c3006f4+67108864 0fb48df3a292cd784d3a4e1df2efea3b+67108864 b43562e4baf12fda2ef2f88e655d24ca+67108864 13b293acaea889c5672a10096d0b70b6+67108864 87232993894f0684d3071118528acb30+67108864 f7ebc10f8e47b12167c3b18a9b40af4a+67108864 7aba76f27f35b5c0c1ca8750c5895f45+67108864 889d9bb6f270501204b48e052c763e3f+67108864 8b574864a6d5ce579793d4d232bff6b3+67108864 e19cf0756dc6b54f2ad8bf750415772e+67108864 88e85afb7736347d28df444a048af72a+67108864 06bda3da34e66eb63f1699fef8c70047+67108864 a06ad6b51927d11c35f8cfa86980a713+67108864 68b3204eba15d00312166c99fa33eeab+67108864 98b12cada97a8843dae7448ff380298c+67108864 5ce5c167e9f03631d6d30cb6e45a52a2+67108864 348633f0b38db8610b435ce4f53fd049+67108864 8651641cdca73876e3ee249973888a4a+67108864 ba2e2453070570ecee21e549cdba4c4c+67108864 4c14365d045edf5f7db25a6077cd18d1+67108864 199d38530de4d2bbdf644082a5cbfaa3+67108864 ea8e9092d88d7a2ded26dddaea3e35bb+67108864 a981d1b9cc878eb2825e6ac397204ced+67108864 6c8a6a15f249927de8c391bfa9a13887+67108864 5fb6f06f70251fab1474bd5cf827c4fb+67108864 51336a8ac8e66b4cf183a87f83184a58+67108864 5e7324e999bfc640e1e4b8e193c2704f+67108864 ed0372472af294f0a70ec98f4b12eac5+67108864 97dc3c2bf973b650dcc1b14e4e307049+67108864 ac2dbf604592e32443f698243cf21b43+67108864 4f6b487a03217b6e2db48fd609ac3fdf+67108864 19ce146e7d279ace45a056b40c8b0e2c+67108864 7d22fb7947fc9a8f389ae5aa2681b767+67108864 9dcebdba72dfd50659747073415dce98+67108864 10982d30d47b5909b6ae40d073e2b7b8+67108864 bae58060b6dd999976b61149d05b2d9f+67108864 0fd4d4d81968a7e683c1e736af26ca08+67108864 ef25f3edcc83b407d40b406187c7e73a+67108864 befaf13aae2e584e9e3ad1c7a5e98f64+67108864 6880080067e109394df71b712d201f4c+67108864 485c60ad6add65d4eac035768e43db0f+67108864 902c2519a1d327098a8936486f237c3b+67108864 e0a1ca44d4a9b71efcb95a8690283a77+67108864 5cb09dac3177616dea86b0683c63d379+67108864 5a08f945265debf4ec6cc61e51efa702+67108864 f0179759fd17199bc13902de79374753+67108864 835e93df3ad2cfcc3b6b0b0ba26ecd52+67108864 7ffd15a96469d15bb821573bcb406900+67108864 282105da606f63b2bae3bf91b8703ad1+67108864 0e67f64306d1949d07c301077279a257+67108864 1ff5dc38a6e08ac8737f7b048883ba57+67108864 0c48efc7f081f704b5e81b37d2fcf78d+67108864 48cb575c08d65b849e336a528fd1fdef+67108864 2f89ed035978f3eda7402d3a352f172a+67108864 ee96f8e4c159fecd3167f2d5f89cd1f2+67108864 44c196f7b06576ca183baba37c07ed0b+67108864 c394702750ec25144bbd50864817f412+67108864 ecb5f5dfaa3ecbeb44f850c3f39e75ee+67108864 9189dae667bd9bb7efc65a468657e108+67108864 cf32ab8783731037450e3b3bb1a7e24c+67108864 970130f22be6713fe29ab1b4654508ef+67108864 3eec0cba1a8e599c776331fce72eb135+67108864 40f024255335221fc9b5e35147956717+67108864 0a23f0e47c7aff96458df2d8a4337b43+67108864 aa4dbb73141da37741ef87f25908de08+67108864 b4374046f4aa89c1bc56ab4ff243712a+67108864 5b3b59037994aa980b394d984a107364+67108864 1856eed7f374fef9a6a2d54855646dc0+67108864 c58269b0c2137b24b4ab73d017382af2+67108864 3ef84af204b89170bde51ff5b2251580+67108864 47eca65588f21d57d6826ab968ce0ee1+67108864 c1c8a064e8c5cb4998db2f63fbe38aa8+67108864 7989eaff82ce0c9ce44b07d30004f736+67108864 5c550ab03a78a8e95591466c98e73c35+67108864 a9bbfb746766c189c72e01f9c5f06893+67108864 df809e32f246382bd14dfaba10f796f7+67108864 c08575ebfe83afdb9d99c8b0a20f204d+67108864 342a1fff271f3b35fb476136ed1046aa+67108864 be53838e3da15290c9450dbf615a23a8+67108864 3d15a3114e259ce18e60f7d162b23b49+67108864 3fe7e7a6840c16fe922ee285073a5e34+67108864 0a98281ef6382ece1136ed68f1276e4a+67108864 d8242a4c2212e41de5d3871407813a04+67108864 89161d238c95e16e74ff7e98df4dae3d+67108864 2cd9e980b0c040903d723bcc097873fd+67108864 58c233f19a14fcf85763483343f68ed5+67108864 cd9ea5cb906ebbfe11989f6b2178b1e5+67108864 1ed5d50de85e8b1aa8a9fe351c17ffb3+67108864 b207e05f95076c307944bcf66e8271b5+67108864 1e16d3914e27d93a30a1fe14900d5bd2+67108864 3dd41cb336b5dba6ce1ec12a12d70838+67108864 0553a8a876bcd08a9e59b672dea3cadf+67108864 3270098cdd3a653802b64b97e2c013d3+67108864 74a4d14216f2e95c3c762fa899810245+67108864 c8f6bfd2f49cb68d2c12bfcddb7a3a14+67108864 d57828eafb6113e1378635fb7d811ef7+67108864 4ea5da07cc79e707cfbd46a05e71f626+67108864 fcf7ed7fd390b222f75879caeddc10bf+67108864 a9b52d652eb5b057507664e55d8c2065+67108864 1952492c2a5e553538b01b8c68754fba+67108864 1876ea6728d7f5135308bfbb2f907f7c+67108864 637eb85d012094cdce43454ac707b186+67108864 6146cbfbbde640b0ba81721ad730518d+67108864 339994a175ee6af23dbbadffabf5abaf+67108864 2512f64ca51feb66de4943bd63de1389+67108864 d45850194dffeeace32b87161df8b637+67108864 70e746b2c7a2785abd140bcefb359d5d+67108864 a675ca70dfc82b1295b8e934777c2963+67108864 89b608bcd8e1ae97b1b54a4ce6534f25+67108864 93fafcf8ad42d73962773d45aa703e48+67108864 b2ee61842cb6035d392cb39a9f9bf3d1+67108864 65201c355aec6c098ecbc096d807a94e+67108864 efc47cc3b58120afaa5b12f9847bd9b9+67108864 815b18871706defdbb32f52f79888b6b+67108864 cb212280920fd14d7c083e244fae8f5a+67108864 0563576707787553605de7c2c3b43f69+67108864 706b06048a3c162df3eb8c76fa4b9a1c+67108864 39ce8aefa48b3e1ed7387d9374ebe607+67108864 b68c296491338234d53ee8d7b80e20fd+67108864 6a604b76699c7b5d1f28c783ba7b785f+67108864 29ef63b9fb1236065d93d649c14a7696+67108864 3c42c2f540d3961241f8ca697ce4a15e+67108864 0f2212e11f9abffbc05b49c7085e6692+67108864 66bdf3d4ba4a002e86e81a0ef235c6e3+67108864 84dc9f05a6292ae7a1a368b39ec5ba61+67108864 3a9889f10bf0f526c8de4d9ad875cd25+67108864 8953d1e682dd25c8df3cd5b659db5d4f+67108864 ab7be59c61570efa5dc2b78cf83676bd+67108864 dba9ac0eb05c49a6cb308074a19206d8+67108864 f06d174cb6ec6a6ce10d0149c62d1a0f+67108864 11d2f482b141766b0ba4f53e59c2188d+67108864 9fb4a1a3ddf95e2c7135947af3114e2e+67108864 275bfb636251eda218715c1aff06e503+67108864 a0c89242b3edf53737070abf6ad87afd+67108864 8b4763a22fa4a3a9f045d22e4b11270a+67108864 2cca0708700a877794c8590619f2968e+67108864 b9d7eb594832c2b65a93d83ac35a19cd+67108864 d9f5beeed66607e179827b0fc6185139+67108864 f97887998347fd8619bd35cb03da2a4f+67108864 52c088791a443a992cba0ea3fbf12e1c+67108864 78f71f4bb45320072b2fbad6e5725055+67108864 652e98cbe0e04a9dd5d2b6ec2fc7c04e+67108864 550cf40ee7d2487066f44d7925c7b709+67108864 00d1a4f4532f950c85668a7748d38cad+67108864 f085dda612a3afa91c9582b0c5d4aaaa+67108864 fe1b1abfdc6bb203c38909ed0d124709+67108864 7316d6a08a14e2d840d524ec3700e837+67108864 e00f6b79c66e8e1e23f52c97467fb161+67108864 a3a1206eac6c1439baece870f922c446+67108864 fc677aeb5ae37d160ce7f658672d0352+67108864 b306ac3b86b18e3df67c12af3432f0f8+67108864 de6bcace6f2bbafbadab0830f970c581+67108864 30fb4d875646e3ee8b9f284e9761de9f+67108864 c2c9e0be88875d7fe8b93ea622f9b44e+67108864 dec0fac2abc6f1eaa399e5640819a000+67108864 2aaf7d4f5cfec013454efc6b1e702d3b+67108864 5a9d28e7cbf92495289d4719810580bf+67108864 5f618fe336664eb82b35dcd1a3527305+67108864 52b997bc9b934183e5b69029d3c90dc6+67108864 fdd35a04ec9d5938f7ba040422f09b50+67108864 b8eec7e11bfee019bede22b20fe0b59e+67108864 fd03ab91847277757e25c4214545378d+67108864 0cebfabcbdc53c4366f9fdb3c58da369+67108864 37fc9e297586cbe133823b0dcd74151b+67108864 5413d6e80ab9b9a4995238f56387f920+67108864 b65fbffd1cd35708767b822d354fb6c5+67108864 369d2566eabb30c55223261f52561e05+67108864 f6d5f3b3c0a22b93e1dda7a569813098+67108864 2097a5b95515dcab7170d6e45f15644f+67108864 651a39b728d858e73a97317f28f01570+67108864 1fffdd51f56f1df30310ed957e7b6940+67108864 1f3ebeb7f6da888bbc10daefbb389d86+67108864 0446df2210a9bb8aa78424ea8890dbfd+67108864 79ba0e4df90bd1aeb12f1521fb29150d+67108864 5eef6de0afe26994aa2c7cfd31c97c85+67108864 250e64306df679e7a1abca0302c796ec+67108864 64e0ef4c14f7c913b48a2a2ee2610077+67108864 8207b3d6919395a87fd4705d83033dad+67108864 673ff19dd35b2c519c4bcfb158976f56+67108864 ff2885cbdb66c872885e44c43bd8e68d+67108864 5a2e771e4b0338c1dd7647d693da555b+67108864 ee9f602d74e0fb02bf26d60025517511+67108864 b53d146b9ad8d8470a9ae1f8982f693e+67108864 0ec4753c965090fb02b2d4881cfded65+67108864 258255645bdc327b3f5aff2f5f308b86+67108864 eca1fb054e55cbbb106ec7b77987e4f9+67108864 67ff2f4aa9246afeee983520baa9f28f+67108864 9088128cd4b27cd3e49f2cd16605cf3b+67108864 eef9ef8b7d292d53b512844eeb1f8c14+67108864 82fb940c018616328ad5b1f40573d0d0+67108864 d91badac0cf1090d6b9e0c4835095d41+67108864 8cf02691ad8e84eab3f166cbf21fe456+67108864 d046af96ff4ea58d232fc61a0cec06c7+67108864 90fc539b57ac863cfbaa510a6d7a8831+67108864 c56a89de61ab11e03b57fe0652a9f824+67108864 ac049420424f3a7320ffd25124e73097+67108864 b331df4098dd950ed2127110a77d69cb+67108864 4169576a334d9d6d0ad1acf785de4beb+67108864 8417499360a366a19e803eb4bad782cb+67108864 ce9c12f73a782f7d8c4adb1955f5041b+67108864 67ac94f8d9252daa60fd83fdd485719d+67108864 b6745ef3760ed93c751c2a6ad463c453+67108864 3e8ca95376b731465cfdad3137debd5b+67108864 3597ed23a677c8510948fcffcaa32174+67108864 e183a236e71b541e936697989c953fdf+67108864 adb1b761eab093ccf4381e483767ad87+67108864 61fe4674dea00f7dfffb572981da4eb6+67108864 59d5521497d7004b1734f8f12d50995c+67108864 708ab80ea89529c7a828b27240bae2c9+67108864 d5546b0d36c4618401eb534f8ef9ae67+67108864 146b5cfb47f585add7fb91b3eb792b3f+67108864 98af89fbfc592389f4ee90001b73b7c0+67108864 f1f7e7a38ae792b1676958c38a079302+67108864 dee5b4e934ad4d820084abe03ec82bb0+67108864 233ac5529b4bddd3357ba114cecb8265+67108864 2ea7c26b43543828173d265429e5e9a3+67108864 554279d68a2ba24f37960716668f57c0+67108864 a652774854ea89b90addf1e5558b03db+67108864 2f32839c01a3178754b207ccf2cf774f+67108864 19e1085e4a9428f54516d2c9763fc69b+67108864 b08e52aa55ce36adddc8c827a7b56a90+67108864 ca5a2cfa551dcc4171a8548b2e75737c+67108864 07d0c5d3b9da6f020c49a09ddab88c11+67108864 297c14087d08799e3cc758bebb35a998+67108864 36745bcc5ab5e3b6db6d73d685486632+67108864 145570316045be126fb77dce478c9e7b+67108864 7ae40af44f48b1940ae5f1eaf7149d8e+67108864 a040da7c89a88d383f6351a09881e5c1+67108864 347090b7962725c04375d35b1426a922+67108864 969ae2ca582911e37549ab48999596f2+67108864 b3d6aff2b8fcca4b97080ec1a393d4ae+67108864 f2cfa7ddb99bb01b7fe0e380bbbeb743+67108864 459a7ea1a6c0b502ae06f87bc8a22d85+67108864 d6c18cc1df3b7973d1fc1dc994e90e7f+67108864 7585f0be7bce0bde7246e93f26d9663f+67108864 e75e85ea0ca03510ac43f793a012f71b+67108864 69b99706e27164ddd6bbebcc34704e2f+67108864 6d54e0c179d902173ec3550561baf014+67108864 6b8d7b1fc0b2db4a2eb4a62026df6f07+67108864 454dcf5308ef0d3cb8d50963536b47cf+67108864 00934415280fbe98d2f428ba54694504+67108864 8ce63e908997f169795175c2aecc2800+67108864 d2adddeec7da9fb3b9eb973b7dd62301+67108864 df334feb04844764f8d6deb418c8809c+67108864 c400cefe791d3885f256df23f156b790+67108864 3fe67e7bc24ff07ee05f1d5010f65e59+67108864 52dea4a8d0b2076971c0d8662f4012c0+67108864 4a361fd451f8f4f645f300880d6fbea1+67108864 a47ed8eebf37a796eaf28fd5b8a448f3+67108864 6333c635f5f8efd608837c9c43a54809+67108864 c5218502430171c40ff8329ea81d6142+67108864 e40b9b1935f2f8242ecd722c87876905+67108864 0fa2bd707cf80dd38937420c88ad07e3+67108864 68a7f964eb4f4f32f42d2fc0e4b4c168+67108864 d7031b0d93a9e6ae52fefb38ea359d0b+67108864 a8cb2892fdaa1ab06152ba266271bf6a+67108864 dde2ae6293a78d523de73934580adb98+67108864 64b31b76d0b3f567cabdb19ec8a6b5bb+67108864 5722cd27250a7b4f387f689eccf1387b+67108864 9a5a56f5ad46ae4cc425b52f5f66b0e9+67108864 2c26af8c2644c3130ce2630c11b55f16+67108864 b15cc2d99d1814ea3269caefe5aeed1f+67108864 845936a2571203663e760fe969cb7cd4+67108864 cfea2e5fd2d21b39a0279c0ad8166b0a+67108864 012754e502a0a7ec6ffe98299592e496+67108864 ca04a3214136dca30208e625288d50c0+67108864 fb015bda0345f425717e8e2da41515e1+67108864 6375587f9cd8b52f461e457d0ba5e6a5+67108864 18ac65bc4f38174709f34a54cb0bfdc3+67108864 fd3afea501ea6dc765eba676c7668d1c+67108864 9e576d0ff9d0f7ef7c55a9142627f48c+67108864 aafb3340fb59fd4e1ecd15b71486cf71+67108864 f8579bc6ec704e334984c5ed7626061d+67108864 67798d6de9a3a161763560a25cd5fdad+67108864 0895eb15394b8f3eb87630ced9c54374+67108864 e65992f5b348cf08f7f94c83abdbce9b+67108864 6e3a01b14054b64f85bee2b089c82183+67108864 5a02dd377136f74a88f37478d1465e4d+67108864 6d6cecaaf9e0446e484448dd62ee963e+67108864 4e1cbc7a34dc967a034ed3e9cba67b64+67108864 a7cc7e1328300bd8f32504136b084c80+67108864 648ce1fecf63126e094fdfc123f549be+67108864 164e1083eabbad57b7b4f72810a655db+67108864 452a5be2713d4931248299a6c563cef1+67108864 0ef85624c448f6e4ffbf5c69f0df6a63+67108864 636f3cf22e32d186b16700b34b93f34b+67108864 1005aeb33da4e9fc72bb3a0fafd0c3f4+67108864 6ce50685ad27cfbf0b83cbde29adf870+67108864 f8079b077ed19ab55860c83f0a5891d1+67108864 1e4471af55b217dbb89bcbebd476dbc1+67108864 0941ab2b20017001185b8f7d96b3da45+67108864 218c586c39817c072148fc1c9323fccd+67108864 c6ae2f238bec21d75c463888eb9eb34e+67108864 17e43a11af424ed19ec3e37208ccd7c2+67108864 088975b838d40639b140cacb48f24582+67108864 d3499a99641de103b50eec6391c8bb85+67108864 3a3925e9ce09b308b7d686bd35ded3ad+67108864 4be279b24000df6b90f3b21346a95ec0+67108864 dff78a508fe2d378362073a634fc8568+67108864 7e030eed13b4d92570bf27cea056de2b+67108864 e575167c80666518e1a1fcc37e5be977+67108864 59bf806d56b3f1da60d7e1ea1e326732+67108864 7ab1600fd8e0ea33d4a1522ccb4b16ec+67108864 b486802203e725f884e67662d60a4bc9+67108864 e2747727cd64c67213008cb997a182af+67108864 bbcd31beb88d98d982fae985212cd467+67108864 63e43c3dbf8b07f8823d6d6d8dca4e5a+67108864 1aca07c1a84f7370026399e36371059a+67108864 59da7470ed1691daa40159076f00aacc+67108864 2c67c1687441dfe2dd335aeace7960a3+67108864 148352f31cd89f167ebecb37709763e9+67108864 b15ebf827a05848de50be331fb5480ff+67108864 5a5e03fb89bf5dc0e4b2ea691944f772+67108864 8625d91e288b99dccb7b56561ee74876+67108864 3656bca4544924b720b82283a91cb76b+67108864 5fd2f6f1fad7d20c0e973703ac6e3669+67108864 b33f494062f3cb679c36337ffd306507+67108864 707dba27750617a509a96a2000893ef3+67108864 c9db9063eefa8c0c352ef3deb05af1f4+67108864 77ad729701812bfe2cc39ba1750c2051+67108864 632b1bef7f64c435bb783d1ebf397196+67108864 b9137b8556e1d9d3c47c79d756647182+67108864 146b878dac4ca3bb0a728d395b42a74e+67108864 0e65fdf451b17e75be0f91786077f848+67108864 2926796ae841754b2dd1815cbb707043+67108864 c0cae36e934007991f9d56a0caca8158+67108864 b8ec664a45a543ff21447729cc4799ee+67108864 4d3ea3381baa8a14c71628a95c4b2d82+67108864 a1ee68e9f6381a4c1723d2b221d182fc+67108864 51383ce68788f81c011a8b658f425b8d+67108864 39738b40415353cf36bcaebbddae28b0+67108864 49a9a08e0f163045fb4bdb87d94c7470+67108864 bf896038315fcb8c40a628ea135cdc31+67108864 3e5ca3e8307931fed9854d8bc8d6b04c+67108864 1c7a2e1225976dd6ad6b6c57d6089da9+67108864 8d970c8f25369d3ddee7897a801b3600+67108864 4099f0a3b81e8f24097fd8778a230cd6+67108864 1190633b75127dc6dcf564a81d903afc+67108864 aabcc49889ba529bbdde745f7a4e2a06+67108864 4006b0b18f997427d6b01d7488875b0a+67108864 6c02ecaf633dc323c688d0ac7c6a42cc+67108864 341c3efd284477d4540fd53938af4a40+67108864 070d5b5a0274690de3b95bc09ffb78dd+67108864 ebdc0b5a4395cebc98e0716965c47a3f+67108864 2ef29fc6ddb8118b08ee3960029506bd+67108864 5958bffe4d6506019c1596d8ed1ba6a1+67108864 9c15577caab6a3ebed7ea299e32e4dce+67108864 6cb435f99aaa250079c37629628d5520+67108864 4b3c90f76918b88372745d89eeb9e084+67108864 837c2eb79a671d35aa881aab520bbf4f+67108864 92f0463f8c9dae280f9a162870679502+67108864 95f70fcce64cfabc5b8707b62e6d245f+67108864 64ea34ea306f87277008613ffc46e4f7+67108864 de302fcd65dafb52be9e0488631b0de1+67108864 feb4e1556edf524f8020b14e432fb73d+67108864 f7cd9b1aa21cede7078a6dde4a9a6d91+67108864 061f4e1dc36630d27d4ce11239aba66f+44772532 0:6148:.DS_Store 6148:4096:._.DS_Store 10244:117550693231:PG0002577-DNA.bam 117550703475:8805224:PG0002577-DNA.bam.bai 117559508699:936266194:PG0002577-DNA.bam.fa.gz 118495774893:465904647:PG0002577-DNA.bam.tdf
+./PG0002577-DNA-jlake-germline/Assembly/genome/bam/realigned e3d7a51e4c0ead03e3e3896342f471e0+67108864 42ba06408eb1234fae80cec40e58427c+67108864 1af5af879cc2eb0a208852e0211e7625+67108864 30a07562440868426251ca573f2d9ec1+67108864 e9e0de7a6665939596b778ac72043926+67108864 e0ef7fc66317baaf856a3f9145731d98+67108864 b2ca4708a9098cdafcb7416705031238+67108864 1bbbafc913e7312f709f2cbe02037bef+67108864 1d4e3218c9bf91ee9b6de69f0e5559fa+67108864 8a089574e5a9a8ce2882b06bab082314+67108864 7efed976b32544fa933c38b1c810521a+67108864 cbf8af44acde3ecc1cca2bd98777832f+67108864 19d0c9bccdf28f7cae5dd51cb6f3883b+67108864 3220af4613dd7dde52fbf72208dedf65+67108864 41447742354119644391fa6e8ea27a92+67108864 1b003e733ed594760ede9079ab5f0997+67108864 5283d84d614113b2732c931d01f47ddd+67108864 db29a5faa61e4301c6bf71012ad1d4d5+67108864 ac0387a2bc339dca235c1f0eb1d6e3d9+24178596 0:1226675356:PG0002577-DNA.realigned.bam 1226675356:5462792:PG0002577-DNA.realigned.bam.bai
+./PG0002577-DNA-jlake-germline/Assembly/stats a3d360c03f346f830fe8c247fb6b6969+37754 0:17936:Reads.idx 17936:17936:Reads.idx.bu 35872:1249:coverage.summary.txt 37121:633:dupCount.summary.txt
+./PG0002577-DNA-jlake-germline/Docs 5b614c0ac2f1b7be407433860ee2a553+5625667 0:277564:1_IGS_Deliverable_Layout_gVCF.pdf 277564:304833:2_gVCF_Conventions_CASAVA_Release.pdf 582397:332651:3_Illumina_Annotation_Pipeline_Documentation.pdf 915048:3765366:S1_CASAVA_UG_15011196B.PDF 4680414:903872:S2_CASAVA_QRG_15011197B.PDF 5584286:41381:S3_bam2fastq.pdf
+./PG0002577-DNA-jlake-germline/Genotyping c73ad23d5e2b04a552ba4172a5efb1af+67108864 6bfe5a7cb20aceadc14486a51eaa81b8+67108864 6c7822f824a85de9c6e5a2e1e222777c+4019621 0:138237349:FinalReport_HumanOmni2.5-8v1_PG0002577.txt
+./PG0002577-DNA-jlake-germline/IGV 3ab66c4b117c21a43e1b3e921d32cf49+15934904 0:2898:.igv_session.xml 2898:2898:.mac_igv_session.xml 5796:2526:GID_session.xml 8322:171972:batik-codec.jar 180294:202:igv.bat 180496:43:igv.command 180539:15725768:igv.jar 15906307:42:igv.sh 15906349:1150:illumina.ico 15907499:26167:license_LGPL-2.1.txt 15933666:1238:readme.txt
+./PG0002577-DNA-jlake-germline/Variations c8be77db5bd5c21d538743aca8977c14+67108864 c7fe6cd59645d31b4de811ff627ef4b5+67108864 014529a882403f6d7f425015980848c6+67108864 dd7715f352e78bf2da032fa1ce2b1377+67108864 7967b6e51b1331f996358898955a0baa+67108864 f7491669a7747705bf63780078a8da60+67108864 ae300af114c7a1adbf251db77ef188b8+67108864 a5d6beb9c88ba5abf7003d34ff44bbe2+67108864 f1cc90f7192ffd09197c429d57400f07+67108864 13051c9b1052878f8a49992355c48860+67108864 eb964b9fc0515b5f6248fcc83a6af015+67108864 30bef0e73685998399da830c54ac64b4+67108864 0b3c289822fda2d7837bdc140ef18b62+67108864 ec49a958f1ec1bc94fd40b99d3baa0f9+67108864 39bf6e6bb4bbac8e98e46eee0751cb56+67108864 f6d35577522c66c11d96b0bce2359b87+67108864 3ce124d6ce052da22b79aa82277879a9+67108864 a6aa4f7b73c9bebc05b9f2d71a118dcb+67108864 de2132d64ee96ca4fa5c8f0bcf29529a+67108864 2305a45a0a9a219b0b992612f1954808+67108864 2eb2714435221611c91295d4b4036cc9+3233741 0:1209008791:PG0002577-DNA.genome.block.anno.vcf.gz 1209008791:3563086:PG0002577-DNA.genome.block.anno.vcf.gz.tbi 1212571877:131236358:PG0002577-DNA.snps.vcf.gz 1343808235:1602786:PG0002577-DNA.snps.vcf.gz.tbi
+./PG0002578-DNA-jlake-tumor 70ff27bf1044858b30152546a861370d+1848377 0:6148:.DS_Store 6148:4096:._.DS_Store 10244:1834705:PG0002578-DNA.pdf 1844949:76:PersonalGenome_Mac.command 1845025:704:PersonalGenome_Windows.bat 1845729:2648:md5sum.txt
+./PG0002578-DNA-jlake-tumor/Assembly/conf d6de8e335f14bb99df74e40d37649876+159230 0:61440:dirs.tar 61440:11017:project.conf 72457:61440:project.dirs.tar 133897:25333:run.conf.xml
+./PG0002578-DNA-jlake-tumor/Assembly/genome/bam b27667638ac1b82166eb4158a276203d+67108864 58eeb2e10cd0859bb96886a205bd4aaa+67108864 667e5de545718d41403ace0a1e52572b+67108864 1c5a59fcef82d558aea7f8402652c97f+67108864 f89963d6b7d2dda6c5859ec38fbd39ac+67108864 8446e283f77664263ba79f6c3d84b965+67108864 d3b974ed13fd0e3f4daa88611e9cf97a+67108864 cd6f8cd41438efa36f836963cabc14ee+67108864 dc4c3d32095842b4542cdbf678f8638e+67108864 e4163f2f75001d911c55291c6557fee9+67108864 a152baede8c988a2b79edc26d92859e5+67108864 203df769bf775c7a903427b47cd50058+67108864 2e1fd6d98da402f7057d9e42f31a6855+67108864 15694d0809b5cb0b9b62e278030fb9ba+67108864 c5659c15bf0a35bdd7c9ce9521caaf17+67108864 4b331f97efb322bab7823f60dc33cbaa+67108864 ef5df5e9be8cebe67752c1ec7b699360+67108864 195e68b05f0175fe26abfe17a52133c4+67108864 d1df9508f48008dd0897e986d5e0a095+67108864 cb9bb9701109b42927d21dc0c441c106+67108864 3c544db7889c09ad04a683ab65dbf905+67108864 b3059eeaa6c4be575ef6442d7d686044+67108864 6f7d0657e6dcacb680e2c18c7ea969f4+67108864 fd19754ef54a96294fa0be3c235190d3+67108864 d403cf9deb5d300471cf491270728769+67108864 c11e3a5138e7e73a8d462a817284a578+67108864 31a4eb0282b6a20b1db03ab537f27d90+67108864 d2925bfcd512c54f774b28371321e80a+67108864 b10985d7e9eb98adc7bcd47fd51d74c7+67108864 cd6611da61290e6320c85aa2e64b573c+67108864 790643150532ca3b87fc87b398463bda+67108864 d73db36a115a9d62d3dc624a68263299+67108864 428b2cb5bf196058426fa5cfb0ab1f55+67108864 0882d387d810173e5466f1659f8ac150+67108864 c5602579109a9527c299cf23ff8e90c0+67108864 1e51d370499018e399e9da092061c13c+67108864 e49696b1edd093737fc543f594f55f6e+67108864 19b700f5e309bf97a4bfe5cfbea39768+67108864 bf0f28dc79bce5d2c5f1562558f27447+67108864 4be9d66602af08697c4a1bfc3c31841f+67108864 b6ab46ebedea1f2232120c1d390bf39c+67108864 ce12df5c0931d07646ba92f9c97ddbf5+67108864 d4afb665643b3b448998e68bbc9a91a1+67108864 92ebdbd5ffe74cfc842bd6ae44d11bd5+67108864 57faf1813558e0a6c25dc13bea541fe9+67108864 20851e6a10cfeda7062427e52035dd8c+67108864 25a70e81b78029f0be4fd632f57aa7be+67108864 419283b83cbd3202499bd4cefb0a1cdb+67108864 1a4a73a0778b404a2436684ef85a97bd+67108864 917f420880916197600f18d403b8173d+67108864 bd83a677cfc43cb03a6abfbc30b43d8a+67108864 f76cf33b00cddbd5e19d18bbf0fbaa2e+67108864 8d580e6c30d80cedf72fd3b60fca4a64+67108864 ba25a6f251eeb30321f807c9429f51c9+67108864 d003d7b82f5778e576a4a6367b5117d0+67108864 f37d3c41b2fdba068359b21666c4c81a+67108864 ae93098d87574a5f0b86413e8cf5bf40+67108864 7c1d4fc584f7adc3b778852776eb00f9+67108864 e1db975356914650ba3e29d13cd125ef+67108864 853f89dad1549ae9b0ba44899d4ccc8e+67108864 8a182ad3a2444ae6d6da7f6f7f4df167+67108864 a473f2377653cf34cc216528c883a12d+67108864 f0614b5c5954fefc1b2e6e2c4eeb5114+67108864 095fab3d4eb93eaf3662e3d307bdca46+67108864 cc5ef7122b2566b67fc5576a8f5f1f21+67108864 5e495a56cc1dd12d2349a71a066d392b+67108864 ac7834fe596d03c10adf8b689f6f151b+67108864 ee09ce2a05fb11431d2682631b702e26+67108864 e8893b94fdcafbee3257c27255512899+67108864 ef566dc982a25f7723106d859971ae15+67108864 bef22febb5bb8d15b8760795bcc70dd6+67108864 736d1b506a8e928e1911c58eeb5de21b+67108864 8e21577e579ed20b42f0feea41d8bade+67108864 51ae0fbd5bec7e4cf8ffef8a32c1ce40+67108864 66c69c19a031d37c5ce3cc256dfc702d+67108864 503d43e6803675b8387234ee64564ac9+67108864 a29454d0d616e51caa2b352a968d7dd9+67108864 f8c68ced290518c6e754b0e2c45c64f2+67108864 1bbcedb7c16ee806a82bd8b4a80ce339+67108864 7742487b63e051606b7f15765025e69f+67108864 ce33f57c6e8405d27c611991f55aea65+67108864 97e7ac624da63ef827ab9622ca1f5013+67108864 25ff51e2abedd04c71e7337e49ddd2cc+67108864 d92bcb904e10595be0dc35838bfd01b3+67108864 b5107a1d8064062dfc20cf915aac6691+67108864 1a35c6f5f345d085c5b1ce13733b6c3a+67108864 aaf44b9e1927563d13da3e9667624594+67108864 eccece5552f7a4aaf887fcf1a9445fab+67108864 e842b55a948fa0b492b69fd2c029f3d1+67108864 67c57be4efda877f9b44f4d1a2069a1f+67108864 6ab8cdae41408d27e4da3682450177a7+67108864 7aa6e963e26b2b987ffcdf223d42be5b+67108864 999b6b6ce0fcea94a4261395eff99038+67108864 acf4418cf27bd8ab5e40e2d6004ee9dc+67108864 ae3f390d34b4a92c23053c44a39f0980+67108864 b2df89979a416c6703222503a8722b7d+67108864 325a9362025c52c3a93daf3a411ff54e+67108864 b6b885513511313a706768655b770470+67108864 7924347c70e23e71392ac3be1a8dd202+67108864 81b852cfa07cdedbc467204835f346ec+67108864 c14a909737d44c5ddbb31d8bbc2301aa+67108864 8eaaa6ccd27b0433a16379fbd46a46b1+67108864 7b515b1799a09df1c53ba8a42afaaa44+67108864 da78adc26bc2739f4778ec04cf4eb545+67108864 f89e9a83a12f6c20c99e2a8128b24480+67108864 32cba62bd7e4e0d6c669059d9e9e8187+67108864 9c98cde5507452e6e66a92a47f0b1177+67108864 3ec80b900ddc0aa5351ed295c2519506+67108864 3e440a25f00805e345904f712459d05e+67108864 c6d5b9c92034e7a3ae676db0f9440410+67108864 a459a2ef3c7a523d03641d4eb5b19b9a+67108864 38af85e2bfdd36f39e871d8ec77e99f1+67108864 3ef6789bfbe65b73ea91aabaf2814e51+67108864 71d11439333ded47932b26a0c1291ee6+67108864 ace062e48a19df1816c912cf14ec73e3+67108864 96c0bd7cd898216e1de2de81ba431fe5+67108864 b7b0bb102bb512b191d57dbac648a9ac+67108864 1beb107a743ddb783f1df684a770d3b3+67108864 dbb7ccff44d8a1fc3e2c2f8b56feef69+67108864 376856dc7222a5d06fba46edb8d421af+67108864 936cde3ac43bcc6fabc0dcccbd8c0bb7+67108864 fa0064d0ba4b197ea1e043b39214ecf8+67108864 faff642c6445bbff6766b2173caf52d8+67108864 329226588c99b28febbfafcd465a0506+67108864 b1053c66901f8c9ababa599a215f5865+67108864 52a1e0723389874dbe26cda89a7ba074+67108864 651fc0d719d0ecf654fb68fcead40fa7+67108864 11a5aae83b1855f665d1fb649ca77551+67108864 49fe9f4b9374b20cb104ce019597458c+67108864 ee63c03171c5ae71845f9ec36b5d7810+67108864 dd0eaced2856c38ca14f4b4e7cd1283a+67108864 031b5092c185f12485b6fb60f12f1bd9+67108864 52624c84bd220136bd295b728fb39ee7+67108864 619ce6edd5b950b97b0144fd8cc0d846+67108864 2a326f8467fcc97e00feb58a2d282e60+67108864 afe28a3567c3d8e22357e54767a66284+67108864 43ddb4ef932cd779efa7803a8c682ff3+67108864 d714bd4ea327fdc41bd030ba0dacfcb7+67108864 cd0b60019265606af1630fda58d7fe76+67108864 245bf3c257e85ecc61c94b21f199c3ba+67108864 cd57ef218d5dab7230df2ed458400f4a+67108864 05c0056dc807fae33dec61b84c21e72e+67108864 a5dbee91918ee2fe8ca60b3935a36f66+67108864 1763cd31e4ce10548f0cfefcdd389b27+67108864 f27c37a2d77439dfb851a797df640be1+67108864 5c2afc1352ac67ca338a2bea4daacb9b+67108864 26b65a719765253a2248f1cbce10ae42+67108864 ccd5dc52fb8f92f467e99bba643e962b+67108864 d6f46c28ec827a571d03d44c1b3f0be6+67108864 835810e6e8acfe67f9cc53f12058f3f5+67108864 fc04ac6ac1bc8f85696cbf34d47e067c+67108864 180ef12c3f768a9347368a3d68f83a76+67108864 6e2cd549271844576032f654ac3cade1+67108864 b0063ee8160312761b2d95ecbe61add1+67108864 5601decb3b13f98a1246f4841254d949+67108864 c2ebf8433eaa439e8a7101e8ce735b30+67108864 acb6486284c8ac5ddc3a5cabe10f6ec2+67108864 f2d534128b117a03e6a1b528fd7739bf+67108864 3aebf3617fcf25db123b20011a96e9d6+67108864 dcef10edb820661ba7e708c61789d9ef+67108864 115ec18ea7aa397236ab039332c60ea5+67108864 8fe654a590ccc870c5aefcd848768480+67108864 d343ec7f640ce4a8b1e9bb49d9c16f09+67108864 3a24e80c488cee7f138a7c9357236997+67108864 3f42b92c722326b05303aac018ccf3dd+67108864 b91bc0cc81c1a2886034555e0de77cb9+67108864 b04373680126dcd17847013f0a1cdc5e+67108864 771305894ea402b6275fb079baf1e176+67108864 83b902682a699d2e509f6148be44cc81+67108864 2f2dba45cbc0d0a3b039bbb15e642806+67108864 28c35daa91968426f743e02c1df09ecb+67108864 ae9c053be0004a45a04bd7c684816eeb+67108864 b779e49cfe032ea858f04a174d5f7915+67108864 1cb18ea4dfffb211cf2e1b3b89684cd0+67108864 700a140d8be71a3a4111efa7676ce751+67108864 0e39fc71ea3aef669e46273e879a9cb5+67108864 eb075d86d17bbe570daee899e531a0d6+67108864 1209317403b766b79db6e691aa51d807+67108864 06511508a5f7af30d2b1a25355709ddd+67108864 23415542c3528187dcaa667ab27e910a+67108864 b21c149732221ddbb710146b6e0dc641+67108864 d6cb43cea2c25237ff24c957ed305c4d+67108864 130240a70807018d8353a49ecd9a114a+67108864 02ee615b4caabd6b65be38fecde69e36+67108864 a44590e6dbeee583ec4e2e556fb4ebc1+67108864 6690720a79e990e60bb53330f2381b60+67108864 938b829c29b361dd9df3345183ad8a2e+67108864 c0979fc234519c48ff714b533b0ac84f+67108864 2925fd6e9204dd1e120fa0b1f81b3d79+67108864 824dacbcbab1e6e4bb3bf19f0998bd07+67108864 31f33dd52e63b4d1915be40521805ac7+67108864 75721f7a0f736b2e89c3660dcdebd669+67108864 8b5ec2f053d27d497a02bbd4430fd680+67108864 ef45bf06c76c11c1e018508ddfbea33e+67108864 46ec11a6412019631b342baf9bd8cb1b+67108864 a936e7b58f6453dea8eeb240f78436f7+67108864 cdc0790f7b0e0fb948d2fd72eadcc1b4+67108864 e4e68a5f78554687704ed9a6e02c587e+67108864 92be6241e5980eeed5c52922e5fb506e+67108864 cbadb73e5d13adc78f1cf5128cf2f071+67108864 a7d0e1b8cfdd33fb776e040a6d6c95b3+67108864 22c7264616a56cb9051f42d601d59e6c+67108864 47518cfef61f5870fc537240738134cc+67108864 57d873bc31e939b64fbde571a81807b4+67108864 e39e5c68e7527446b4569cc06d4173c1+67108864 445a9a6abb15410f43093da9ef20d14a+67108864 c03b8fa6fcfe2a4952410468e684052b+67108864 fee487e4e6e506f97fd349b827a973a2+67108864 2b13ead8d886deaf68c310893dace3d6+67108864 ad5e842788cd9cacaf6380cce4666e4b+67108864 818508d6056786e1705ae6b9c5135752+67108864 53f0b9bc1be7cb1b7a329c22f2ac4b92+67108864 61e1042f92891deb1a3ca198ed66111d+67108864 be5addb257cfa18b00ca9b2e394cb289+67108864 b527844cfeee11e254b667885581f483+67108864 67b373734db9d69ec644c1c7db2bf5f0+67108864 8b23c1262fd32884dcfee4a801af3e5d+67108864 000bbb9236cc0ceb98913aa92fff5e99+67108864 7fc2ffc8c1b6009d078595b74a62cb85+67108864 5de77a68570a727b13666ef7aca9366a+67108864 54bb5594fb272171844bd33cb42ad9b1+67108864 590f8787314bf797bbbcb2787f613835+67108864 fde9b2191cbf07223459ad210a5c428f+67108864 503e56d97295d6e0a12045c0e12002ee+67108864 03a5f9b183dc9569721ed453644ddc18+67108864 2be6fc27fc31381276862d2abe1ac5dd+67108864 5947b0d663c0a52c05875ec5ce61bd84+67108864 4ef80e9e4dae16a5aae51a9501c616ec+67108864 153df94cd79dbb2dc40303907ee33b80+67108864 09104bb5a00744a104ef3400b21f20f0+67108864 2c124e205a229a9e99c2b304be89294c+67108864 854ba0a363dabefa28e8d360250b2ba7+67108864 95ff4f4b90489ddbc14aa33c7c867e06+67108864 f9373ff3a5039c6a5d2257ebef59dc3a+67108864 7f1abc805d8f6324c34b912af0ed0493+67108864 86ed37c6ba43db6e1b73df095d2767a5+67108864 09b0a46851e882230861ffc4177b4ed2+67108864 1092b56cc1a2172b7084a0d99ec6d0b7+67108864 f70c26b2a62dd5a914208db67d341064+67108864 830ea49cee6d701200b3c08b39be989b+67108864 4255d52ed73e6e02f8bd4c431831adca+67108864 b43115fe604e7741234d9d816a29e89b+67108864 e5ac0b97870c3cadc72b85097df78157+67108864 db9645ed90daada987e1d19ff8ec56ae+67108864 ad29235faaf4367473e2af9fda3d5080+67108864 191eb8c2cd7957b63474c53121e79e70+67108864 8503282417733089b18da8530ccedbb7+67108864 5e0889c82ed4c2a16d34c7ae9b87a5c2+67108864 d45d6abe6f8dee6cd021619e017fd63b+67108864 2892b58d187bcab6e8878b849f43445d+67108864 dc541d6a0af76dfb86a6770bab90e408+67108864 d1d42ce6c4d0499eb502f2b413b84e8f+67108864 b14d93850fc3eeca8d6daab0b577a408+67108864 593d932d2839b798fe3dbdbbf8c3a7ea+67108864 f384a78c5361f354cff3d6abbc08de67+67108864 6cf3d9317a0c58fcaa96a06edbb4c34d+67108864 c2ac341f1ffe67c5f729e0f3318ed272+67108864 08b4299b0bb7afbe68cf2af3aebe1a58+67108864 7dacdb347bcc696d50683b5947de2941+67108864 bf115a0e40b82478001cc3337d05f4a5+67108864 9772c379171a80eaf9167a5229eadb18+67108864 b2999f960a78a00649e7775949e7348f+67108864 3d99cb6768c58bc98dc55785440cebd0+67108864 b41f747b1d5f7428faead1391f9aaca4+67108864 1287df2ffb45e0415a9a368d52f8d508+67108864 7d6e7553dfe6ba49963519eb068713af+67108864 14a8e108d5fdfd7eef34851c695bcba7+67108864 8eb7f420eb13a536f0392adb709885ef+67108864 559e61efc2da01fdb0986679bb1dbc37+67108864 2cec25bda3ad1d892fbee59af1163685+67108864 315616c4097c448b9cd9945744cf6cc7+67108864 6c7fcb4dae7790a43a4cc22204bb6a84+67108864 ed2551b5c8662c3a57dcc0c712e4fcc7+67108864 15b54667bae409ea2d760f93ae26bbd4+67108864 f95a0fa90b01a5ce5e6ade63c331305e+67108864 1cdd6995b63579938be9aec26195d995+67108864 23215d1a26ac2696e27f03418ce138a5+67108864 7b611d9a0f689a1544df8132347a56f6+67108864 8dd426c07fe5fb724dcba9c2a15b2931+67108864 2ce2ba723ce6ebe056066a234bac46ba+67108864 c4e8594a8b7ce23b3da167825c8de7d1+67108864 4e7e54bc389c33c968c46f1a124610e3+67108864 f4f9aceea1e08862d46dd717d8b4f8a8+67108864 a2aa43ceba29057bc66cdb9a361fb419+67108864 5e886dc968de49b8e6abe6d151d53fd0+67108864 99d00caf3c14fd72f776c383c90ab631+67108864 08544e774a050e67f03e202514d1ac42+67108864 b9d6faa9b8f2811ccb451d2910a6a589+67108864 f977340bde7d733ba35fc998963fa8b4+67108864 135ac1eee41a279e3d000a146adb1fce+67108864 b30fa80fdd9ff4691d796fdac74f0093+67108864 a41417fec9fee6f189d834402a9ebc8a+67108864 4ab7b6f850183e8d1af3dc0f94a1c83f+67108864 6c1635db222313655d1a61cd9264299e+67108864 348a8d7f292e600ee53dc9c0cf48358d+67108864 2c2101c9815e64d46a38a5c24720b233+67108864 be8acf03fe71d9d43c3cf59e77ef3f92+67108864 a82c39cf815336c4d230429c9e53ea30+67108864 7c3c4b4dc62efd8c2f3597e2ca1b4c4b+67108864 15f7175e532a484f4be80d6f7e15b808+67108864 d44d3e0dfa084fc5e888e1503fb2d28f+67108864 3fbea3c0a4c7876ce9358de20795b751+67108864 735b8c3b26ea942e166321f4e0bc5127+67108864 286e2637c88ccf5187dde287a4ca9990+67108864 bbf981a586017a3a8c323d9d0fdf1a43+67108864 5a809f908b75792c8589eb2b23a9b8c3+67108864 d6e897e6dd3ee464553d3c835cafae94+67108864 6ee1aef6e62e295bc7dd79e2ea6e0ccf+67108864 f3baa399c5e8bb8b3db494b0107e5af1+67108864 99e401e71cd20430f26df9cabd414658+67108864 f1ba18255163e40e1a7738d5107fa214+67108864 9be7a2b18f11ada848d5586e353cc2ff+67108864 4f453ae5dfe7744f1f355c8c360cb7e9+67108864 70348d7e74ba8dc70519172645d98b51+67108864 1149a22ebe1be33590c5d531a974e79c+67108864 379397789b87b9c0e44d46dd9a7b0927+67108864 0bc9781da20de560b00f9492bf9d26b1+67108864 965ef8040f95c779b567a3c2c9319e7e+67108864 d86b8775c719b63188321560cca2b076+67108864 6ce9dfda8310aefd648aedf750c23900+67108864 68b06472825519dfb5f743d759708c8a+67108864 9617ea0542a1ebf7496efd4477bb67bc+67108864 6335e90273f14ca152e88a986ec40935+67108864 35f1d34a24d889cd1d86b10b1b233c42+67108864 49ef382f65fe1ec46cb2a8a4f8a960cf+67108864 a3f0fec2599be5ecd19b360b203e5876+67108864 743dc90628f546541daf0cf89710fdde+67108864 d167ec2708343b4b13fba5c2f12bf9b0+67108864 bd0bb42bd6a7bf267b00e81479ce3de0+67108864 c92c45f21773d3fa66afe741fc40c79b+67108864 b31bcb75bf11f2a25a7829cf0d8050bc+67108864 63b72753cfd53c2cd9ab94bcb5902969+67108864 3ba309561299c6547c52ee967fb315df+67108864 aab873f87359a7dfc85b0fe51f01b5a9+67108864 a150926f927cc3e60d45b8b18f3f57a3+67108864 f195bee4c6bfba67434e6204ba7c082f+67108864 96c83f753f9b3ff62b1d097d7ab5161d+67108864 85ae48853801003271b8b7a113e3c439+67108864 7279992bc5df537682a25710e83cb6e0+67108864 9799fdb7db707cebfc2fb23279d1328b+67108864 28b4a1cb9b7d06db17482190b37eb014+67108864 bc8887be40fda9cec1cd4e405dee6784+67108864 67b3c19c0cfc1f897d082fc32558c0a2+67108864 66b5d0f197a5d622cc8a46ebfb91c831+67108864 aaa8c95f2e065adb74a630951644b69a+67108864 1df2ba81a4082700248ed31b49a78d3c+67108864 c641804541401992e665b6d71b08676e+67108864 43a751e4dd67528826b1c8b48a208899+67108864 12e4cfcbdac91438cae64b2cd7c9780f+67108864 0d3aae2988c4714fa91537613c5e616b+67108864 2f95606f37db2656ced4b009d6905ca0+67108864 a3053b1d8868bcdd108d9bbdf8987667+67108864 f4c6f20e3e6f4e9fbd11325b33c81f28+67108864 079ae4f891032ca44ccad706c3210fc5+67108864 aeb92132131d06d085946802bc63379f+67108864 0c51a101a9015707f28be913c549ea2d+67108864 a3adbdde43e893554b73304849163d31+67108864 1124b485aa2be68ec06067db378caadf+67108864 105a90949ef8a77743739cf6912ddecf+67108864 2d6eb744f7babcbd30e17f709cefc92d+67108864 c6e8581198ad5ba878697e95b4c55dc7+67108864 6633b9c706e53b649cc5d0eb5d7474bf+67108864 a0a8055971c9c2698af9cae2dcfc1de5+67108864 7afa27ead5036742aff637977742bce2+67108864 2a4689ec1a63cf5ccb4ae3754ad143a3+67108864 c50953205baa8180b24c33b3430e1895+67108864 43fa314ee5b342bc7aed72517cdff282+67108864 a3df0148323a0004acfe8387c67cc7d5+67108864 1c29892044dc4854651c73296d0e0c41+67108864 9d75a69bb257970ffaeb4ffbdb890728+67108864 b1b22a2463ee4106c480505247037743+67108864 7072621df84141b650e222049e3c3d4c+67108864 638e4160832bf12ac9eed8dc2d1aa57d+67108864 b88afc09886457810ba20ed4bc9725a3+67108864 45bce56d25f3612a8fa4d15adad97539+67108864 5421b2945c952a99b69ef6a6a70cf453+67108864 1f6f2dfb6224182059688f5d46e61ff9+67108864 359ac6d0f79d5e29b465fa12547d45f9+67108864 7b7c538226d537326ae3c8a334494425+67108864 86cffb84184aab85f109d155f45a6289+67108864 1913f3176b9441fa5adb2b5feb112a36+67108864 6020e46282904da6b914d6a37756c9ec+67108864 e7fb9206f7d4eafb469b3619a37f64cf+67108864 5c4eb1a7bc507b0c4fd9147bd6fe5b3d+67108864 39511f0f76cd426f1a8b55563a393090+67108864 228589eaa12f741ae3d63964e552ceb9+67108864 e71fd43848d544eea1440595225383bc+67108864 5d9d7af54c2b43e70331e74346de7be6+67108864 11f889041c34528b4f32b717fcef37f4+67108864 41f9c5578d0b11e7d4e96d951407a495+67108864 3164503cb8eed5eda0f929e89b4ba41f+67108864 e8232889c0ebeb8b95efda8a0be0fed5+67108864 f831bb088817b20fc665cb152ffcb7f7+67108864 c317567be4a749a38cee367bcb4650be+67108864 535ff483eea4aae8db6693c6fcbf4c96+67108864 4c3667b429aeab2cbd1c3764808beadc+67108864 f2d7e4f9220a5b144ab935441ee5a4c4+67108864 46376eaaac4261635cc8d4c421ad989c+67108864 8ad8c6ba6994354296efe3b271c83d68+67108864 f3ccadadfcc75bb032d33af3f218136d+67108864 fb7f377672c6ab9a6d7ee640de0708da+67108864 455e5b21427a1e0c1166a77888e3db84+67108864 56c1bd2a46e9c510c0f9df14a5e35005+67108864 729f094efa399f560639698946c924a5+67108864 f3597659df39a5489bf09e9fee9e5f18+67108864 6eb0404e6575741c52f564ed127a9e58+67108864 15b2142e9955e2a7f2597942e891d800+67108864 24a2e5ad926d978f93f1a055bac2ae82+67108864 6da3be627ed06f3302422a3571912798+67108864 faf50ff859c11e516516a396fa90e370+67108864 f30c246988782a97f8fb045f8562cd66+67108864 3dcfac0f2b47e7b54dd42b7593c11b3c+67108864 8c0cca153ed7b0298c272a38659dcd35+67108864 24d100860a2522d686b11e841e6bb3fc+67108864 a0fa91ad649ba8bfbd39edc032164aa4+67108864 4873a584c9bb9b86df2dda047977223e+67108864 71af7580293bbe70550235da201bc5b7+67108864 95246229f010e909205f973c336ef913+67108864 760718000bfa43f87faced458fef8a81+67108864 b2bad6b04dc56bf6d486a389c3a89f69+67108864 f131bbb77c16d5e8bb37241b38aed448+67108864 e93e069d21f6b5c65ad59f54e10954fa+67108864 8edd8526ceeae5a2f73898ea94a2637d+67108864 89998b502934966809d3c3c5e9fcae09+67108864 2fce7d4eb38c05370d1695cb5fe2b283+67108864 19d601c0232c10ba5dbfd1ad65e26dd2+67108864 9c7b6580cb0a2b603d05117f559453c8+67108864 72726a8bee94ed66806cce11af1e2371+67108864 2b5db38f1eab185a91777d57ee86d2c6+67108864 ec6db4e314d2fcd9740bb0fb6a05204b+67108864 94edf1746c8aa716099d6cb69c065a40+67108864 4836f61b8d29f86f2cc8b7f449587ae9+67108864 436d54ff31569849e9b3b861a8d7a2c2+67108864 7ab27b51efccbb501ec8b0524d862005+67108864 0c23eb2a65db550177f8a03356b7e726+67108864 fae904ea4bded822adba6a676481440a+67108864 07f9c8f81344f0cd051bde9c3bb20398+67108864 57f5fabdd15e3deefe7e8670c015ab49+67108864 27812f4f1bf76cac4467e94bc517e2b0+67108864 eeb1e8dc2b9efb3ebab313e848ba415d+67108864 f2827412ad0b5ca07628a44c28fce28d+67108864 27127550ebc9c8be6cd30f08c20d3e77+67108864 827a8e19e46b575e698a03f2f159929a+67108864 d6da49faa10324de4f345e0ba7eb963f+67108864 48ee9edb8e9be2824651378cd71bcf60+67108864 d42fd051025373f0b395f9ee413e133b+67108864 8f72b8ed9aacb48b4d008fba4da38055+67108864 4c382522d1fb5e5e70a7641b11cbbc5e+67108864 dc40ff7e5dc3419dbf06ce5d89db77b6+67108864 b178799b404d1a0f2405c45f853bb87e+67108864 aad7711a0c588e389e1d898837c77975+67108864 dc92a289df1ee20c2a50c5cb34b9ee9f+67108864 c0b506a6540b190c8de760845d89a20d+67108864 95d57277bef8851c91053f8930557783+67108864 f1fbd42cb8a45b97fd3e1befbebbd141+67108864 343af058b01d8c9cb6deab3c7041be9e+67108864 ff56bd3a487164a446760ba4691ec93e+67108864 4ff72bbf0fbd4429341cd6c0633adfac+67108864 9b08953e5766d8cc5665c73f3066b9d4+67108864 c26eb39cffb14c5b29464552158f6f9e+67108864 2597fd02083990464f66d77950854dad+67108864 da1df4d16834f62ee21f8f414b63264a+67108864 9ee6fbfd042c057d1d700b51a3d6620b+67108864 1728c736a8598ede8333ef2359d3c9bd+67108864 a1a10371aa32905f2ec8ddbcba5fb065+67108864 ba2ad4e1729d11bdce0129d87f2a999b+67108864 c41113602add81f97ffdc93b5c3ee306+67108864 ee449a445b76a3f2590fe5ccc313cd55+67108864 7190f9a48c2b16ad0b93eccd0ea07e5f+67108864 d825ce686c183120f818411877161caf+67108864 8696a1e8f5542fef24a8e7a1b4eb667d+67108864 eac9cc77117da7eca4e691815d440570+67108864 4eb5252425e2342053e27721ef419033+67108864 bb6ecfd5c6c3404d9a4c1f44e75397cd+67108864 7dd9c32e758ac7a2a6adbcce675ea9b8+67108864 711f558f7ccf54b12910e7f4646d3ed4+67108864 7867a303bc4095bcde227661553682af+67108864 9370f355a3193b46bdecdafa6cbb9c8a+67108864 016b4584b44296de38f1d102937c59d5+67108864 07261c25f8ca01b3a384f590673a3380+67108864 e6994e3638f2e12ed52a104c14d88b1d+67108864 16e57ee081f408f8dc74e909efb63879+67108864 235866ac3b7d83e27bf8f4a6bdb56c02+67108864 25efb32940871da66f4ea5465334825d+67108864 f79d26bb161e83bd2a26b8c35b1d42b4+67108864 2783ea5a5721654486aaa5efbc83fb74+67108864 461881362fa60250adae60d3c49dc131+67108864 f4b68164f31c286249f1e5d2d7237c35+67108864 659eac0ad8a3e7e597458709bb795680+67108864 034ebd61fd1a2c7b8a283fffbdbb6ca4+67108864 50d93209850a3d6bbfe509ef813ecafe+67108864 42a97fd6584b9ca3cbc7dcb74cd405a3+67108864 3d0aa7902822df7f39feae96b5344f1a+67108864 f5dec5ba880a6d6392e4cb7605ffac0d+67108864 567809b2e7769647651efca42fef2e8d+67108864 6b12c06ff734e6e58b9eccf64bf1f911+67108864 7bc4c900e5d59443b0096866a80a700e+67108864 b8add59db3b248dafa75beb2700136cc+67108864 6ce79cc7c998349ff12c651f464b4d42+67108864 6cbe5e5e6b19de4a0b715e0d845d5719+67108864 e59a47b51498f2ce7f276a9a0d63fa66+67108864 4f5ba032de58d21a0cbd20ff0c5ca2cb+67108864 9d5fdbdf3cf4cc4fe2c32e5678417bcb+67108864 606d871a7812d8d61717bb0d6de1d3bb+67108864 a7f59b847684061ae94b5e0d9bf70cb0+67108864 7704eacf857396f10a46a5141067f26a+67108864 bee69de8466c8b7ed1d8729658a40027+67108864 3c3c55ff9c9cd05f1fa4104140fcc901+67108864 4456b7aef7afd6689d3570b66ef0182e+67108864 50ba9fd74ef8d07e23dd96b20e1c1067+67108864 ff2c79e2bcae5c9204cd64cdf372d3b1+67108864 2ce25d963ba37dd5b24c2df65dd1295f+67108864 20b81f528f70c9e5f920e7534afc2bb2+67108864 a0b0e42685869944d3768dc337580428+67108864 fb0d0bc80635bda7b81030998c5bdec3+67108864 bfe86f22ef97ee20388699c8d4e824fc+67108864 5041aa0dc3a9b4b86f5aca145314477d+67108864 68e608344390a442be79c53395223e36+67108864 86bce8f646770b66dff7cf43751b77fc+67108864 de0b67d42b4b6a7825a3bef956737e5f+67108864 4b88b81edeb09740420ec66d79249c6a+67108864 755132bfea966ea29dec0b5703174ff2+67108864 c80f48e88aae10238b1c28647c7ed739+67108864 e001ea8aa95caab94f82df29fdf27e4f+67108864 8fccfa89d4af86d60e9f97af9936ecf2+67108864 bb01dafd921f67f6cd859d329eaa5463+67108864 931a95676fd8ba998400abeb98ad293a+67108864 3e0b9148a86dc17ee1ed7b5d44f394bd+67108864 63b29d2a9bee8cf79d63ce337feee7a9+67108864 bdc851ade507ac37df5fc3d3d869a996+67108864 fe054d07167887c82d439c841ae352c1+67108864 0107f8ff057ec92321c25060cd4d865d+67108864 ea6bb18766a302faa044cc2357ad1f3e+67108864 487fcc9b756d31eeb5ca6c2006bebf91+67108864 233f7ea448da931b0385a63aa0b3c1a3+67108864 fe1d37c64f7e48c69e4565428bc78857+67108864 4990ba572fc9afa7f325052b51d0a47a+67108864 423266abfb6cd3571e8e66c2b30d972c+67108864 8a83c116090deefd716b983e63ecd5af+67108864 8e9b6bb307f89902d414223e9cbd7d5d+67108864 e18c8fd868d41face78005a8b255bd3b+67108864 4a60796fad1c71dc21c23a74ee658421+67108864 2d27fff66b21eb557946c09e9b930deb+67108864 524dd7eb012fd8b3b3f64b31f43115ce+67108864 512765c1f1685768a0d8bb47ae5225fe+67108864 1e11f5b0124b427d1bf462e7632296b4+67108864 41faf74a022e8b3a583cee0410be3c32+67108864 0b4a883486509fa81c8c19bcc51532e2+67108864 f708c01017b33cdc5f4d373da7fc90ff+67108864 602de9b6714a2d9b55b81670256bdfb3+67108864 87346a79929afc2fb5029dac7a2279ae+67108864 e1251b9b403eba79863fc82fdfbd943b+67108864 189117239220e41f0d02e8d7620a04a6+67108864 736705421734ba02be110da2808cfa81+67108864 295f181993c67d894145c2c071b4301a+67108864 ff84adf713707bb22c1eee95e4e27dce+67108864 d3c2aa31c1d8d790741e828df484fe17+67108864 7aa19cd3f187fa5b7dd623c2c09e4236+67108864 779595e6c757024f5fb2fef69d9b048b+67108864 eb3fc60541f45f8ed8983af5c2bf3b95+67108864 b8fe527fc513cd3f60237c6aa87b0573+67108864 1c9d80f46710684355577738e5a07a61+67108864 98a2d14f30435bd37e68e18fd13879a5+67108864 dc464b8e7cc454900bd1af2f73167ed1+67108864 3fc4b913ade156db548d8db91e03389c+67108864 677c1763fe8b931e01b5d76c66119051+67108864 33bb1e8bc7548970a4b3f7055fed6cec+67108864 43857b257e194d9a0ba6b68e16d81dbc+67108864 4662626ec479033f2c67f00c10f4f3cc+67108864 82b053bffc39afd1835da5593026c5ed+67108864 f090aa4a714e943af26fbcabfc5a8be8+67108864 6a655ff89d9a9e1f034837de7291fc2c+67108864 f74ae1321c93c6d3d0ac64cee951518f+67108864 d4c8f4b673100f15076763b856e6261e+67108864 fc516957b488877fd52fb5723aaf1d9f+67108864 6729a81638a2518956a3eb5a6a18fd91+67108864 f13eb8762ad4935d6cdf6c872a5afc0e+67108864 8f0d2b097917b4f052e5f9533a55fe58+67108864 fdc3ecfd8eb73392e1fe1aa8edc916bd+67108864 337387bd132aaa183ed5843f272a49f4+67108864 6a9db804b6f2087c186fbc8ff77c79f0+67108864 5fe678e3a9e49f4d8debcc56a4d04dc8+67108864 89f2ad15d704ded3af481430d26c00f3+67108864 f803716b4143c361087ab2a034e9abe6+67108864 4edf94e4dd6c5c6bfb72da385c2b981e+67108864 c5f51291f77b31cf93fff9e294ac9659+67108864 d938cf9124ca3f39eff966a98668b3cb+67108864 aff6467b5d36539c8c6444107f08e959+67108864 da8a0ad7cd02d4f78df8ef8c8b61f8f7+67108864 9d33faec81bf171b5dae27fb380dfd8f+67108864 e4093751a7136d8d17ccb5034aced419+67108864 94fc879d3bcb98f726b2cfe018f3be3b+67108864 474ab1d4763a090f4a361d660544d8a6+67108864 8af4c1580f8c0bed92d3b860238a37f9+67108864 63b45b164b25c4457f672ea2095bb234+67108864 3ebf649e0b24f32487778caa41f24442+67108864 9719bd418db412587e6d66c75c3a6205+67108864 346d35f73e586a9e5e2573b336f194a4+67108864 efc845c053c037d89d9bcc059a025db6+67108864 186c5aa2db96fc6b9393d7d675a11e7f+67108864 631b5eced91f74bbfc206cf5856e812e+67108864 916386facb14f03f9f3251ca7b07476c+67108864 12844c228114136ab850dd20e11ace4e+67108864 ed3255e55123b2ef21f4a7d2f2bdd644+67108864 0e31381b92d55f99ced79c14281ab52a+67108864 fed7f83c927dc4e5b2ba63e21b1736b5+67108864 22ab11bc0606f0d041e34f4c1139a209+67108864 20bbbc8375b015e4a89df74a1566ef47+67108864 7d7752212e5226ae570e03c9b2700fdc+67108864 cd22f0b787d25927062cbee33bbe3371+67108864 40baadfd1426510073508dc0628f0794+67108864 181e4bf30a8f77da23c8959e1be70fe8+67108864 622a02d725eb682b81dda117da700ed1+67108864 8d9f0c71149e9c1199a951d452ea0d02+67108864 1814f3c34ea4c42495a79205816f169d+67108864 4f4298fbaf1dcc46ed7c3f410a065d45+67108864 960e592059027311a32d1c1e97bd7260+67108864 de9ffdb227add673b59b10bc19796360+67108864 2736cf83c1bdfbbfa742472b5af5e651+67108864 1269c0373263126cf938de481aa9b897+67108864 fe3fbc87e7a23f0160a69c0ed626082d+67108864 e276c8357f973f36b45f51f0c71d5aed+67108864 1fc4414ab833f2b0cb43c5c067aeb39a+67108864 652af913139e3e10555bdfc56ae16b9a+67108864 c3119097a1400ec0897abf917ef8a108+67108864 69a8272c1d1f14078e1d550b611bc985+67108864 23675ce9f0120b2d89289e253e92ba8f+67108864 f959c9a7b0272c49ed1f084208694276+67108864 b7e9bebb22287722cd96cadcc4eea2fe+67108864 15acb83d077045ffc1b8458a48a6398c+67108864 c4f0640ca93090b7a06df55c66110547+67108864 275e73ff5e9266d5d07fd4c9f0b6256c+67108864 2532625da1f8a0a444ef53dd0d196db2+67108864 7f05e653e318b82ff410b83e6bb0b556+67108864 d6e133ca3f00f63184ce80a53fec3107+67108864 b8daa3bb4165f81d53aae24183eb6608+67108864 0a8d711d220316af33b0ec0c1818f403+67108864 f9c34cdb6b97d2c5dd58430d324e7f05+67108864 ddcc459d76f637cec850257ab5fd711f+67108864 a532803027b7545065855b827ca760ba+67108864 c5109e5fbf248ae1145b45ff2e137a86+67108864 088bba73713732e628ed664b45a80878+67108864 720af32dd389f70a969d6e75c8442d05+67108864 fdb232e6af0bd7d28e2b5b07c62e1aa5+67108864 7a50af59afbed238c6bb61dc3ac22675+67108864 e3831c594aff61c21fbdca24228c70f5+67108864 b64ee908abe5dc9b59db0e928833f81e+67108864 7cd627c229001bfe2a2771412125ad9c+67108864 2eb73d895bbaa6e6f704712c5dfca62f+67108864 5fbe4f7adcb52ef8afe2770c3f444d57+67108864 cb00a9a59fe9adae4c19c55d0f67cb23+67108864 21309b59a02bf3956b350c33f5ce016c+67108864 fdc90f4032fbf373b66fd1a1d16cda0a+67108864 1fb14dbb013e05b7df0ec7275dac673e+67108864 a287d100a50408ba94ad3c1956445e44+67108864 bbf5b0e3c7d1f855d43c1b3ae5713cc7+67108864 66364beb6181a393943f61726e06a63f+67108864 71a199035090172c2c48dfca851fb77b+67108864 c85f3d46426e932c3ae5f20929f1d412+67108864 413053233729159c37ca20b2d325729e+67108864 16ea95b5143fac3d4894db0f6761bc07+67108864 65e3ea0a4c2192ba1b3dde341beb8b8e+67108864 9be1589739885d435b8208ec3a5608e1+67108864 19a2d0b16817c6e11cbfa36f0fa17cc5+67108864 e5b38b84741d4def69309c9c66532c92+67108864 1cef5fb113965f16ff73f0d74ac5f6f2+67108864 57a91e408fc820b8cfec6d2733f5b573+67108864 bbadd120a6bce9d182009445d90bf403+67108864 d498136e6a6b6821df6241c945245a72+67108864 a3a7f8dbc36741da81350f2fdc6f33c6+67108864 0459e23c9c447e5d6cf4a733a04de961+67108864 2dda2d49a05aa1fbc58c3ab040281bfa+67108864 30b7695c33688f894a83f3cce0b67da7+67108864 8689b86276aa67441da2602d13484a16+67108864 a77f3e13c2744bd912ecbc94ad5aade4+67108864 10da7c2337eb393cfd600368862ba662+67108864 ce7e2fde61772e393ed0d7c31e855be3+67108864 096b521bab8c247f74789d070e771807+67108864 1019c2b793990d6aaf7d81bbb2176ee9+67108864 54ed19ddec9c9c553f59ebab3a7d5dbf+67108864 094fdf5c30c3d805c38e769d5ee928cb+67108864 1d7ebd59cc5d0cc9400d6f2fb9e29594+67108864 d5cab35aba572e070cd870a19c0beec1+67108864 e418e25ea0e2d1dda947ff716d916529+67108864 a568b248c881c740a444dabe4a8cba1b+67108864 25688b79ead2563dbaa5d21e512c1aa7+67108864 4fa44475f1dfb2fab6dfa8347f43abd5+67108864 c37860c180fafb91feb9187acd355c2d+67108864 585dfedd5202b1084484ee85dbaa5ed1+67108864 ac00a4785238f69fb5005977d36d02a0+67108864 a97c8edd59cea65c679a80966ca03482+67108864 2b1207bbb44508f0738dfc60881c2e99+67108864 f0f698122fcff73e939f6b6bf22f9cf9+67108864 792a5130188e5504e23bb19dcd748fb5+67108864 8a50dd1f26086f2eba93a7b6e7035b11+67108864 7fba73104b7d27b8ca512746161aa95c+67108864 52f549dd074baf3fef610d2a81e8d1e2+67108864 e8ba8562c268fcd5b2edf5bdad76d319+67108864 6fae9fa89a358ce5c80c339e6b576d78+67108864 48f1f2fc7d52618658bb8f652fddf9a9+67108864 5c6a4bdc74ef2581d3fbf391a8d587ae+67108864 411afdc89fc1435d7ecd1569e474d6a8+67108864 a546bb78c4913f26cc4b1c8ab91ad277+67108864 fa45ef65dc70d14160f1efaa0a8e2687+67108864 481dfbeb675e469846f0f69cb7d36d73+67108864 1ceb17f51950b94673950f088842f33d+67108864 d1e4769eca2b7eb98a84a87cf6803cf2+67108864 f13d8deca0cbccb51fcd1a4ab40ab0da+67108864 20873c5e390a5552511f8ed98e2d49de+67108864 767eadf955a415988e7e1f83c74f7a9b+67108864 85562d1acff2915f0ff6d45ad87fdef1+67108864 12547b8f30465624e8883e25e870892a+67108864 f2dd149abc688678a5132be30af317b6+67108864 a5190593f6608e3747e929105fd601c8+67108864 101835f2b47c37fa0740525295019838+67108864 107c3a97bcc74c54b565f025068ee9c9+67108864 bd04bae6fa6e5a8fbfa9dccd2e467952+67108864 cf907435f4f5c0446fe211049e211984+67108864 16d183f23f46c6cb4e492c2a496901d1+67108864 c831967b607bcc15f73a8334ea4f1501+67108864 edee1bbe2a9f0126e45526d9bb421861+67108864 011ffbc947b2aeca6a75939ef16e4b1b+67108864 68d847961bed44f8d89bb26f1bd0af35+67108864 b6d56c74fe7d25dcf0c28df056090306+67108864 24da1fd3c8d4b91e3ae907a25d156a54+67108864 4a61fdabde6a07f7e5b2a4cdcc26d013+67108864 b861eeaa168860e759d5c8f24712f7ee+67108864 a266e80c9a70f7d4937384aaeb5ee360+67108864 f8a5c5d06023f4bf75eeaa1eb5bb3374+67108864 f228202d9f58ccdc24c1dca57fa5d77d+67108864 4e61e6dba9ff5a6a4051d48b907be4ba+67108864 2be5bf4cee45ab1c4400a680df60f81b+67108864 dd66f99ff5054cbc8cf54d3c8fefc5e6+67108864 dff0cfbd2ff138d4f9fea60a96fb2df6+67108864 500ca6e6c15d85070900b6fdf3979b76+67108864 6f36698535293c13016b1abd0ff46139+67108864 e9dcd509836c212d2f6d8274891c3c41+67108864 70d0934888c6c587addcc3927bad38a2+67108864 0c50fe89bb20e3e9efffd1a0cab6d084+67108864 d4e349a2a674497462202d061932508a+67108864 6bc71e5e68fc5f83370173073ab4ae1e+67108864 a00a2da32f91785cf75e6482e59892e7+67108864 397510c84c36e9c234e4c280b06862ab+67108864 e0c00e4cab678098571417c9fda1cf87+67108864 124092481a8bcc63fd71fcc8cfa84795+67108864 0e87753f045eeb278f2b257fa53ab510+67108864 8168fbb0188889addbb3e9b68d3b3593+67108864 f6a005c9723b4ddf4cd5bc1811279fc6+67108864 beca840b56f1ee8eab55366750fde36a+67108864 944d4724fdf35af10976624297ff3343+67108864 d82f71afcdf80d43ac70d43d18d039cd+67108864 7068a4db9fbe9a06e59350f634fd8855+67108864 bda72fa7ed6c0f07f149deae16120901+67108864 b134a0ad3152051241bb63ddb0ffa0ee+67108864 afd1344cd6247583b2e08b42a5b495c0+67108864 6d71dcd93c01a8bdedb1a384cc1b47d9+67108864 525f86b84d3f9602f1308d2c82206019+67108864 3c5edb580b5d56b8fc92b49681e22db6+67108864 8fb6f50d1873a1974b7c5947ad8ffd5b+67108864 fd510dc5ad3116a7b4424a405c9e0333+67108864 a5e463f2679cb6f4bab936e0e372b8ad+67108864 7fa2c65ea82c0bac249684bbe4ee3b33+67108864 d3c23cb68b91c0d1852e133c82881eeb+67108864 0d23ac035da7e96d139f6b6724fe6d94+67108864 e4bdc1e7327eaa9457860179765b1a2a+67108864 3838edbbd807bbe5c75379e6f7ef53c2+67108864 ee09b2bb5466e520d98348f0b4e5a272+67108864 4f5015d61f01512653964ae3d58cf2a3+67108864 c05fd85f363942029b17fabca47b21fc+67108864 93ba1a2da4ef91a9460fd65895b867c4+67108864 d6430bc6ff93632f3c571c57ced084ba+67108864 a59c6864154616b9704d769f4437fe48+67108864 29f7d541b7fd363162189ff4be354ec3+67108864 142b095b33338c13fe6a0cba04ab8982+67108864 9e4fff3f8f5a272c4e55d79e899acfed+67108864 5d782433b0615d0c81f40d45b5ecf4ac+67108864 a1ce4f9cf8db339593655aaf432dc372+67108864 814f4ba561bd3459a7da97a7fca5f3a2+67108864 9a663484b49fd5a5465906760f4677b1+67108864 b4fe2e513982a4efb17bf442ae8abf30+67108864 36ab4fbd80eb1525f5f078c0bad27961+67108864 888389ff68d5b71d3a38d44d2a5f5321+67108864 af94eb7d687c5d973c3ef6826986a377+67108864 7ff861173bc6125ac2729f82fb4f76cf+67108864 f04b119f090e7dae55e982c94dfa5197+67108864 67b095174cd6d4d5a97c4c10926488c6+67108864 54963c6c726ae113457ac8628493bb36+67108864 94b063d6778371dbdf74c81ec6e00705+67108864 efd856b38a4127578ef3b30cf2f8111b+67108864 e9a78aaf8290e786d31b52e3d280f25b+67108864 acf39db50c314e81d77063e1363b0d44+67108864 f5ed13b763e78ee4d4ef45c754ddf2c6+67108864 f0a522930f01ccd16a21c4c836d81486+67108864 638503d44d5f70646c90cd9c1e5ddad4+67108864 32375ece74a773563332b435121f1f69+67108864 206a739575b9f0864abd4f01c57e7a6c+67108864 4b8ce29ba1e51c563b67abf72ba2559b+67108864 5ae2edd2acd049b2bb6d2bf398e0ea9b+67108864 f142e90252904e409bf460290d3ef7de+67108864 c168023fec9fc0d340f647a31b49d68a+67108864 d46018096ee511db7264de70de2de130+67108864 a4ec756f5ec69838074d7c51e3ce9366+67108864 657b7662f9fa7ce790eb6b6788bf4fdb+67108864 88b268dbcd8cfc68e322a6593a3f85a9+67108864 f6abb1603254a9c704c214208e45ecd8+67108864 53ba009b6a5ccd6e5001c099c97fc3e2+67108864 5304881bcd7ae73781a53a4fdb8f013c+67108864 fcf742e76f89d28953997eb339c4d2ae+67108864 e732f6fc4718c7ab9d6832641ed9850c+67108864 de4c892de00874bc9cd07918393ef6e2+67108864 9abadd8f9c1dcd464f17c45d65e6c4ab+67108864 7f1971a1fd92794421c07d50771b404a+67108864 349595e945b11955f64fd8899611d58e+67108864 d58073ab66e3f676a560748bf9898ba5+67108864 8f8b26f5d44408c19d0a3cab03ef67cc+67108864 38bc3e0c4925c47fef039917090f69a0+67108864 0ca5058c7c829ff871ca3868332b662c+67108864 5ae9155c4b1a25c37ea00d671324c6c4+67108864 7028834108fafc13240ffe2021cf7027+67108864 f2e194ea64bc8a0dbd5a86f085f1e934+67108864 298bffc3352973f28307d993a8973c1d+67108864 5e43691e50baacabf4a3c295649f2b2e+67108864 727520dafcd59f806f52ffaeaff02bc1+67108864 706789ae77dc03640546c8e83e129528+67108864 b5eeaf5cd6a94607ff7247eac7eb6455+67108864 7f8b151b8ffe117beea3b1934f9f419b+67108864 bab5b9d0cfb54f33e79227643fbf0b65+67108864 a59d082d7207bef94b4991215b134a10+67108864 785056e6a4426076b734e608cae86737+67108864 47117a5988bb128528b528e4d541eb1a+67108864 1b7085a666ecc988bd37eccf3e93c4ed+67108864 bfcbe4d5f5d7e4678f198d60996f13b9+67108864 3f4f1303a528c16d0f930da14a16b230+67108864 9e9140f33f9ee9b5fc3907b58eb051c8+67108864 4fcb1c3af4d85fcf0ac1095e14a42bd4+67108864 a6be2e79bff044c13ce21c2aa9c95e08+67108864 9e03214d420e916b21e2324a432dbbe6+67108864 1f0b58dc5d2b1497cd83fb9b1a2176f1+67108864 44c835860f76c96f9e0837e5bae8dd54+67108864 f9d33a3817dc95252c3385a9b620de96+67108864 c9fb1942eb1ca6f2df777a537bd717f4+67108864 e56f8e279cf628f2575b9f0b8df32df6+67108864 febf0b9a281b32a2a20b9611264f93e9+67108864 e6d5ad53ed0acd1ff102f22fe495a7ac+67108864 75435e66e302aba8c7da88b547a2517d+67108864 3bae3dca82efdf59e588345138b08498+67108864 e2e2c0f5e15558e7dce55f20fb52e254+67108864 f4c5394e402d38d8d4c5725ba7eef920+67108864 2580fe3b582a0b4c17a4ff4bb9ebd673+67108864 ed5992cc4a9cf4daabd5cfcbfeb4b896+67108864 488d4c76a978e3265bdddfcde78fcc82+67108864 04fe93c825d53638d60d38953b372557+67108864 ba6e44ea4f79f61f907e36253c0bf958+67108864 41213b819b4bfff9f17581950193ebe0+67108864 269b6e49b5593ef54b3d49032e4edfd4+67108864 e267c0d9870a736ac13c5a2a01cb23fe+67108864 804a37500b781cfa66441090c323c677+67108864 33195f727565738c7f2e4a70c6920d7c+67108864 e7c94488ea6b2408b8a81d404bab5408+67108864 48b336d69d1188f5ef6523151afee6f3+67108864 6cad6bf178aeb3f6279911a1153b0bce+67108864 9a674b1c710c52a4994a0670610cbf4c+67108864 f6a38265f9473e02057ac4be6bee7170+67108864 833b1f028e71ab42dbecc4d183da4b07+67108864 6839ceaa235277adae36d5587640df0f+67108864 c4835d24adb63f08ca4311469d82587f+67108864 040e2f87dedfc549528ce3de53688dda+67108864 2984c84d1d32b7f52ae49bd838b8c016+67108864 33fce73dee1e203326ffff8fece4816a+67108864 f59f8f10cfa7548df73184ff86acd661+67108864 fa82b6721c15118eee3ee95b41ebc19f+67108864 7b6db4c134dcc09f5a851d81d6fe2fcd+67108864 178ba3074b954c0aca5910dfa78e341c+67108864 f44afa76eca4fac8b8bfaca8b14401fb+67108864 90d717e686fc0cfecc8b92bff5e3dc3a+67108864 4c497db5abb4e6c08762c66b51be2864+67108864 3f5f220f3749bec9664f2a5c22714f0c+67108864 36165d8271554ff80e9ad204d6f41c86+67108864 0cde3c478fe6d14dfc7238f017af453d+67108864 d22407672d47ebf442725a0365a4f9f1+67108864 9ee04e14feb275234673409d2efa97ee+67108864 1431699e15fa4cef7dd54e6ed69d9cd5+67108864 a91b69896d9cfe2be169f4dd1e585b24+67108864 8c35d02a5b3961f7717828239b49d21d+67108864 c4d11536015b05bf84926e0cef77dcbe+67108864 b14f3f000f174c9b63de76d6b7f7e2c3+67108864 2732612254c0b8fec0c533017bf946bb+67108864 87b760ef4b34ac9d5ecf0c32a2d07aea+67108864 7566c2a133f0f8c5dd31d49a6ba8d5f5+67108864 28de06e61335558872188129073eca90+67108864 384ec6e77e4581804ef5ebed60c49806+67108864 460f0d01ee80f6936a36202c52d1367a+67108864 f475c729d470dba96ad5a355223fa3f8+67108864 75951867b767478687a0ed04031005dd+67108864 988e9032fc26f255d5e65f896f97c386+67108864 c72d6fe3a565167215c4b8725c71d20c+67108864 03f2a74dc6d301e7eb1440e7af0e8aab+67108864 0cad7f4c65c691932c7490ec31f32a2c+67108864 b86eaab28570a18618fcc5551589535a+67108864 5c2e755aa09e7eb494fe2f380cfc18bb+67108864 7b0314633fd0276ba4a7cfb18faf2a63+67108864 805596626907ffea2d90c29d1a8bd183+67108864 bbe42cc13151e29901f2ff81cd16ac10+67108864 96f514038c76fbc50b3325ce0a50e260+67108864 73ec6c69f79cb39a8c6813d6f27082db+67108864 9ab13bcf77c6874f6843b2ce9bb18cb0+67108864 4570482366c5811d199f47a2e92ec727+67108864 dc1c567a96316d293feb2fae90a7b8ee+67108864 7b2bfabe105b5c19e70bc18cf7c62320+67108864 513593f9a7b1b1465c8e20a4daaa8e2f+67108864 6442521c08fd3b7b6772e71404c09d9d+67108864 601eec17c302eef232cdc707534a6c61+67108864 2a7822d5f641502312296d507301ebca+67108864 0805d7819623d6af391ea9e072ce9bc4+67108864 152c643d2ccad0674c38a23368a4a1f9+67108864 b1a4f45eba2a13984d9b095ab5a16e73+67108864 9cf64a5302f8b9c21c01dc5f068bdcd0+67108864 0e82e1e3f2f1390be5ca4560b18bd96e+67108864 6213cb25efa2a9bb524be9a4f273355b+67108864 a04a71578d23bf26517ae21d101f9ce7+67108864 c875cbbd27c30d3e2be026fd11b28011+67108864 1375d33fc6949a826a321ba2c2d21d05+67108864 aec41b74054aac99980f2047d462757d+67108864 e672ff1a260ac97238a25a95747a346e+67108864 1cf87c401a5084c740466f8a724132b0+67108864 771c370c42eb026842a56f533af4b8e5+67108864 5139242530c8feb094f7effef56e7305+67108864 1d4bd13959bb21b28b48363fd367fbbf+67108864 e920e35f2fb67d9b34b012b95d8e2c89+67108864 8facf133a1ded0c098fa41c953f63b89+67108864 6c32393c950f9062a02ca4c13bd858ae+67108864 6b2e28a4fd767ef70b56589f3d2f29f5+67108864 f2b0bc69c431be32a87fc6e1c097e456+67108864 adf88e147e6089df2e1f44472d4523fe+67108864 74aded23685105b0a360e006946a403a+67108864 62b19d7d4c3342d653f780bdeba26e90+67108864 0ec5b45cd3a722baf10c683c3be0f1e9+67108864 9da6829a21b6b75cef6b5c6f17f5e07b+67108864 826ffa05850817239f4fe38d60c01ea5+67108864 adb1cfacdf09d7041a55433f32d32c4f+67108864 29e8f3c27f97a7ee5f00a15196000f29+67108864 7a5753093a96c622e7bc5bb762bf65c4+67108864 1307b7902955bc0588261c48d684dafe+67108864 88d27c9d828382625103e1b1b75ef6e5+67108864 7345011181afb92c1990ed7656a0eb9e+67108864 22ab24fe279e19a3773a70f42a4b37d2+67108864 27446b06a710072e7439388ef138749d+67108864 27353af04e039140bf5560bfb12b49f0+67108864 2cf867ed85d88a901025580c0d42c163+67108864 a2cc7481a86b8577cd9b1c36d81f9c54+67108864 63fc71a9df52da41f1879db40ae4683c+67108864 cba5ff71d3b6c3499e8c9f9ef99484d7+67108864 621818664122058078b2669d0efb60d9+67108864 544590a66aeff05521be3c0c51009803+67108864 a56212f4d9e0072dd8b2c6eadf7b2d9a+67108864 2b19824bd9c1f9bac0c87163f671c56f+67108864 c039c43ad2190e1be0cf68376bef9e76+67108864 6c616beba20069803ac30b1be56aeae6+67108864 28c4d7d0e0f45cbc9bfac0bf72beca95+67108864 a3b74f9d7d729e0443b2acac559aebe2+67108864 67d7c31bb19b81d190cdf58c92a0762d+67108864 6ba1fa534fb5ebd4382d2f37ab9bc16c+67108864 5c8e4e4404b987be63f37942f38b4d17+67108864 b3fdd9a8d97720199e9fc8bdf5464ce8+67108864 9e41a0725995633c4199fb5c79705146+67108864 d6ed794aaa78d7e338c9b88980798d57+67108864 bec7ca93e898b711f8705ed27815bfed+67108864 73d9523c774903cce44f37b36e350b33+67108864 3bb892044528096fb01358fbcb5689d2+67108864 ba6a6d4afd22b52213df85f79a30d251+67108864 b1b5fddd4d4dfc8de7b6e9edd888f24e+67108864 ad1cfd8c575b1f4df0d9481bb25bfe10+67108864 eb42bc382bad6c31248953175c57fbc3+67108864 f7ff3fbcddfdeff776851bf7f0b91708+67108864 096d0a35baf62c6267a588ec20b0b295+67108864 213f9667d41a694c24edeb6723817425+67108864 a1a3102d7223910a50f343bfa9f567fd+67108864 cb20b98b9cfa88ab1cf0cde7e92a963c+67108864 cfd396b2c4fdb101d220385445bdcc6f+67108864 feec74cb51b17c68e03caeaf520a013d+67108864 3b0eb66cd74ca88137ca5f3ba474c653+67108864 4e564d3d903811897e5970f31e20cff2+67108864 4b811ae252ba5070d60c6dfe5f6374ed+67108864 139ab8e8f46ac3bf236c23de49925413+67108864 e8fe58e8624815a50badebfa4d6bec2a+67108864 3015e8601d6eb6e42e9cdbc64664f32b+67108864 d77de37630cf3560ad50d02352d0c514+67108864 abc01fbe76ef45bdf2835ef06e4541cc+67108864 4dfb8d4243e6049028dd1fe43fd2180d+67108864 3220ab3a86613f63e0e5d4bc5a02afde+67108864 fd77865c46669253284d781a553b8a57+67108864 851ca8a64dca3edf8eb645a0007aa9c1+67108864 16b554ca3194d8b58cd9be8df8b7a321+67108864 9d0b9cfe67898e7c9f58050a5231e4b0+67108864 757a90985b5b92b16c02642f7c36fd74+67108864 3857a258764c94340920f45da85541fd+67108864 40326fff73456df9b895e6ff137fdccc+67108864 63f1d9a514d48754916bd33722911176+67108864 4820a4a74d6d4be30f4cca1eea2fb507+67108864 636d058d10bf9791c3092a8443915c9a+67108864 916f4f6dd7635b871325c288fbde0475+67108864 e7b2a6379ba0d49e7017bae5d4e5469e+67108864 c17c35e312dba5bd13ffd23cc2c7d939+67108864 7d80a58afa6735d113ffee5228a87775+67108864 99ecaa8b85b99e85427fa76657681647+67108864 602ae0f4abd8be52e76e9749ab8d8766+67108864 546e66b992c13e1f42fb03ebbe21d20e+67108864 46be78022b380d3b1ad9a7d6d48d4ffd+67108864 632596cde5b56aa0ad4e5a364669bf30+67108864 df8e7efd77d29fc70afcdfb355bb7002+67108864 ea0b3c954abe83b54c8c2b82b4b29217+67108864 1b7ff88f8491f39efd6bf74caa1b8ca2+67108864 208469377ac08802354de7a56d216c99+67108864 b467a3def115f956b617a4b5c066bd38+67108864 1208f0cf2e1953ff2d218525a0e5267f+67108864 44d7cc36d50d20860983f5a0869248b5+67108864 ac5c5552be8df8b790863e15bb50f3d5+67108864 0eee3089f9e662f5593a5ebc27b00532+67108864 5debd7be66b6480762a64e42f03aba81+67108864 e6a2bf3e08fd8ae2532b5dfc07e61f4c+67108864 64cb0b5d826b614aef5d95f17da8303b+67108864 3df707ea75c92e036c1185f046d5a2a6+67108864 50a7f1474a09c58d74d64605bddea6ae+67108864 874d107937f315b0b8169346b0630074+67108864 8e67dea16e96a62bc9902954d98a0f66+67108864 8d97c8703fac17ff05d2493233a67db9+67108864 0b21830cbcf73b7742837500b4c815c4+67108864 f2d055d36a926d74b87235c598cb4bf8+67108864 8aaf0b8589579bdc8da894fe167df948+67108864 fb64252c12e1fe1b64762c7f2c476dbf+67108864 3e23aaebfe46253e265f1cdbe55e9ca7+67108864 3ec7f774ce71e3d5b05a1b428357879f+67108864 870c74fbba8c1c5ca855374e34227770+67108864 c847245ea26999c205496a2edadd1f0e+67108864 c9c01dbd3df4a60e85d49a09c7a78cd6+67108864 1c5409de5ac0dc6c56cbcadc39de2c88+67108864 73081aa5140b4be500081ff8097478ef+67108864 edd831590a9ea992557dfae2ced26ec3+67108864 45d83cbc0c27d34f54e8ab01dac78acd+67108864 29d0340872b053b07c17781af001d700+67108864 6c707bdab47d7f86926f3ca83d46a5b3+67108864 c83a0779a209c7b6d36008b3b5bcb094+67108864 022481f50f42cf63f4931425ce841e6c+67108864 3727c014ebdfa8fd044c11fa7e5fcdc4+67108864 2cc1df6a91333b4b9b1a1752d298d7f5+67108864 6455c34e8cb08007b5b538aa96335cd4+67108864 c611c113c44dbc38f2b7dc0e2c8e789e+67108864 72d91fa8c3fd9ca40fe9ce4abd6aef3d+67108864 269ba993ba237bf6fb38573d129e29be+67108864 c2647496d2d5e294a4f59d0b321e597c+67108864 8652c87dd888540694383e6c37fe61e6+67108864 ba173508a36e70695d67f82bd002ee75+67108864 6b24483f7cba1ee77e92965c96eee803+67108864 7dcc165fac7975c3e390ab595ea84215+67108864 34de3797f59cb379bd7bc54eb07c2159+67108864 2adc45907715d755fd4f422b841609ef+67108864 7a46f799c381c18cb2ff2812b5b845fa+67108864 1986cd180cd8e948cfff091ccbb656ad+67108864 622cd1910b7f81f0c7170da1a3362bca+67108864 3aa879b74c7dc6bb0858636638d2b5e5+67108864 0dbf410b5be606ff739a480dec8161ae+67108864 f4086a5dac293be83bd889b04b7fd312+67108864 1f63c6f777a762cbb96169b2278ada67+67108864 96b5c1defe59dabbe1a380a8bc6056d6+67108864 84b13f87fa6c3ab2d04eb93f3505c98d+67108864 dfdc2aae1c1f49fbc36b5ab9573cb64e+67108864 318d865d048de4b484291b88bf36af44+67108864 651188cc20eb0df1c8945c533fa2892b+67108864 a8256ef0104dad714359c01c8059499f+67108864 5534cf3170d3cca00e8926e811ed31a9+67108864 35097b20dae2e31750cebc3a4046ff7a+67108864 08146f4dbf346719da9351d806363c3a+67108864 dda60404102211f6f8958f1f044e2a4a+67108864 f0353b389211bb2f3787147643e0293e+67108864 42a778507d32f3d16563d23b17c836e3+67108864 770af5bcc4f42e26bfd94f11b2de1111+67108864 f1d6738a1979688177fb392dbc3ea8c8+67108864 40be76d3cc1e1f0700ae7bee5b084b88+67108864 8560b693afb6ec7ab75032819e1a0737+67108864 9ff467396156130788b0de8b3abbc835+67108864 fb81044f46ee376b4ea7067c0e9474ad+67108864 5aa3aa18a8eb9fb635b218b5ba85713c+67108864 4bf897273b900fc96efaec8b27266257+67108864 601cb544933cb27f9b8322d609c24379+67108864 0f845c76f2cebf936abd4a8acee42076+67108864 771a5507849272544dd28835aee1baa0+67108864 82ad48d9641075f08789f7e9dc4fba26+67108864 30e0fbcc1fd402d6d4ee077dbbed9985+67108864 9c3f4cff8a0292cabccfe492cc978c6f+67108864 6413966c9aa54f96e2426600936d72d3+67108864 cf903ebc0656b705c26d869d455405ee+67108864 0ed47f82adc7a5e5787715e6a43d9fcc+67108864 2a92d60161816494b4ccbe4d727e021f+67108864 6d4c65315c56f53ad4955b2cd402286d+67108864 3c6d8a7ccd14d9aa75d4ad2e74b7bb28+67108864 982dc1ddfea2915a10dde69ec06dfa76+67108864 03b9c546519fb29aaac3a4bee52414b1+67108864 7803ff4e38dfa625745189e39876c155+67108864 844ea317c0f0095e2f51182702c393f5+67108864 2ea4a37141cf743d79fd884b70f4de05+67108864 c7e2a60485c19ffd6ae4cd5b61b1cf48+67108864 791b84800ed2cc0869bf33b7d85cee77+67108864 6f2b1d1f71f26c1f5bb606034db357a7+67108864 ac185d4ac6b4a85d2320662aef29f060+67108864 2c30efc1fb13aa0043decfb8bc1d1463+67108864 b421b08e5745d876953098e2f2baacd4+67108864 307e458977fd32d61445babb4310030b+67108864 3a6d5736dcc1ef9db6c694dd36e6cfa8+67108864 7ee43e9000accce3462428668a696cde+67108864 a15a30673558f6070996b77e5f975285+67108864 d358ddad7d06cf521cf9d6657b51cec2+67108864 eac6f5c1a8e2cb363c89305c7bfdbd6b+67108864 e5a87afb73e69adc46d79f57b192b7da+67108864 bc7cf84f4d954131ac5e2df31b31144a+67108864 5a9e7bcc8bbf16f3d64545f77e446642+67108864 b1bca9126d855cff7680d960f7a67a45+67108864 15eefaf5212822bc3e0e06916681fe4f+67108864 2ec224ffa681bb8ebaf65b984fe5ac2d+67108864 c5a94822c9c89f4f6627d288747f9b66+67108864 52aaeee57527a75a3bbbe911100c0361+67108864 80fa3e2b96c7823d8e9979d67f41e98c+67108864 b361c3601325ae469be51356e5804d72+67108864 78a933d60f6ca62c1df56b9b11a19160+67108864 98c26a9f728291a50055330fa4880f93+67108864 4f5030e434da715a0e5e2b6f85f0fd46+67108864 06f2acf241fc5269f94d85533b7417fa+67108864 8e39b0432f784ab407735d0d9667db20+67108864 3d6d01636a230edc77fe2d2cfa8c822b+67108864 af54747b06874508412e92815d05fd54+67108864 5f9beb261ee7800d96cf0068707b1419+67108864 8f2cfef40aceb50cd10e37d3693d340e+67108864 e8871ce0905050da9fdd140f96219b34+67108864 1c907eabee3b1eb051aa5bd16ea8c40c+67108864 aa50715b07f837cc3f9e0047ea08ba4d+67108864 d4f89f368239b077b28902df2291ec7d+67108864 513c7bc368665fbbe551708bce375f54+67108864 b5ec7a608fdf46f63b2aace86b22ecbe+67108864 37180c46fdbb4da4ebf7fc85604cb6dc+67108864 5594f89127ce8cd5b5b65b15076d0017+67108864 85ea487408db514720f43e8e61013a9e+67108864 a58bf72af3f393a3bca9f78502f39f09+67108864 3d63ead9a1ca876fcf472a36e437d5d3+67108864 e437dcbb269983af98f515fdff1b8c7d+67108864 76e1b803f60d796a15457fd006290246+67108864 eb4473b76001e5c65ac412099965d200+67108864 18e85dad25031b80d870089342d3fb30+67108864 35a7541d53a64feb7eddeeef2535586f+67108864 c2fbf1f0f1fa1359db0899683894f33d+67108864 6794ee809f5e58111792320303f1a8b2+67108864 d848092b6abefd75c4af817805da1cfc+67108864 2f7471f842739e00be1bdee2c3af96de+67108864 33d3bf343d5703851cf571cc0169acf4+67108864 73d934696c7ef7d873c13a61c6e93610+67108864 eec4ab22ea8289a12fede9936d06c47f+67108864 f280a1f0d2afe437f560e2d37b3d6f98+67108864 d636a57ea0e9b1018424a2acaa6d6a6d+67108864 4025879d6bf913a95dd289efbbc1a289+67108864 d7a116cdc7c52a7e05658d3ed9e24124+67108864 e3221ca9702dc74d06f168840663f73f+67108864 4165ee4fd1dbdca4c8879aed8a2b47a8+67108864 81c0cbde0e9cb9b1b141b48ea1a308cd+67108864 bff9166a75515e5f10af5538dc303212+67108864 45b4ca425e17296da803a51e0fed70bf+67108864 60e983493191b0df26b65c8e7446e9f0+67108864 93590b8affca8daf37b17844b5bf9040+67108864 8621fb9f9c1023d9faaa6eb74fc54a4e+67108864 23275e63a4acd8c7af597fcb76df373e+67108864 f6c082b0018e2c7cb81b97dbc76d5276+67108864 c1de2367ebbb8f821924cc9829caf433+67108864 28d7fe0b01343515c98152458e7469ba+67108864 d30ecd76efca9a45fb6541bf982bb043+67108864 c19fc0b7c6131911ec86f395b32942a1+67108864 fee25c10fa170ef91d6716546c325503+67108864 ba852a7069532ec2b50d30a2b8680369+67108864 eb6f12e52f9742085af5b111263a8a31+67108864 a3c5a938fe579707f06bbe71a445f57f+67108864 103fef8dfcc65c29b0c4c348d6b7cd5c+67108864 891dce541cc4c9fc0cff89231b7081ad+67108864 63434747d0b4b7677fc028fc842a01f8+67108864 4debf4aae27725e624d95e8d8f092790+67108864 b8b34bd97e512895a509222db622ed34+67108864 37e2b5b9f31dc0ed14f45af72827b850+67108864 fd1093368c508a9ccb7faa058087080d+67108864 3ec967bb33e9b55fcf32b63986399481+67108864 608325c1df26b43099ff3f539eaa8534+67108864 b3bb50a8d7a2af13df953ccd64770037+67108864 85debc01db61ef231b17d5adac609899+67108864 8e088c719257d21ca6c9c14c437ef72c+67108864 fd1c96ccde6743a911fb60a4433fecb7+67108864 a8f426581b54a0591d2bded643fde0f0+67108864 19ceaaaacbd811496d178ab8be3d721a+67108864 603b2fcacaaa2903771c5c0a7be15c6a+67108864 ee44b1f92ff9204befa52460d6ac6dda+67108864 366c305dd4378452ab3e9c7ed7b75e5e+67108864 ee826c5bf9d9d25c12d74cca0cde7cde+67108864 cf9ac2e024028adaed51a54e6dc70cd6+67108864 eca814155c1024562187292140170356+67108864 ccfcc357515eb46b9fbadbe80e8ff20b+67108864 3699ec34d183a068422d10b40aae0631+67108864 8daacf3c17a7273ce86e75fc555ecf70+67108864 b23cdd04b9fa1e61b972c2caef1577a2+67108864 990eeff6f56cbb12ecd6df721cac3115+67108864 2de9439dbf73f13efcdad3bb1909d5d3+67108864 e2cb816e92cff445a13fa9754c2bd2d4+67108864 892fec0f10624ae2eab5e4a833a53e3c+67108864 838ae0ca9da00f5c2621af49ec562448+67108864 7278188b1c82dd51460dc4b8c4557cd5+67108864 3c9d0798f3827f8363ae677bafbe9a69+67108864 910df3804a999d1414eb4806bd3b91fe+67108864 5ec3deace8be01db561690bf2ad6fcd9+67108864 42245551b2225e0185aee98a3bbc96e5+67108864 024d1b37f61012e8b11bce86417c5b66+67108864 bf9d48c28504eae8ad723c1e723e6c1e+67108864 daae1d560067bf2c461707a8063fd284+67108864 f9663b2d732c9e954a7cb728978f15fa+67108864 fa95a4fdcbd2128496b72c4ad304065a+67108864 bede18218d8c3c019b3bd2c873b94543+67108864 5ff434025926d30ae45c2114dc816257+67108864 b2cde4f1fffd89abdeb9f585108ed9e7+67108864 d54e21fbd16a3e8c38055a1c10ff6c1a+67108864 d49e4c6e77ee68fe23d34a679c792535+67108864 c30788084c79acf5bdfbf2a44a6486c7+67108864 142696943bd0289004de141776a4ebf3+67108864 23253a95877919a9e15b9496d171a990+67108864 a9fc4555af8829d2720a2b308772ff19+67108864 4d97246ede727b2dfdb72568397a127b+67108864 55b1cc3eb96ef940a8872d2a828abf64+67108864 70fa925c5553dd08873444c7d0ef1b8e+67108864 76c3db8722b92364f03f87eeed8fe53d+67108864 43ee24bc7c125362797acd869881fdb2+67108864 6c28ceb03969b041c1c189068f12bab4+67108864 7078ef25b761e30d51aee9116c5c59fd+67108864 88cf2cb45ee2711c1477e290a6cda42b+67108864 6cbf85a79fdeb004196684e63e45de3f+67108864 0dee67d87e5628caad9c3cd19e8bb38c+67108864 5313f75103edb9ab1eef9d0d9e987609+67108864 3d8454608337215314df099fcde636d9+67108864 2864e53673cadb6e1ed4fed72ef6360d+67108864 ef77259b68a64e9db567fcedf9709612+67108864 8bd0df0b2999c64d2866152d868dd4a6+67108864 3853cdaf6af0a85b0cfec54cd0d2e7bf+67108864 26d95f4758780a9eadfb0fa4b9fa9e85+67108864 bfaba46d337bfc45ae3dff8a5eed0d2d+67108864 52098bd03d910f2947747f744a7e7cf6+67108864 4cbb3854d9975b3e3d3105257aba7ef3+67108864 e06499f3a15a3dd2699f6942c2c0620d+67108864 efc4c80437412a4d5b0baf65a3b5550a+67108864 c574766c117b409c08bd12d82229f8c1+67108864 52af621352517bc7b5f7a37bba1e9a7f+67108864 f2258eae9b00f0837441c0e9ca024308+67108864 e57077ada195464b45117e44ce43292f+67108864 50d87f4c461824c081eeea80f9405783+67108864 2b538fca02bbe2e7d32bd0b58921e82f+67108864 2db2d0e983e1e3507de4cd9976a31017+67108864 7fb8c5435dd3eb83ce94e88278123613+67108864 67e61af3278ebd337d0155843024df19+67108864 9b65d127cf41e54ca6eb215806c3c78a+67108864 76b9faf2c24bc448817c1ff94f7e0aad+67108864 c04f7e671684c411d736a4f217e8c285+67108864 c14a4e1dbef1112fe60bbc8515e0d6d6+67108864 851819a0f279d5b0958e5d718c5865f0+67108864 d1986a6720da6e1abe012637b5547d57+67108864 11b0f93f0f5373729978dbc17362ef97+67108864 8c1f042f1c7f465019182de726f02350+67108864 2a455b07fbb041db3cbf54ade540752e+67108864 647e3a6dc6b99ac5866d0d1c4e2e7352+67108864 7cafb10d4d750b6a70b6de5f064eeb0c+67108864 d6ae66882a0ca9bba70d847e66797896+67108864 0d01a0eee71ef4bee88f9453f632134b+67108864 ae2140209ba681364275a26e8eac217e+67108864 40b675b2b11e70de68407f0f70f1f03f+67108864 130d9d5d51e8cc5096ba667aa9364c97+67108864 380a783cf03f5a3cfeebef66aee5b28d+67108864 e56360b5cda00f91cc3ba4b51633fdb4+67108864 24d4b59098f119b5b9fc5818f16d6aab+67108864 0b593d049f80991ae59cd330123d42be+67108864 30826cd5f49acf23070a1ded8022808b+67108864 cff3def8b5cbd55e5a1679f9c8934923+67108864 2d4a11a94554b1040cf8904396b0680a+67108864 eb9a072fa8e648ff5ef10b288af5fb6c+67108864 8046144d1a921d88683205b893c9aebc+67108864 7730f957a9be36db7abd4962afb3054f+67108864 742a9f4fcde793b644c13fbb4ee3e975+67108864 a35832757441d24aa04836af07b4c3b5+67108864 0ba07a50ae988c3506b7fa07e509f5bb+67108864 b39743548f0a682c65f277764ff9b097+67108864 21098bc8efe18127c66082e6222bf7ba+67108864 6f21d4c116fdd221692ee09036c8e985+67108864 4f3e46fe795367a58ddb917439850237+67108864 3531ce816ce7ff198f668c7119d7e339+67108864 799778902558e13feecdb35008f64335+67108864 773a7ea46671db445dcff7cdb3641fa6+67108864 97e489ed1177fc6db932af81478b9a6d+67108864 987e799850a5a5027ec095af93e53250+67108864 3a531df05dbe8224cec6fec6f411baef+67108864 d2ee610b5ebc5e705a6029c74d86710a+67108864 672a73b64ae5009c06438b755549241a+67108864 1e7185a9cf5ba378826474bccc51370b+67108864 e489af9d0c3ffef982125ac3e016391e+67108864 5dc7dc12e9cf09150aa39798f16dda0c+67108864 764fae2a1a5c53bc9b7725b8d48e17a9+67108864 4fcbea54f6867700008205dee1a55ee1+67108864 2d7af75fae4b8fafc9198432a127d3e7+67108864 71c3f297de8c416025af0cde00cefa6d+67108864 cad383c3f7341c192398820fbe86e665+67108864 d3ee90d3f0e49c76fe7d5ded5fd8a13d+67108864 52b2a629ea9a32e9b3cd3bd153989b6f+67108864 267fdcb1dcfb1b721352462501444d53+67108864 283ac9aded198745e16d3e2172fe59f7+67108864 57025c826ecb06f0321ce3e0ed7b2e4b+67108864 7cbe3a01c92f13807b15ce870a160fec+67108864 de7f59f08ea07551bdf2eac2b5b346ae+67108864 e70e70e3dd37ec0e59e1109ac6f1b3b8+67108864 a64486d04c1bf082e27e323f3edbb6b2+67108864 3af2e24eddb3f079a43222f2c521a4b7+67108864 4a3ec05b28d6c7540660400f0b5e2132+67108864 d34ae3feefb83c1921cba43e1902a624+67108864 aa0b774639159abcdfd4e87cdbb22501+67108864 bb06b89f2760bae1e0205fa5030827af+67108864 e5f240b2ddec9bf3f9b685bcfe095dfb+67108864 120b67b713bdb4092424f299143ee075+67108864 f9ffd0f5696ed790a2cb0a3bfe7eac57+67108864 6c8d86f09658c53d0b0b30ee42482271+67108864 d9288b957174ccb7fba72fc4ea3d761c+67108864 ca4aa05a80f2a62000d32b9b3bec7e77+67108864 ce9809f906a6c05a0ab0fd87238d083b+67108864 ab0c00cda4e5e7e5ab426c40dff7b705+67108864 ec73f7e70dc8a41524c25bb3a48c34a7+67108864 1f073a660524c25e2613feb6f05eb72f+67108864 09542461e2d26915c2d6ad6d2ce37c22+67108864 2ae249fa2dadd829eb68f9706c6fdd5a+67108864 34a60d677721a4f6106aeda9486731c7+67108864 d5c3016a253edd4be3df2a2d9e205fa6+67108864 aefca039b38116199e66f3ca685ff711+67108864 a952a7a8e82db93aa5ece90dbfeb558c+67108864 df3e8d76a91b95534365ad17c7fd80ca+67108864 683acf860d1b972852697e75e82d4377+67108864 4b48aa46659ccc66948b1948920c8bb8+67108864 75921520ff8976da048e4f48b65713fc+67108864 b1f9b9541ca3df1ff6d644527853a56e+67108864 f482ed10f9bcc8839226c13374dc24fd+67108864 89f6a2018a94e0dc75efebbfb3298ea2+67108864 1116d391c6aa0168db01ae84e4a6974e+67108864 3638536201513086e8a6ab97f6b28013+67108864 e0ae416fbd2edbea670fd4ab33f0dd53+67108864 cab05291139f2f9695f80fd4f56eb9a7+67108864 2074dc1e5b43560a7f0dba097f798599+67108864 499e50cc59a0282465d7f5d7ab00ca3c+67108864 c8d5ea8ac6383e69951ae03b92f4ef6a+67108864 028684dd6cc229bc52bc421784696473+67108864 9a05421a96b3657e72306ac3cc91a14c+67108864 c28927241aa6dbad0408cad3384d4887+67108864 37e3154fa87dbfdfc1508a17d9a539d8+67108864 bd57b88617da02c1c547a534d4cea6ac+67108864 cced51fa202f8410d4b0c0cdbd839e43+67108864 b2a3991e08ed41183e4e3693b3de7871+67108864 6442a997170bbf2f64c2f423c3e58a02+67108864 afd77bcbb63d84d2a59a6ca20921187b+67108864 54eab8b24e4e9fa88256f15c302a77d7+67108864 d3affc2d9a34a998d7d189b9e5a7055d+67108864 c457931914fa11b139fb745f900bcc5f+67108864 51ad6a806b0eb57d4f9e43d713a8eb23+67108864 42a1e629c0fb3f26eabfd15560f97b32+67108864 f878ee0ae55ae5e0f57611ddcef39b1e+67108864 fcb4593f27accd8efdf42afe593a29a8+67108864 d61ab1521fec675ce644ec3426f49833+67108864 7844dcc6c4a53d645d8d6be11fdde7db+67108864 cab883dc96650743eea243f830ddfa99+67108864 e412e3496b8e288b0f84f3915f78682b+67108864 3c9f0bbfa22aea749ad1003759f90871+67108864 6476e0c1c60207f0c5f82179cbb1eb55+67108864 39803ea71680efa53d93ecf071da128a+67108864 746567896b262ea67fb15702772272ae+67108864 3ebba6eaf8d320520c1ae04c69c51c54+67108864 60ec5ed8a833afb4065e39dbf649ce3b+67108864 378ed3ee18558e18b02e9d864c740192+67108864 496ee9cfb30dae1cb7bb7d7be99b4f9d+67108864 32c5ca216b69a9024cd785f3c6f5727a+67108864 101aaf4e6cc6fea9372116cbc91295dc+67108864 26da7649915f412dc9e353ae77439e16+67108864 81f8dff12b4aeabe610806080b56cdf4+67108864 b305bf18afbd40bd57fdcbfe80a1f6b0+67108864 34dcac449fd85a37e468b5b747d860ec+67108864 dd7296825e900f1a5c48cc77887b6d26+67108864 778bec1f5aec275d7a0747fc2f1edb69+67108864 a1c96dd0819cf0eac95edd0ab5c05a58+67108864 2bd7d0ca76c8f4d0efda3935575cc45c+67108864 1aabfb4e8d4143022443335ff4326f1e+67108864 ab939e65a4d32b305261829f2abb8b2a+67108864 d336dba0e326ae1e24000c00c10a3e3e+67108864 91da82d2cc82f55b859e2233c76e60f3+67108864 5e8665e03aab339a9f7da3c529a2b612+67108864 d13a86b4688790e57a32e87bcc209ec4+67108864 05712bd5603728d3f9016791d46f18a0+67108864 0b9a1a50d053843bcaa8c2c92d2738d3+67108864 a155912e0e45b54521429e739096d7ed+67108864 dedad0d2a05e7f7786e90370e2f4aae7+67108864 bb3b9f9b905ea40b6aa7360ff26c251b+67108864 f1c1dbf5e0ca7bc398ace6d215eb1b0f+67108864 56ce951826892637bcf276bd7e234587+67108864 b1b20e8b062f0a22375754b6f3170876+67108864 942532b6c96f7b51859d39ed123b2509+67108864 c4ead5a64baa6a6fd16c6d9d639ab84c+67108864 d7d4b85f843e2f4a5576fc7d9b6f8c4a+67108864 7eff16af07bdf8470b0b19f843c22ec5+67108864 1dd070d54d64b07d27fb7625a94b47bb+67108864 b33c17ab40dc191636dbbff51c1b0aab+67108864 d8cdd7ca5fdc00505f405c9ae54947d3+67108864 a2a68c3d5ffa4d9660e1644fc784c595+67108864 6419d072f83937007be14ade52127892+67108864 a21e2c355fc15c5aed0ec8bbdd72ce57+67108864 5a39145dd181812527c28ef26515ec05+67108864 fce2f7b28fac75292ad68c9e158a13e5+67108864 ad8a8fcea664c1f0e73e68f1747a926c+67108864 6a0475795138c21b49a7f64a83830786+67108864 fdb58610320a6c1ac6b7a65621d0e1cf+67108864 7b00d44d90b7e2c303442017f4c90669+67108864 05d5186afda38885eb02558047b4de5a+67108864 1fd3dadea7b7325a1679a3bd64a0677b+67108864 02873b880b7c81807450431f38578adf+67108864 92f94a574cf8f897b0d5cdcf81a36757+67108864 ab23dc595b61727226997bbfc81d0ab5+67108864 d6641c1132d04737d040216305a9dcbc+67108864 0ef5d9a5a279b482fa6b97aa2039e423+67108864 aae63d13b1d9d8405d55c79f38a562d2+67108864 c676127582c2f5324575e7044e8e8e13+67108864 f4828a91ed7679c403f0711910adb8e9+67108864 9dc446c9842db3d526567b1b07a55c4d+67108864 c4192c0f0cb5a42c1bdb49530e3560bd+67108864 98cbdb65458086ad86164661fe3113fd+67108864 4d4c5ad721ba1ec22aa044fb5cec743c+67108864 7ea9aa9309936c10635dd5a5d1b986f3+67108864 7dc4a6d69b3ae0704a25fe6d0fd75272+67108864 f749b92411e4f602907a4c2e0853d914+67108864 89384497e0c6b5ae900d504e6f4e7348+67108864 01a97fdc4c69bb61d00bb0e0f175ee9c+67108864 f2920e0ad57f64b1c2eb48af5387321b+67108864 a8fa1e0e5aaafb37766bd135c818a3a4+67108864 7d7bec841a2c0c4214727cc83787733c+67108864 73d6603ce67a74b1b4d7346ce5442669+67108864 43e728dd53e31a4c6e24ae69e38d5482+67108864 427dd6b12aec18c38c5b8a8276160cf0+67108864 313574f4f22e7dc8b4d3f6d1b5594146+67108864 d0720964a956512960d5c147bf8dd280+67108864 8a35b2b23f9cf7fd81c6739a13c26add+36834981 0:95527142234:PG0002578-DNA.bam 95527142234:8761328:PG0002578-DNA.bam.bai 95535903562:936266194:PG0002578-DNA.bam.fa.gz 96472169756:469864841:PG0002578-DNA.bam.tdf
+./PG0002578-DNA-jlake-tumor/Assembly/genome/bam/realigned 39f862840d200c3dbc166ad29dea6807+67108864 34c3d868d8bd1134dbbde930b5a0161a+67108864 0c44e83c212416b1845cc0b292bafa9c+67108864 3f9bfd80e8eccd4fe3d26f3a74f3de35+67108864 9021a4781b43910f1952000e72100689+67108864 48083a918c1e46c64b9387a334c1faa2+67108864 1a3e290d82c15d770ab030a806d4166b+67108864 16aacdcffb8fb09724e517e76984463a+67108864 c4b69566ee2213c9da499588e27f9b37+67108864 77616a26e1711f0f0af2afe361f07559+67108864 23afc19d408c9e2b918eef3254899dff+67108864 ef820a07ec1446e36dcfb54f4b1bb4d9+67108864 85804989c1a609229f2100aca2a5164b+67108864 056c41fdc0e02e32e6a480ce2c401e78+67108864 d79df4b7582af576371a42cb17de617c+62074987 0:996151435:PG0002578-DNA.realigned.bam 996151435:5447648:PG0002578-DNA.realigned.bam.bai
+./PG0002578-DNA-jlake-tumor/Assembly/stats 6798533a7dfcc926ab0d03ca4b1fe9bb+30924 0:14525:Reads.idx 14525:14525:Reads.idx.bu 29050:1247:coverage.summary.txt 30297:627:dupCount.summary.txt
+./PG0002578-DNA-jlake-tumor/Docs 5b614c0ac2f1b7be407433860ee2a553+5625667 0:277564:1_IGS_Deliverable_Layout_gVCF.pdf 277564:304833:2_gVCF_Conventions_CASAVA_Release.pdf 582397:332651:3_Illumina_Annotation_Pipeline_Documentation.pdf 915048:3765366:S1_CASAVA_UG_15011196B.PDF 4680414:903872:S2_CASAVA_QRG_15011197B.PDF 5584286:41381:S3_bam2fastq.pdf
+./PG0002578-DNA-jlake-tumor/Genotyping 74a29b8642eafbee843c51f46fb526c0+67108864 c659bb8049be3ac13768227a5ac78228+67108864 388f348c50d59fc16bfb566f088e85aa+4019621 0:138237349:FinalReport_HumanOmni2.5-8v1_PG0002578.txt
+./PG0002578-DNA-jlake-tumor/IGV 1ae944d18638508fece1b0a8bfcf8c9e+15934904 0:2898:.igv_session.xml 2898:2898:.mac_igv_session.xml 5796:2526:GID_session.xml 8322:171972:batik-codec.jar 180294:202:igv.bat 180496:43:igv.command 180539:15725768:igv.jar 15906307:42:igv.sh 15906349:1150:illumina.ico 15907499:26167:license_LGPL-2.1.txt 15933666:1238:readme.txt
+./PG0002578-DNA-jlake-tumor/Variations c16493faff63b09072395f9131e38152+67108864 f8f61d884faf2a66f162af422c2749ee+67108864 75b165151b45b7aee32b4690f0644b38+67108864 a33a13617e75d300715e46c57162fc33+67108864 ca46c7a4c725d0efe0568dce26bc5213+67108864 18f8e870d93a271f8a894fc4c4351e60+67108864 adb2c4f3e1e99be24e3ab19cf5db7631+67108864 fefc2d2bfafc240776c7b06ddc8d475b+67108864 adf6ee298b575c59143eda731f83c1cf+67108864 78cf4992604945f97209402eabb2eb7d+67108864 8bf9394ad0435a51e2b2e57a841300c1+67108864 a6f8c5582335c30d06d111ecd79d85bf+67108864 7765bf35e97576b071639d17d9bdd090+67108864 8b9b746b76b18e32ba8047176e9f74d2+67108864 56590e49063b1f814005d9c02000ddfd+67108864 10a639f273764b31451b5e8d95a8e98d+67108864 1b1c8235e66633bb95d2a2a2bede6f3f+67108864 4cc650efa04c38fd0502287a92786737+67108864 4433bac63122a8f9058334633904e988+67108864 3b470c2e8bc8d0ed981ea14353f08eaa+67108864 13de261edeba63d0c330f85bf3544656+67108864 7aee17fb67ed1a622f2bed2b3a50ff78+67108864 8c7ecacdbd99ec2cb3cbd276984bb361+67108864 4bee2d90998217971ef72b2f94054966+12779495 0:1432964600:PG0002578-DNA.genome.block.anno.vcf.gz 1432964600:3650551:PG0002578-DNA.genome.block.anno.vcf.gz.tbi 1436615151:118084986:PG0002578-DNA.snps.vcf.gz 1554700137:1583230:PG0002578-DNA.snps.vcf.gz.tbi
@files = []
return
end
+
+ #normalized_manifest = ""
+ #IO.popen(['arv-normalize'], 'w+b') do |io|
+ # io.write manifest_text
+ # io.close_write
+ # while buf = io.read(2**20)
+ # normalized_manifest += buf
+ # end
+ #end
+
@data_size = 0
- @files = []
+ tmp = {}
+
manifest_text.split("\n").each do |stream|
toks = stream.split(" ")
else $1.to_i(8).chr
end
end
- @files << [stream, filename, re[2].to_i]
+ fn = stream + '/' + filename
+ i = re[2].to_i
+ if tmp[fn]
+ tmp[fn] += i
+ else
+ tmp[fn] = i
+ end
end
end
end
+
+ @files = []
+ tmp.each do |k, v|
+ re = k.match(/^(.+)\/(.+)/)
+ @files << [re[1], re[2], v]
+ end
end
end
@todo = Job.queue
end
+ def sinfo
+ @@slurm_version ||= Gem::Version.new(`sinfo --version`.match(/\b[\d\.]+\b/)[0])
+ if Gem::Version.new('2.3') <= @@slurm_version
+ `sinfo --noheader -o '%n:%t'`.strip
+ else
+ # Expand rows with hostname ranges (like "foo[1-3,5,9-12]:idle")
+ # into multiple rows with one hostname each.
+ `sinfo --noheader -o '%N:%t'`.split("\n").collect do |line|
+ tokens = line.split ":"
+ if (re = tokens[0].match /^(.*?)\[([-,\d]+)\]$/)
+ re[2].split(",").collect do |range|
+ range = range.split("-").collect(&:to_i)
+ (range[0]..range[-1]).collect do |n|
+ [re[1] + n.to_s, tokens[1..-1]].join ":"
+ end
+ end
+ else
+ tokens.join ":"
+ end
+ end.flatten.join "\n"
+ end
+ end
+
def update_node_status
if Server::Application.config.crunch_job_wrapper.to_s.match /^slurm/
@nodes_in_state = {idle: 0, alloc: 0, down: 0}
@node_state ||= {}
node_seen = {}
begin
- `sinfo --noheader -o '%n:%t'`.
- split("\n").
+ sinfo.split("\n").
each do |line|
re = line.match /(\S+?):+(idle|alloc|down)/
next if !re