From 3741acaec618fde1e4c230ee2a503987746235e4 Mon Sep 17 00:00:00 2001 From: Ben Hutchings <ben@decadent.org.uk> Date: Fri, 30 Dec 2005 13:14:01 +0000 Subject: [PATCH] Branched from version 1.1. --- Changes | 9 ++ Memories.pm | 148 +++++++++++++++++++++ Memories/Album.pm | 77 +++++++++++ Memories/Comment.pm | 7 + Memories/Config.pm | 55 ++++++++ Memories/DBI.pm | 7 + Memories/Photo.pm | 239 ++++++++++++++++++++++++++++++++++ Memories/SystemTag.pm | 62 +++++++++ Memories/Tag.pm | 100 ++++++++++++++ Memories/User.pm | 67 ++++++++++ README | 59 +++++++++ memories.sql | 58 +++++++++ tag_dates | 10 ++ templates/album/denied | 7 + templates/album/list | 25 ++++ templates/album/view | 9 ++ templates/album_adder | 9 ++ templates/calendar | 43 ++++++ templates/custom/list | 20 +++ templates/footer | 9 ++ templates/frontpage | 35 +++++ templates/header | 23 ++++ templates/login_box | 34 +++++ templates/macros | 62 +++++++++ templates/memories.css | 8 ++ templates/memories.png | Bin 0 -> 40186 bytes templates/nav | 11 ++ templates/pager | 19 +++ templates/photo/comment | 18 +++ templates/photo/exif | 16 +++ templates/photo/recent | 18 +++ templates/photo/tagedit | 21 +++ templates/photo/upload | 63 +++++++++ templates/photo/view | 86 ++++++++++++ templates/picture/view | 7 + templates/recent.rss | 22 ++++ templates/rhs | 33 +++++ templates/static/1-s.gif | Bin 0 -> 646 bytes templates/static/1.gif | Bin 0 -> 649 bytes templates/static/2-s.gif | Bin 0 -> 718 bytes templates/static/2.gif | Bin 0 -> 694 bytes templates/static/3-s.gif | Bin 0 -> 718 bytes templates/static/3.gif | Bin 0 -> 695 bytes templates/static/4-s.gif | Bin 0 -> 680 bytes templates/static/4.gif | Bin 0 -> 668 bytes templates/static/5-s.gif | Bin 0 -> 710 bytes templates/static/5.gif | Bin 0 -> 692 bytes templates/static/6-s.gif | Bin 0 -> 719 bytes templates/static/6.gif | Bin 0 -> 708 bytes templates/static/7-s.gif | Bin 0 -> 673 bytes templates/static/7.gif | Bin 0 -> 672 bytes templates/static/8-s.gif | Bin 0 -> 731 bytes templates/static/8.gif | Bin 0 -> 713 bytes templates/static/9-s.gif | Bin 0 -> 731 bytes templates/static/9.gif | Bin 0 -> 704 bytes templates/static/memories.css | 141 ++++++++++++++++++++ templates/static/memories.png | Bin 0 -> 38516 bytes templates/static/upload.js | 82 ++++++++++++ templates/systemtag/list | 36 +++++ templates/systemtag/view | 14 ++ templates/tag/list | 36 +++++ templates/tag/list_js | 1 + templates/tag/view | 28 ++++ templates/tagcloud | 4 + templates/test | 2 + templates/user/album_list | 41 ++++++ templates/user/list | 25 ++++ templates/user/view | 7 + 68 files changed, 1913 insertions(+) create mode 100644 Changes create mode 100644 Memories.pm create mode 100644 Memories/Album.pm create mode 100644 Memories/Comment.pm create mode 100644 Memories/Config.pm create mode 100644 Memories/DBI.pm create mode 100644 Memories/Photo.pm create mode 100644 Memories/SystemTag.pm create mode 100644 Memories/Tag.pm create mode 100644 Memories/User.pm create mode 100644 README create mode 100644 memories.sql create mode 100644 tag_dates create mode 100644 templates/album/denied create mode 100644 templates/album/list create mode 100644 templates/album/view create mode 100644 templates/album_adder create mode 100644 templates/calendar create mode 100644 templates/custom/list create mode 100644 templates/footer create mode 100644 templates/frontpage create mode 100644 templates/header create mode 100644 templates/login_box create mode 100644 templates/macros create mode 100644 templates/memories.css create mode 100644 templates/memories.png create mode 100644 templates/nav create mode 100644 templates/pager create mode 100644 templates/photo/comment create mode 100644 templates/photo/exif create mode 100644 templates/photo/recent create mode 100644 templates/photo/tagedit create mode 100644 templates/photo/upload create mode 100644 templates/photo/view create mode 100644 templates/picture/view create mode 100644 templates/recent.rss create mode 100644 templates/rhs create mode 100644 templates/static/1-s.gif create mode 100644 templates/static/1.gif create mode 100644 templates/static/2-s.gif create mode 100644 templates/static/2.gif create mode 100644 templates/static/3-s.gif create mode 100644 templates/static/3.gif create mode 100644 templates/static/4-s.gif create mode 100644 templates/static/4.gif create mode 100644 templates/static/5-s.gif create mode 100644 templates/static/5.gif create mode 100644 templates/static/6-s.gif create mode 100644 templates/static/6.gif create mode 100644 templates/static/7-s.gif create mode 100644 templates/static/7.gif create mode 100644 templates/static/8-s.gif create mode 100644 templates/static/8.gif create mode 100644 templates/static/9-s.gif create mode 100644 templates/static/9.gif create mode 100644 templates/static/memories.css create mode 100644 templates/static/memories.png create mode 100644 templates/static/upload.js create mode 100644 templates/systemtag/list create mode 100644 templates/systemtag/view create mode 100644 templates/tag/list create mode 100644 templates/tag/list_js create mode 100644 templates/tag/view create mode 100644 templates/tagcloud create mode 100644 templates/test create mode 100644 templates/user/album_list create mode 100644 templates/user/list create mode 100644 templates/user/view diff --git a/Changes b/Changes new file mode 100644 index 0000000..de9c121 --- /dev/null +++ b/Changes @@ -0,0 +1,9 @@ +1.1 - Mon Oct 31 23:59:52 GMT 2005 + + - RSS feeds available from [%base%]/recent.rss + - Javascript suggestion of tags + - Calendaring and system tags + - Visual cleanups + - Concept of "enclosing tag" as well as "inside this tag" + - Minor fixes (zap cache on upload, URI escaping, etc.) + - Pager uses gifs diff --git a/Memories.pm b/Memories.pm new file mode 100644 index 0000000..33fbf40 --- /dev/null +++ b/Memories.pm @@ -0,0 +1,148 @@ +package Memories; +use strict; +use HTML::TagCloud; +use URI; +use Maypole::Application qw(Upload Authentication::UserSessionCookie +-Debug); +use Memories::Config; +use Memories::DBI; +use Memories::Photo; +use Memories::Comment; +use Memories::Tag; +use Memories::SystemTag; +use Memories::User; +use Memories::Album; +use URI::Escape; +use Calendar::Simple; + +Memories->config->auth->{ user_field } = "name"; +Memories->config->model("Maypole::Model::CDBI::Plain"); +Memories->setup([qw/ Memories::Photo Memories::User Memories::Tag +Memories::Album Memories::SystemTag/]); + +sub message { + my ($self, $message) = @_; + push @{$self->{template_args}{messages}}, $message; +} + +sub additional_data { + my $r = shift; + if ($r->params->{view_cal}) { + $r->{template_args}{view_cal} = eval { + Time::Piece->strptime($r->{params}{view_cal}, "%Y-%m-%d") }; + } + $r->{template_args}{now} = Time::Piece->new; +} + +use Maypole::Constants; +sub authenticate { + my ($self, $r) = @_; + return DECLINED if $self->path =~/static|store/; # XXX + $r->get_user; + return OK; +} + + +use Cache::SharedMemoryCache; +my %cache_options = ( 'namespace' => 'MemoriesStuff', + 'default_expires_in' => 600 ); +my $cache = + new Cache::SharedMemoryCache( \%cache_options ) or + croak( "Couldn't instantiate SharedMemoryCache" ); + +sub zap_cache { $cache->Clear } +use Storable qw(freeze); use MIME::Base64; +sub do_cached { + my ($self, $codeblock,$arg) = @_; + my $key = 0+$codeblock; if ($arg) { $key .=":".encode_base64(freeze(\$arg)); } + my $c = $cache->get(0+$codeblock); return @$c if $c; + my @stuff = $codeblock->($arg); + $cache->set(0+$codeblock, [ @stuff ]); + return @stuff; +} + +sub _recent_uploads { Memories::Photo->search_recent() } + +sub recent_uploads { shift->do_cached(\&_recent_uploads) } +sub tagcloud { shift->do_cached(\&_tagcloud) } + +sub _tagcloud { + my $cloud = HTML::TagCloud->new(); + my $base = Memories->config->uri_base."tag/view/"; + for my $tagging (Memories::Tagging->search_summary) { + my $name = $tagging->tag->name; + $cloud->add($name, + $base.uri_escape($name), + $tagging->{count} + ) + } + $cloud +} + +sub calendar { + # shift->do_cached(\&_calendar, shift ) } +#sub _calendar { + my $self = shift; + my $arg = shift; + my ($y, $m) = split /-/, ($arg || Time::Piece->new->ymd); + my @m = Calendar::Simple::calendar($m, $y); + my @month; + foreach my $week (@m) { + my @weekdays; + foreach my $day (@$week) { + my $d = { day => $day }; + if ($day) { + my $tag = "date:$y-$m-".sprintf("%02d", $day); + my ($x) = Memories::SystemTag->search(name => $tag); + if ($x) { $d->{tag} = "/system_tag/view/$tag" } + } + push(@weekdays, $d); + } + push(@month, \@weekdays); + } + return \@month; +} + +# THIS IS A HACK + +use Time::Seconds; +sub Time::Piece::next_month { + my $tp = shift; + my $month = $tp + ONE_MONTH; + return if $month > Time::Piece->new; + return $month +} +sub Time::Piece::prev_month { + my $tp = shift; + my $month = $tp - ONE_MONTH; + return $month +} + + +sub tag_select { + my ($r, $tags, $photos) = @_; + # XXX only affects current page + my %counter; + for (map {$_->tags} @$photos) { + $counter{$_->name}++; + } + delete $counter{$_->name} for @$tags; + my @super; + + my $cloud = HTML::TagCloud->new(); + my $base = $r->config->uri_base.$r->path."/"; + my $tags; + for my $name (sort {$a cmp $b} keys %counter) { + if ($counter{$name} == @$photos) { + push @super, $name; + } else { + $cloud->add($name, $base.uri_escape($name), $counter{$name}); + $tags++; + } + } + my %res; + if (@super) { $res{super} = \@super } + if ($tags) { $res{cloud} = $cloud } + \%res; +} +1; diff --git a/Memories/Album.pm b/Memories/Album.pm new file mode 100644 index 0000000..b4f869d --- /dev/null +++ b/Memories/Album.pm @@ -0,0 +1,77 @@ +package Memories::Album; +use base qw(Memories::DBI Maypole::Model::CDBI::Plain); +__PACKAGE__->columns(Essential => qw/id name user privacy/); +Memories::Album->has_a(user => "Memories::User"); +Memories::User->has_many(albums => "Memories::Album"); + +sub view :Exported { + my ($self, $r) = @_; + my $album = $r->objects->[0]; + if ($album->privacy && $album->user != $r->user) { + $r->template("denied"); return; + } + $r->template_args->{photos} = [ $album->photos ]; +} + +sub list :Exported { + my ($self, $r) = @_; + my $page = $r->{params}{page} || 1; + my $pager = Memories::Album->pager( + Memories->config->{photos_per_page}, $page); + $r->{objects} = [$pager->search(privacy => 0)]; + $r->{template_args}{pager} = $pager; +} + +sub edit :Exported { + my ($self, $r) = @_; + use Data::Dumper; warn Dumper($r->{params}); + my $album; + if ($r->{params}{album}) { # We're adding to an album + $album = $self->retrieve($r->{params}{album}); + if (!$album or $album->user != $r->user) { + $r->template("denied"); return; + } + for (map /(\d+)/,grep /add\d+/, keys %{$r->{params}}) { + Memories::AlbumEntry->create({ + album => $album->id, + photo => $_ + }); + } + } else { + $album = $r->{objects}[0]; + if (!$album or $album->user != $r->user) { + $r->template("denied"); return; + } + for (map /(\d+)/,grep /delete\d+/, keys %{$r->{params}}) { + my ($ae) = Memories::AlbumEntry->search({ + album => $album->id, + photo => $_ + }); + $ae->delete if $ae; + } + } + $r->objects([ $album ]); + $r->template("view"); $self->view($r); +} + +package Memories::AlbumEntry; +use base qw(Memories::DBI); +__PACKAGE__->table("album_entry"); +__PACKAGE__->columns(TEMP => qw/count/); +__PACKAGE__->columns(Essential => qw/id album photo/); +__PACKAGE__->set_sql(summary => qq/ +SELECT id, album, count(*) AS count +FROM album_entry; +GROUP BY album +ORDER BY count DESC +LIMIT 50 + /); +Memories::AlbumEntry->has_a("photo" => "Memories::Photo"); +Memories::AlbumEntry->has_a("album" => "Memories::Album"); + +Memories::Photo->has_many(albums => ["Memories::AlbumEntry" => "album"]); +Memories::Photo->has_many(albumentries => "Memories::AlbumEntry"); +Memories::Album->has_many(photos => ["Memories::AlbumEntry" => "photo"] ); +Memories::Album->has_many(albumentries => "Memories::AlbumEntry"); + +1; diff --git a/Memories/Comment.pm b/Memories/Comment.pm new file mode 100644 index 0000000..2b7f0ca --- /dev/null +++ b/Memories/Comment.pm @@ -0,0 +1,7 @@ +package Memories::Comment; +use base qw(Memories::DBI); +__PACKAGE__->columns(Essential => qw/id name photo/); +__PACKAGE__->columns(Others => qw/content/); +Memories::Comment->has_a("photo" => "Memories::Photo"); + +1; diff --git a/Memories/Config.pm b/Memories/Config.pm new file mode 100644 index 0000000..f874eff --- /dev/null +++ b/Memories/Config.pm @@ -0,0 +1,55 @@ +package Memories::Config; +# PATHS AND URLS + +# This parameter should be the external address of your Memories +# installation +Memories->config->uri_base("http://memories.simon-cozens.org/"); + +# This is where your templates will live. +Memories->config->{template_root} = "/home/simon/maypole-sites/memories/templates"; + +# Here is where uploaded photos will be stored. Your web server user +# should own this directory. +Memories->config->{data_store} = "/web/photostore/"; + +# You also need to configure your web server so that it serves files out +# of the data store; this URL should be where that data store directory +# is exposed on the web. +Memories->config->{data_store_external} = "http://memories.simon-cozens.org/store/"; + +# Your database server: the first part should always be "dbi"; the +# second, the name of the DBD driver you're using (usually mysql unless +# you want to do your own thing); the final part, the name of the +# database. +# +# Initialize this database from memories.sql and give www-data (or +# equivalent) read/write access to all tables. +Memories->config->{dsn} = "dbi:mysql:memories"; + +# SESSION MANAGEMENT +# +# The name of any cookies this application should give out +Memories->config->{auth}{cookie_name} = "memories"; + +# Session file storage. Create these directories and have them owned by +# www-data +Memories->config->{auth}{session_args} = { + Directory => "/var/lib/memories/sessions", + LockDirectory => "/var/lib/memories/sessionlock", + }; + +# DISPLAY PARAMETERS +# +# It's OK to leave these as they are. +# +# The size of thumbnails to generate +Memories->config->{thumb_size} = "90x90"; + +# Sizes you want to scale to. "full" is special. +Memories->config->{sizes} = + [ qw/ 150x100 300x200 640x480 800x600 1024x768 1280x1024 full /]; + +# Number of photos on a page. It's best if this is a multiple of three +Memories->config->{photos_per_page} = 21; + +1; diff --git a/Memories/DBI.pm b/Memories/DBI.pm new file mode 100644 index 0000000..4d3595d --- /dev/null +++ b/Memories/DBI.pm @@ -0,0 +1,7 @@ +package Memories::DBI; +use base qw(Class::DBI::mysql); +Memories::DBI->connection(Memories->config->{dsn}); +Memories::DBI->autoupdate(1); +use Carp qw(carp); + +1; diff --git a/Memories/Photo.pm b/Memories/Photo.pm new file mode 100644 index 0000000..288ac4a --- /dev/null +++ b/Memories/Photo.pm @@ -0,0 +1,239 @@ +package Memories::Photo; +use strict; +use Carp qw(cluck confess); +use base qw(Memories::DBI Maypole::Model::CDBI::Plain); +use Time::Piece; +use constant PAGER_SYNTAX => "LimitXY"; +__PACKAGE__->columns(Essential => qw(id title uploader uploaded x y)); +__PACKAGE__->columns(TEMP => qw/exif_object/); +__PACKAGE__->set_sql(recent => q{ +SELECT __ESSENTIAL__ +FROM __TABLE__ +ORDER BY uploaded DESC +LIMIT 4 +}); + +__PACKAGE__->has_many(comments => "Memories::Comment"); +__PACKAGE__->has_a(uploader => "Memories::User"); +__PACKAGE__->has_a(uploaded => "Time::Piece", + inflate => sub { Time::Piece->strptime(shift, "%Y-%m-%d %H:%M:%S") }, + deflate => 'datetime', +); + +sub do_upload :Exported { + my ($self, $r) = @_; + my %upload = $r->upload("photo"); + + # XXX Stop anonymous uploads! + my $photo = $self->create({ + uploader => $r->user, + uploaded => Time::Piece->new(), + title => ($r->params->{title} || $upload{filename}) + }); + + # Dump content + if (!open OUT, ">". $photo->path("file")) { + die "Can't write ".$photo->path("file")." because $!"; + } + # XXX Check it's a JPEG, etc. + # XXX Unzip ZIP file + print OUT $upload{content}; + close OUT; + my ($x, $y) = dim(image_info($photo->path)); + $photo->x($x); $photo->y($y); + + # Rotate? + $photo->unrotate(); + + $photo->make_thumb; + $photo->add_tags($r->{params}{tags}); + Memories->zap_cache(); + + # Add system tags here + my $tag = "date:".$photo->shot->ymd; + $photo->add_to_system_tags({tag => Memories::SystemTag->find_or_create({name =>$tag}) }); + + # Set it up to go again + $r->objects([$photo]); + $r->template("view"); + $r->message("Thanks for the upload! ". + ($r->{params}{tags} ? "" + : "Don't forget to <a href=\"?".$r->config->uri_base."photo/view/".$photo->id."?active=tagedit\">tag your photo</a>" + ) + ); +} + +sub upload :Exported {} + +use Class::DBI::Plugin::Pager; +use Class::DBI::Plugin::AbstractCount; + +sub recent :Exported { + my ($self, $r) = @_; + my $page = $r->params->{page} || 1; + my $pager = $self->pager( + per_page => Memories->config->{photos_per_page}, + page => $page, + syntax => PAGER_SYNTAX, + order_by => "uploaded desc" + ); + $r->objects([$pager->retrieve_all ]); + $r->{template_args}{pager} = $pager; +} + +sub add_comment :Exported { + my ($self, $r, $photo) = @_; + $r->template("view"); + $r->objects->[0]->add_to_comments({ + name => $r->params->{name}, + content => $r->params->{content} + }); +} + +sub format { + "jpg" # For now +} + +use Cache::MemoryCache; +use Image::Info qw(dim image_info); +use Image::ExifTool; +my $cache = new Cache::MemoryCache( { 'namespace' => 'MemoriesInfo' }); + +sub unrotate { + my $self = shift; + my $orient = $self->exif_info->{EXIF}->{Orientation}; + return if $orient !~/Rotate (\d+)/i; + my $steps = $1/90; + my $img = Image::Imlib2->load($self->path("file")); + $img->image_orientate($steps); + $img->save($self->path("file")); +} + +sub exif_info { + my $self = shift; + my $info = $self->exif_object; + return $info if $info; + # Get it from the Cache + if (!($info = $cache->get($self->id))) { + # Create it + $info = $self->_exif_info; + $cache->set($self->id, $info); + } + $self->exif_object($info); + $info; +} + +sub _exif_info { + my $exifTool = new Image::ExifTool; + $exifTool->Options(Group0 => ['EXIF', 'MakerNotes', 'Composite']); + my $info = $exifTool->ImageInfo(shift->path); + my $hash = {}; + foreach my $tag ($exifTool->GetFoundTags('Group0')) { + my $group = $exifTool->GetGroup($tag); + my $val = $info->{$tag}; + next if ref $val eq 'SCALAR'; + next if $val =~ /^[0\s]*$/; + $hash->{$group}->{$exifTool->GetDescription($tag)} = $val; + } + return $hash; +} + +# XXX Cache this +sub dimensions { join "x", $_[0]->x, $_[0]->y } + +sub is_bigger { + my ($self, $size) = @_; + return 1 if $size eq "full"; + my ($w, $h) = ($self->x, $self->y); + my ($w2, $h2) = split /x/, $size; + return 1 if $w > $w2 or $h > $h2; + return 0; +} + +sub sized_url { # Use this rather than ->path from TT + my ($self, $size) = @_; + my $url = Memories->config->{data_store_external}; + my $resized = Memories->config->{sizes}->[$size]; + if (!$resized) { cluck "Asked for crazy size $size"; return; } + if ($resized eq "full") { return $self->path("url") } + $self->scale($resized) + unless -e $self->path( file => $resized ); + return $self->path(url => $resized); +} + +sub path { + my ($self, $is_url, $scale) = @_; + my $path = + Memories->config->{$is_url eq "url" ? "data_store_external" : "data_store" }; + if ($scale) { $path .= "$scale/" } + # Make dir if it doesn't exist, save trouble later + use File::Path; + if ($is_url ne "url") {mkpath($path);} + $path .= $self->id.".".$self->format; + return $path; +} + +sub thumb_url { shift->path(url => Memories->config->{thumb_size}); } +sub make_thumb { shift->scale(Memories->config->{thumb_size}, 1); } + +use Image::Imlib2; +sub scale { + my ($self, $scale, $swap) = @_; + my ($x, $y) = split /x/, $scale; + # Find out smaller axis + my ($cur_x, $cur_y) = ($self->x, $self->y); + if (!$swap) { + if ($cur_x < $cur_y) { $y = 0 } else { $x = 0 } + } else { + if ($cur_x > $cur_y) { $y = 0 } else { $x = 0 } + } + my $img = Image::Imlib2->load($self->path("file")); + unless ($img) { + cluck "Couldn't open image file ".$self->path("file"); + return; + } + $img = $img->create_scaled_image($x, $y); + $img->image_set_format("jpeg"); + my $file = $self->path( file => $scale ); + $img->save($file); + if ($!) { + cluck "Couldn't write image file $file ($!)"; + return; + } +} + +use Text::Balanced qw(extract_multiple extract_quotelike); +sub edit_tags :Exported { + my ($self, $r) = @_; + my $photo = $r->objects->[0]; + my %params = %{$r->params}; + for (keys %params) { + next unless /delete_(\d+)/; + my $tagging = Memories::Tagging->retrieve($1) or next; + next unless $tagging->photo->id == $photo->id; + $tagging->delete; + } + $photo->add_tags($params{newtags}); + $r->template("view"); +} + +sub add_tags { + my ($photo, $tagstring) = @_; + + for my $tag (map { s/^"|"$//g; $_} extract_multiple(lc $tagstring, [ \&extract_quotelike, qr/([^\s]+)/ ], undef,1)) { + $photo->add_to_tags({tag => Memories::Tag->find_or_create({name =>$tag}) }) + } +} + +sub shot { + my $self = shift; + my $exif = $self->exif_info->{EXIF}; + my ($dt) = + grep {$_ and /[^ 0:]/} + ($exif->{ 'Shooting Date/Time' }, + $exif->{ 'Date/Time Of Digitization' }, + $exif->{ 'Date/Time Of Last Modification' }); + if (!$dt) { return $self->uploaded } + return Time::Piece->strptime($dt, "%Y:%m:%d %T") || $self->uploaded; +} +1; diff --git a/Memories/SystemTag.pm b/Memories/SystemTag.pm new file mode 100644 index 0000000..d4f8439 --- /dev/null +++ b/Memories/SystemTag.pm @@ -0,0 +1,62 @@ +package Memories::SystemTag; +use strict; +use base qw(Memories::DBI Maypole::Model::CDBI::Plain); +__PACKAGE__->columns(Essential => qw/id name/); +__PACKAGE__->table("system_tag"); + +Memories::Photo->set_sql(sorted_by_system_tag => q/ +SELECT photo.id as id, title, uploader, uploaded, x, y +FROM photo, system_tag, system_tagging +WHERE system_tagging.photo = photo.id + AND system_tagging.tag = system_tag.id + AND system_tag.id = ? +ORDER BY photo.uploaded DESC +/ +); +sub view :Exported { + my ($self, $r) = @_; + my $tag; + my $page = $r->params->{page} || 1; + my $pager = Class::DBI::Pager::_pager("Memories::Photo", + Memories->config->{photos_per_page}, $page); + $r->{template_args}{pager} = $pager; + + if (!$r->objects) { + $tag = $self->search(name => $r->{args}->[0])->first; + } else { + $tag = $r->objects->[0]; # Should hardly happen + } + $r->{template_args}{tag} = $tag; + $r->{template_args}{tags} = [$tag]; # For selector + $r->{template_args}{photos} = + [$pager->search_sorted_by_system_tag($tag->id)]; +} + +package Memories::SystemTagging; +use base qw(Memories::DBI); +use Class::DBI::Pager; +__PACKAGE__->table("system_tagging"); +__PACKAGE__->columns(TEMP => qw/count/); +__PACKAGE__->columns(Essential => qw/id tag photo/); +__PACKAGE__->set_sql(summary => qq/ +SELECT id, system_tag, count(*) AS count +FROM system_tagging +GROUP BY system_tag +ORDER BY count DESC +LIMIT 50 + /); +__PACKAGE__->set_sql(all => qq/ +SELECT id, tag, count(*) AS count +FROM system_tagging +GROUP BY system_tag +ORDER BY count DESC + /); +Memories::SystemTagging->has_a("photo" => "Memories::Photo"); +Memories::SystemTagging->has_a("tag" => "Memories::SystemTag"); + +Memories::Photo->has_many(system_tags => ["Memories::SystemTagging" => "system_tag"]); +Memories::Photo->has_many(system_taggings => "Memories::SystemTagging"); +Memories::SystemTag->has_many(photos => ["Memories::SystemTagging" => "photo"] ); +Memories::SystemTag->has_many(system_taggings => "Memories::SystemTagging"); + +1; diff --git a/Memories/Tag.pm b/Memories/Tag.pm new file mode 100644 index 0000000..bcaa6c0 --- /dev/null +++ b/Memories/Tag.pm @@ -0,0 +1,100 @@ +package Memories::Tag; +use strict; +use base qw(Memories::DBI Maypole::Model::CDBI::Plain); +__PACKAGE__->columns(Essential => qw/id name/); + +Memories::Photo->set_sql(sorted_by_tag => q/ +SELECT photo.id as id, title, uploader, uploaded, x, y +FROM photo, tag, tagging +WHERE tagging.photo = photo.id + AND tagging.tag = tag.id + AND tag.id = ? +ORDER BY photo.uploaded DESC +/ +); + +sub view :Exported { + my ($self, $r) = @_; + my $tag; + my $page = $r->params->{page} || 1; + my $pager = Class::DBI::Pager::_pager("Memories::Photo", + Memories->config->{photos_per_page}, $page); + $r->{template_args}{pager} = $pager; + + if (@{$r->args} > 1) { # This is actually an n-level search + $self->multi_search($r); + } else { + if (!$r->objects) { + $tag = $self->search(name => $r->{args}->[0])->first; + } else { + $tag = $r->objects->[0]; # Should hardly happen + } + $r->{template_args}{tag} = $tag; + $r->{template_args}{tags} = [$tag]; # For selector + $r->{template_args}{photos} = + [$pager->search_sorted_by_tag($tag->id)]; + } +} + +sub multi_search { + my ($self, $r) = @_; + my $counter = "tagaaa"; + my @tags; + for (@{$r->{args}}) { + my $tag = $self->search(name => $_)->first; + if (!$tag) { return } + push @tags, { tag => $tag, id => $tag-> id, counter => $counter++ }; + } + my $sql = "select photo.id as id, photo.title as title, uploader, uploaded, x, y +from photo, ". (join ",", map{ "tagging ".$_->{counter} } @tags). +" where ". (join " AND ", map { "$_->{counter}.tag=$_->{id} and photo.id = $_->{counter}.photo" } @tags); + +$sql .= " order by photo.uploaded desc"; + my $sth = $self->db_Main->prepare($sql); + $r->{template_args}{photos} = [ $r->{template_args}{pager}->sth_to_objects($sth) ]; + $sth->finish; + $r->{template_args}{tags} = [ map { $_->{tag} } @tags ]; +} + +sub list :Exported { + my ($self, $r) = @_; + my $page = $r->params->{page} || 1; + my $pager = Memories::Tagging->pager( + Memories->config->{photos_per_page}, $page + ); + $r->{template_args}{pager} = $pager; + $r->objects([map {$_->tag} $pager->search_all]); +} + +sub list_js :Exported { + my ($self, $r) = @_; + $r->objects([ $self->retrieve_all ]); +} + +package Memories::Tagging; +use base qw(Memories::DBI); +use Class::DBI::Pager; +__PACKAGE__->columns(TEMP => qw/count/); +__PACKAGE__->columns(Essential => qw/id tag photo/); +__PACKAGE__->set_sql(summary => qq/ +SELECT id, tag, count(*) AS count +FROM tagging +GROUP BY tag +ORDER BY count DESC +LIMIT 50 + /); +__PACKAGE__->set_sql(all => qq/ +SELECT id, tag, count(*) AS count +FROM tagging +GROUP BY tag +ORDER BY count DESC + /); +Memories::Tagging->has_a("photo" => "Memories::Photo"); +Memories::Tagging->has_a("tag" => "Memories::Tag"); + +Memories::Photo->has_many(tags => ["Memories::Tagging" => "tag"]); +Memories::Photo->has_many(taggings => "Memories::Tagging"); +Memories::Tag->has_many(photos => ["Memories::Tagging" => "photo"] ); +Memories::Tag->has_many(taggings => "Memories::Tagging"); + +1; diff --git a/Memories/User.pm b/Memories/User.pm new file mode 100644 index 0000000..2fa82ca --- /dev/null +++ b/Memories/User.pm @@ -0,0 +1,67 @@ +package Memories::User; +use base qw(Memories::DBI Maypole::Model::CDBI::Plain); +__PACKAGE__->columns(All => qw/id name password/); +__PACKAGE__->has_many(photos => "Memories::Photo"); + +sub register :Exported { + my ($class, $r) = @_; + my $login = $r->params->{name}; + my $pass = $r->params->{password}; + $r->template("frontpage"); + return if $r->user; + + # Do we already exist? + if (!$login) { $r->template("login"); $r->message("You didn't enter a user name"); return; } + my ($user) = $class->search(name => $login); + if ($user) { $r->template("login"); $r->message("User name already exists"); return; } + $user = $class->create({name => $login, password => $pass }); + $r->user($user, 0); + $r->login_user($user->id); + +} + +sub view :Exported { + my ($self, $r) = @_; + my $user = $r->objects->[0]; + my $page = $r->params->{page} || 1; + my $pager = Class::DBI::Pager::_pager("Memories::Photo", + Memories->config->{photos_per_page}, $page); + $r->{template_args}{photos} = [$pager->search(uploader => + $user->id,{order_by => "uploaded desc"}) ]; + $r->{template_args}{pager} = $pager; + $r->{template_args}{albums} = [$user->albums(privacy => 0)]; +} + +# Album support! + +sub edit_albums :Exported { + my ($self, $r) = @_; + $r->{template} = "view"; + $self->view($r); + my $user = $r->objects->[0]; + return unless $r->user and $r->user->id == $user->id; + if ($r->{params}{create}) { + $user->add_to_albums({ + privacy => !!($r->{params}{new_privacy}), + name => $r->{params}{new_name} + }); + } elsif ($r->{params}{changes}) { + for my $album ($user->albums) { #XXX + warn "Setting $album privacy to ". + $r->{params}{"privacy_".$album->id}; + $album->privacy(!!$r->{params}{"privacy_".$album->id}); + } + } else { + my @to_delete = map /(\d+)/, + grep /delete_\d+/, keys %{$r->{params}}; + for (@to_delete) { + my $album = Memories::Album->retrieve($_); + if ($album and $album->user->id == $user->id) { + $album->delete + } + } + } + +} + +1; diff --git a/README b/README new file mode 100644 index 0000000..abc3838 --- /dev/null +++ b/README @@ -0,0 +1,59 @@ +Updating from an earlier release? Read the bit at the bottom! + +Installing the Memories photo sharing application +------------------------------------------------- + +First, Perl modules. This is the hard part. You will need: + Maypole (good luck) + Class::DBI + DBI + DBD::mysql + Class::DBI::mysql + Image::Info + Image::Imlib2 (requires libimlib2 and libimlib2-dev packages) + Time::Piece + Cache::Cache + Maypole::Plugin::Upload + Maypole::Plugin::Authentication::UserSessionCookie + HTML::TagCloud + +Apache mod_perl is recommended. Memories can also be run as a CGI +application, but you're on your own. + +You will also need a MySQL database. Again, in theory other databases +can be used, but in practice, you're on your own again. + +Configure Maypole/Config.pm to your site, and follow the instructions in +there - it will require you to set other things up as well. + +Test that everything works: + + perl -MMemories -e1 + +If this produces no errors, you're good to configure Apache. I have +Memories living in "/home/simon/maypole-sites/memories", and my photo +storage in "/opt/store/", and so my configuration looks like this: + + <Perl> + use lib qw( /home/simon/maypole-sites/memories/ ); + </Perl> + + PerlModule Memories + Alias /memories/static/ /home/simon/maypole-sites/memories/templates/static/ + Alias /memories/store/ /opt/store/ + + <Location /memories> + PerlHandler Memories + SetHandler perl-script + </Location> + +Restart Apache, register yourself and get uploading! + + +Updating Memories 1.0 to 1.1 +---------------------------- + +1) Create the system_tags and system_taggings table as in memories.sql + +2) Run the tag_dates script. + diff --git a/memories.sql b/memories.sql new file mode 100644 index 0000000..9ebe256 --- /dev/null +++ b/memories.sql @@ -0,0 +1,58 @@ +CREATE TABLE photo ( + id integer not null auto_increment primary key, + title varchar(255), + uploader integer, + uploaded datetime, + x integer, + y integer +); + +CREATE TABLE comment ( + id integer not null auto_increment primary key, + name varchar(255), + content text, + photo integer +); + +CREATE TABLE user ( + id integer not null auto_increment primary key, + name varchar(255), + password varchar(255) +); + +CREATE TABLE tag ( + id integer not null auto_increment primary key, + name varchar(255) +); + +CREATE TABLE tagging ( + id integer not null auto_increment primary key, + tag integer, + photo integer +); + +CREATE TABLE album ( + id integer not null auto_increment primary key, + name varchar(255), + user integer, + privacy integer +); + +CREATE TABLE album_entry ( + id integer not null auto_increment primary key, + album integer, + photo integer +); + +CREATE TABLE system_tag ( + id integer not null auto_increment primary key, + name varchar(255) +); + +CREATE TABLE system_tagging ( + id integer not null auto_increment primary key, + tag integer, + photo integer +); + + diff --git a/tag_dates b/tag_dates new file mode 100644 index 0000000..e44af81 --- /dev/null +++ b/tag_dates @@ -0,0 +1,10 @@ +use Memories; +my $it = Memories::Photo->retrieve_all; + +my $thing = $it->first; +do { + print $thing->title, " $tag\n"; + my $tag = "date:".$thing->shot->ymd; + $thing->add_to_system_tags({tag => Memories::SystemTag->find_or_create({name + =>$tag}) }); +} while $thing = $it->next; diff --git a/templates/album/denied b/templates/album/denied new file mode 100644 index 0000000..7b641a9 --- /dev/null +++ b/templates/album/denied @@ -0,0 +1,7 @@ +[% INCLUDE header %] +<div class="warning"> +This album has been marked private, and you do not have permission to +view it. +</div> + +[% INCLUDE footer; %] diff --git a/templates/album/list b/templates/album/list new file mode 100644 index 0000000..0229289 --- /dev/null +++ b/templates/album/list @@ -0,0 +1,25 @@ +[% INCLUDE header %] +[% PROCESS macros %] + +<table class="userlist"> +[% WHILE objects.size > 0 %] +<tr> + [% SET minilist = objects.splice(0,3) %] + [% FOR album = minilist %] + <td> + <a href="[%base%]/album/view/[%album.id%]">[% album %]<br/> + <img src="[% album.photos.last.thumb_url |uri%]"></a><br/> + <span class="info"> + [%album.photos.size %] + photo[%-"s" IF album.photos.size != 1 %] + <br> + <a + href="[%base%]/user/view/[%album.user.id%]">[%album.user%]</a> + </span> + </td> + [% END %] +</tr> +[% END %] +</table> +[% INCLUDE pager %] +[% INCLUDE footer %] diff --git a/templates/album/view b/templates/album/view new file mode 100644 index 0000000..a8ad02d --- /dev/null +++ b/templates/album/view @@ -0,0 +1,9 @@ +[% INCLUDE header %] +[% PROCESS macros %] +<h1> [% album.name %] </h1> +[% IF album.user == request.user %] + [% view_page_of(photos, "delete") %] +[% ELSE %] +[% view_page_of(photos) %] +[% END %] +[% INCLUDE footer %] diff --git a/templates/album_adder b/templates/album_adder new file mode 100644 index 0000000..2c3db73 --- /dev/null +++ b/templates/album_adder @@ -0,0 +1,9 @@ +[% IF request.user.albums.size > 0 %] + Add to: + <select name="album"> + [% FOR album = request.user.albums %] + <option value="[%album.id%]"> [% album %] </option> + [% END %] + </select> + <input type="submit" value="Add" name="Add"> +[% END %] diff --git a/templates/calendar b/templates/calendar new file mode 100644 index 0000000..700072f --- /dev/null +++ b/templates/calendar @@ -0,0 +1,43 @@ +<div align="center" style="border: 1px solid black; background: #eee"> +[% IF request.action == "view" %] + [% SET shot = photo.shot %] +[% END %] +[% SET date = view_cal || shot || now %] +[% SET imp_date = shot || now %] +[% SET next = date.next_month %] +[% SET prev = date.prev_month %] +[% SET calendar = request.calendar(date.ymd) %] +<table class="calendar"> + <tr> + <th> <a href="?view_cal=[%prev.ymd%]">« </a></th> + <th colspan="5"> + [% date.strftime("%Y-%m") %] + </th> + <th> [% IF next %] + <a href="?view_cal=[%next.ymd%]">» </a> + [% END %] + </th> + </tr> + <tr> + <td>S </td><td> M </td><td> + T</td><td>W</td><td>T</td><td>F</td><td>S</td> + </tr> +[% FOR week = calendar %] + <tr> + +[% FOR day = week %] + [% IF day.tag %] + [% IF shot AND day.day == imp_date.mday %] + <td class="caltoday"> + [% ELSE %] + <td class="caltagged"> + [% END %] + <a href="[%base%][%day.tag%]?view_cal=[%date.ymd%]">[% day.day %]</a> </td> + [% ELSE %] + <td class="calempty"> [% day.day %] </td> + [% END %] +[% END %] + </tr> +[% END %] +</table> +</div> diff --git a/templates/custom/list b/templates/custom/list new file mode 100644 index 0000000..3dd50b3 --- /dev/null +++ b/templates/custom/list @@ -0,0 +1,20 @@ +[% INCLUDE header %] +[% PROCESS macros %] + +<table class="userlist"> +[% WHILE objects.size > 0 %] +<tr> + [% SET minilist = objects.splice(0,3) %] + [% FOR object = minilist %] + <td> + <a href="[%base%]/object/view/[%object.id%]">[% object %]<br/> + <img src="[% object.photos.last.thumb_url |uri%]"></a><br/> + <span class="info"> + [%object.photos.size %] + photo[%-"s" IF object.photos.size != 1 %]</span> + </td> + [% END %] +</tr> +[% END %] +</table> +[% INCLUDE footer %] diff --git a/templates/footer b/templates/footer new file mode 100644 index 0000000..64186ac --- /dev/null +++ b/templates/footer @@ -0,0 +1,9 @@ +</div> +</td> + <td id="rhs" valign="top"> + [% INCLUDE rhs %] + </td> +</tr> +</table> +</body> +</html> diff --git a/templates/frontpage b/templates/frontpage new file mode 100644 index 0000000..2b36f1e --- /dev/null +++ b/templates/frontpage @@ -0,0 +1,35 @@ +[% INCLUDE header %] +<h1> Welcome to Memories </h1> + +<p> + Memories is a site where you can upload and share your photos of + college life with your friends. +</p> +<p> + To view other people's photos, look at the <a + href="[%base%]/user/list">user list</a> or the <a + href="[%base%]/album/list">album list</a>. +</p> +<p> + Alternatively, Memories supports tagging photos with names, places, or + other descriptive terms. Browse based on the tags on the right, or look + at the full <a href="[%base%]/tag/list">tag list</a>. +</p> +<hr/> +[% IF request.user %] +<p> +Now that you're logged in, you can start <a +href="[%base%]/photo/upload">uploading photos</a>. Create some albums or +check out what you've uploaded at <a +href="[%base%]/user/view/[%request.user.id%]">your home page</a>. +</p> +[% ELSE %] +<p> +To get started uploading your own photos, you'll need to <a +href="[%base%]/login_box">log in</a>. If you +don't have an account, just go to the log in page anyway, choose a +username and password, and click "Register". So long as nobody else has that name, +we'll create an account for you immediately. +</p> +[% END %] +[% INCLUDE footer %] diff --git a/templates/header b/templates/header new file mode 100644 index 0000000..8dc15a6 --- /dev/null +++ b/templates/header @@ -0,0 +1,23 @@ +<html> +<head> + <title> Memories - ANCC Photo Sharing </title> + <link title="Maypole" href="[%base%]/static/memories.css" type="text/css" rel="stylesheet"/> +[% IF request.params.active == "tagedit" %] + <script type="text/javascript" src="[%base%]/tag/list_js"></script> + <script type="text/javascript" src="[%base%]/static/upload.js"></script> +</head> +<body onload="init()"> +[% ELSE %] +</head> +<body> +[% END %] +[% INCLUDE nav %] +<table width="100%"> + <tr> + <td valign="top"> + [% IF messages %] + <div class="messages"> + <ul> [% FOR m = messages %] <li> [%m%] </li> [% END %] + </ul></div> + [% END %] + <div id="main"> diff --git a/templates/login_box b/templates/login_box new file mode 100644 index 0000000..b875129 --- /dev/null +++ b/templates/login_box @@ -0,0 +1,34 @@ + [% INCLUDE header %] + + <div id="login"> + [% IF request.user %] + Welcome, [% request.user.name %] + [% ELSE %] + + [% IF login_error %] + <div class="error"> [% login_error %] </div> + [% END %] + <form method="post" action="[% base %]/user/register"> + <fieldset> + <legend>Login or register as a new user</legend> + <table> <tr> + <td class="loginfield"> + Username: + </td> + <td> + <input name="name" type="text" /> + </td> + </tr> + <tr> <td class="loginfield"> + Password: + </td><td> + <input name="password" type="password" /> + </td></tr></table> + <input type="submit" name="login" value="Login"/> + <input type="submit" name="login" value="Register"/> + </fieldset> + </form> + [% END %] + </div> + + [% INCLUDE footer %] diff --git a/templates/macros b/templates/macros new file mode 100644 index 0000000..f97cdd3 --- /dev/null +++ b/templates/macros @@ -0,0 +1,62 @@ +[% MACRO thumb(photo, album) BLOCK %] +<table class="thumb"> + <tr><td> + <a href="[%base%]/photo/view/[%photo.id%]"> + <img src="[% photo.thumb_url |uri%]" alt="[%photo.title|html%]"/> + </a> + </td> </tr> + <tr><td> + <a href="[%base%]/photo/view/[%photo.id%]"> + <b>[% photo.title |html%] </b> + </a> + + </td></tr> + <tr><td> Uploaded by + <a href="[%base%]/user/view/[%photo.uploader.id%]"> + [% photo.uploader.name |html%] + </a><br/> at [% photo.uploaded %] </td></tr> + [% IF request.user %] + [% IF album == 1 %] + <tr><td> Add to album: <input type="checkbox" name="add[%photo.id%]" value="[%photo.id%]"> </td></tr> + [% ELSIF album == 2 %] + <tr><td> Delete from album: <input type="checkbox" name="delete[%photo.id%]" value="[%photo.id%]"> </td></tr> + [% END %] + [% END %] +</table> +[% END %] + +[% MACRO view_page_of(photos) BLOCK; %] +[% IF request.table == "album" AND request.template == "view" %] +[% SET editing_album = 1%] +[% END %] +[% IF editing_album %] +<form action="[%base%]/album/edit/[%album.id%]" method="post"> +[% ELSE %] +<form action="[%base%]/album/edit" method="post"> +[% END %] +[% IF !photos OR ! photos.size %] +<div class="warning"> + This [% request.table %] is empty! +</div> +[% ELSE %] +<table class="userlist"> +[% WHILE photos.size > 0 %] +[% SET triple = photos.splice(0,3) %] + <tr> + [% FOR photo = triple %] + <td> + [% IF editing_album; thumb(photo, 2); ELSE; thumb(photo, 1); END %] + </td> + [% END %] + </tr> +[% END %] +</table> +[% END %] +[% IF editing_album %] +<input type="submit" name="Delete" value="Delete"> +[% ELSE %] +[% INCLUDE album_adder %] +[% END %] +[% INCLUDE pager %] +</form> +[% END %] diff --git a/templates/memories.css b/templates/memories.css new file mode 100644 index 0000000..ac5608e --- /dev/null +++ b/templates/memories.css @@ -0,0 +1,8 @@ +body { background: #afa; } + +.recentuploads { + float:right; + background: #ddd; + padding: 10px; + border: 1px solid black; +} diff --git a/templates/memories.png b/templates/memories.png new file mode 100644 index 0000000000000000000000000000000000000000..c602c08d01c3a33f7b67a03544c0b3ffffb605cd GIT binary patch literal 40186 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	dgzZ3c)&)*tvRS5lv;nOm%gtVvErNr5yIr}6q~ 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�c24G zjfkK?Q_fe3BRZP&Vmvoo|G3}m%;;s#WYGJ^l4`h7pk;ywrVp0P8bBF#P6=J-9ULiM zRh)_wi_h<d0&=Jv0=_BW-t_AmVwV9OzN684%5hSn_~8MCv;iiMaD0;yoM^{K<i!)$ zdz0U+K`SJpZ9Gcc-gZsfas2XrKSngoF;hJ@5Xwmx5?E2GwboT1+f3zj(ZsRmG?7dn zU?PlJ-!E}s#}*`pu!hMO+MBE0Vy_AZFes0s@6KUNyOt7I(_6}x8({9Y<{6~(`)7}z zp;H$r-%+{zzNS~#(4bvVkrhw~jZGW-W#j+wjX4mySu*nd>%VD^;YmfMB_hR^%z)B$ z(*{1od8&w=GkNcqQpiIw78S*obmA1EDVDC?*?>%QF0cWK@V$9RzT7ZG5@mfopEGE_ zabGFIR+P*IWrss8(+@I3%jglHnw0bA;r@Ch*1{m3#vtPl5Jb5overiwD<$CM{9am? z)buq#0@0;TE+3feb?$-n?jwoJuJ9sB?NS!W)2f(WVxRO)`6ZH_q=jud#W8qpR1LNo zAgMo}%GGD#JuAi+1uIfmX3n%?;MckHWn4m+<H$stL;5LH0*9~pp4VCOWuihGj-0+T zhzXX<K#M{=j?AuFvnOvBXZsrCq4BG35^m{F7#g82F4L)5UwbDEJmakYQXWi(&hVaP zcSkW#jKgd7uP*6mtsa&(esZbTRa8MT9CrLSJ@Hq*w^A}Z#=!=1D`>QPqV^t?>+46U zvJM6?Wr5XvUxMdS5H&MepU+`j@~#A2^*7F;F`1Qrqw$s552QSJz!#zY*Q#{94fMpk z=HQbNsw?0ZwF+h8pRTfyZenZDpDv%ah{{aNhOO2+wca$AY%wX8!~emG42M<RG8b67 zeaHM)>m$2~w4un^3X#bModPBTalHT|24{Fymu8)wc?-uPOJ%AwVPhDY+u6VM(SY>! zm&E-uG4|iXo<gFOrn%DMpxTYa724!^S!s>If_*t+s7m~Ip4Pof$}+}5f53g#v#+qU zIL_>>68nA}kFAWDb$a*!Gh?Ae!&vPV?I4+vG*qR<nL_JTE~SaE+it}u@i4S9z<wp3 zy3Y+ZY0Xx}^GxB!M`lfFwM&Fz<cIJx{`~cd_!{o2Zz^+VXRjkThwWii!4;QoS7sNG zat=SXyUBk2((ka5tZkw}3vJ_Y1S32Emnqc()7C=3y$ue&P7b;*$6;RTWYgf4j?`kM zuR4V7!;T7tGu41nuLuZns?`wr%R9bw^V=P9boq{FW0T22A!Ysffw77TN(liBUa1!_ zj`ZY4yGwd{7$mL1cVkxe(!&(}nEE`*k^9&69gX$<7r$)Xp|?%UMbd-1`#vU`{Lk>F za(mx=N5Y^29l3w)tAoX2rY=-W9}{rmr;}2WxF0S`YA)@J6L__MxX;m=Mw}#<K41HW zByjG=qRu_I5u@jHl^r2cQUKv^Po^uMNm2t5A|KYNC*Mb-Y!C+y{w$aS(O|JwG8OaO zC&8JbREu<>K*jwX`S*Wdi569?O~)AkRXN;zHeYDFzrAXbfkLvd2nxb5SHH%`2X1bN z1o*GBLd@Rl8Y(q0p4O_1$50o(U}BaoRGif^I}%hya2OfJ5nK}&HP6q0p(v-Y+nru? zdp!+~OC@mgOy8-Qn3YG%y-MYTuGnp{50{FxW9GKhD?0cWBPQ_SbW$&W?){+Y0p1H< zZ66uCf2iB)YAtVWW@8y2y9rxzE`_%zb~>CkT*(EqW%C|v&kUFAWQG_;FfbUB+8`It zV_?8;0XU_a_Ftba)3#*w3rnc(yEj?#;H!HT6s%gRW4Eo0x(m8xdN$fm4uLV(OV++t z`2|RHx&G2k&L^BOfl2;QCy_?U-mNlJb{RrfkKlj6P9C%OS16vaOz()5;STAT*vBy? zYUmogrbtY^@QIw0pO*pe>r_J=J&4|fKiY227G2A%&+*|0GFB2pYH1nMzGYkVj@@MV z&n~D@JIt?NGOA>3$<hC=uHBuHnma6-vx1hYP-k!&*vv-b@SSSTLIL_p&~6vnTz;Y= z6Iba6R7M?Z%UEockcihr``FGEm|gT7m)PWnePac%-$Z1i?Y;)S4Llvz_z%y?a8qMR z8E+qg4de;11voY*&3q*ekKgB6M<ieaD^l>%s%I^`wH-isrHCxi_W7qwYz_4(F}p)h zJZwY%wsMF_dH+aFeSk4!85{32JUEG4UL_YOz09T5<f>k^H;3sjt(5y{!-H)hJ~1pt zvkW>R5C=9|-{ZO0f!bq_FeC<Z(-CYks~+@O6`U5ok6_{3*4nKWXRficg4hE8OG2nh zU7aTlqoH?LUEKNbz^!xtDIa+4;z4GMfTTga49~AI4V?=Ik0=me>;B8=&9xV0{hEFX zz;#wwNvUjnMQY#Xxc)z?g3YD-!A>UeoLTMpE6?NQZ=F&+Tn=Z)TtP^|j;AIY^=ggR zkJfrEp1GS@hYQBJ;c87B4Rt^Mxy6|gE*mzta|lI=#$V`k5)7%`t<OP78Ed}pH{X4v zQyhy)r@ZX=0SVi}1jksd6iV|a{=;5<u40^!VB$fAGBE<5fWh4w5gl!**fv|LrF0fP z4@%?bBte06rnd$wwqsXDnFc3_53(98{9EQab=E7J!;h%CPR2oz?%uu;m6f^Ip5D7F zCR>DEb`vq?tJ5B61V=UAP%?2^$kvquM*wUz+pS5O3e;oyiirNeX*9`gf9XpsMm?wv zb-3ZiNRu#+Z_yVyU6;HWL2$Zpa`3;U9a)JQ%cTX~NHmRVoE|-U|F#+|Fna@R=L;-X z=_J8naRH0H%LDHYdyq6o<2n{WU|iuhf(?oB{wc=CoZD&G?ydfbkal(TR{7)9{J>j( zc=Y61BRKpy)ymmNKQeG2l7?<ftEY~bK*hTA$efk)l;r~NnGZ|e-??y<a_aEo>VOzY zS)ZA)1o<SCFKktNhY=R*L48G;fn%4P_CI=@rq=MpYwY%R#d0qru2YvhWwcAX9}bzN zwM5YvdKZ$?KLb;36v^GU3a7lY&A2OZlA9MRUgkmGwveZZq_QXYNsES3qU!mOPWQDt z2^n2nQ0C{qe%UY3#D_j)sdf49fgFMUBRa(H;N-nBrbWyV@EN+LXJA07{ALj=fB0&O z|4l0QO^7DKOO^`=i=}`n0ScMx)ds?WpFT=;;5emRyKmbE*J6_ae6xsu#=Ic%h8Y$Q zfwR>6uH80!e|1%75f?!mj(vx@6G)>fglhHzjr@s~4b2(qvIyP%w&O(LOx3P2em67( zZ4-hexLls|i7BW~O=C{1tKYe&uc@eeSLgh>i+3gk7m;TiOA%V?nI&LNi=K}go!|V8 z_-=sSVO*0b+`?FU{&v@N9B(u{WqjlQF(1=+iuoT#RE9Nu)SDlvN5@;S7XG!VZ7@sf zL3(3#vW88G!+1rIDyY-n-+AP|eCO(lrL;s+nn8CG)$MZIWag3>*%S2j2luHwHTMh& zXEp?#Ycd!RKj@)v7KPeK_<PiiC1Q1C9GuXCn`{^6F{nhDK*?euT?jbxSU70@INUB( zF*B?+PdL!gB_6t+BNGeR4}iDVgFzc1Xp(5>PorVXjE&Z^x?^?lVn*dNuHGBA3M(&n zSoCWaI&;m<2~WcvJ%k62TnrAvS_tJy|Frei3#;8T%szj86ABG^B83mIV(%=119Fq% zS0NFR-89la`?7nu!ca;uP>Iyls}4U7o349YeN-EpqZ>p_GPHy?8-IdA*H0@w{kr&} z&{eaaZUfK{sfP~)PwRAj{t<9j8%h%R3AMLTEuR8gGJg(yvP)tM!i>g>rYEwKH*l!s zHkwQ^qG7&5AX=Pq8B4Csxq%okuIUJP)gJ2kOKmVaU5NrXquv{0Tz7mnH=T^U>IdU) zu$p;&{zvsT#v0_&LE~Nx`rw}<mWz}OK|%({QlBeN@`mMVxZEwE`@5Fjvg7MlfC|3{ z`wTe&NGiK+>|nNwC~_Pb`b|X@E%+Y9rBjC5Wi~QEwilyjtNi!|2{?wUNo}A8YFc1u zB?JBkMP{m-{ZWGROc$c7u`PI*=ejpcr{jjLOS2M$ApPXr*v_T<+h*X}taILZH3--v z_LLMMZ#?qySS{M4o3o~ap=ud){oV7KEzCm&T(yM!Az*pl<ec=_KUnPF+wbnt&kMsD zy3J4RTu!WoiWN|x_To$B?=-76y2>=D3k83Bnk1S!vWlq~l&({oFkOw{F}V%f{g&GB zA2bZy5YqVJKvZ=Ek6|3n+b^vGw_mNtQTAC79lr_ki7IePEv;Y?qT$J}Fg2{OqjY}> zmL%<%CoxqNP&}!<y<;470ONK)JprL4EVgGwCLu<k(Z!pu^-TzM6@h$m{QTx!CZ{~X z7Z=53QmE0qFwxps{1(hjbKKtkfct6YgY@*vDwy~a2A(pC548pzrvKOSP66n!I68Hu zMZd_wT=Frf#?(${{pyGiuiAHh!o_srye8ALvA7iEmb%}CpFnH)_b=O|jPkD4cJ-ux z%~$uW?7rId+(nPAUWcYQjQV3t>84=&4(F6#jc4Uud|ngAkFBi5nQ8v}V+G<8Ir&C^ zH{M@5)7fnZJuaVTO33XPg&G}GHw*65;J^o_Bu{-p4BuObqEgGY0cHMNff9?l`LOtS z=RJB%j>tq#U^u#z>)QbStKhrV1k9|p+mBI2m)_J4e|VkSs8azY&HRv)YW&;V1Tue( zNFOa1n1zBAtI(F-t_=Af%Stp!xTy(!?}5AXb<S!9kaA$%8uw|}cZ|v76m5M)ES_Kb zE`NzqLv#G#k(v(O737RwqYqdxOLxM#CozufG+@^p`<Q`KKd`Rt#ZRa|i^X>zbyiks zk_PuoC$S+wN>3Ln)7v0aFq;|A?3C;p9&4Un`;03iqp^81$mJ;KGNmLFDRTI7zH=b! zd7g}KZww5R-dI>&Hj*`kR1oU*aeTGX4mC|FOvcbq+*~)1t{1yo*k4fkgU0>9-GH$_ zUHm-0?|pdlcL`$R4USf;Edg(ZQ@%f#>ZUYXBc!E%BNEkmu&aiH8gDj;sR@x7;v*Q~ zjB6JTWYr*naB}sx=r2fvZg*nzHWHmV33)zETGrO@wJO>#bXIJit~m5oi^MLm?cN;{ z0b#2e^bNO`imFH!g(2Yt7fWFI*<(0t(iaL%?b%HKEok#XuOmrbwg?YPk4|PqP<Xjc z;W2yME*AWwzQv*kWCZny)R;ab!Y)<QWk$dc{*)2qaowD{nD@{G`AJ1g`B$%-oBcn` z#)-}RB$Lmt0L2#m@V^22Mog)&;Obb@f~~tw$ojuX3C`VR$2?m4pLzYewJ<-RwvmJh zoAkRyca6|D-Ih`+0+EQl&>z`P;|JDeMUmV<j%UK=<KoLyEU`JVT`ZwIlO8fXU8|?B zmg7on9F7cKDK?{}#20;%8i%=DNk#Z~62x9Lsu7O`{j<$bIc}k;@Pkw#V`K74pz3%9 zK|Gp->!UsQwRR_mSv~#C7bZ8_#i^rA(y=!A_1~XOv(MPi{Xw*$5Zn<1Ge^?u5#cvq zmI6TTJ?!$eggwP=x1<zD4n#rP3sMf6ADVywk&!B@LI7qI?mv_VORg$T?6*e0^8lVv zJPswT2vOmKCIYWCzVUDzQ_y4?Vx!`rXP7A75~W+sM#q}9l9`NpZnv~#KEF+OsvpR} zNv-Dr3@j_tMYs(38<=T7m-P+p|BFQd0Sb1u6r-xFE3noHOFoo6^lx1tFXjq~U7e~@ zB*c|Q4S9iCi;A36xph$ef;_as$N|XUq*NIfJDVSIji+Dr#@C{VE06sG`4*d;>fu*F zBV)_y!<GNst(Om@f4zJ|sk9yl<Oc<DaB@4yDd=n%m4t`)PY#0?wPXzc{P%END;{~A z3Ig_c*_q&dk<QocCf{9mS-35Ibip5iP@SwGN`uXmy<|4Q?`?S2w4s1lKza|7=vM-q zi4*t_iwF7GV#HFGI)Kbngq-LXG5D&@G?;m<`+E%=s8WdY`^a$NumgEm?CPS-&to}M z+02m<*OB_siurd8hg?bzCuN)A?B{=+aUmh(V9g42XmGJ_jS^uDzixj;G7*XHk$*4l zaDmgkv<ZR+N?_a4XT>v^{=XIpjLqt~zJnQbPPwp@mMk=V#;ln$kb$%|GyZLHv%9`^ zHR1_W-h6)Vb&ob5t8c2vtDVO$Eu44c&sshDAU~6Zr*3@o;eWJv{*s;x%|Ww-KA@5} zqinL;L(xp$3XPoi{LltjX>f<+{U#A(%^nnlbuK*x@%x;;L}TlU@Z@26Z|snrcZZq= zil@<g=Mu^eetTGGdTs79Hwzv1DR5Znv|TTz1<o7QRdqLLuTpffAM7AUw}iY(Lk(w4 zE<B!T3buI<sWU-fZ;zFg2nvhkNd49gp14WPXW>ZgD;^$PnArkuU%5ddNpPROq;BBb ziqJhy$l9&MEi_ITHz_1F1FEg@l8IU6_k=&$52t4-5-#1mhMSc<@H2GZdbBt&tE4(w znSLH*dtXgFSJb;D<h<WqxSiSI0W?M_WR`UF>Jn9|j?c1qZ|2;l9xoM3f5sN8&X&v8 z00D^l<E>fTKAYVx8F!_66F6tHxdF`|Q{Cj~3neFHf$ri~QyVh@OB!Enf8)`&WaDH{ zHk}S3Ul~;rs@dNCIs?BMX{PPgD-nj!_8b6E)xw4b7$IVS3~TY;<lw!t^L{1q*RHFm z+a+edBaN}rrr1VajUW{Ze5Ke}52Fl&9(~8>XN?Ej4L(b)URo;qLPn7c^1iV4Cf_&6 z|Jzie8W);jlrG>3E!kF{>2@kQOBvF_mtY$2y_UV<;h*pHA7SBUu!v$&#)bLcFnEA9 zneOgynbpKQs5?1<2904+!NSvxz|WF?Sj?par5x<+Tpr&13wFCgJSGCF{vcNyR!K}W zPaIUb5HIb)w)iPH-2>p;g7ITaz^-1V(_-@LKbf9}G2`0+2bp&dNgLBOGTsV^M&$z| z?QsH7BG5pZ<t;&PBeLiF{=%!#3c2cDIvT1mh_O=^;RmtDH8z~#zc3CQ3^eLpgcD4Y znau7+=XJM_H2pX05Z@0~%x(91p*C~AB7nj8HL0qpc97~^yg%@5E;gNLsd1|If}}Bg zXhXu>Z09Sz>?!m&A(3=}xx?c>{xEZeg+lb$K-2<(^Btu!f4>QwVYeO~mL=2b^}8a^ zoRl;>56d-#>Q-BG=8);D{QD-<GJtUfKwZsrEqO_#&Vq+t4BqRBSycVt?!PL6HLrBp zlQ4HCXjc<@v7gN0^1aIT=Axn>ZFv%2kCt3Trm|P77i+K4gdCLOqSYMIj2V@Hx8~#C z0{EqWabu1=Zqcm<W@e~iWz&)bq7X=F<y}9!--V=(R`+5BPR}4iXnW5VLA%O+3y%yn zG*uIqJT-5j!D5Mif!{q3{e@%Rkl9a<1qYqoF3w@JNN>)Jx7xOno(Hp>M*z)Csi}Y& z=CZPzDvvTUVdHi*K{aiKy9{gGl9d^Q^1l_xFFyk};z>%KdWOIelLqV6bEgyL%}t6f zcRXLd(vN;5{flR+*Xuhq__g&zCs6PV`gD#L+L?&8MDZF)0Dt~>wRjBJI}!hnmb1OR zTvmmp=f9D8f6%~O)kAttL3MM||I<<aPwrzMLZBNE+M8~uG*-?U7<M9EoxxFmCg7`$ zY;8m~UQKxJ(In31W%CjoT$pbe(VWdnPm}1u!!1P!KKCSCwgv$!wt9<T3UQi%&mT{z zS7)pY!iL*~LE8#L#5a=E+O|T)VR3#pJtvY|f`U6kgyDgw;#*VD+I57ueI~!UNQ!LP zeZDsJ^(1GOqc%90ZXJHcT-1X^&~dkp3JPIvNoCePzuMR-r-slVyK@(zNlC^&{(y-& z;(cPqdY?YGoo=<1cn{ex-Mu;k-eU+pNucDn)3zz(PkOadP;fgZzouTIqG${kiNm6y zZ?v&kX%&?_l+fDceXXEzf6*Lv_0?+S*VSAc=02TUl^v4-{w?SzV~sep8CR`auOpX~ zN1}GYPxD&~IyKie=4@532o1IdSNV@K7Kf~<kQf3%6fZxUUlU8(kWi`0TF>MtDT%zP z-S8L&v`gr(0!mQA92MUMK-5QfP*C{M9>xAvD{aV<M;?hQW<5VZ@LPHhH}8+0A=S=7 zlvui95##o%F~xw8TK*y^djx%T&tmd0ogP)aKAT<@ag$Qos?^{4a8bjq`I&&D#2es3 zv1$gjAKIMi$j-6?0-oiB5NHHZ6iILeeFh;PZbUz>dw2y1a9RS15WU21T~b-C>b%r; zB|pD!LRCQtSomr6aC&zl@Np}ll~0>tXx>psW^PR70hoKk0;SW>K4N){!qz2ikmT@w zT)EOzBXN`_if9xxS^MoZs9gM!(|P8fkU#Re!1uEqZtOB%6g{bsSn<zygbo&a5?^8e zo|mupXO7z?LvdhgzymsS{_s(nAp9}4IJl?~`4O=+DtUc?Y(m>xdAbkVT~U$e?Bpe# z=GBvxY3jwLboJ(2w|ccM-*EG#AH-6!IWZhB(EHpniz+57WXZ1whC$73NQQPP@ipIr zV1=*1HcJhWXPL>|0C4t|i$EcfPM5djR!Hf^E0fm~I30%L%i{VbS6!fyy*F@ft+VFV z(|z?8!sBy<V6!H^#1=F-fBQ1*o^b;vGd1^m{40#0y8eyBnuhVOleO1dQ;aP4)a%IQ zN?qmX)a(Aj*ZBRw^0csjcbdZsv$mF)-Eo!98V0u_fEH9ghP2LKwv4)T*I8*WO;PD^ z>g^!q7P0%1=Ir$5*-@)ud}X%NYmCBqmxU4Y#iaOYnav6*Q%zgjA-{j;y1_E(&gc#^ z<`I*q%(l~H?9(+N+lS0buzOSEVy$^*t&xYDlX}_M>_wc(sooul6R<iu?wHhMo7G-h z*Z1?GE6_{;Jk%8PL{D&~0iE(uo_JgUtlYwQX_6|-_h8|O)s@p(z)2({G|gZ-YM?cE zut)jnva;*U*>F)UOyuXUgyWXZA_J2ePeL#2%{Dao@wMfO()#GG=i*HtxT1t*2{)!I zTsT-WF6~qn9^4K<7aSw!(Xmw+(s+MhDhvdsd~b+|AhZ(1zex_Gm4+3!N4%&c1OM-j z&5Rl3b|>tvBfceV+e!#X2e!ngocdva;}1bS1<vtBa{Mz}hZhf>Rz|(o&;>FuEI}iH zF5?z17a2Mlf~V&}lk#1o#yPOU^0e)8fpuc4j(?6e$S0DcwgJ`wdNj8=VWCl`7!B{} z@PKK%DkV8NP4P9t-|+CL`66TsC{UXv%^{RiLngKv>UGnOz4a4m+g>3M^Zv}RCQ?R! zC73ZltFK-b#8?N=;Rp{i$j5c_j>EkVuO6Fyk!kaLYz{|{NmoC@84U2}7D-v@eLrx+ zi)KO=@A0*~jMs$7hxI8+&-FqVes9!07YarIZ{DB#5>oeH;LEZoxcV;=p{kmi7(l~( z!n^P6-@4K90{un|nf;M3@uc!R<pR?$5I0qe(lteGZ3+ky>o6>^gq0YAZ;8YT`U(ON zjva$om*<+bT^osZf{onkFQ|ug0}g?-U8)+^k!Ts%K&{V?zZG`@U`aNegx`w*Y$5t| zd>j=iGY(MGk&|;#(Y*$?BZw%-`%SFmD~?hI)W-K|!{LZtx8Y;gY4XB-Z^to*%W!~< zj_VkPDP`G*o;zngZ-MLR(aq(|H8Wu$EP!^hTej{2@WrIN{XWrSEcZK#lOTQRV0NSZ zN#)|jM55GfCZDJgiT|B6BN#E`cS;8US7V%dPUI|{{FfLA9YhT&05hKsd38bv$hpHa zC9{C{`T5g7bxLYN%^UP`i&ik82~1vznb!|q>bwPU2KN<Z^bH!^OTzv|4<a%*GFZ;n z40E;^(2%;|%u)JHKB9Zs$(r)lXHxXiK$V~j=K;IcLK=1CX}NxJ0f2{$8@l!w3qU0M zrRrNFd`#`7;veO>xnlAlw@x@r;A?N!hKW_LJzl(x$Im*-fLAI8i!=Xtn%IspN4T&+ z+#7%OX7GnW1K7ydB*%vO>hEnpf_K1y&+y!*BT7g2@cHF0v2FWsDV4%MXVc?VLQu?L z4_(+zGt%a6CC5$Uc=NZUJfN(h+vB+Fr;*eWy;>t_pKa4%3Su5%WHX-pI$jzoeB_Ce z-Co$}x%2K9#sozq+}_&&KxPr+rGp_&^leKgYD}v=>SE4~xZ)y(yhd3G@tVa)6@DJ$ zanQ+kidTCKd_EI)&<(i1^8$u+q<pG%LZ0CE1e)ewC`%*S%eaM2BJ{2&>pnXP;A>d` z58U2UWH%SnO$l4Pv_6zDgW;5`SMC0K*flyZ4|V80uQp0L7o^65$A(G?e=~m?C?hv` zT(3<LOJYGYoQeP#R{Mf25Tw<s|6Wgl%f!RPgeXihE673qxOT}c1YYku))bZ-prQvE zN~--Jgp{cey%xW22|HvWw2}JZrp}e9Atg*z!$^_m)ae~4kqget2MJv!G;NCTnbR96 zfyP(C3hTf)P_0nhxt(;1^iU08dLg)f;YU{SPCLcLj-||9$BVn}Z(ZS8`m@YKGbj7+ z$1Np!;;%W7k6lQ9ZMcu&Bzv>@Zm2vW8Gk*Uo`Q<0HL&Arz!ei=HYD#}^7W{6OYF_8 zJ}P&6J^N9<#dgv-N#3u87Hy94kPn3^qd1aBGC+B?bq_|)a8}P47eH{gmi?}d!5@R2 zG&YD|4-=|qG^7m?yjt26_hkX%VJAb1^<M|Sl5xcG!zz-?m8kHMnI-i$1Xbxqz__pZ z9O<=gWk_o=YBY_15)&Jgy$d^x4aX5$BRsYZPD?3*{a2*gxOghD@3lRvoKR;Spynn^ zuQ=$|kt`NNK&=>@pZ?i~z#U_iT(JtP;z7@#FDg5QM#0r1*ICmaz#AI;J5>M48I0nY z?bmz|dte;xBy7zwcl<ojk5iCo4?qV6;Wg>CXk>fOsPRV|jDH~#bp`{VZdHbtnD_Y+ zIoeAdTv`jP+n6=iV?XHgFp@Ug;{Xs;0Ck^*HIW6YfS%Q3wTd#-2=7s}*zW_0P3sZf z-O9WN(bE_p${=#R(S8Q#Aqsq%MtlCL0mzkFwTqjUYlMBaMs#rjMXH39A2nnW?NIcG zjS6Z7e<sZ+yvo(aiulq$<~?4!EKK&;P!b*N5pfN8m58K6IrGNe&nE)Jg#y&tMv(42 zs7Edrrkf!Z3ju2Jfni6jyQ4vjPOS!Yhk=4uM#|ON?zRHJ1r2hx2*or<eyGzKJaiN% zv7c@)u%z<OO-LRK?xYIYF}&ICFxhEY)KzfSi4tV)Tl^(>0xSbC7q+0=G<c^i|Ay*= zFwEF~OyvQ{@05tKUtC{lu;syC|1w7_Qn<@?g;?RCOrchwOv_paXGgpqk%MzHOY&pB z=H($b|CT+Dbw9$;BjiVb(So}6h1;*?!el^f@B#%^iym-<dHIa2odtI_WpH5Lq9^z9 zVguB@N<?S?@K8X?Xgy5tqZ80%@tbb}XqYF<BSN7%cC;R0-Si|rlDvU@YqL$c2&!Yr zcnZ=Rf+h^|mxCUac&O9<-UUZMIIK3czbb9irmXPU0xtAxCOLK#)$uP#?KCEmD4}px zsyt3;TLkq$zzTSRlK446`Su%SO_iK5fH<2S9|?9W+DY43hD{E9U^i`9KxE@7V3s#2 zI9WFV<M%q+2{;njlO}$suQuZ5KUu)<PIea_@V!~op+(`VqsV9Q7SY|X0?$9gg<X>i z`!XKBy+-{p5tgLjQ4)Fh*ZVFtJ8)US9o-!jLjd335&76$B?5xNG7h!y{+;@&SKx5% zc<$k;!@K7DBr-)gtylqG*oXl~#%$PZS`j|hdC_0I2%<t_g{$E+!>Z(+68S)AZ6B}? zJ%`{i)VNVVgB_H|7W9OcFS#t`wWH1m0^Dc``1FW8iT+qRp8wQ`XdEc8G1oA)qf#(n zky5d6X-K(0M2ziMyf}Ho<|Mrj;n@w^Ezm_AU_u1Ei0U0>%7>l}Vv=I-8@Pz5XjOSC zAo6%0V7CL?QARb}x-r7`g%on3nQxV)udon+j)PU$<&iwDXvz75HObKBA2TLh^PQpo zda>&52Lesw=NWO*$kELXC`sh$poBWSIbbek_uh|1eGV~RgT2l=U;tNi`ytm7ty4&W zK4cM$5hOYCJo@kK{>**R;c~gZVgsAlNJy?|o;JA@cs?XO)Oztve43zo=1mp+yD0$` zoT@!M>@Y0RImtb5__Xq93u9qjTByXS5z*LD!5veSpkMEHJpO)rCtLlw&o7QPI#g3^ zD6zm2dMH4{cnrziZ*&dPJN-(4(ISF(2AEL;%xb2Ha5=K<_SXvPo+=iDcUxd+k1xf1 zH|)*3@1KPX$sa`(ktN>h-Lz$6I>B_0d+5lco&+#|SOEOqDWuIs-hkW3AixoWhA)Ew zd)@dl`8H0>p6V?(%tas%jE0npYz0C)AoKj!H0~sE9(lGkl^N2tTmyL?@g02Ox8j8j ziM`_QS7)pr?OD@HgATAF1fy0EF0)o7?#`&1Wd|~`rN5_kKXyWWOE5d6c~jTqg-@th zq|8f$!18HeVsY3<`8Bm*lwMt*(wGRn!Y3>s96;OfQMvD~eq3iZiWAo{?-FdvZOVt` zAwmh&UIcw%1u3z_S198#C3EMt9tn=3di|(bilgnP$@tupxuMUM^<IDZAVk${;{aju zkv|8!Wp35Kto0<4IOVsEeiBeWUC!vn8tO~fZ^w(Lt1Z{V`}081qj2p%(@k)>!`r9M z_B-?{212(V>nZRh&aE{um_7SEjN9ptDyVwjg+e<tMo%PU4QIm9pX-a2QrAJpzae}; zZs<!()>`@!5lm?RU*ztsJ+dmxcP#Z%9}wD3BpMlWOCH`@GN_RzJAD*buOkS;)u;jf z(&Wf8f5K`K2YyGDFgpI3huStoQtJ?e4k9VmFC{9)q=T&SMl>O2Oh%)26}Zj4<{AxJ zQzo&`EFqNZeH$3wig@l3)MX>O6&~RQGN49QvqHpT2{cc^<e2n)-DJxi3vYI}>CPT* zVi4Wx|4oO&tD|!u_Q(+tJ`q7ABa@JLve!RuxY6hOqn_+l)53em(i&fA{v!XMFJ}ls zCx(!d2|#|K45TBMtXYUisauycr&TJHjEkqBri7^R<w+2pxk`E04@oJlQux1@Bhml< zc3yypM5q3*7^xVn{{I|AqO+MxYrrRyiv7>Md|V|$y8k^Pg{b-88j<Kd|F7zQ<p46@ zZTwFKP~iVxtJMB~|Lf=f-THpw|1I<XY0ww!zFpw_rDboG;^X`<MvUNin90-TVxHoQ z@3piyN5#|oyB0yMsEO9k*O@Tgi4xYc@J|&(O=H?ON5|&(>X|F)Lu&3_^QEc_m)Fm& z4@Is<aG>(>@Q=rh3rebo^Q>-FQv1a1myaKRjfXsGYb$J=X&8!?9XyU~U#@6B6%)k? z2_ac*Bzd3kLLUTEE+NnY<mm^Szh4wKPT9qwlCDGX{fi;R1>xhF1C^x+mA#wsbe=*_ zug+ZfZe80au_}Rz)V5|sIwxm*-le=#WXTgP=Dw)gl{kHfH!p~dzDJ!x#ez>PNeyL} zWKbgVR3y6-53+*JD#XD2CvAC!Y7DMLr`2<^w$w|b1+=~eBIT#Qx-7-hf5Th;XdI^% z1Q(cCvi+}^C}F4j*9f+Kn)LL$Z^_q52*rKD@$iF~4{Me-24qj$A<_^&>t0sa>f`aE zaps&9gG4un6KBIPM^(mhTwnzc3R0T11$CJSESP#|4)5|`iC%KbRY}?7{-^UNs86=r z8v&iA6N};~?V-=B2aR80#vnPbJ1pqcG)jfZ&<VPvg_v8({!bu^4iO$(7GQ9CP$YXI zpi~Bb#J2RH_4H2WDY_f-VCgic(m4?pu`n$dJ~tXhZhMNQnp`hPbcFdx$C4)~oVgaO zscGz6M+yu8<uac)(Ed<Db4XkAEqNY4Kd5g)5_4?x-|qu@BqZqci}%>T58<QEW=Mxd zNhzq@ru4GMISpd#EdFr)>l!Yaj82}rp|y~-k=tph@y+P_x_XGO-H`v60}t7Pm=gM& zX|1V#A9P7fm6)6^uTZe-L4MZ}u2)GGr!G_lAHe*T{w`-^6^l+lehkWN%2dX%+-T*M z)g<9j6Q3)478M$~9jR#h+n4Oa9SJ-}ye|b7O%c=DF*fWA@$E6=2J78m`WO}U#It$V zU47i^-Pe)dgj=JhjKYHm>6}P-fD?iKc7yx9=q$iYO149hShA_GBYu6WSg$wPeJyda z4h>wh%>a4hAo5uY4ZJ2$Iy|t%ErmXNnVCbq9bqdorF=t1fFJDd-`)@7yU={^*KR5! z)nM3!H~GtC0g~00S>H6--SB3qU<vT){$VR%!_BVIV6r5A!uVg;ttE8#4w^(X8}HB? zE)fjB3HRbZz_*iOd?}p@)+R1hboNhL^^^(F>O{BzT5YV#j@frQM)j|ZC9D=IICr!$ z-p5Q3X-{vFBh?6wYOs;WgkY5DGo7173`H2N_(~A4ReTzOuFJ)r&>hM&S9|AYkmW&2 zg>axwt*6&sV`H?HU*T=Usy#B_<9MyVv+Wv}%pl->ms90;kN4V$%ixx;O9#3AgUlPl zkj-kaP89<y2Kz=bVtX)L0$>%;l8f(yt;)-|BcLGjAZJ-BCl+n;W~+d|N46>}6lG!Q zgpgoeESxug!QR}it*PwUXtpRC8U-H+EP!5pDX%`;CV8@pStxQ&&MJf&Yc(}dG*H9z z0AA~7!Cslk{2&DE1{@@!Ea|LTucy`@&K2KX|NObR#&15pjKvN{6v8L+V$5`qfTQ0E z@$ZPtD4BsV>op~VkP$_&i;iC$Y??jN*Gt1%MK#IAr<xz)r<A+3!T2ZWpeD8&2e+<s z1wRwKP5YXS4M!>Ezw!CCIfv5=d!YLEGNEtxR5hO%#zZ-}xHcL6)drKGk;dQq2ig#j zI@YXA+GGQb)uwGe+{)@;Gen{$hD)AYeYpnyk}LM&>DOj(ej5=1mL9;8r13})`(04j zl&y=(BDJ1x<3p4LQAQn_aVC^;HdHhy*uMr6gd}z5kCv`u+{&Wt4qvzF+Ei&$BP*lM zsjjL-4(h4OYdqs@<XEZTH?>6dKRmDZj6ljnoW^yPdl!*;A!s1Rs53~0nF>*&s=5~K z3h!Q<e_(l$92M8F9M<<F0(;BRZ4sv9!623asQ~{bv|nSkcVnfb{*=c9a)$a=7OF!) z<1<*tg8|vphRZZ^K0Hr+UJ?-FMxLvHXnfnMD;);AhBVXi5Ney7rB=Rn`-;87^F8p0 zJW)m4Ff#O)NQn3>Ib3&0A?0yN<uH#T+izfBxGVQ%<#KJcQbvv(YClx|aEM%7kF9=B zAS;l%%riAC3{&Gj65xYufXxfE9*(yOp^#}X*^JZXT{BF2>du29Jfa+^C-s2a-6^J! zYZg`LX6OS}i3=uhUzD}*7o(pS1&<@4#=MSY6YbGI1bIn;ul8IxG9aVgth#OHb__ba zJ3}4#HWkp^Kdz?U45UtSN(_HA;ZVgSj~$BroFi8DTRqKo{`c3&HU65{FEd33;_o|? z>gZIY+Fi68p{1K+F=YyerRY#C(c|UMs$9%>URL=)UXiU8Rs<V4jM}cBH%MFbbY1t= z&Ak5vJHbXD^TxJ$5eXTfp433>+E99KjR>vGJ8)BuN)J2vY)(^J)+qug&h6wbv;8Oz z$F2@ziJVnrhB;}Tydw0iKLdAd$s}S@ZURh>gsN@yI9Lh5jef$yUznCK78BC3>m?k6 z&ZPYPcxr@NeK?PEOB2OnO-i&W0yQobEr^I0s}c%oU%jBr*%jchE7J3r(&2Chz)eF0 zj*z%%Q!*(y?|vhjGvxWR9+m;dI;W`m21lwh)Fq62eoXMUa3AL2>dDt~1TdM3xx9hD zbaZ4dFW2e6Oh@POwl#cB`n*`KpN4b18&BuEAQ+Y5j=5L;OiFw^-r<FS#hvGxP7#^- z;aDw=Lwjl+e@#9YcEP^?gaLM%7BMt}g0Gxlosu|*&G4B?3yI|Txy;aV;g;{VavKh) z`u-b;&u}-73q7`Iz>x4i_Z{Z3V~$+=*PjXM*_SuK`fuF+QNyRKfLGb^RpoRhs!<Sd zg+kA#(+wX&y*vLY$|NLi&8T*(PSFqIvfK5!zg?b-?TeznW)U2)=<9~zsa}IP&LVG= zp)6)lYvSX{(N1uBBuH36oCAvmsXLQs6SS*}V*}KhSFBr~{~efP6<q5!@Tc8SXAC@d zSCALW{7u6wR@eF4Nx6d;cwv7>(43ol<?vHV{c?2__;IB?zl0zRMWW-6a1lSNbcYJ7 z@)h7LRAg_m9feEVUT_Th+3_=}O%SAFzz3b|WoeY=EFr6XT`#iv{U$$wQ4lPnMBg|; z#53oTxHxm3<gWi|3(rk6FrjnEQ(UM?e4jiv)jnep0u-tkT84r{Y4DDn$;3$LB`P;w z@BC{Lg^Y0J`Hb*O)S%BO7cH{}xgj;V&I+aiv`1>r&=c1lA5&R{aE=seFr!HJ?U5?a z$GyXa`*$7JIygg>HIsiLj0ve#vw`M$8vZ?lR$g?EYEJI#U0iYd<A@*p>9izrpm)W! zJC~lPho@?+E`*z^isqb2pU-$ub5k;mo8_@~i%;0oc>CAql_Pkam_Y`0)65wHfNpch z8U>nw(_Bu#eI(U>f^CmIO4@a`p_V@V&_eHT`9x{Fd9qYrvJxK0BEz%iBU&@@M-QJX zzOl!jX6bt%4(cC_5<8I{RUSufsetn*Q&|EIm<Ok!JRYNkMwneLhG7;e{)c{oz+0-c zwACEDw>6hxV&vU$l5*C$_)q%HE?Xw<aK^RJ6VNf5jn*+YkFPm6EEoVi?I>^5UpV8Q zjzy<m-%B4fBscc@=S5&=j*j!c)Rp<uXN;|-$LDB)e&Y6E7@Q^l6=sea3*9N(l`BQa zE5;jhb7pjbT}2rYX$egU?ljYFv$FDkoR&#`B)~VEz@A$2%f(!mx7#r|eu?VwnwxR+ z?N(`tmC|cnjW&FJjX>J<SYD9qB9F;)CZS(1rx`C%G$9ArbjTNindWgj4vo9_O^Spt zyeTGgOQf>Bf<g2SE*EKE!2`lBFnbg_W!M6~pUV718jP?{V~iK>Ilqt}&$9%cI^YPG z1EO(sW-r5=JbjABief<c-}`fC=Ag2<JYnBM-}D3?5;L*-l6_BGCrUvze1p7+KVADA zs@naYefxlUlfL`4s6xqFpmm0~z;ySdWp}->f1k;5LX+-qmCQjX$dT%YluAoIZ@OL| zLH!u2i)On&gCJc_?ZAXlcLG}8+VYNb*=VEEEj-=fwH!)auD0`@>>_tR;wS2vbnGX$ z{W^n~>1H9S&`&`jYEW4ooE_P|<REs2pFa0a_^g>8iC7Pzlg%cFzr37Nw^gO2f22dc zglMLQnZSQuw(mg>q+S~Y#OV^HVHw(f%kB84lCE~-l>maIOxZeKb5yU0iw+Mg!_zL3 zQ398upZNKJdxTA{ef5YaoYtB-U3JQbIMZ~rk<*Rj`eP|6<yj$ip9kt!5(bNU&)86# z27A=?V2^4YeMrF-48WkaUjaQ;t4s$CR?SxsLIB5J466=M*!PVm0lo%TACCdGo=p6U z$NY#V=idesTA<;B%%Xkob<TO!1FtWV?$Nq}g7v95Sri+;>@t*vH#`r&h@z@d{LFR` zReC?RWI1#fR8sMZrU{WOqc%dbA$!Xe$Mdy<#^f<q7(C;+UCkY9jnfojU(`Hw*o4y1 zzya?V7>BqwX=OBiMF2|UgW<@ZG7Z&pWkJg+72|?TUQD6`S5$Z3Hv2gQ9B5YgMa z<7#$v8H~}JSn<Q?6V4}8Agp*LZJ=*3Z7o}W|4n;za#isv+0pH@Hckr>`ukupNfT+l zZT+QNgXc@!j}{B3L;dO8jXLNlcCM_}na_~aqG>!hSr|uEEv`A+@5ZLOXP#WwKB!tw z=XTBYMAsfsNppu&t$tR`HGO$Zv%9FIxj%0M|6W%SnbV-p?59nzUWJYcA|8q5pn|sR zRV3wjnh;7;gK)^rZxWF!JyMYV{3SV8h@^+>Gs3j18{k$H2KQOCkuCWxC#npoG2ih| zRDBJDKvhV>0a^g@Z_Ax$FEDebvfb~EA5X_qWG-p$cHPLy7Y(mX@3(Yjbv#{c1o5J6 zefWZ)`$FVy63l4kE$mt4t@N1_iuI<`5(0tLZf#>zz_GBvEhmSbNs?drb5GshwMUuc zp7WvZMV}3Tvx00^gZ+w<>vARqh`Q8CpjDUv@6{wvl-i2Bj<PVU{-At8jl@Bcda`$K zWo$}uM}2+WtY)O$<oLXtuZi>yPUC|i^OLjC&c5uNne|J1Vy~C6U+Z-{3|RqF3&!9Y z30fd#qox-c$<$I8SXazQ(&-<jMkpOu=>Y~?GV=!pP0l>G<;z@8x{N~Vh|Sx-Xlw1- z=5H*j&U#ZDepl-ra57TvN=gn;aT`j7l@Qb@J++Ck(J6t1kqA~`p%OrSCRK$Tm{9<f zv{!z#`aqqsLj;#hg@SF>p0GhH7#LmE`3<mL5vMjWk8X1$=Irg$Yj5=!k);Hrfy)Hs z3hVPG0E1R7MGtSM6u{;5%W9amJXzk`x$n8%W4aT%?%eegLSSy9+?5>e1K9A~<F)If zuDc@JM1z8`KTt+1<b%E68V$b@YiFDX%Gkkb!<ZPAl4;ULuIflq$sMjkw*ii#B+L8s z-nU}THAOP+Q5}PLJ(vgQP0kWpv-tXL9mxU7YXv^Ht7k+iq$XEeox^A-=bHsycX@q< z_LS7fm0?649&-tMSR1FVS{Z`^gbPYJk~r^}y=^Es>jMdL<r;l`GAcq8a#ZvBwb55y z8(kXq!?>sr!5ekHJIX`r3*@}6{nqK_ISEyDb0Bp;QaibdBbrhL-%+*7H0s{3UEDT4 z<{^8@$Y^TKBSpXsYnxn`zz@g1D3h@s8H&kRZ2ykhsN_?yIAEm@n|8dT3LWdVUv6vP ze0)3BzeR^?wkbfXnHGW5p=VI^6|wNB*~x&Vl)I>6nWJ+VJi!bda<;KmAugu(HVHL4 zpo(`Vx^bM~^_xzLuJ=0CTv5!$FH$4b`~!<RT+r%O?&|wLPq4xQu3H{vGqL$I-p;hc z7)J;nB5-&GY2=FP_*CfoAqBCHF8v(BCH``xdjK?oC($=<8*XSp!<?E?y!{l5IRRHP zd$DP6H@HxRjyAwi`G5zcaz2y_<&%3d6bJf7WZZo~P*(^!uW7&E424mVvdpn9w}#V; z4}JQX`ug{L`Fc8cvipSobp$aadEb%%AnW=(9M{R<xN5N*9b4j0O8V=9isRkejMnh; zOW~PFA6?k+$SO_)QFN(7d9d~EIidQJEYIe$Xu$9q?Zv}mrVDQb7KW**N`f+|yt?iT zSDWwk`hx0-Xu2q8uJk3=a)+0iHUYkHV;#LCf9;3;*OgUub=K#2AqUV0SEiy~Qr%Th zG9-3k)C4VOuO}esU^+tRWp;YSxAxfD)e=3;hANy)j&-@MaaRJw{5j<2Rt%)UfQoqC zV@WyV<ee4`t)}bVus5xFgWrK4Mjp+d5jAW#WrOT+F9JA}n_FiCW>K$aZdHe_efoAr zFJI-otw&bfX6s)3Z+`j|wRUKK+Vk-u>29L9p0Is4KZ;0OnpBx}S^3q2EpT8S9{Cjo z__<a)$5(vzFXk1Z6NUTVzo~BhW%c@QACv%SBAD2yU+C-N*V>_DZ4u2AS5)o63Lvt( zl~Lu@R#FdTL6)ng54|?mFO@nYxph%i4YX5}XqJDjO%4iUo0S2y9-FwB_~v6Y^gQR~ z|Cwd8S8r2*Si5%Hj`OK_<C>;qWe1#C^KJc9T!gvss*TBS34mo3CZmA!Th?zcU2osz z!V0=soUQrOA3lBYVraLoIl9kw|Ly`0s%~z{O!G`ECK^Xt|IwR*dHkuFjSVBIE%yJ} z%<yZ#H2&zc{G6NbsM;qC(?+w=`Jvdy>a^|9&1-~81>W|?ef+?AybENfw-dcZSGPCD zW;KSO;M}@W?_4#ag?ebwsyxU&YRc@oM^zd4+4I0*1ielyd4p%1G$%EQsKw3<>Ld@p zO2M3*60b^U;3Hcs_Xas{+L`Qa1v5G-f{>m=<QK2a_f}5zx%lY5q!X_=Wu)~W@Om9r z&d_amu2i^;%D>-A=%HE#aIl1=S(6tiu!qFvz_nQm%UHzP==I0wK4>x0rfYgsO)b~$ z<t&dm--hA8DyTF^>Q0=<>i!~x#;}i{&*E0ZL)K;FhAv6VO<^5)@<naMp+M2m&+~|I z3BWO``p!N|!vZ;RHCg5wiZ<HWeQ7t3(zHB|{|Nlb`gmw2M2_wv56%yvx(N)CL0o@B zTCz#VZao*nJPWb2URCM#Teyv|@p_<cfr26MtB4>7`_nfD^4*7Zl8Tn(^CWrvP+g^p zEDcZFXQ;%=>=ZsSG+lClnJLGgU1#FY?F1smAl%y1l~S2c!ROJ->fo`M;6KsMqi0|J z(i?U0YqEP!87&BqQtvgEa3H@#Fy;Gx_YvpaW9%x)(hQ>nu~h~%a;dh%IGp1=)me#5 zwfl`GroeGz`KXQE{GYnc`YWogZ{vV8NQ!iqzyK1GLl33WBHi5~ozl$!LkNR}lu`pj z%TPLW2}pM%Lk}Pl@^C+Ez3aVydCnhj&f068y}xyRu1#a>nKu0ksWSf0W;c+#S%TiE zJ?rFWP0P|W@5PH2v4%Qncj3nR-ecO>qe>XXadFZijeoW_Rbd@llR_SZDh;$SYCaJq z7xWC&2KRVQ2ab-wD|Aq8boA&vwY=%<K>t;{`6EPfnGFzR_S*fZ3|Q+RuU8k>2D4Pj z`ld0`$TFp*P{9P^e*<5C*J3)DWbeX9Dfmska)Y;3(Nxbx(KVN(a5646%mxJQ!a5zo z=eMDVVDNoz$IYEq{p!3jo|Bm&o?eenKcf;7S(32xyhl-*j8xcR<y+`)st_r7<&ZI8 zWvR9Pl6z=vJOfFwY2_|R6&`#V6N$;uc*|M~<^H;qV3Twk$z92jVmBMtO~^&S`Rvcf zqUT<oqN${69B*F(q8_ypLx+_CJYbFkD#wR=i}(mEF5yJ)Q^y<FFzKrd4(F7%oW%Bx z2St%$6};i}sSX6l@}=t*0(4=x)$|1uxJjLjKA5<@e9=NZ0KQ^-CQ=q>;G!#n?KFm1 zo>C9Ere5u5_6Sl9sa__?HBjFQTsq5&X#5-cj+xm{e^LDNnT0CM0{48_L?Jvpc~#HY zUgqUvxG$(6v5y&Ctgp&c9W<f9Q8z%_nfh&mY+PnH*;IiV`SZ~eq*iIp5t_VtQOG)u zOS;7CuYcTvw&z8%tENs`*7>b2Q#Ce#0hSXYd@?ctizJ$l0SF$Mu@r`0&(%^&+saal zbu-cn5jo;gFf1iy#VhVYlC_?rhG9F$WwWDlA#&?F%_)YqCt1T>&K)<nHTZJFN2vG^ z2itP1sOl&0ZhiLB`Zt8K3Eh9%VkR6;rZ{C}k$g1GN`<2)=#Yzzj94eaIGiaq#J66A z`n2&PHUa)VLXO|za<hDfsa6?nB&t{C@%db1Vv&}$qZzSfE^nplufD)Kx=i-^-#AFL z94@X}LVG!f>bhj^Hx}hQmKryk)wL|HGxlm6SAGgbh9Mq;sZ%ocj$-IZW%btc%|DY# zivYy=#-|V99+FcL)nzFwlJ|g4Vg>_qo@PGJeu3kA!voqR>ES^?+XRO+vC*mi&g-GQ zLe*5d`v#0UTUE+w>S-tmmf7=JR)(<$xz8@?M`@4s*U-SH7eJ)D4BEieRNSlbd$COF z{mEFnT-V*6jb5dKc#=?l)4t7iPvV%S>y5i7V{7S8L$w2u4&1-@{Ygx>`8Zs$#fH?9 z*_s0ppaLaMa=~mK!(7*dFL{gtqa?XcnFq#ZRJ3t---2*)G=mtP7Ve;p7Lm+aju5ZF z#H<`nD1)q=y21PfL2aFN525-Jx!&T(RO3j4Z(Hb?LW2I!Mg=S2ftF})LTgrP&42|G z=jHLH^>ySE*Nk&|w}yeZrC>UV#;~y^oZ!D+tJNmGZr3AKo~O!DV6HRv3W^KsX&zWC z?f47&9I5E!moATo<#zl`<er0xZ+zMZ*)E{~L8JRl{=bTB;0MW9VGv>lMs0f4y|`;} z(rpqIw{#!$P<9utw5-zbpR25NPZ<Nfdj3SU{;f|Euhgm(WCR`fC@gL^;Ld*fD^<@{ zlEl+`mT|%{!!x{7i}4omG}SJv!1r>`U)@$$k$l}4kCavfY4CBOs#hOW5Fn~UL`ft+ zwx&Np6LOdLiS)P)6+095-8(wZW?p!_@`YXcB9ccf1T`wOI}=m)z0ut!aABxcl}{Vk z7l8*-9iGh^(WNveyy$I3Z1{QelcZUSn?nlk9OR(&FC9ld_XajyEgs1nadK!#4u@^J zrQ!$RrS;mr-adeJEjQRf9Wt(dl;vC=YA8ZQOw|XPgVyyGn(=Nva6bI(9cyr=4nmd7 z12a#PhxT&I#JG-3@a`%o{6?f5$(~FnK6AYqx_fcRDJ+v-PZD(a!M*tGM*UVbC&?$+ zc|#di5WX_srg+cMRLl}%J|;D*;D=6jOAI()Uu<WCIUufC($UX1C69G5s~3Kh`znVL zNSV|u)QqyNW2RYm=3Ayhsm-sB+)hK=+7>LOSQpc;-hIY)Ix7wLgS0w56xA$AM3jXU zloul=suv+$rO2+uK4;>RuBGz;9;#>eDHsVATPs3W`6792JFou0N8-uBnWa?+LAZu+ z^fD3@2;cHg$h4WuWR<H`h8QE?3UB)E(5hN^uwzrQ#nr|bRRdI~O4SR;6?{cdi}Zg? zoJFMHd^A_$un|DNc_Uy1cPY3c>5?lFJuOBhFlC!OcvB8sYCFdgqWP`EqhGHrbj(s) ziIOs}+}U%CQ;ybxb5!QHOV4iPwyEA4j!?hKIz9fBWRad68X8#@G^;SNGv7<y)E*Vx z&(<e0{%MpvM7vQWE9gNZ*PiMX4I76U>I+8=P||H|*<;#6Pgg2#kO`4orAZ)MRTah& zguPLq7#2@tPaJW_eOY0cpWIU`D`|D`=3*;XbTytv1CMlfyqw#YFk|~NEt>H8M;yY> zq$if8W6tv)M{2$S{o-wxeV@mP|1wwiG=0H=Dpg`P4OB2r<&_{kt4%THX!okWO1*jJ zca3;IG3UBN2&brd#O9Z1iCnYb5Ll>4xK7)TzMxf|3wmdfMY9(s7_ojVRe7AyCl=2` zuWt+E?^4HNkyX0$vi>VD3$j0f0Sa_MD|aHuAK+|$hMd)hpna&mC2aM{jdZ3%t1A)@ z<U#w$X!xmCNc7K%z`#>&8C20{baG(5efR}Z!*OI|21jhy${vX^M`&4=frL!w68$NM z7S5@CLvtmp@g59hGly3On1y(t?NfV{;;@A=+tr-MC?Q6<`qXB^JN$iXaGS?u$Id#Y z3p3jW$;-y(?lQb+B)^g9x)nuWoiiIG^i6l<Ppnfn@|W@19sC;qL{ti@#KHl8(HXI{ zRrmSczaawr`)zT}+jFNcSM}bhYUO+SYgtuOq)S?vR4u!s8hVtD?gckOqXzsVXWH=2 z#DDI*&k6f8nZTVfuok$ovPN+U^#IOEjRbGAw|AM;wdO}-{iIx;HnKn@+6B+`m3^Cl z_(KK`@2$B!3jybwpOQ3X3puDw_zGCaGBHV0puy}lv$zVEW=j2zSn3<Di&EuMQwkvk z`uaxW3E{SX=4I~>PS=rtF;F0&p>Tmlg19Lr;E#5+ox329NCj*8)0UB!<J9y*8|h^~ zH;m|K<^hx^p}VB7ycHK1<DG`8@%z@8#}{bHGwJfFUbsvMmlJE=%H9!i>Ay9eLOMXj zreWq?<$I8d#J^z_>L>ZiAxE=XCJ*LtwdNV+a6SHNHi~i*she{KbvcvLBMSTlJMJ8F z<1<T5Df8r2!S<`G9E*_RBI<<WTd`{V3QP7l99D2}z?c#Ta5jquqFZ?StSd&$C0~nP zoG_CwlEaHK7N!M5puX=T%C3DW3haRMWjEJr)A2uvO`7$!xYsMZ=Xw>tS_EFii6d>I zH6>&>`_SXk?QLtliNDDlg?QZL!x3_5^xdj}#7U9iTTM#0t3*3WBP^|urxu~H>OXTx z2!s6}j<`*b+0bX3o8-7KLy5nb6vpImlNF*qu(D*y#8JLV79QXB3g0^R@w~<TSs9Bb z2=%hj4~qrm*+#qG>pUyAsp-64kTDQFGCDYr0_l-lBf>6!`b5)Q7Byv7GS|F@ztbE! z;^u!HB0q3(Wa4SzRexG}1tjXWUCc9pJ<9_=Ov<IwCB{^2PMPwU<|Y{>=yoz*^=Co` zSSE^Y+6snKUlH`l)QcXzIc;&Nl|*g5L047ho2WkafMlK%+dd;DC)&!wXEX6&pog7# z^NkESsH#4e{QWt1RgfmUr5in2Z;b|<A6pAPqN+s~GIZ@-=Q4*HDSyk^JJr=4i7pt< z(M*<@;jTzvpXikOw7?)(UxVVy(LlUN^k05xRqokWB;7{Ieb0vfQ?lHg&ajRm=vWu$ zhmdwT;Jb+ENvieRcjU#)9vycR4_+*Nuh@#h0+yJMIdw>^XRuVkF$2GTdaG^O=hTUa zdUV-roXw*zS2-f9x#kyqeew(1ejkU+=0*3n|5CId)zr7BP{$(&ju(Ww|7n6R=Z`|A zRoqQY&bJLLfU=^o0NDC?9-7o{TP<aI;XNNt-PX}2&!^v34`b6yd<a>4TCWmsl)&l~ z?o&;>e#ZE1)3g4~BrdIM2M_6WXgYbp&1S2ZQ3YhrL3^-y9GB+yK^UKNe^=NL8{A=Q z^CA25V2EprUkZ2faifTe-02-@8M_^%REOO=^jI&idZDh_apC%fa>;BpK#G)K+z~L7 z5SZF6Wzlyt^L&ukF}%E#c~YlYL?3N6_=#XtbTBtDZJe)?LQQc3^sI(R@L)kOS1RcX zCU!A{o2scN;$i4XGn#Rnm{@E_q{_+&wtMnK?(d=a=1o#$8jkT)5<l3DAjk_))mS+c z)anAhMXdy&zVlLa_JDv%!aL0u2P)|=D~t+CEHcc(L5-3mV9@7qc$33yZQj-GLyeCD zXNi9_33ZaODEIG5?r^c`3%jGHpw)70Z~Ulfo;7&s+|nff;dhvo{x|mXw&3agjd(L} zz&+(*135g4fEO$UpOQPd1C%>&@y|B0roW1&S<?TfnR5o)IcPW9;%nyf*s=%?Ik`CC z9)r9GXyD3I9-?qRMMa`rhxm>e_9m*<v|I}kn1tdWJ{}L7M1~hNtIMdZ_NPQHAvwa9 zkH#QL@+oR*+rh|b@o<UdbLDLZ3Cq%hg&&(FB70kDKKw_^IRq>|7IxVtZp1Yw?@nXM z0z>LE%kMCUUa9TYexwiOW?C3Z5MEMD9NKM@nVA$B<GuBsy8aZtcfe4Y$B!J14i;ws zZrx8luTgr)=H#gM-!}xiw7P!SBbKjQCQlKN2>&rbn$mGnc!1&TrxzI0gm{QT!B%W_ z{*19=r#8I!2<{VLgj;o^#&@s`my7%q@NjA2Jb2y;&3uRZL{q6YP$;*Y<N`Jhckz8M zaL~8^s34vM9?Z*EQx^B~HVF>*`JL;K5=OZ6s|OiMkg2c6`BR&%{!K1M<>$KW%&eQ) ztjvHMGa1*V9FAK<CZdiwbXVgTps)PAt{#bMYUVeGJJ_%94bqdXLgRN$0}!8MmVccM ze>ERYO-z)q=j2c{n2DdqA6FsZ|J~F?&%4t4FgOfe`xue~#&tV6DZ{4-OHQ*B5l|{h zA%E2ZconEz)|B3Kdhkv~j(_CQ6z+$;jax@Gx76A0^3Zo_1LOA`<qDk>zEwH+WS;>+ zce(0GN#&iFoy_}#;{-Lao!|SHKm6L#CnWLkmr$!UFENzHx6x^KC=~J?o`Exa{6#_J z@b6IBC#?{yZL~>?_pJffRIVxv@$L3Qw*T51>#D(_=0IyQ@41Ps<qvyvufW>$A8n;6 zs?@hlQztIca+9s~V)DW&Rd=|#6;4~)Ed_rl=N?Rw?H_A4!`2OHSH^$+R4}Ir2AI&X zn|ZqRUm6+2CwTO>sW=#`W4ONTV=20?s^;`81ruz;rA}-{5bb_$uxYD(UWl}GUKy^s zhY0@}b2jw*bJ4h22T2}u`(D;M8mc)=NaP9jmGJBqmh>#z*X}(v8V{1O$HmdfWrF2e z<-J{#Au$sX7GX3WVoBYg5VYZ?ZhGUR)X+@%>ZWB@HQ&7O*I9rX?v3sEgnFrgKJ7L~ z5SIfb4{GhAH)r*rY*xu4?DXoW#P}=j!Sb$|CR>Bxa5Y|mudHRdSy-=Ov$Xe)WEAdB z3d4(1i>eZMs?+r3G??)D)GwBP6p43a@`TfB_RM>I)Z+K;omx3!y1TX_Ao7uTjc8^~ zS!50kGcB%Hfb&)Vwjb2U9QNx|<X{hpgs+qlc0yl`cwCLN^tB=tzbe#5XMJd>_%>_Z z3b-RA+<h^Y&DOZF;hb(U5-%JrHFa$-9Co48NhBYUmppa7KfT!NpTNT%@}pqifve+m zN(6$RM4bzCTbL^jsdhy351}7nmY>_-Yxl^(`uG%gCjTz1w0rd2V`Cn&t?!Cl|DYg| zeJyDmo;CS5JaN=*L5p_UJ*jzOK$Lj6XF=^TJ!DK(k<A}tfsw(j_^arMSii#X+id^C z5M79i(~Z{1z>gpu`RSSUAE~51(NV<KcYXUWw>QLK1}07RX7iEse{biQumQaiY~k2@ zuh?PmRmWu~`bM>R&B9aqY}8uMkT*pq-<aSjS>B7j+~eJYzUwV#a4zkS$LrhIA|k#+ z7Nr{}R)tfdBEHu%UjV-;++azA;q|owIkkW8xXd@chfrahZE|bgIo*Q1(b1>=zoq_0 zmvb{r3!@CV(53>TIqQ?50>%RTi{w99K~UA<{PD$HZHp*@(mSX-BPbpyNI#1s(kejn z!dY$gZOxqNJ6*FP9G{4CNV9A0bSc#|mKAFzUQ5HJ{#zp=5{9$Gz@s)vKDj$rfx@o0 zyg5r*cuDQDV3#<v0){}m8oX9vwLNSP_cDD}K8-#GhCm0_tz}REwd&E887^@EE`D9# z$uE}TsPL+22T%)8Ht1W-!uQo2oWrdZD6jlsmLl|I9d5M87~-S><bDMlQW#l{=BGc% z+Z}pT*ruv|hiY)O;D18B%Z|5?cBOb}-G8&h9-ts2wn<Y3Sdj}ceaErw3C0>H6eN_5 z?8`-)iXr%jhSp{n!*Wzlz9t|dMcAduKU}B-W3SGGh=FDqr{8)S;h^e?zFr=~ZyIDj zcHXs{o><OpvrN$iKsV1Ui_5&t{i!Qk_VoKgG9qkq34ZId%c6@rUva~%wKA2`23tF1 zDTYifl-a=Lli0bbyDuKh9fs`>wtGWz9<6$r4aa<?Qwwt-M8w=M2=aU-_b}R<SJAdF zk+{igp$blcPnAZ!UYEIId{{EwK53!t3#><BI$aKg*R2e}bq{$Q4hsZS5Emmuv~lf? zh#X~0kNCob%}}@DUqrxN>$Ul=<2BoAy^TTha{6;F>(^Z@#L9w+n7`Z9Z6jY(@3S*@ z=z+1kPc%7~xTgB@z8u5#G(M0b>(!Nm@N>7-To=mNEnj{@>KQ6B=V66AQZO}<!2+Ux z$4eLFW7T!raE>XZME74^sa@4BgEHziq&DZMHBR2fZ&L7c$}4%i1K#rJC1YdaG4e<o zF-l?}hqLV;ZRneQZa3?MIpTGhhzT=-tCYWu)A*`gsl7F@-o(lHIORaNMo*s_0Pq5S zNw>5}5^}ZA^C1f(RWO$^tsti84E_-z-yl#eMjnA@OW+QX%=kw&5Rv`iQEU-s73ggI z1I6$17_I^f!_C<k^<Hifb6&EToR1XUgz`_waIv0UooLby2;-n|iD-m0B4a*$NE>)m z<E!v~xcMXWanZq>Q*r@3K9w%Z<;BC1gcjn1!KoN;TT1~t?eE8v+H%)!^4U~MPIQil z6HU|nN2=7_v0TsagvcavA9=h`??8Nht+!F1cJU6l)>hmosq+X!aFBAnT>@MOI3rvU zP?~J^IpHM_o5cxSr_SCA5$diQkk;gY`u5QD!Br@SSR<*2(%#b({bC?~eTx+!&dJ0M ziDqUJgviw=12w*l|N5c8mUfvjp!eL?0nfT*k>VV%A`y8rucR9?R)S?XfkWaqo5-Ee zPvQNkcT?dg%&R3I;3D2!tDz78vH?lsQm;N7XKfY-&7md~KWy+>xQ!XoIWaf@Pfjjv zbI;Tq=9|`;$%&oupV=rtedIed3imjG*`sNOcJ){K)eW&%V#aa_hff1FvNJ$_Ka+R@ z3jsVXaHFHsrRKD64IFM9970;YN^b9fzWulb5Ky0zwUIU1%~p{g1}7t8KWBhar#6x2 zxpfwJaZLrdMYhwtN3i)-=^T0GmiZN56U5~E$$#!}O_VJBhVsBg$G^-3F98wXk6CzR zRe=X8iv7rK$Q2ONR*msCF(Qk{Q0yy6p5vQo?AquF!TWBGbXr8O9rd!k)Ax8inuNsh zv{n-vBT}yP!s1<)^g-DsiA>0Ad3v$hKR#I>0lD8==`-vIl)k+><<%PQi?SwEQ~{=P z)4>dd_FXduKExU#*aY6qKV1K9X^2f{P50h*+#aboubB9j@>+LCBPFho&KOF$uFp*8 zAGh|a-b4VxiP@x=`jATKVYxq6XtsGy|JcVd!!N)M7>t|FoB_D3SuMW@d9rmXQD-wL zdq&=f6m&MDRiI+S?=EVh00|DGf`FS}Ue&mcV%`ePZ3>vxPXZZ0J}xh@>o~n2ee5B3 z6ex8_z}E+Bf(rF)35xks7Gn&q^nTV4LQlBKxrC{8Wd|wppK?n)=eV0s8>+2w=uWm7 z8Rg(^G)yHgVPKE-eMUIz7(&gDMlg0MFFwe1fn2)w2+PQ{fse+<nZh;L+iFTK@7Pw} z5(CdAfavnaq$ZE!4fqEU;yB<OPE4Nq9ftG)U0UY#GP&=4WR3J5(w%3E$?1R}OKB$s zW)_Q06OJrWYUM=9&(N=5b*rVUwJ&hd>SOSIrE=ybrX=^fVv_Stg3#2yekIIWLa-Ik z!So479=n(fysMgD6g^kCThaR`HDDoq3=Y9W#g-PTGi(~t7rdZYn|Gv5X_EM}nh04v z37ITO&SIR4&ym}tr4~u`QuljJrwgUTDagjYaunKs$TWrxm=Q1IfdM8-pIp@$V(mrE ztPK456$%<$ZChArAjX74$zob`86+8lMta{GjFX#Hx3}N?Q*~_=lKD|CztrBN(^<-# zcsA29$Q$tnp~}^*#=z1~Vk&kH*ArT4TCe!JW~6gcmUo|k9e~tR;qC7~GBYOZFD-78 zoc7gdE_fVaK$-p}0V4*q<>MAuD^?^u-|4<5H9#WIy>$5|g7@J=l-Rz-0eZ!+QI)d3 z#fW_qg<JE0FSSEoP*N4a)zv|HCaPHB<t4R`6AWrZoBJ!-&1;8m=)aP@ObqAwTscK> z(XJ(0`G2baOlRFVng2ow|D^!_g#%#xKWy+XcHn>U1^;3P{!K0Xn=km+3;zeOAO+vM b$DzRps3;JAe8i=N@$jfCYl3POEhGN}Hvcn< literal 0 HcmV?d00001 diff --git a/templates/nav b/templates/nav new file mode 100644 index 0000000..f42bb06 --- /dev/null +++ b/templates/nav @@ -0,0 +1,11 @@ +<div id="nav"> +<table width="100%"><tr><td align="left"> +<a href="[%base%]"><img src="[%base%]/static/memories.png"/></a> +</td><td align="right"> +[% FOR photo = request.recent_uploads %] + <a href="[%base%]/photo/view/[%photo.id%]"> + <img src="[% photo.thumb_url |uri%]" alt="[%photo.title|html%]"/> + </a> +[% END %] +</td></tr></table> +</div> diff --git a/templates/pager b/templates/pager new file mode 100644 index 0000000..8ff1ed0 --- /dev/null +++ b/templates/pager @@ -0,0 +1,19 @@ +[% IF pager.last_page > 1 %] + [% FOREACH num = [pager.first_page .. pager.last_page] %] + [% IF num == pager.current_page %] + [% IF num < 10 %] + <img src="[%base%]/static/[%num%]-s.gif"> + [% ELSE %] + [[% num %]] + [% END %] + [% ELSE %] + <a href="?page=[% num %]"> + [% IF num < 10 %] + <img src="[%base%]/static/[%num%].gif"> + [% ELSE %] + [[% num %]] + [% END %] + </a> + [% END %] +[% END %] +[% END %] diff --git a/templates/photo/comment b/templates/photo/comment new file mode 100644 index 0000000..498e5b6 --- /dev/null +++ b/templates/photo/comment @@ -0,0 +1,18 @@ +<div class="comments"> +[% FOR comment = photo.comments %] + <div class="comment"> + [% comment.name | html %] writes...<hr> + [% comment.content %] + </div> +[% END %] + <div class="comment"> + <form action="[%base%]/photo/add_comment/[%photo.id%]" method="post"> + Name: <input name="name" /> <hr> + <textarea name="content" cols="60" rows="5"/> + </textarea> + <p> + <input type="submit" name="Comment on this picture" value="Comment on this picture"> + </p> + </form> + </div> +</div> diff --git a/templates/photo/exif b/templates/photo/exif new file mode 100644 index 0000000..b60ddbc --- /dev/null +++ b/templates/photo/exif @@ -0,0 +1,16 @@ +[% SET exif = photo.exif_info %] +[% FOR group = exif.keys %] + [% SET counter = 0 %] + <h3> [% group %] </h3> + <table id="exif"> + [% FOR key = exif.$group.keys %] + + [% IF counter % 2 == 0 %] <tr> [% END %] + <td class="exiftag"> [% key %] </td> + <td class="exifvalue"> [% exif.$group.$key %] </td> + [% IF counter % 2 == 1 %] </tr> + [% ELSE %] <td> </td> [% END %] + [% SET counter = counter + 1 %] + [% END %] + </table> +[% END %] diff --git a/templates/photo/recent b/templates/photo/recent new file mode 100644 index 0000000..37d1ae3 --- /dev/null +++ b/templates/photo/recent @@ -0,0 +1,18 @@ +[% INCLUDE header %] +[% PROCESS macros %] +<h1> Recent photos </h1> +<table class="userlist"> +[% WHILE photos.size > 0 %] +[% SET triple = photos.splice(0,3) %] + <tr> + [% FOR photo = triple %] + <td> + [% thumb(photo, 1) %] + </td> + [% END %] + </tr> +[% END %] +</table> + +[% INCLUDE pager %] +[% INCLUDE footer %] diff --git a/templates/photo/tagedit b/templates/photo/tagedit new file mode 100644 index 0000000..a34d8bd --- /dev/null +++ b/templates/photo/tagedit @@ -0,0 +1,21 @@ +<div class="messages"><small> +<b>Tagging advice</b>: Tags should be words, (<i>portrait</i>, <i>henry</i>) or +phrases surrounded by double quotes. (<i>"tall buildings"</i>) You can +put any number of tags in the "add tags" box, like this: +<p> +<i> landscape cambridge "tall buildings" </i> +</p> +</small> +<p> Suggested tags </p> +<div id="suggestionlist"/> +</div> + +Delete tags: <form action="[%base%]/photo/edit_tags/[%photo.id%]" method="post"> +<ul> +[% FOR tagging = photo.taggings %] + <li> [% tagging.tag %] <input type="checkbox" name="delete_[%tagging.id%]"> +[% END %] +</ul> +<p> Add tags: <input type="textbox" name="newtags" id="tags"> <input +type="submit" value="Tag it!"> </p> +</form> diff --git a/templates/photo/upload b/templates/photo/upload new file mode 100644 index 0000000..d17d3cb --- /dev/null +++ b/templates/photo/upload @@ -0,0 +1,63 @@ +<html> +<head> + <title> Memories - ANCC Photo Sharing </title> + <link title="Maypole" href="[%base%]/static/memories.css" type="text/css" rel="stylesheet"/> + <script type="text/javascript" src="[%base%]/tag/list_js"></script> + <script type="text/javascript" src="[%base%]/static/upload.js"></script> +</head> +<body onload="init()"> +[% INCLUDE nav %] +<table width="100%"> + <tr> + <td valign="top"> + [% IF messages %] + <div class="messages"> + <ul> [% FOR m = messages %] <li> [%m%] </li> [% END %] + </ul></div> + [% END %] + <div id="main"> +<h1> Upload a photo </h1> +<p> +This is where you can upload your photographs. At the moment, you must +upload them one at a time; in the near future, you will be able to +upload a Zip file containing several photos. +</p> +<p> +Please note that it may take a while to transfer your photograph to the +server, so don't press stop or reload after pressing the Upload button. +</p> + +<form method="post" action="[%base%]/photo/do_upload" enctype="multipart/form-data"> + +<table> + <tr><td> Title: </td> + <td><input name="title"></td> + </tr> + + <tr><td> Tags: </td> + <td><input name="tags" id="tags"></td> + <tr><td> </td> <td> +<div class="messages"><small> +<b>Tagging advice</b>: Tags should be words, (<i>portrait</i>, <i>henry</i>) or +phrases surrounded by double quotes. (<i>"tall buildings"</i>) You can +put any number of tags in the "add tags" box, like this: +<p> +<i> landscape cambridge "tall buildings" </i> +</p> +You don't have to do this at this stage, and you can always re-tag +photos later, but if do it now, it saves you forgetting later! Try to +re-use tags that other people have used, then all the photos can be +found under the same tag. Use the <b><a +href="[%base%]tag/list">tag list</a></b> to find existing tags. +</small> +<p> +Suggested tags +</p> +<div id="suggestionlist"/> +</td> </tr> + <tr><td> File </td> + <td><input type="file" name="photo"></td> + <tr><td colspan="2"><input type="submit" name="Upload" value="Upload"></td></tr> +</table> +</form> +[% INCLUDE footer %] diff --git a/templates/photo/view b/templates/photo/view new file mode 100644 index 0000000..33b562b --- /dev/null +++ b/templates/photo/view @@ -0,0 +1,86 @@ +[% INCLUDE header %] +[% SET tab = request.params.active || "comment" %] +[% SET url = base _ "/photo/view/" _ photo.id; %] +<table width="100%"> + <tr valign="top"> + <td width="70%"> +<h1>[% photo.title %]</h1> +</td> +<td align="right" class="tagbrowse"> +[% FOR tag = photo.tags; + "<a href=\""; base;"/tag/view/";tag.name | html | uri;"\">"; + tag; + "</a> ("; + tag.taggings.size; ")"; + ", " UNLESS tag == photo.tags.last; +END %] +</td> +</tr> +<tr> +<td> +[% IF photo.albums %] +In albums: +[% FOR album = photo.albums; %] +<a href="[%base%]/album/view/[%album.id%]">[%album.name%]</a> ([%album.photos.size%]) +[% ";" UNLESS album == photo.albums.last %] +[% END %] +[% END %] + +</td> +<td align="right" class="tagbrowse"><small> +<i>Photo shot on [% photo.shot.ymd %] </i> <br> +Uploaded by <a href="[%base%]/user/view/[%photo.uploader.id%]"> [% +photo.uploader %] </a> +</small></td> +</tr> +</table> +<div class="photoview"> + [% SET sizes = request.config.sizes %] + [% IF request.params.exists("scale") %] + [% SET size = request.params.scale %] + [% ELSIF request.session.scale %] + [% SET size = request.session.scale %] + [% ELSE; SET size = 1; END; %] + <img src="[% photo.sized_url(size) %]"> + <p> (Original size [%photo.dimensions %]) </p> + <p> + Size: + [% SET i = 0; WHILE i < sizes.size %] + [% IF photo.is_bigger(sizes.$i); %] + [% IF i == size %] + [% sizes.$i %] + [% ELSE %] + <a href="[%url%]?scale=[% i %]&active=[%tab%]">[% sizes.$i %]</a> + [% END %] + [% END; %] + [% SET i = i + 1 %] + [% END %] + </p> + [%# Now put it back in the session %] + [% SET request.session.scale = size %] +</div> + +[% MACRO do_tab(tabname, label) BLOCK; %] +<li> + [% IF tab == tabname %]<a class="active"> + [% ELSE %]<a href="[%url%]?scale=[%size%]&active=[%tabname%]"> + [% END %] + [%label%]</a> +</li> +[% END %] + +<ul id="tabmenu"> + [%do_tab("comment", "Comments") %] + [%do_tab("exif", "Photo info") %] + [%do_tab("tagedit", "Edit tags") %] +</ul> +<div id="content"> +[% +IF request.params.active == "tagedit"; INCLUDE tagedit; +ELSIF request.params.active == "exif"; INCLUDE exif; +ELSE; INCLUDE comment; END; +%] +</div> +[% +INCLUDE footer; +%] diff --git a/templates/picture/view b/templates/picture/view new file mode 100644 index 0000000..976b786 --- /dev/null +++ b/templates/picture/view @@ -0,0 +1,7 @@ +[% INCLUDE header %] + +[%# Scale to 800 across by default, else scale to appropriate size %] + +<div class="sizing"> +<a href="[%base%]/store/[%picture.id%].jpg"> Full size image </a> +</div> diff --git a/templates/recent.rss b/templates/recent.rss new file mode 100644 index 0000000..51be582 --- /dev/null +++ b/templates/recent.rss @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss"> + <channel> + <title>Memories photostream</title> + <link>[%base%]</link> + <description>Recent photos from [%base %]</description> +[% FOR photo = request.recent_uploads %] + <item> + <title>[%photo.title|html%]</title> + <pubDate>[%photo.shot.strftime("%a, %d %b %Y %H:%M:%S %z") %]</pubDate> + + <description> +[% FILTER html %] + <a href="[%base%]/photo/view/[%photo.id%]"> + <img src="[% photo.thumb_url |uri%]" alt="[%photo.title|html%]"/> + </a> +[% END %] + </description> + </item> +[% END %] +</channel> +</rss> diff --git a/templates/rhs b/templates/rhs new file mode 100644 index 0000000..e23114a --- /dev/null +++ b/templates/rhs @@ -0,0 +1,33 @@ +<table class="commands"> +[% IF ! request.user %] +<tr> +<td><a href="[%base%]/login_box">Login</a> </td> +</tr> +[% ELSE %] +<tr> +<td style="border:1px solid black; font-weight:normal; background: #eee">[% request.user.name %]</td></tr> +[% END %] +<tr> +<td><a href="[%base%]/user/list">List users</a> </td> +</tr> +<tr> +<td><a href="[%base%]/tag/list">View all tags</a> </td> +</tr> +<tr> +<td><a href="[%base%]/photo/recent">Recently uploaded</a></td> +</tr> +<tr> +<td><a href="[%base%]/album/list">List albums</a></td> +</tr> + +[% IF request.user %] +<tr> +<td><a href="[%base%]/user/view/[%request.user.id%]">Home</a></td> +</tr> +<tr> +<td> <a href="[%base%]/photo/upload">Upload</a> </td> +</tr> +[% END %] +</table> +[% INCLUDE calendar %] + [% INCLUDE tagcloud %] diff --git a/templates/static/1-s.gif b/templates/static/1-s.gif new file mode 100644 index 0000000000000000000000000000000000000000..304f6ce9a39bc7cd65fac774f0902818271a9e8d GIT binary patch literal 646 zcmZ?wbhEHb6k!lyc$Ud<<x=Of$MfF5S^DJR+}AG_J-R>V-RmW{ZcMv<bGna@PfbnD z#EH%u*H_)YGi%ev^iwCg-@IJ>_`#ezH)q_vHDleHitAUW+`fJL>7#ic-Y#7*Kj_8N z`KM3z%$gOjZcYAyeWmNy7OYsFaByGinN!V^COTie+;!n>+wr5F2ltoGn;WoWTm9t8 zF4L#`Enk+nV|)Io<4q6l&Ny_iY~S9ZJ-eE&UYfLbcZHXi*OVzf2llp1o#M53ch#o# zRrBUXZr+qSe_qV8r4ch`_+7u+Gi8eVvSm@*w&uKkv0(9{uyt#brcUvB@^HqE?FIL4 zPxAKmet2*8>63LQj&)U6S5KerwRvO4`n6?OE>4;?GwAKB#dGIGpFi8SbZN}X=L;`i z?3_0*bj!w?RV(r~tgF0wxo5@<{~6N*H*d;1dZ>NYOz+R1KOa7Pc)|pSkMEZK|NozX zVxahwg^__FlR*b$5-3g>*dI4!HZ^6mwzZ3;Hg~u8wxxCTw7NK`7(}r!wNGen^)gfs zXJu7l7U-SR#w3?y!ojF2$kLbA?wh`2hm$8WTVK0?u8hSFd!69O{i|4|<%81AZ21{a zwXsR*87m}M`-xv|XAsxW3Q1;u(8j>%oF1kq__FmiUwWeXi%+iucgPCQdii3m<)fud z>l^e>Jb0C~VPdPZO^wJw(UgN6I&S*}4m7Aa&Wy^KkkT+I`(Tr?_O>S(0jiBnCh`|K y5|Wf!`M5+R3?3*wKG>qlb%x_tN23EHC;KEN2Ze<P8>IX#cv)ATQC;r9U=0A#aVP5l literal 0 HcmV?d00001 diff --git a/templates/static/1.gif b/templates/static/1.gif new file mode 100644 index 0000000000000000000000000000000000000000..0eb416fb09f3479f13469ed279f6ed1cac254f93 GIT binary patch literal 649 zcmZ?wbhEHb6k!lyc$UEM`o)4XryCwUdi3kpuVY6m7cB~&Gskz@G`FXZW**pIeE06% zo7Z|KOmJ*zahg55Z0qK<zCMTDJ9Gd1`Lk|q!u$8{J373UE?xTj_wT&Cy#9X2Wy><> z%!z*g{_Tkqi+AqqPDt=tyg1|joyjdN&VT;=Uc5LhD=VYByY%<(ABPUDoj<?p?%m_t zw{KszEPKI%?z3mN@7U3`VMB9cqgzRdTSrI7(xnY`b&gAxq&;|WCL_bSv$J#Cwr%O@ z0rm9`X=wrT=EY2!<UDIu%$zw<@7}$xs|%PhBeJp4b?eqm-Q6W8PcAufWJ6}AOL4L5 z#EH(^wr#1abDBFh`u_b>8#gv3BzU*908MVFuMfC<u`MGb?aZ02ckdpnuXjpIOIx}$ zbH$3NkMEXEnBegL|9=Kr0>z&!j0_A33_2i7Kykvr{;VOPsYzK&PRHL-!9Y(&ym>-` zxm5hrX;U3MMT92G`b=LC&tt;G-0U$eHdauWWg#EevH<(3Y@Cej@v#eeG?~=Rrm-<@ z=VW1BDC!nDoj>mUg@y6%`U}`&Ss2e>3XQoG%X)jEtKI#Facm2fr0>T+S`e)AmVsgC zf~df^ig95Jy(8}PF?{%>aD`9N#i_CS*(;%bZSequ6`~0Tne;i>*c1#Na<}js9|%|w zw32~=<$@nmgup{?J|3$B9s&;(noYa~rsQl?aJaz0s;hNpjUsDvYeX{}M@CYTM-LnC SoD(ksm5z4>B``5ESOWkt2L+7) literal 0 HcmV?d00001 diff --git a/templates/static/2-s.gif b/templates/static/2-s.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6c405c13ccfa2026687c9728f2d028baf79f783 GIT binary patch literal 718 zcmV;<0x|tZNk%w1VH5xq0Oo%H%*u_(#)-+te%IBE*3*-Ge0-CWM4z5gqM=>b*N>Z; zOwrDTo10O$wSK3jb4p4|xVLNT=%VcDqu<<`ySahr<)85FrQO<?@9d@C+mh$xpOlnE z?dqfB;GE&!o0ynN;@_N@mrT66f|;04&dZLvxPZ>ggVWHF%gKz}+uQEzq?MINmX=B5 z;h0QJOyJ#`%*un#%!R(ZdZwjV)Y6Htu6gO_p`)Q?xVCoO*_E!XWS^a7+Sin(rdYVP zZL+U=qoP*U(~6drO~Jo++}W6zmrBRRe5R#m&C7+=(~8&BkgcnC&&`U#!NIk%e3+M2 zxwvrG)s&Z(RJgW(si<n4n^T#XSe=|$ot$5wpH!fqU%$O{si<(AoKM`@lik~r!oP); zluDPDOUA>3($9+P=%B;EhO@D0x3z4eqG+e4YP`96zPy9i){e%+iKnJp<>H*Hsb;CD zUYeOpl$1=CmQSIeX4TV-qoQTd&5z8=f%Eh8!^6XnkU;V7rvLx{A^8LW004ggEC2ui z02BZe000O7fPaF5euajIDSLy9hmD4Oij0LBK{PZbMhOxYg^+`W18`n3WFAT|F$o-; zo}dX^K5riza%W6A1Dk$)hAk!+bA7_YEMqVl9E}TiXdiubJ9cSWeIYUv5seZ88!UZN zHEtvU27L%8HjNk+I>J_L*logC0TqrIAUIb`C>3Q8eZn{(k<O6{5P3-ONYbMZ0|yi? zU~p6jLj*kvf-%4|g+MlnlV)rPaij)?6D_`|;N)n4f-VTSG(Z8R&k!WY8nu9+pih+_ zV4_r*Q6$c_Y$+xQSW&KzfdfDed|07o&4maq_V8K|Bg=><bcBpp(MQY;DkM5QDDX$C zgboBN%uo<fq6CEoPDB8>u$GUYJxwH3=->f_hZhqr5P6}YZ=|-oK>Be}z*8UqJJ~vH ATL1t6 literal 0 HcmV?d00001 diff --git a/templates/static/2.gif b/templates/static/2.gif new file mode 100644 index 0000000000000000000000000000000000000000..251beccdf4ce570d9458afa78f2acf0be2ef05df GIT binary patch literal 694 zcmZ?wbhEHb6k!lyc$UC$^IFfeX>N-a1<#q|d+ccCqeqW^{rYwJV%yV4Gq-L|yL<QU z?wz>@_7_i>;MmgQ^!xYkKY#x8^*Q9_<-LFZ{><ryjt;Ncv&)t)U3&NK@ny@hH*RcN zx-_$;#j(ELY2rlZrAr$YFV09$54eB-R905T+_};3-o2hQ$$9J6O)V|Xot>StX2sOi zInJNowQN~tLV|Zff>(EUNqv35p+jr`{Q13Y+qU|8hb2oIHf(5~H!mhFEp5q?w8loa z_wV0kWH>KgoVIP-mLo?t%$XB?_wKRZzkhUhm+sinRaY0#*y!5d?^sgewqQYbak1;1 zIZ<cNZl5tD^2CY7Cr>V^t8+SYW@~1q%Yz4JGBVP(Z{NOiXLnj!Ku1T%y0r<fUo5zP zXYz^_Q6Jwen=rxQ|Ns9Cv;>MjSr{1@5*TzqmVn}ff&G6&LQ|8mM7X4ikAk_c4S(~5 zgb>~Msne!vIS30(^p~5yAf8vAm905oDr4;GSZ>bP>0(^Vl+@yxnV6z@qGFkuV;QIN z>aaRnO^uCWVUOX6V-Q(2O;p`!>aM8hxM&83^D*%orW&~3h>f}ZIG!bL?=(Z{X-qM3 zaj)Mp9GdEGF`biP#~bN_1KiEt8ci)y5fhj+`0Si&FESmFo6fkvDud(d(*t69oGN+~ znY!edn11gth)B?M;Z$GAu_SqB&*{cO(^WPTE;=|g<%;diwdB-3)UA`CcH_dL+|!Ne z-}VT6_`0;6MJho-WJ80?qNN<cMKKx*CmNVkMfa>LP<(i3jU$^d*B^zXly+wJz)1;` O6AyW58Z<I6SOWk&Eg3Ta literal 0 HcmV?d00001 diff --git a/templates/static/3-s.gif b/templates/static/3-s.gif new file mode 100644 index 0000000000000000000000000000000000000000..07a4ddfefbfe45136651cc5e09cf8eef2866f62f GIT binary patch literal 718 zcmV;<0x|tZNk%w1VH5xq0Oo%HwX|`os%oaCVv&(U#lw5OyMnyBa+Q@wm6S=buV|N+ zN$lyP>*%84-kVHJOp=mB?(3xK=b_`^oP2zIpPy5im`d;LrI(jZl$1rEo>Roac+t;= znV448(uv#K+mez-)zXsV;h5;<pWxk^?dqf7+?v9_h04c**VT;b=b_islG)dmnVCz{ z&ylaKcI)V%)zgaQ;+~k8PteYZxVC?sn^nEMbHl-csHb46s9)RJlFiDC-P)J5vueP- zguJ_Sq@r)y*p}Pbm$|oYxwvlA(2=2^X}Pz6vaoTmu6eh$b-TH9*wv88#){L?iK3xm zySaFyp=hO}Y~tUXtEq9ixPZRAgTujhmX=cE;+veDQP$Lptf_C4lSibZS(cVd%*unF zoLA4ygwV}~+}V@S&xf<IY_+s&!@!2d#EH4Ld#0slsi<eGs$|Z~j@Q<X*VK^V-j~?c zmE75tyt;PV*pQl-TAG<%rlnY$n^*AdrStRi!^6XnkU;V7rvLx{A^8LW004ggEC2ui z02BZe000O7fPaF5euajI9(#j}hmD4Oij0OEFdZFYPH_-=evpHPAsS_11}7yv1Y;={ zor<7hL=_Yn8D2eSKPM5ae1}^E6@7gV7zn}&P&^Bcb#N39SU@gceIHUtatw|nIyrqt zM?24VR5vBdjd}|+N^AfJ!yIZtA`p&#dJ!rK2^iG_0ah^JbWfdxC0g<bd(dVMiF<`M zWNFaCM1Ut<9sp=y&(I4LSMc<y5JZ9m6=sC3X`#&!iU>pe)j%V`PY4@*5JYj4;!qqi z1{CzMQ((#q4J`U_Z~<bOhe8nE7{JkGfG`&RE=V!az=DH4z0@(GBjCaX8DRu)Nn%By zg9(2tz~W=j07RMsG^+S$Qe*^!w|oT2)dL|yj0PhbND#3=58y~~dqMQ`_)j1JI~s*@ ARR910 literal 0 HcmV?d00001 diff --git a/templates/static/3.gif b/templates/static/3.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc9051033e98eb1b850a8669d596ac1556cc61e6 GIT binary patch literal 695 zcmZ?wbhEHb6k!lyc$UC$^IFfGIlix7EZDs>_vxdVixvexdh}@P=CohGejV6feE-hm zY17=!oNl;$vF+~NyAvijwzN1MJ6ieY&!4_NhmH=f_wU~?UApx5@87d$m*wT<b$6F8 zU7ERUS@z<^X-k$g%$pZ8cW!i6Rz^#Ub9#Ef)~%cF-aYo<!I`sXw=Y?eHfK)MtXVOc znJyh29VbsNIdNj~wryJy61>vV0!m8Uwr$&1U+=JEN7voE$BT<yw{PG6=g;pWM>eFT zrPb91Y}n9z=FHYflbq}81Mc5HwRmyH@83TT9a=koepf~Y(B$Zr7RSa$x4JsV_wV0! zcb8;jI5#%BzI*q&uFh%3jL80e$Akp$Wy>-bEa=|2v8l7ObLrBC`g*5{6P<VN>|VDv zVa1B5kMEXEnBegL|9=Kr0>z&!j0_A33_2i7Kykvr{=XrismanTT1G+B$yVK4ym>-` zT1foVX;ZbVM1>~mMNMB2&mY0Y(X2ZyHfHsz7{+N5e9Ii|r^YY~vd6^6Gsdo8<jUr( zF*TN*DehDp6AKsfG!Yfmm8>VvbFsuR?3w0cI*mJ)A&xsfmWg5CbO-4LoXo5-=XheC zP4kmq7{keXhUtP{r-jg}N#d+0Ie2z_XZ36kIIvH|W5e5qr8;3jvLDhf&e+5<E$@fH zx1;l?H$0zGxY6X1=ae``B^BndhDLEVR;`N$MU5wzJJ}gBf|vC=Z09tHXju7RVNjzU z4}*vAhD$+{d5jNu7&JI~IeH6+z1fi9Ai%^Ps!<baq}t3H*(@R;QL(VmU5G<q!HEvR NM_heD2~3O()&Pay7yAGJ literal 0 HcmV?d00001 diff --git a/templates/static/4-s.gif b/templates/static/4-s.gif new file mode 100644 index 0000000000000000000000000000000000000000..5e640e4e72080e5039de88a443c63c44b68afd6b GIT binary patch literal 680 zcmV;Z0$2S<Nk%w1VH5xq0OouE@9d@R>Z5#oeC+9?OiWDc=%V4?o9gGG;@_O`?WN`7 zp6BGB<l&f_nOWf7n#ID0+uPf#s$k8^gzM;_)X|c|!FSiyjK{`&&&-eH;hp2)oS&Xt z%E*B3>!irWe!jeeq@!8J#EGV+TG!Q-mzPY?&W69eblTUD(9MR?&xxR)T&k&I%gKM( z)sV}{jHab=oSRjYltt3ejiaGx#l(M`n^C8xYOAVi$i|ASs&?MnnV6STy}N$V&XCm7 ziKC)wo}O9O)Qh;bf6B;ym6S-x#(b5PO_h{R%E*hIolwQYc%`ISk)+L+MIkDi`W z+SrzwnM;zAM90N@>F1%=)04r!dXkbz!@+{7r)!mzN}-@;#KL&b&4`zlOPZNlpq^Sw zOH1C{lEA%$l$1xWtz_uspT50zxwnABz=qY*l9G}`ot#pbmrkapSf{3Dyt;I?vUHxE zTfe=7o10GN<DSXKexadN^Yin=!^4n}K=JOT|Ns900000000000A^8LW004XdEC2ui z02BZe000O7fP8|2dxeIF5O{-&hmD4Lij0jG6&D8pkCA+i3`GV_83Tuqn~f7(9wJZ+ zn4^vpLmV-BSO^J@j!GyIdU{z^9k_=qC1<^QKRu$tdlpkNcgI^!%eZ0}T}gUgM|v|D z1;Pv!DZE548+vjsRJaUw9%a1^Hf(xYaS}c!0k?%gCalou#e~c;DSANA&=9~-fEI9` zfN9WR0}wq|zNoknLPx_w01hCa@L)`u2RumZ$ngP(8dilM>`4&7jD`#xqV!txhJu1i zg$Uru)5y(|8f}cgSRtVRCISNZ3_Y{}!yGh1J|G#PpaaxAf~FQ4pum6w2L=$-DG){g Osjx%^nSE6h2mm|HBwf`2 literal 0 HcmV?d00001 diff --git a/templates/static/4.gif b/templates/static/4.gif new file mode 100644 index 0000000000000000000000000000000000000000..b42183c4d58516c8969f6c2162c0084e2bf66b92 GIT binary patch literal 668 zcmZ?wbhEHb6k!lyc$UDhVnx)twF$d-=AJp-@aWN_U%!4`zSy>PbK2_{3!XljdH3$! zMT>&(-<dpNg5!bx#eIDa@87?lGsm~3#p%zVKOG%jvuBt6{{1^IFK_A6rOTFOmz20A zBzV1l|90-&=!p}ZTUs3N-aUT*{;BlzfSo(Lw{G1ue}31oqm^gRZtw0coi!^aBg1*g zlC<sHw`XLeZQHgjA;CK<D<dr}t-HIVt}dXs*tNdislMJ}$&!Y~M%M=q&YU>0c<Iv2 zWy>;8o?P<o-Rn7Xq8BgDm@_Bp$dL_8mp06p5!u<<Icbvff(6|>c68O%IW;!AWoEk6 z)j1wIwD!!It!Zfi_4NTA9UXV?9{cm>cYnX*ym>LdfB$G{ao(_@dGTVP8@6oR*fedL z+s$h|AKxvTFu~#f|NjiM1d2ad7#SE67<53EfZ~LK{bxf$Q&X^lvZSn|Lxj4FSo4Gg zOPlzq)23=V2?$TLlAFFDp4XX$wb^!I3=?0>bWyHlif#*;)-K>xWeL+>$j%U}wopVR zXdwe5b6o7gcq5Mmf=rBYr_KaePhZ7wGLG$xMd-9!OjkHgFATSz8pF=W9>*cb#<6X> zeB{)(m*W`XIpesUuHN{>%Fw{dv%>HP`+09B_GuXwKM%3a6laSy`e&Sw;Bdf8sYW0% ztbpN&w^>v~#wCW320e~lu~i!sxg<EuH>KXOeBhueDjw4?(_sOV=%lG~I-QM;4GWmK m`T`VAJ~_(Dvw=-iVFBw=9#tU~m5U!(+yupz9$;Z&um%8SXA2Mj literal 0 HcmV?d00001 diff --git a/templates/static/5-s.gif b/templates/static/5-s.gif new file mode 100644 index 0000000000000000000000000000000000000000..00f59be3ff2234f20902edefbbb7a92c32e99382 GIT binary patch literal 710 zcmV;%0y+IhNk%w1VH5xq0Oo%Hv#@&E*Otx8j>pD*z`lFg){wrugOQO#wX|xToK=~b zO{b=6*VT=al17=BQI(ZQ?dqe{(uwTpqwwve?(3vXOibqEo_u_K;N6<<?4{GuiRI#+ zmzPQF=%S;dSJBRp+uPgM)Re}<h|bJ|-`twj(vsEFisIj#>*%24;GCD1Nyx^EmX=B9 z<e!t0NXyBLl9EJ~luNm|Yt_<^o}E(R-kYGFW!cw})6kKpre>|IVw{^;%E*h#$bZ(< zi>#_}qM=o$q-LU`T$h$jo0?Llq;R#ee8a(c!oYpR!g$8Sd$qK0(a(vfr(B$yQL(UT zvaoNcrfuNfm)h8pl#@s3<)4+5MX;}Cvax5jv~st#ew33*<l&gPw|?Z|otKtUs;Oa^ zmsPB*VaUgUudZdFpIDuoU$L)oq@z}(q*s}kN~57@y18+_y>`61g0HQ3-P)F$n^C{L zgPE95nwm_ot#+@jaG{}9$;XJUtZ&@enDg`V!^6XnkU;V7rvLx{A^8LW004ggEC2ui z02BZe000O7fPaF5euajIAbW$0hmD4Oij0O_J|+>DBR3Eekb{Li5gG#)8y2QLOdAw_ zorV!`ItX__9<^j4C#$T7qG~FAz`$iZDHD!<5m+334PjqqYXC1T$9^MiEHN%NL3U7h zBoNgaV|_4v2M-D~NClh65i`pNF%G~91UC}KjZ!yHIf}f|lE(p+GDy7WIz)lNl@%*O zkkA9>L7y`LBs4;igifC<8U189!lKWD4;>mYKwu6)32`WtaM*D&<slPd`fQ2v(vJ)@ zeS&le=?6q132YP`pyHuP8Y?Oi)Dd7IgP#g}_=udcgvgLNahwSGVMGLpRTVD$$?69J s1_5#-+!&A}M+A-&8q@L-lyw4xDk(4suCbwmF};!2YOQwlLZ?6gJ8b7_I{*Lx literal 0 HcmV?d00001 diff --git a/templates/static/5.gif b/templates/static/5.gif new file mode 100644 index 0000000000000000000000000000000000000000..e488fdbf3d8c76e31041b0524ec614af76b0c8a5 GIT binary patch literal 692 zcmZ?wbhEHb6k!lyc$UC$|IXxT)7)-e>shxp;n>m2r;lbXS`>U>fAOP7kAD67HD`|R z<%?}+PB(1boObu_-3b#Mckj$?X>sc7bNKV;&-?f9XU{I{=<xde`*&Vm-qNK@ySq!4 zF3nuFEPL6q%sF$S)6xPKFU~k~W@}@kTW4qI)~%Z|GMqPVY??POX8!!H?(WhVGa{ER zZRqIe$jC_BwryKhRz_M{+Mz>h6B4{LGhOQH95-xezI*rhf(700-@o0lqig&2?GGND zNly>>^XK=wcdzHniMoIPR7;C<ON-<0-#?ZtNt-n*rnuO3+qNx7j%--GIIX0_ZOM{` z{(i^$dZ&pKop<i+uB&r8dv<$$eZbwj$4;DBoRHu(cW(5_lS}IB9qQ@=CQWi~Y;^tj zZrSS>3s$U%nlQoP|Ns9Cv;>MjSr{1@5*TzqmVn}ff&G6&LQ|8inZHb!y@F|=g?RIX z1Z&y&sne#qdWZ;54Dp*josp4Wn}f4Cd@5U99P^qrY`jxN`Ib9GO^u6ZW1PNbD!&GY zv&*!#ObjunVz~EC6;lb`$9^)FHHL|2ft2Mw?wD9!X0`=WgQTZ33p`-uW@q0uJz9NV zTx@I%!*`yzbMcOHuM(vfENHZ2`nZq7GpKLQQs!%H5m`xx#2Fa4ba)-g4osRTaEv43 z^K(~+=`A)jD^46;(B06pTdYKpLD;*S+fc5C(_!stCMFiHh;H?TT-*jC(?Wt68XFpN zSlE7OHy&i2!O5XzpjqyDh(|(FfWzy-gErQ6@fjx$Ojvkr0Skv<-;xtbN=_^qUUqvV M79JLv;lN-G0JKUKSpWb4 literal 0 HcmV?d00001 diff --git a/templates/static/6-s.gif b/templates/static/6-s.gif new file mode 100644 index 0000000000000000000000000000000000000000..226cc050ef2679a57205179d0beb83c127d2608f GIT binary patch literal 719 zcmV;=0x<nYNk%w1VH5xq0Oo%Ho0?JU=%LfmipR!)#lnY^l19C}a^v8c-P)M8wQJDL zhRMf*#>9!q$9|KONuHfqm6b@myKtJATI}hg?(3xQ?4{@ApOlnE*VT+nOiY)TN$KaI zl9EGwe0=cjrRCzD$HjZw+uNR<Qj(HH#>9KY!+*-ii_Xl6=Hs5|<)7;3q3GtIl95B% z*N@K2j+2u_%gTnPq-v|GX|=L^kVwtvyjirUzf*VUA}x^I}5PQ1Ewrlnfa&yk*< zP@kS$ySagzn@+^TdZnaY(aw&ms$s;!e%#rUz`cUFwsGX*o8#b|uB~R$(2SXwRLRGS zt*ddbt$3oKUbM1tsHSqexO~dUfXvE+&C7?at7qZfo1vgvm6b}Sq-D;_jKjfqu&-*X zscpu@fZyDj!@+r=pI+_iqo1Esot$5vo?gese7?Mcv#@)qsA`#*O~Af)nwd?Mlt-eX zSiHJ&v9ETpu6eAgbd!@ulaofLreD_6lk@ZQ!^6XnkU;V7rvLx{A^8LW004ggEC2ui z02BZe000O7fPaF5euajIA$x<1hmD4Oij0RC4Qc`gIV%)?kb{#ABy(a3FeeKK6`YEb zEe1S6A|ha32nrjie5_;_eQ_gweR($u788vD4NVttF?MVZeH>XfAI6gkMHg*hQ%OvH z4s|^in}=UF7cX}J8fO|1XmmFd9*q%Az%(pz03$3;Rcz2}ltYXL4h1AonX#o$0U0Nb z3^YWdggOaP7~n86<c^LfS2P_00pnl{0$M1j*a3mdngzuUDS5*yjSCfi4p`Cf0LTCo z0S-|RQiMYvH&{R<@X;p*k})Zag)p?C1OPlVfXR8$Wd@NHW-4UZlgm#93q)l6DDyxH zlo}>1mTbz<;SbqD6*eGn!GHh(6M8<RqRU6n-9i*LSU~ZiSUtj#?3Q&@2=bpm06XGd BWxW6Z literal 0 HcmV?d00001 diff --git a/templates/static/6.gif b/templates/static/6.gif new file mode 100644 index 0000000000000000000000000000000000000000..4b38e4dca34b358ef981356f9b6df59a23f00ea1 GIT binary patch literal 708 zcmZ?wbhEHb6k!lyc$UC0ZJOJ<wF!$B1@GROyLEHgqeqW!UhBDkXY#LKzb;>FJ9E0> z*wM-f6CCf}y}NYj(!M^2*|W=9TAbd$f1j6^*U{ni=g*(tzkkn}6Lsdy*0i*=;$qjj zI>-0#-!56wFma-DW24*R#cA8NZJ9L5dC8Kr6DJnmzkll8yVu>_C3EIP&zcppZQHh; zJG&Pw=-#oTD?L4+ySuc$KA^tdsiefMzTV;F$t4>$G#@##p{2#Sr3L7Q<8^gTbLU1s zcyJ~wD`Woru6grfX3U6Oy0qc<?;jZ%X+XEs)dh5Rb|xfvXJj}pTb9|;(Xn)C=HkT} zXU}fW%yhYX_t?gbO=)QX2?<`ymSrD0w6?L)wZGqS>())%w{JhNzj)3Z-`6h|Jbg6t z<GW=mRzyvh;PC(de+F6t#h)yU3=9bjIv`6xal*j<zagQi$;DDT*jn7j)K^BVc|wAX zXZ+M@Q#H+mL?^1qO<xet<H*X<Y_fofF>*Cm+*ASHWvWWk7~)u%BU$32qSo`+u{tSl zi(}+ukByCCj%Q$s7YX;D9v8<I%@!FM8_m3Ts=DqrW|nA{X)&?qrWtroyUrOCd5Voa zCTe=9{j|vV(_3;sKGTX?Dy{K|^TDAD4XaWkYeEk(9tvX6kKVzuVM)Wy>EZE74jWw@ zPB-fQ(yH_<TRn-5XB!ib$&Zcqj(h3(Fl^kBaFdBKN+`$kgX{esMX?nI9qA1V&GpzA zLaG#8IVCt{^%xZ<q#kH0n>xWKfN_}<BS)B1Y}Esm=4PfQMFEopN5{9*dEM14CYW+K ZHVWu>)pQ6rw)be*_9SSsstGVy0|14*8!`X@ literal 0 HcmV?d00001 diff --git a/templates/static/7-s.gif b/templates/static/7-s.gif new file mode 100644 index 0000000000000000000000000000000000000000..d60763a1ffdfaf60b68e1b0cd6bf106885571fc4 GIT binary patch literal 673 zcmV;S0$%+`Nk%w1VH5xq0Oo!G@9d@2(uqt=OniKN-`tw)>7&!piRtH|;@_Oi%7fe4 zmz|tj!NI}g;hoLOgp-m+$Hj^0=Ahf#+w16})zgZgpH%ASq3-LXm6b^5<DSUIeC6Vv z@a?77)r_5;P}9(nlaoZDp;_72mcPA&pPgmT%#WU&ZNkBJ!@+r>pk|YjOPQEY<KUd( z-kYzjWV*P3kLtaX)@M$XKIlaocn!H1NSOPH8SmzPlT^75mhW#HYGmX%MIl})Ip zT$q?q+Siol<e$F0gR7}+nV3z{&xOUrf1jRFmX=7Cl}MhQUYVIo-rJd`q->m<QL3n4 zv9M{*%Z|;<g{!Jyv9EE+#)`PMf3K~0&dh_Lpj64neYm%4y}EsrluXgjiJO{Ntg3dR zqE^<^kL~KCp`lXX-I}tncG%XH+1HQj=%Bp1f~>1!ySab6xq+>#cdM#h$;XSQrfSQ{ zjGUWKnV3qIluWa*d$X}=<l&gn&XDu-^TWf#kdQ#}?xz3${{R30A^8LW004dfEC2ui z02BZe000O6fPR94eT9aH5_*G+hmD4Nii|~C1_l9_m>LE<3^{{+9R@984h{*YUI<cU zGZ74mg%n48H(3=GYfyI{E=B}FV|#`gbbQ9gd`Ltga7+^bhiG%gDmGnp4-Y*tRSnRG z1yjZ*S5{_xFeGgv1&$mjPCRZUKw*41U{ME-g$Exa5E_tKf+2+(0^b|~h=5?j2|h`b z*vVsoUn4v+Xy}Lofki@#eYWsf(S(bF2_Oxnc>`j>kPjIyq%73IM@uSaEO2lnp%DcS z7=Ex((5{gHJ;DrOdBW$55QIht_(5u@fPxw?<Yb7tM-bIM01hA^utBCF0Rtcn`f3ra H+CTt1%2rmW literal 0 HcmV?d00001 diff --git a/templates/static/7.gif b/templates/static/7.gif new file mode 100644 index 0000000000000000000000000000000000000000..f22734d0944dd2467a03f28a5384022758f52a6c GIT binary patch literal 672 zcmZ?wbhEHb6k!lycoxra^IFfkwF!?NJ(@PnZR_T=r;lbH*kAnX*RS0>bLY(Qy?giW z{X3H<OmIANx?%S0vdb6S`uZFeEed}B{{5dne_C3cIy$_TE?xTj_wT&Cyt=x8dGliG z>mA;|e_L1QIB}x$;>Bra&TQSVq51y(Q*-7-ZQZ)*$dL{2-o1YC;LQB_UCWkb&YBgI zkl?*^X+uUvT1$)Lf(6|tPAuNBqpPmYY2(JGB}*C(9a_6|X=Y=iTV|%q+_}-)w{M>_ zC%V2q;O^aH+qP|)G|9Q8#rf>n?TZ&@WMyS^cbA+zxum<hG%YQyvC%a>J)onbBO}8( zA;GJ@-s#Vu-^InQzkmPOwr$(ao!v{8r1keZ-o1N##*E0461TLpfX>d&Wy`W(zgY0` z-Le%cq9#mm`2YVu1C4>=PZmZ7hIj@YkUgL{VPOB;5Z~0~7aA00sqCcaC?noHAzocG zZtAqDTB<_A6Ak31FNovOVPbD~jpJltj9t4fmXRfvk87EdeOxRH$C~xbEIWBLm;!>Q zGO|WT$HYW4FmT7jP8C(LoyKwI)|qp>%+p*9r!&N`vOVYLj^><hV>X>XhGE(hwgnzi z(^m<`G4n>V?u%vGq#UBka!R13=;Ofz@l?hejaf#A6PWebmbF$fDTOqpY~oQfOk@q2 z&cq<Vv1iM|qpeardaMi?{30xBUi&;2BxX7^urmB;jA~LmHJy`5CcrR*lc`TxjD^E$ m!2?&;WwK!j8v?Q~Ff!Wpr0j5PZ0gaDXiK>m_{v*>!5RSVz6Htv literal 0 HcmV?d00001 diff --git a/templates/static/8-s.gif b/templates/static/8-s.gif new file mode 100644 index 0000000000000000000000000000000000000000..b648bdd4bb5f7bff4961a016bf6ddaa44afeae07 GIT binary patch literal 731 zcmV<10wn!MNk%w1VH5xq0Oo%H-P)7T&4!wpP}9+gs;OSVzkKQEp{%NI*w&TN&WxU% zSHHb=%E*G@-kXz>MzgVYot$3R)s4^0hrPRbm6b-Kpk9@fNT{c8nweDZ?4|JSrS0mY z?CGOSOiYrJM0|XF?(3xD-<<2{qLY(E#lnZ^<)72gk+rmI+uPgg=%CowkJi(Qt*de5 z;hnLsdY6|;-P)Ms;h3nWV8p?PudZjIpjX=0kf^6zl#@l((~#EFljGo=pPp2fl}*jd zh34a(tgB(czk#r?b<4?qyt;DI&yk{_WTvHIwX%G}!FR^QfX2g!ySZ=D(1*&$gq)jG z!@!2b!-MDKpUTLK%*uh1kwe|umcP7#tE*tSw{xngX2`~hmX%Ahv1zifZQ9t9udR00 z)QjKTm9DIKxwvq`z<<TVdzhC|)6tErt7X5vf3K}@;^CU6rC#OYp0KZG=Hs5Xwr`}P zWWm38rlfAFsBXu`eBa!fw6c1(w0V<~MDz3W!^6XnkU;V7rvLx{A^8LW004ggEC2ui z02BZe000O7fPaF5euajID0_p8hmD4Oij00K5lIAQO?Cq|8ybF)gM~3GR5?mnabyc< z0b(E;poU>gFehC!JT)~mIX)#IpN26u3<Z710u~;9UI+mO8HX7IcUU+T7c37?Ra`+i zB^!qtA`E>N7Y}6x6Uzq(zl|9xFMSv?N)m4`XD&J%o*Hc+AmH2x9DVc{$pa%=qZ9#v zjBwxp!?HdQ)K~%5Xh;Nv5a=8bQm2Q5D|b2_0-%COA30-4ByeIPjfXV|#2s4k<wPGa zGeU@H0%y*P112~$`mrEE9|cj^Obb9^1fHaYP!!4l;Dn521a90wh6F*h4tw|%;t*nj zmI_Zec(ggf!Uc&PemZ>klh%(04lQ&{ApvE^k}X9VY|zU`P+vb8M3it7B18)*02xQ( NtJaYr&3^&`06WsuY|H=v literal 0 HcmV?d00001 diff --git a/templates/static/8.gif b/templates/static/8.gif new file mode 100644 index 0000000000000000000000000000000000000000..036dbb682fcde2aa120eafcd122e7bb969cdac8c GIT binary patch literal 713 zcmZ?wbhEHb6k!lyc$UDhb#vP8ow<t^1)n+H@axyFM~@zTe7Eet{^DatEAQW#eEDMA z-Me=uOmO`D`*&ZTLq~^KON-N=KYx}kT{?SqSzcb=`}gnX%!xjGcKd<_-E-$gFI$#5 ze}31}rJ3*FzkTrF%>DbPCQWjlIMKPj-l4m@bnDhlb#;z^{`_ufasK`LM}2+3tXVM| zH#U`&xYgG?b$6E}BzUEz1*D~=ojkduxY%{cl7_{L)3$Hlo|);gb7%LQIZ@lTZJReQ zrlrNPuFmQ1-Q!tV8U6i^85zzA3EneiMDExDw7MZ9Bdw#OqqDQ~?%iW2PAuNAp?TZ3 zE$`mFK5}HkvSrzgjjoN2Zi^RZq^Ad*IkUB{E?~)$v_ps1&Y9!;^wG?l*LtQ+b6dAI z;q{9JD^^5JnBegL|9=Kr0>z&!j0_A33_2i7Kykvr{=XrisY%Vw!e7!d$Xi^Nw|PQ> zoK*bOX;ZcQL<J{$DNbJy&*RF<(rh#>jv<OUh9f49X{s>yGI@omaT}Q8R>j0b$1Rd( z)d<_kv>_@gGB!5qz$Shb&uItaxY%MDna@VXABxv=nI0Dr%M~5H=L}=SR85)b(ada7 zyY_QNK8z2rUJxN<aaqXW;AU@iorX_F2O_7Zu`yNL4C-|6EsC49m#JXE&D~zQVG&GW z{0F8d#P3jfkd(<L>dm-MXR}Izw*$+xWhRnAoD9?2MD`~fY+BHLQeUaZWXGWe=?wXd zd<MoJ&K>MlPSCorp{4b7BQuAH%!f!#4p!L&C6O5nDpyq5&DD}TG!!}xF!Au;snb+! fX=;gT<`79RTI40dAyBoU;UjZrZ%_ggBZD;n<uD%+ literal 0 HcmV?d00001 diff --git a/templates/static/9-s.gif b/templates/static/9-s.gif new file mode 100644 index 0000000000000000000000000000000000000000..d3ea79c79a6665c1fad8f8ef503c9135ef69bd8a GIT binary patch literal 731 zcmV<10wn!MNk%w1VH5xq0Oo%HudZg-)s)Z8hQ-2t(a(&Pl}6mzn4X?d!@+vCwQb?v zo4dJr*VT-;wtUjih?kd1u&;8+#)^`XM9If~nVD6qs%ERHcFW0w%gKSYvV7Ikk(!xJ zk|l}+pDqD)Lo@9d@S>!ju4o_u_K?dqfG<)85FrR?dW<KUds(uvsDkK5bZlaoiO zr*-M)q2=P7)zga3%!8t#TCc5e>gS>B=%A&fX3NQp$;O7fyLr~rkEW(t=Hs2*+L6`L zlFG=7)zgg0$AYM)a=^WVsi|J*=AfdXRh*nwu&#O0&XDKipVrfgn3qnkt!tc{Rl&e^ zsi<S8rfRRQW8~qT!M}K^r(@>hp2Wg<vaoHowQ9t{htkl8yt;p&pH{cEb*`*$-P)JO z#(>}4n!CAy#>0rCqgdeHm!Y6ynweRjo>;uPbkos~zrJ_Y)05oUlgr45-rJJR%Z1I# zi`LVOpq^ozn@^yhT$h$mm6b}Ysco&RZS(W<!^6XnkU;V7rvLx{A^8LW004ggEC2ui z02BZe000O7fPaF5euajID|>^BhmD4Oij00W3=>ZdDVZlAg^+`VH9aa5VF+v&Isz&r zCVrlV3^Y<keYFPw8ej}3t$c=XFBk>2EEG(A8w7DBB#lcY!%;0r88Z+PLmG25t%flI zwJll!U_m|=8*(wshcOqm76F_oA_;vJ11KJcFI0UTXWDQw<K}<_CteKfGZX^IgIZk% zY{^2TPM;1l0xUFiVvQaac=|jjv!F>IG<q~PGU0*%mOL3CG+2=1fekJOPBdZwqd<Ww zLvXwy(nrRZ8zMLzf?;Jx9|<zl9H?cdfl5Cs4DrAqB@G7-wIonz5n&3a4|{z1xq=`8 zlp`HD?$8l}gp8PGA4dF1>&Jtb07-rf88hTZ01+Yl<mDqMZ3q`7l!!o~07a3+ibr^A NtkzMX#fky}06QGmanAq% literal 0 HcmV?d00001 diff --git a/templates/static/9.gif b/templates/static/9.gif new file mode 100644 index 0000000000000000000000000000000000000000..c345bc5e087c1ca143b6446d60f445a3306e88eb GIT binary patch literal 704 zcmZ?wbhEHb6k!lyc$UDhb#vOHMZsrIH@tqaV9p%hM~@!;`t|F;{^DatD{o%wxqPv0 z_s-n=cP8Jxdw0SF$CehSKY#x8^*OwM|GuNc>-X>9vuBqrUAi<cFR!uDb<UjVWy>;; z9N92uPSm7H&h_;H^XGR>oanrGamL)a(GMP+*}8Sp;>Br8mo{wMwxy-Txuc_F)~uMi zI>(F*=RbdbFI}3sV@FqacS&8H)1gCaGc#Qp8{Ov3izzO4O-oB#vZNs+BP}7pYy0-? zXU}eLX>rWT%6R|&?a7l%mMzQv{rktecdvKu>@F#B+qP}nf(6|hH#XJP1uR*TwqZl_ z{rjix-aXdY**RlI<cSlD>+2o*`yJ1m*_xgnkd_vZkl=my?(zD1r|$03b!!uzKAJgg zn%l>B%T}z2nlQoP|Ns9Cv;>MjSr{1@5*TzqmVn}ff&G6&LQ|7&xQnBbjH0)Vy-4$f z1ZAoCsne!vNec-~3{aT9Af8W+m95!f8cQ5I1AE;1n5m+?%Y0;~vaDiYV&{sBVPsh( z&+6ngZ9ix1=~!m2n7FCJD!$VgV>n{>FfejNbH`tdH_)FJ6@Pl;)VL_l3sdFvPP~Yo zevxzER0-4RQKuh0+>#@yz~{<V9lgtdVZ!QIr$Sq=1}=q!hC{kMTMQH;IJqYU#B9-t zVC7|GDl}Ub!}Y-RpqT#ksIs4-ou?+Ke`YE9$=2YwnPKXpCkqq~JE~?dv8mmueCN#~ zt9iiVKp^LVCf40T3K>zIM_H8<6hu}is9sshVVoDCp>V>XSy@>2OkHH+(<auaW*!lX YiK?8v?EFb0D<2&`*%y?+#K>R`0O<D`s{jB1 literal 0 HcmV?d00001 diff --git a/templates/static/memories.css b/templates/static/memories.css new file mode 100644 index 0000000..45752c9 --- /dev/null +++ b/templates/static/memories.css @@ -0,0 +1,141 @@ +BODY { background: #fff; border: 0; margin: 0; padding: 0 } +a { text-decoration: none; color: #000; } +p a { font-weight: bold } +.tagbrowse a { font-weight: bold } +a:hover { text-decoration: underline } +a img { border: 0 } +#nav { background: #994; padding: 2px; } +#rhs { background: #fff; height: 100%; width:150px; +padding: 0 5px 0 5px; border-left: 1px dotted black } +#suggestionlist { background:#ffd; padding: 10px; margin:10px; +font-weight: bold; font-family: sans-serif;} + +#login { margin-top: 10px; +font-weight: bold; font-family: sans-serif; background: #eee} +.loginfield { font-weight: bold; font-size: 80%; } + +.messages { background: #fff; border: 1px dotted black; margin: 0px 10px + 5px 10px; padding: 2px; } +#main { border: 1px solid black; background: #eee; padding: 5px; margin: 10px 0 0 10px; } + +h1 { font-family: sans-serif; } +p { font-family: sans-serif; } + +.commands { width: 100%; + font-weight: bold; font-family: sans-serif; font-size: 80%; text-align: center} +.commands a { color: #222 } + +#recentuploads { background: #aaa; border: 1px solid black; width: 400px } +.thumb { + width: 100%; + text-align:center; font-size: 80%; font-family:sans-serif; + border-bottom: 1px solid black; } + +.photoview { + text-align:center; + } +.userlist { + padding: 5px; + text-align:center; font-weight:bold; font-family:sans-serif; + } +.userlist td { background: #bbb; padding: 10px; } +.userlist td a { font-weight: bold; } +.comment { + background: #ccc; padding: 10px; + font-family:sans-serif; + margin: 5px 50px 5px 50px +} +.info { font-weight: normal; font-size: 70% } + +#tabmenu { border-bottom:2px solid black; margin: 12px 0 0 0; + padding: 0; z-index:1; padding-left:10px; +} + +#tabmenu li { display:inline; overflow:hidden; list-style-type: none; } + +#tabmenu a, a.active { + background: #ffa; + color: #000; + font-size: 10pt; + font-weight:bold; font-family:sans-serif; + margin: 0; padding: 2px 5px 0px 5px; + border-right: 1px solid #cc7; + border-top: 1px solid #cc7; + text-decoration:none; +} + +#tabmenu a.active { + background: #dd8; border-bottom:3px solid #dd8; + border-left: 1px solid black; +} + +#tabmenu a:hover { color: #fff; background: #ac9; text-decoration:none;} +#tabmenu a.active:hover { color: #000; background: #dd8; } + +#content { background: #dd8; border:2px solid black; border-top: none; + z-index: 2;margin:0; padding:20px } + +.taglistheader { text-align:center; font-family: sans-serif; } +.taglistheader a { text-decoration: none; color: #000; } + +.calendar { font-family: sans-serif; font-size: 90%; text-align:center } +.caltagged { font-weight:bold; background: #ff9; } +.caltoday { font-weight:bold; background: #f99; text-align:center; } +.calempty { color: #444; text-align:center; } +.related { background: #ff9; margin: 5px; padding: 2px; font-family:sans-serif; } +.exiftag { font-size: 8pt; background: #ffa; } +.exifvalue { font-size: 9pt; background: #fff } + +.albums { background: #ffc; padding-left: 15px; border: 1px dotted black; } +.htmltagcloud { text-align: center; font-family: sans-serif; } +span.tagcloud0 { font-size: 9px;} +span.tagcloud1 { font-size: 10px;} +span.tagcloud2 { font-size: 10px;} +span.tagcloud3 { font-size: 11px;} +span.tagcloud4 { font-size: 11px;} +span.tagcloud5 { font-size: 12px;} +span.tagcloud6 { font-size: 12px;} +span.tagcloud7 { font-size: 13px;} +span.tagcloud8 { font-size: 13px;} +span.tagcloud9 { font-size: 14px;} +span.tagcloud10 { font-size: 14px;} +span.tagcloud11 { font-size: 15px;} +span.tagcloud12 { font-size: 15px;} +span.tagcloud13 { font-size: 16px;} +span.tagcloud14 { font-size: 16px;} +span.tagcloud15 { font-size: 17px;} +span.tagcloud16 { font-size: 17px;} +span.tagcloud17 { font-size: 18px;} +span.tagcloud18 { font-size: 18px;} +span.tagcloud19 { font-size: 19px;} +span.tagcloud20 { font-size: 19px;} +span.tagcloud21 { font-size: 20px;} +span.tagcloud22 { font-size: 20px;} +span.tagcloud23 { font-size: 21px;} +span.tagcloud24 { font-size: 21px;} + +span.tagcloud0 a {text-decoration: none; color: #000;} +span.tagcloud1 a {text-decoration: none; color: #000;} +span.tagcloud2 a {text-decoration: none; color: #000;} +span.tagcloud3 a {text-decoration: none; color: #000;} +span.tagcloud10 a {text-decoration: none; color: #000;} +span.tagcloud20 a {text-decoration: none; color: #000;} +span.tagcloud11 a {text-decoration: none; color: #000;} +span.tagcloud21 a {text-decoration: none; color: #000;} +span.tagcloud12 a {text-decoration: none; color: #000;} +span.tagcloud22 a {text-decoration: none; color: #000;} +span.tagcloud13 a {text-decoration: none; color: #000;} +span.tagcloud23 a {text-decoration: none; color: #000;} +span.tagcloud14 a {text-decoration: none; color: #000;} +span.tagcloud24 a {text-decoration: none; color: #000;} +span.tagcloud4 a {text-decoration: none; color: #000;} +span.tagcloud15 a {text-decoration: none; color: #000;} +span.tagcloud5 a {text-decoration: none; color: #000;} +span.tagcloud16 a {text-decoration: none; color: #000;} +span.tagcloud6 a {text-decoration: none; color: #000;} +span.tagcloud17 a {text-decoration: none; color: #000;} +span.tagcloud7 a {text-decoration: none; color: #000;} +span.tagcloud18 a {text-decoration: none; color: #000;} +span.tagcloud8 a {text-decoration: none; color: #000;} +span.tagcloud19 a {text-decoration: none; color: #000;} +span.tagcloud9 a {text-decoration: none; color: #000;} diff --git a/templates/static/memories.png b/templates/static/memories.png new file mode 100644 index 0000000000000000000000000000000000000000..97847d13394489c69b08eff1073f9c604d4c9136 GIT binary patch literal 38516 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 literal 0 HcmV?d00001 diff --git a/templates/static/upload.js b/templates/static/upload.js new file mode 100644 index 0000000..0b033c6 --- /dev/null +++ b/templates/static/upload.js @@ -0,0 +1,82 @@ +String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g,'') } +String.prototype.escRegExp = function(){ return this.replace(/[\\$*+?()=!|,{}\[\]\.^]/g,'\\$&') } +String.prototype.unescHtml = function(){ var i,t=this; for(i in e) t=t.replace(new RegExp(i,'g'),e[i]); return t } +function Suggestions() { this.length=0; this.picked=0 } +var suggestions = new Suggestions(); +var tagSearch='', lastEdit=''; +var h={}, sections=[{},{},{},{},{},{}], selected={}, currentTag={}, +e={'<':'<','>':'>','&':'&','"':'"'}; + +function init () { + document.onkeydown = document.onkeypress = document.onkeyup = handler + h.suggest = document.getElementById("suggestionlist"); + h.tags = document.getElementById("tags"); +} + +function handler(event) { var e=(event||window.event) //w3||ie + if (e.type == 'keyup') { + switch(e.keyCode) { + //case 8: //backspace + //case 46: //delete + case 35: //end + case 36: //home + case 39: // right + case 37: // left + case 32: // space + hideSuggestions(); break + case 38: case 40: break; + case 9: break; + case 13: break; + default: + updateSuggestions() +}} + else if (e.type == "keypress") { lastEdit = h.tags.value } +} + +function makeTag(parent, tag, js) { + parent.appendChild(document.createTextNode(" "+ tag)) +} + +function updateSuggestions() { + while (h.suggest.hasChildNodes()) h.suggest.removeChild(h.suggest.firstChild) + if(!getCurrentTag() || !currentTag.text) { + hideSuggestions(); return false + } + var tagArray = h.tags.value.toLowerCase().split(' '), + txt=currentTag.text.trim().escRegExp(), tagHash={}, t + for(t in tagArray) tagHash[tagArray[t]] = true; + + var search = tagList.match(new RegExp(("(?:^| )("+txt+"[^ ]+)"), "gi")) + if(search){ + var i; + for (i=0; i<search.length; i++) { + var tl = search[i].trim() + if(tagHash[tl]) continue // do not suggest already typed tag + suggestions[suggestions.length] = makeTag(h.suggest, tl, 'complete') + suggestions.length++ + }} + if (suggestions.length > 0) { showSuggestions() } + else { hideSuggestions(); } +} + +function getCurrentTag() { + if(h.tags.value == lastEdit) return true // no edit + if(h.tags == '') return false + currentTag = {} + var tagArray=h.tags.value.toLowerCase().split(' '), oldArray=lastEdit.toLowerCase().split(' '), currentTags = [], matched=false, t,o + for (t in tagArray) { + for (o in oldArray) { + if(typeof oldArray[o] == 'undefined') { oldArray.splice(o,1); break } + if(tagArray[t] == oldArray[o]) { matched = true; oldArray.splice(o,1); break; } + } + if(!matched) currentTags[currentTags.length] = t + matched=false + } + // more than one word changed... abort + currentTag = { text:tagArray[currentTags[0]], index:currentTags[0] } + return true +} + + +function hideSuggestions() { h.suggest.style.visibility='hidden' } +function showSuggestions() { h.suggest.style.visibility='visible' } diff --git a/templates/systemtag/list b/templates/systemtag/list new file mode 100644 index 0000000..9a7361a --- /dev/null +++ b/templates/systemtag/list @@ -0,0 +1,36 @@ +[% INCLUDE header %] +[% PROCESS macros %] + +<table class="taglist"> +[% WHILE objects.size > 0 %] +<tr> + [% SET minilist = objects.splice(0,7) %] + [% FOR tag = minilist %] + <td> + <table><tr> <td width="100%" class="taglistheader"> + <a href="[%base%]/tag/view/[%tag.name |html|uri%]">[% tag %]</a> + </td></tr> + [% SET photos = tag.photos %] + [% IF photos.last %] + <tr><td> + <a href="[%base%]/tag/view/[%tag.name |html|uri%]"> + <img src="[% photos.last.thumb_url |uri%]"> + </a> + </td></tr> + <tr><td class="info"> + [%photos.size %] + photo[%-"s" IF photos.size != 1 %]</span> + </td></tr> + [% ELSE %] + <td><tr> + <p><i>(No photos)</i></p> + </td></tr> + [% END %] + </table> + </td> + [% END %] +</tr> +[% END %] +</table> +[% INCLUDE pager %] +[% INCLUDE footer %] diff --git a/templates/systemtag/view b/templates/systemtag/view new file mode 100644 index 0000000..42e885d --- /dev/null +++ b/templates/systemtag/view @@ -0,0 +1,14 @@ +[% INCLUDE header %] +[% PROCESS macros %] +<h1> +[% IF tag.name %] +[% tag.name %] +[% ELSE %] +[% FOR tag = tags %] +<a href="[%base%]/tag/view/[%tag.name%]">[%tag%]</a> +[% ":" UNLESS tag == tags.last %] +[% END %] +[% END %] +</h1> +[% view_page_of(photos) %] +[% INCLUDE footer %] diff --git a/templates/tag/list b/templates/tag/list new file mode 100644 index 0000000..9a7361a --- /dev/null +++ b/templates/tag/list @@ -0,0 +1,36 @@ +[% INCLUDE header %] +[% PROCESS macros %] + +<table class="taglist"> +[% WHILE objects.size > 0 %] +<tr> + [% SET minilist = objects.splice(0,7) %] + [% FOR tag = minilist %] + <td> + <table><tr> <td width="100%" class="taglistheader"> + <a href="[%base%]/tag/view/[%tag.name |html|uri%]">[% tag %]</a> + </td></tr> + [% SET photos = tag.photos %] + [% IF photos.last %] + <tr><td> + <a href="[%base%]/tag/view/[%tag.name |html|uri%]"> + <img src="[% photos.last.thumb_url |uri%]"> + </a> + </td></tr> + <tr><td class="info"> + [%photos.size %] + photo[%-"s" IF photos.size != 1 %]</span> + </td></tr> + [% ELSE %] + <td><tr> + <p><i>(No photos)</i></p> + </td></tr> + [% END %] + </table> + </td> + [% END %] +</tr> +[% END %] +</table> +[% INCLUDE pager %] +[% INCLUDE footer %] diff --git a/templates/tag/list_js b/templates/tag/list_js new file mode 100644 index 0000000..af9b159 --- /dev/null +++ b/templates/tag/list_js @@ -0,0 +1 @@ +var tagList = "[% FOR tag = tags; tag | html; " "; END %]"; diff --git a/templates/tag/view b/templates/tag/view new file mode 100644 index 0000000..8ce4707 --- /dev/null +++ b/templates/tag/view @@ -0,0 +1,28 @@ +[% INCLUDE header %] +[% PROCESS macros %] +<h1> +[% IF tag.name %] +[% tag.name %] +[% ELSE %] +[% FOR tag = tags %] +<a href="[%base%]/tag/view/[%tag.name%]">[%tag%]</a> +[% ":" UNLESS tag == tags.last %] +[% END %] +[% END %] +</h1> +<div class="related"> +[% SET stuff = request.tag_select(tags,photos) %] +[% IF stuff.super %] +Enclosing tags: +[% FOR tag = stuff.super %] +<a href="[%base%]/tag/view/[%tag%]">[%tag%]</a> +[% END %] +<br> +[% END %] +[% IF stuff.cloud %] +Inside this tag: +[% stuff.cloud.html() %] +[% END %] +</div> +[% view_page_of(photos) %] +[% INCLUDE footer %] diff --git a/templates/tagcloud b/templates/tagcloud new file mode 100644 index 0000000..bd46663 --- /dev/null +++ b/templates/tagcloud @@ -0,0 +1,4 @@ +<p align="center" style="border: 1px solid black; background: #eee"> Popular tags </p> +<div class="htmltagcloud"> +[% request.tagcloud.html(75) %] +</div> diff --git a/templates/test b/templates/test new file mode 100644 index 0000000..b5f5031 --- /dev/null +++ b/templates/test @@ -0,0 +1,2 @@ +[% INCLUDE header %] +[% INCLUDE footer %] diff --git a/templates/user/album_list b/templates/user/album_list new file mode 100644 index 0000000..59bcad0 --- /dev/null +++ b/templates/user/album_list @@ -0,0 +1,41 @@ +<div class="albums"> +[% IF request.user == user %] + <h2> Albums </h2> + <form method="post" action="[%base%]/user/edit_albums/[%user.id%]"> + [% IF user.albums.size > 0 %] + <table style="width:100%"> + <tr> + <th style="width: 70%"> Name </th> <th> Private? </th> <th> Delete? </th> + </tr> + [% FOR album = user.albums %] + <tr> + <td> <a href="[%base%]/album/view/[%album.id%]/">[% album.name %]</a> </td> + <td> <input type="checkbox" name="privacy_[% album.id%]" + value="1" [% IF album.privacy == 1 %] checked="1" [%END%] /> + </td> + <td> <input type="submit" value="Delete" name="delete_[%album.id%]"/> + </td> + </tr> + [% END %] + </table> + <input type="submit" value="Submit changes" name="changes"> + <hr> + [% END %] + <h3> Create a new album </h3> + Name: <input name="new_name"/> <br> + Private? <input type="checkbox" name="new_privacy"/> <br> + <input type="submit" value="Create" name="create"> + </form> +[% ELSE %] + +[% IF albums.size > 0 %] + <h2> Public albums </h2> + <ul> + [% FOR album = albums %] + <li> <a href="[%base%]/album/view/[%album.id%]">[% album %]</a> + [% END %] + </ul> +[% END %] + +[% END %] +</div> diff --git a/templates/user/list b/templates/user/list new file mode 100644 index 0000000..66ba34e --- /dev/null +++ b/templates/user/list @@ -0,0 +1,25 @@ +[% INCLUDE header %] +[% PROCESS macros %] + +<table class="userlist"> +[% WHILE objects.size > 0 %] +<tr> + [% SET minilist = objects.splice(0,3) %] + [% FOR user = minilist %] + <td> + [% SET photos = user.photos %] + <a href="[%base%]/user/view/[%user.id%]">[% user %]<br/> + [% IF photos.last %] + <img src="[% photos.last.thumb_url |uri%]"></a><br/> + <span class="info"> + [%photos.size %] + photo[%-"s" IF photos.size != 1 %]</span> + [% ELSE %] + <p><i>(No photos)</i></p> + [% END %] + </td> + [% END %] +</tr> +[% END %] +</table> +[% INCLUDE footer %] diff --git a/templates/user/view b/templates/user/view new file mode 100644 index 0000000..b3cadec --- /dev/null +++ b/templates/user/view @@ -0,0 +1,7 @@ +[% INCLUDE header %] +[% PROCESS macros %] +<h1> [% user.name %] </h1> +[% INCLUDE album_list %] + +[% view_page_of(photos) %] +[% INCLUDE footer %] -- 2.39.5