Apache-Gallery-1.0.2/0000755000175000017500000000000011573741742012427 5ustar milmilApache-Gallery-1.0.2/TODO0000644000175000017500000000127711573732721013123 0ustar milmil$Author: mil $ $Rev: 255 $ $Date: 2004-04-12 19:49:02 +0200 (Mon, 12 Apr 2004) $ - Write a gallery-cleancache.pl script for removing entries in the cache where the original picture has been removed. - /admin page to edit comments and .rotate file. (Cleanup in .cache when changing rotation) - Write perlscript to make static html galleries. - Sort by the DateTimeOriginal part of the EXIF header if possible - Make the template and imagesystem pluggable - Make scaling quality configurable - Thumbnails are to be generated in tmp files first, then moved to the correct location. - Use imlib_create_cropped_scaled_image in resizepicture - Try to avoid running too many resize processes Apache-Gallery-1.0.2/templates/0000755000175000017500000000000011573741742014425 5ustar milmilApache-Gallery-1.0.2/templates/default/0000755000175000017500000000000011573741742016051 5ustar milmilApache-Gallery-1.0.2/templates/default/refresh.tpl0000644000175000017500000000015511573732720020225 0ustar milmil Apache-Gallery-1.0.2/templates/default/directory.tpl0000644000175000017500000000016711573732720020576 0ustar milmil

{ $FILE }
Apache-Gallery-1.0.2/templates/default/rss_item.tpl0000644000175000017500000000023511573732720020413 0ustar milmil { $TITLE } { $LINK } Apache-Gallery-1.0.2/templates/default/file.tpl0000644000175000017500000000021611573732720017504 0ustar milmil
{ $ALT }
{ $FILE }
Apache-Gallery-1.0.2/templates/default/gallery.css0000644000175000017500000000163311573732720020221 0ustar milmilbody { background-color: #cccccc; font-family: Verdana, Lucida, Arial; font-size: 10px; margin-left: 10px; margin-top: 10px; text-align: center; } td { font-size: 10px; } table { margin-left: auto; margin-right: auto; } #menu { font-size: 11px; text-align: left; height: 30px; } #nav { font-size: 11px; text-align: left; height: 30px; text-align: right; } #directory { background-color: #ffffff; border: 1px solid #666666; padding: 20px; text-align: left; top: 0px; } #folder { float: left; height: 100px; padding: 2px; text-align: center; width: 120px; } #picture img { border: 1px solid #000000; } a { color: #5555aa; } a img { border: 2px solid #5555aa; } a:hover { color: #ff9400; } a:hover img { border: 2px solid #ff9400; } #folder img { border: 0px; } .info { background-color: #eeeeee; border: 1px dashed #888888; color: #666666; font-size: 10px; margin: 10px; padding: 5px; } Apache-Gallery-1.0.2/templates/default/scale.tpl0000644000175000017500000000006711573732720017660 0ustar milmil{ $SIZE } Apache-Gallery-1.0.2/templates/default/intervalactive.tpl0000644000175000017500000000001511573732720021602 0ustar milmil{ $SECONDS } Apache-Gallery-1.0.2/templates/default/index.tpl0000644000175000017500000000066211573732720017701 0ustar milmil
{ $DIRCOMMENT }
{ $FILES }
Indexed by Apache::Gallery - Copyright © 2001-2005 Michael Legart - Hest Design!
Apache-Gallery-1.0.2/templates/default/dircomment.tpl0000644000175000017500000000015311573732720020726 0ustar milmil
{ $COMMENT }
Apache-Gallery-1.0.2/templates/default/nodircomment.tpl0000644000175000017500000000000011573732720021252 0ustar milmilApache-Gallery-1.0.2/templates/default/scaleactive.tpl0000644000175000017500000000001211573732720021042 0ustar milmil{ $SIZE } Apache-Gallery-1.0.2/templates/default/slideshowisoff.tpl0000644000175000017500000000000411573732720021610 0ustar milmilOff Apache-Gallery-1.0.2/templates/default/showpicture.tpl0000644000175000017500000000145411573732720021146 0ustar milmil
{ $PICTUREINFO }
{ $BACK }{ $NEXT }
Apache-Gallery-1.0.2/templates/default/info.tpl0000644000175000017500000000003111573732720017513 0ustar milmil{ $KEY }: { $VALUE }
Apache-Gallery-1.0.2/templates/default/navpicture.tpl0000644000175000017500000000025511573732720020750 0ustar milmil
{ $DIRECTION } - { $FILENAME }
Apache-Gallery-1.0.2/templates/default/orig.tpl0000644000175000017500000000005211573732720017523 0ustar milmilOriginal Apache-Gallery-1.0.2/templates/default/picture.tpl0000644000175000017500000000017011573732720020237 0ustar milmil { $FILE } - { $DATE } Apache-Gallery-1.0.2/templates/default/error.tpl0000644000175000017500000000030611573732720017716 0ustar milmil

{ $ERRORTITLE }

{ $ERROR }

Back

Apache-Gallery-1.0.2/templates/default/slideshowoff.tpl0000644000175000017500000000004011573732720021254 0ustar milmilOff Apache-Gallery-1.0.2/templates/default/pictureinfo.tpl0000644000175000017500000000037611573732720021123 0ustar milmil
{ $COMMENT } { $INFO }
Apache-Gallery-1.0.2/templates/default/layout.tpl0000644000175000017500000000035111573732720020102 0ustar milmil { $TITLE } { $META } { $MAIN } Apache-Gallery-1.0.2/templates/default/interval.tpl0000644000175000017500000000012111573732720020404 0ustar milmil{ $SECONDS } Apache-Gallery-1.0.2/templates/default/rss.tpl0000644000175000017500000000031211573732720017371 0ustar milmil { $ITEMS } Apache-Gallery-1.0.2/templates/default/nopictureinfo.tpl0000644000175000017500000000033011573732720021446 0ustar milmil
 
Apache-Gallery-1.0.2/templates/new/0000755000175000017500000000000011573741742015216 5ustar milmilApache-Gallery-1.0.2/templates/new/refresh.tpl0000644000175000017500000000015511573732721017373 0ustar milmil Apache-Gallery-1.0.2/templates/new/directory.tpl0000644000175000017500000000017611573732721017744 0ustar milmil
* { $FILE }
{ $FILE }
Apache-Gallery-1.0.2/templates/new/rss_item.tpl0000644000175000017500000000023511573732721017561 0ustar milmil { $TITLE } { $LINK } Apache-Gallery-1.0.2/templates/new/file.tpl0000644000175000017500000000022211573732721016647 0ustar milmil
{ $ALT }
{ $FILE }
Apache-Gallery-1.0.2/templates/new/gallery.css0000644000175000017500000000212411573732721017363 0ustar milmilbody { background-color: #cccccc; color: #666666; font-family: Verdana, Lucida, Arial, serif; font-size: 10px; margin-left: 10px; margin-top: 10px; text-align: center; } td { font-size: 10px; } table { margin-left: auto; margin-right: auto; } #title { font-size: 11px; text-align: left; } #menu { font-size: 13px; text-align: right; height: 30px; margin-right: 20px; } #directory { background-color: #ffffff; border: 6px solid #aaaaaa; padding: 20px; text-align: left; top: 0px; } .folder { float: left; height: 100px; padding: 2px; text-align: center; width: 120px; } #picture { text-align: center; } #picture img { border: 6px solid #777777; } a { color: #5555aa; text-decoration: none; } a img { border: 3px solid #5555aa; } a:hover { color: #ff9400; } a:hover img { border: 3px solid #ff9400; } .folder img { border: 0px; } .folder a:hover img { border: 0px; } #gallery { margin-top: 50px; } #comment { background-color: #333333; border: 3px solid #555555; color: #999999; width: 400px; margin-left: auto; margin-right: auto; margin-top: 20px; padding: 5px; } Apache-Gallery-1.0.2/templates/new/scale.tpl0000644000175000017500000000006711573732721017026 0ustar milmil{ $SIZE } Apache-Gallery-1.0.2/templates/new/intervalactive.tpl0000644000175000017500000000001511573732721020750 0ustar milmil{ $SECONDS } Apache-Gallery-1.0.2/templates/new/index.tpl0000644000175000017500000000072111573732721017043 0ustar milmil
{ $MENU }
{ $FORM_BEGIN } { $DIRCOMMENT }
{ $FILES }
Indexed by Apache::Gallery - Copyright © 2001-2005 Michael Legart - Hest Design!
{ $FORM_END }
Apache-Gallery-1.0.2/templates/new/dircomment.tpl0000644000175000017500000000015311573732721020074 0ustar milmil
{ $COMMENT }
Apache-Gallery-1.0.2/templates/new/nodircomment.tpl0000644000175000017500000000000011573732721020420 0ustar milmilApache-Gallery-1.0.2/templates/new/scaleactive.tpl0000644000175000017500000000001211573732721020210 0ustar milmil{ $SIZE } Apache-Gallery-1.0.2/templates/new/slideshowisoff.tpl0000644000175000017500000000000411573732721020756 0ustar milmilOff Apache-Gallery-1.0.2/templates/new/showpicture.tpl0000644000175000017500000000135511573732721020314 0ustar milmil
{ $MENU }
{ $PICTUREINFO }
IMG { $NUMBER } of { $TOTAL } { $EXIFVALUES }

* Image { $NUMBER }

[ Size: { $SIZES } | Slideshow: { $SLIDESHOW } ]
Apache-Gallery-1.0.2/templates/new/info.tpl0000644000175000017500000000003111573732721016661 0ustar milmil{ $KEY }: { $VALUE }
Apache-Gallery-1.0.2/templates/new/navpicture.tpl0000644000175000017500000000016311573732721020114 0ustar milmil{ $DIRECTION } Apache-Gallery-1.0.2/templates/new/orig.tpl0000644000175000017500000000005211573732721016671 0ustar milmilOriginal Apache-Gallery-1.0.2/templates/new/picture.tpl0000644000175000017500000000020311573732721017402 0ustar milmil { $FILE } - { $DATE }{ $SELECT } Apache-Gallery-1.0.2/templates/new/error.tpl0000644000175000017500000000132311573732721017064 0ustar milmil

{ $ERRORTITLE }

{ $ERROR }

Back

Apache-Gallery-1.0.2/templates/new/slideshowoff.tpl0000644000175000017500000000004011573732721020422 0ustar milmilOff Apache-Gallery-1.0.2/templates/new/pictureinfo.tpl0000644000175000017500000000034311573732721020263 0ustar milmil
{ $INFO } { $COMMENT }
Apache-Gallery-1.0.2/templates/new/layout.tpl0000644000175000017500000000035111573732721017250 0ustar milmil { $TITLE } { $META } { $MAIN } Apache-Gallery-1.0.2/templates/new/interval.tpl0000644000175000017500000000012111573732721017552 0ustar milmil{ $SECONDS } Apache-Gallery-1.0.2/templates/new/rss.tpl0000644000175000017500000000031211573732721016537 0ustar milmil { $ITEMS } Apache-Gallery-1.0.2/templates/new/nopictureinfo.tpl0000644000175000017500000000033011573732721020614 0ustar milmil
 
Apache-Gallery-1.0.2/templates/bright/0000755000175000017500000000000011573741742015704 5ustar milmilApache-Gallery-1.0.2/templates/bright/refresh.tpl0000644000175000017500000000015511573732717020066 0ustar milmil Apache-Gallery-1.0.2/templates/bright/directory.tpl0000644000175000017500000000020211573732717020425 0ustar milmil
* { $FILE }
{ $FILE }
Apache-Gallery-1.0.2/templates/bright/rss_item.tpl0000644000175000017500000000023511573732717020254 0ustar milmil { $TITLE } { $LINK } Apache-Gallery-1.0.2/templates/bright/file.tpl0000644000175000017500000000022211573732717017342 0ustar milmil
{ $ALT }
{ $FILE }
Apache-Gallery-1.0.2/templates/bright/navdirectory.tpl0000644000175000017500000000021011573732717021131 0ustar milmil
{ $LINK_NAME } { $DIR_FILES }
Apache-Gallery-1.0.2/templates/bright/gallery.css0000644000175000017500000000411511573732717020060 0ustar milmilbody { background-color: #eee; font-family: tahoma, verdana, sans-serif; color: #555; text-align: center; font-size: 11px; margin: 10px; } td { font-size: 11px; } a { color: #506677; text-decoration: none; } a:hover { text-decoration: underline; } table { margin: auto; } .gallery-info { text-align: left; margin-bottom: 30px; } /* .img-white { margin: 0px auto; float: left; background: url(/eeeBorder.gif) no-repeat top left; } .img-shadow { float: left; background: url(/eeeshadow.gif) no-repeat bottom right; } */ .img-border { background-color: #fff; border: 1px solid #555; padding: 8px; font-size: 11px; margin: 6px; text-align: right; } .img-shadow img { border: 2px solid #ddd; border-left: 2px solid #999; border-top: 2px solid #999; } .img-border div { margin-top: 4px; } .clr { clear: both; } div.gallery-nav { float: right; text-align: right; } div.gallery-info { float: left; text-align: left; } div.gallery-info a { } div.gallery-info:hover { color: #000; } div.gallery-info:hover a { color: #5b8db2; } .img-info { margin-bottom: 5px; } .img-info:hover { color: #000; } .comment { margin-bottom: 5px; font-size: 18px; } .comment:hover { color: #000; font-size: 18px; } .img-options { margin-top: 10px; margin-bottom: 100px; } .img-options:hover { color: #000; } .img-options:hover a { color: #5b8db2; } .aginfo:hover { color: #000; } .aginfo:hover a { color: #0066b2; } #directory { background-color: #fff; border: 4px solid #ddd; padding: 20px; text-align: left; top: 0px; width: 620px; } .directory-preview { background-color: #fff; border: 4px solid #ddd; padding: 20px; text-align: left; top: 0px; width: 200px; height: 50px; } .thumb { float: left; text-align: center; width: 150px; height: 150px; margin: 2px; } .thumb img { border-color: #506677; vertical-align: middle; } .folder { float: left; height: 100px; padding: 2px; text-align: center; width: 120px; } .folder img { border: 0px; } .folder a:hover img { border: 0px; } .folder a:hover { text-decoration: none; } Apache-Gallery-1.0.2/templates/bright/scale.tpl0000644000175000017500000000006711573732717017521 0ustar milmil{ $SIZE } Apache-Gallery-1.0.2/templates/bright/intervalactive.tpl0000644000175000017500000000001511573732717021443 0ustar milmil{ $SECONDS } Apache-Gallery-1.0.2/templates/bright/index.tpl0000644000175000017500000000103711573732717017537 0ustar milmil
{ $FORM_BEGIN }
{ $PREV_DIR_FILES } { $NEXT_DIR_FILES }
{ $FILES }
{ $DIRCOMMENT }
Indexed by Apache::Gallery - Copyright © 2001-2008 Michael Legart - Hest Design!
{ $FORM_END } Apache-Gallery-1.0.2/templates/bright/dircomment.tpl0000644000175000017500000000015311573732717020567 0ustar milmil
{ $COMMENT }
Apache-Gallery-1.0.2/templates/bright/nodircomment.tpl0000644000175000017500000000000011573732717021113 0ustar milmilApache-Gallery-1.0.2/templates/bright/scaleactive.tpl0000644000175000017500000000001211573732717020703 0ustar milmil{ $SIZE } Apache-Gallery-1.0.2/templates/bright/slideshowisoff.tpl0000644000175000017500000000000411573732717021451 0ustar milmilOff Apache-Gallery-1.0.2/templates/bright/showpicture.tpl0000644000175000017500000000164711573732717021013 0ustar milmil
IMG { $NUMBER } of { $TOTAL } | { $EXIF_DATETIMEORIGINAL } | { $EXIF_EXPOSURETIME }s | { $EXIF_ISOSPEEDRATINGS }iso | { $EXIF_FOCALLENGTH } | { $EXIF_APERTUREVALUE }
* Image { $NUMBER } { $PICTUREINFO }
[ Size: { $SIZES } | Slideshow: { $SLIDESHOW } ]
Apache::Gallery © 2001-2008 Michael Legart, Hest Design!
Apache-Gallery-1.0.2/templates/bright/info.tpl0000644000175000017500000000003311573732717017356 0ustar milmil{ $KEY }: { $VALUE }
Apache-Gallery-1.0.2/templates/bright/navpicture.tpl0000644000175000017500000000016311573732717020607 0ustar milmil{ $DIRECTION } Apache-Gallery-1.0.2/templates/bright/orig.tpl0000644000175000017500000000005211573732717017364 0ustar milmilOriginal Apache-Gallery-1.0.2/templates/bright/picture.tpl0000644000175000017500000000023611573732717020103 0ustar milmil
{ $FILE } - { $DATE }{ $SELECT }
Apache-Gallery-1.0.2/templates/bright/error.tpl0000644000175000017500000000131311573732717017556 0ustar milmil

{ $ERRORTITLE }

{ $ERROR }

Back

Apache-Gallery-1.0.2/templates/bright/slideshowoff.tpl0000644000175000017500000000004011573732717021115 0ustar milmilOff Apache-Gallery-1.0.2/templates/bright/README0000644000175000017500000000117211573732717016567 0ustar milmilFor this template to work the first two of the following options are a necessity, option three and four only completes the design. Option two should of course be hacked to fit the EXIF from your camera. Remember to copy the new gallery.css to your DocumentRoot as well. PerlSetVar GalleryEXIFMode 'variables' PerlSetVar GalleryInfo 'Model => Model, Timestamp => DateTimeOriginal, Exposure Time => ExposureTime, ISO Speed Rating => ISOSpeedRatings, Focal Length => FocalLength, ApertureValue => ApertureValue, Flash => Flash' PerlSetVar GalleryThumbnailSize '140x105' PerlSetVar GalleryThumbnailSizeLS 1 Apache-Gallery-1.0.2/templates/bright/pictureinfo.tpl0000644000175000017500000000005511573732717020756 0ustar milmil
{ $INFO } { $COMMENT }
Apache-Gallery-1.0.2/templates/bright/layout.tpl0000644000175000017500000000105011573732717017740 0ustar milmil { $TITLE } { $META } { $MAIN } Apache-Gallery-1.0.2/templates/bright/interval.tpl0000644000175000017500000000012511573732717020251 0ustar milmil{ $SECONDS } Apache-Gallery-1.0.2/templates/bright/rss.tpl0000644000175000017500000000031211573732717017232 0ustar milmil { $ITEMS } Apache-Gallery-1.0.2/templates/bright/nopictureinfo.tpl0000644000175000017500000000000011573732717021301 0ustar milmilApache-Gallery-1.0.2/MANIFEST0000644000175000017500000000532311573732721013560 0ustar milmilChanges htdocs/agfolder.png htdocs/application-doc.png htdocs/application-pdf.png htdocs/application-rtf.png htdocs/c.png htdocs/sound-mp3.png htdocs/sound-ogg.png htdocs/sound-wav.png htdocs/video-asf.png htdocs/video-avi.png htdocs/video-mov.png htdocs/video-mpeg.png htdocs/video-mpg.png htdocs/video-wmv.png INSTALL lib/Apache/Gallery.pm LICENSE Makefile.PL MANIFEST META.yml README t/001_use.t t/002_graphlibs.t t/002_injpg.jpg t/002_inpng.png t/003_comment.t t/003_commenttest t/004_cache_dir.t t/005_imageinfo.t t/005_jpg.jpg t/006_thumbnails.t t/007_pod.t templates/bright/dircomment.tpl templates/bright/directory.tpl templates/bright/error.tpl templates/bright/file.tpl templates/bright/gallery.css templates/bright/index.tpl templates/bright/info.tpl templates/bright/intervalactive.tpl templates/bright/interval.tpl templates/bright/layout.tpl templates/bright/navdirectory.tpl templates/bright/navpicture.tpl templates/bright/nodircomment.tpl templates/bright/nopictureinfo.tpl templates/bright/orig.tpl templates/bright/pictureinfo.tpl templates/bright/picture.tpl templates/bright/README templates/bright/refresh.tpl templates/bright/rss_item.tpl templates/bright/rss.tpl templates/bright/scaleactive.tpl templates/bright/scale.tpl templates/bright/showpicture.tpl templates/bright/slideshowisoff.tpl templates/bright/slideshowoff.tpl templates/default/dircomment.tpl templates/default/directory.tpl templates/default/error.tpl templates/default/file.tpl templates/default/gallery.css templates/default/index.tpl templates/default/info.tpl templates/default/intervalactive.tpl templates/default/interval.tpl templates/default/layout.tpl templates/default/navpicture.tpl templates/default/nodircomment.tpl templates/default/nopictureinfo.tpl templates/default/orig.tpl templates/default/pictureinfo.tpl templates/default/picture.tpl templates/default/refresh.tpl templates/default/rss_item.tpl templates/default/rss.tpl templates/default/scaleactive.tpl templates/default/scale.tpl templates/default/showpicture.tpl templates/default/slideshowisoff.tpl templates/default/slideshowoff.tpl templates/new/dircomment.tpl templates/new/directory.tpl templates/new/error.tpl templates/new/file.tpl templates/new/gallery.css templates/new/index.tpl templates/new/info.tpl templates/new/intervalactive.tpl templates/new/interval.tpl templates/new/layout.tpl templates/new/navpicture.tpl templates/new/nodircomment.tpl templates/new/nopictureinfo.tpl templates/new/orig.tpl templates/new/pictureinfo.tpl templates/new/picture.tpl templates/new/refresh.tpl templates/new/rss_item.tpl templates/new/rss.tpl templates/new/scaleactive.tpl templates/new/scale.tpl templates/new/showpicture.tpl templates/new/slideshowisoff.tpl templates/new/slideshowoff.tpl TODO UPGRADE Apache-Gallery-1.0.2/t/0000755000175000017500000000000011573741742012672 5ustar milmilApache-Gallery-1.0.2/t/006_thumbnails.t0000644000175000017500000000102111573732715015604 0ustar milmiluse Apache::Gallery; use Test::More; eval { require Test::MockObject; }; if ($@) { plan skip_all => 'skip because Test::MockObject not found'; } else { plan tests => 4; my $r = Test::MockObject->new(); $r->set_always('dir_config', '100x75'); my ($width, $height) = Apache::Gallery::get_thumbnailsize($r, 640, 480); is ($width, 100, 'Width'); is ($height, 75, 'Height'); ($width, $height) = Apache::Gallery::get_thumbnailsize($r, 480, 640); is ($width, 56, 'Height rotated'); is ($height, 75, 'Width rotated'); } Apache-Gallery-1.0.2/t/003_comment.t0000644000175000017500000000034011573732715015100 0ustar milmiluse Test::More tests => 2; use Apache::Gallery; my $comment = Apache::Gallery::get_comment("t/003_commenttest"); is ( $comment->{TITLE}, "My test title", 'Title'); is ( $comment->{COMMENT}, "My test comment", 'Comment'); Apache-Gallery-1.0.2/t/005_jpg.jpg0000644000175000017500000000061411573732715014541 0ustar milmilÿØÿàJFIFHHÿþCreated with The GIMPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ "ÿÄÿÄ"!1$QA‘²ÿÄÿÄÿÚ ?f¸Ån ö (½kIî­½w€äm8ºÇÏÂzÍfoWÅ™+ÅBb&ŸD‹L¬RÎíÍf#‹Œå"4?‘JfS"í¥¸ÿÙApache-Gallery-1.0.2/t/002_inpng.png0000644000175000017500000000076411573732715015103 0ustar milmil‰PNG  IHDR /%@ bKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ 7 ÔÆIDATxœÁYnÛ0@.7SvhŒ Gèw€Þÿ& šÄ°åJ¢÷ÎÐi|úóþ^[;XÛË^ir©µZ«ÇãcY…è*%ÛæsÉÀ97Z¦œ­‘]ß«cJŒ2B*s‘JbH[]sÊŒ•œrL‘´ œåœ»¾è9£„T )§ñv›eŒÒ nŒÔª7ºg”Ä÷×uEDÒj#ÍïžÂi9%Dôë–bH!çÊ(Ê™Òwô~ˆî`CP[»Í3%s¶,K*eÃX)wƒ{<Pkݼ!àŽbúçwFZkMk¥ÕÖç@t\ˆ=„Ï¿_ß?÷yî€C­uõÞ{—J­¾®Ÿ÷ ·=0茵Úhk”Nè=T¡èÛïËñèdÏa¤>Ø-+¢/¹`Œ[iÛš#¦}£î`…Ôz8ÙqrÓËé|¾¼¾Ú—·ñ×…tˆ~{Üï·ëÏ|ý¦JÉÖ!sNébÎ9ÆÁœÆáù즳§áyì”ùµ±çÍñ—/aIEND®B`‚Apache-Gallery-1.0.2/t/004_cache_dir.t0000644000175000017500000000406311573732715015346 0ustar milmiluse Apache::Gallery; my $tests; BEGIN { $tests=8; eval { require Test::MockObject }; if ($@) { print("1..$tests\n"); for (1..$tests) { print ("ok $_ # skip Test::MockObject not found\n"); } exit 0; } } use Test::More tests => $tests; use File::Spec; # Test these cases: # +--------------------------------------------------+ # | No. | GalleryCacheDir | Virtual | Strip Filename | # | 1 | undef | y | y | # | 2 | undef | y | n | # | 3 | undef | n | y | # | 4 | undef | n | n | # | 5 | 't/cachetest' | y | y | # | 6 | 't/cachetest' | y | n | # | 7 | 't/cachetest' | n | y | # | 8 | 't/cachetest' | n | n | # +-----+-----------------+---------+----------------+ sub request { my ($cachedir, $virtual) = @_; my $r=Test::MockObject->new(); $r->set_always('location', '/location'); $r->set_always('uri', '/uripath1/uripath2/urifile'); $r->set_always('dir_config', $cachedir); my $server=Test::MockObject->new(); $server->set_always('is_virtual', $virtual); $server->set_always('server_hostname', 'hostname' ); $r->set_always('server', $server); return $r; } my $r=request(undef, 1); is(Apache::Gallery::cache_dir($r, 1), '/var/tmp/Apache-Gallery/hostname/uripath1/uripath2'); is(Apache::Gallery::cache_dir($r, 0), '/var/tmp/Apache-Gallery/hostname/uripath1/uripath2/urifile'); $r=request(undef, 0); is(Apache::Gallery::cache_dir($r, 1), '/var/tmp/Apache-Gallery/location/uripath1/uripath2'); is(Apache::Gallery::cache_dir($r, 0), '/var/tmp/Apache-Gallery/location/uripath1/uripath2/urifile'); $r=request('t/cachetest', 1); is(Apache::Gallery::cache_dir($r, 1), 't/cachetest/uripath1/uripath2'); is(Apache::Gallery::cache_dir($r, 0), 't/cachetest/uripath1/uripath2/urifile'); $r=request('t/cachetest', 0); is(Apache::Gallery::cache_dir($r, 1), 't/cachetest/uripath1/uripath2'); is(Apache::Gallery::cache_dir($r, 0), 't/cachetest/uripath1/uripath2/urifile'); Apache-Gallery-1.0.2/t/002_graphlibs.t0000644000175000017500000000200711573732715015412 0ustar milmiluse Test::More; use Apache::Gallery; use Image::Size qw(imgsize); eval { require Apache::FakeRequest; }; if ($@) { plan skip_all => 'skip Apache::FakeRequest not found'; } else { plan tests => 4; my $request = Apache::FakeRequest->new('get_remote_host' => 'localhost'); Apache::Gallery::resizepicture($request, 't/002_inpng.png', 't/inpng-resized.png', 10, 10, 0, ''); Apache::Gallery::resizepicture($request, 't/002_injpg.jpg', 't/injpg-resized.jpg', 10, 10, 0, ''); my ($pngwidth, $pngheight)=imgsize('t/inpng-resized.png'); my ($jpgwidth, $jpgheight)=imgsize('t/injpg-resized.jpg'); is ($pngwidth, 10, 'PNG Width') or diag('You need to install libpng before libimlib'); is ($pngheight, 10, 'PNG Height') or diag('You need to install libpng before libimlib'); is ($jpgwidth, 10, 'JPG Width') or diag('You need to install libjpeg before libimlib'); is ($jpgheight, 10, 'JPG Height') or diag('You need to install libjpeg before libimlib'); unlink('t/inpng-resized.png'); unlink('t/injpg-resized.jpg'); } Apache-Gallery-1.0.2/t/002_injpg.jpg0000644000175000017500000000061411573732715015065 0ustar milmilÿØÿàJFIFHHÿþCreated with The GIMPÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ "ÿÄÿÄ"!1$QA‘²ÿÄÿÄÿÚ ?f¸Ån ö (½kIî­½w€äm8ºÇÏÂzÍfoWÅ™+ÅBb&ŸD‹L¬RÎíÍf#‹Œå"4?‘JfS"í¥¸ÿÙApache-Gallery-1.0.2/t/007_pod.t0000644000175000017500000000062611573732715014233 0ustar milmiluse Test::More; use File::Spec; use File::Find; use strict; eval "use Test::Pod 0.95"; if ($@) { plan skip_all => 'Test::Pod v0.95 required for testing POD'; } else { Test::Pod->import; my @files; my $blib = File::Spec->catfile(qw(blib lib)); find( sub {push @files, $File::Find::name if /\.p(l|m|od)$/}, $blib); plan tests => scalar @files; foreach my $file (@files) { pod_file_ok($file); } } Apache-Gallery-1.0.2/t/001_use.t0000644000175000017500000000010311573732715014225 0ustar milmiluse Test::More tests => 1; BEGIN { use_ok('Apache::Gallery'); } Apache-Gallery-1.0.2/t/003_commenttest0000644000175000017500000000004511573732715015540 0ustar milmilTITLE: My test title My test comment Apache-Gallery-1.0.2/t/005_imageinfo.t0000644000175000017500000000061611573732715015404 0ustar milmiluse Apache::Gallery; use Test::More; eval { require Apache::FakeRequest; }; if ($@) { plan skip_all => 'skip Apache::FakeRequest not found'; } else { plan tests => 1; my $request = Apache::FakeRequest->new('get_remote_host' => 'localhost'); my $info = Apache::Gallery::get_imageinfo($request, "t/005_jpg.jpg", "JPG", 15, 11); is ( $info->{Comment}, "Created with The GIMP", 'Comment'); } Apache-Gallery-1.0.2/INSTALL0000644000175000017500000001004011573732721013450 0ustar milmilApache/Gallery version 1.0 =========================== INSTALLATION Before you start installing Apache::Gallery you need to check that you have the following installed: - Perl 5 (http://www.cpan.org/src/README.html) - Apache (http://httpd.apache.org/) - 1.3.x or 2.x - mod_perl (http://perl.apache.org/) - 1.x or 2.x (2.0.0 or newer) - X11 libraries (ie, XFree86) - Imlib2 (http://prdownloads.sourceforge.net/enlightenment/imlib2-1.0.3.tar.gz) Perl Modules: (Use http://search.cpan.org/ to find them) - URI::Escape - Image::Info version 1.11. (NB NB NB: Version 1.12 is known to give problems) - Image::Size - Text::Template - CGI (3.08) - Image::Imlib2 (1.02) When installing Imlib2 from rpm, deb or other packages formats, remember that you need the imlib2-dev package too. On Debian this can be installed by running: apt-get install libimlib2-dev Then, to install Apache::Gallery run the following commands: perl Makefile.PL make export MOD_PERL_API_VERSION=2 # Only if you run mod_perl 2.0 make test (optional) make install If you use Apache 1.3 and mod_perl 1, you need to configure your virtualhostblock to look like: ServerName gallery.yourdomain.org DocumentRoot /data/pictures/ ErrorLog logs/gallery-error_log TransferLog logs/gallery-access_log PerlSetVar GalleryTemplateDir '/usr/local/apache/gallery/templates/default/' PerlSetVar GalleryInfo 'Picture Taken => DateTimeOriginal, Flash => Flash' PerlSetVar GallerySizes '640 1024 1600 2272' PerlSetVar GalleryThumbnailSize '100x75' PerlSetVar GalleryCopyrightImage 'htdocs/c.png' SetHandler perl-script PerlHandler Apache::Gallery In case you run apache 2 and modperl 2 (or 1.99), it needs to look like: ServerName gallery.yourdomain.org DocumentRoot /data/pictures/ ErrorLog logs/gallery-error_log TransferLog logs/gallery-access_log PerlSetVar GalleryTemplateDir '/usr/local/apache/gallery/templates/default/' PerlSetVar GalleryInfo 'Picture Taken => DateTimeOriginal, Flash => Flash' PerlSetVar GallerySizes '640 1024 1600 2272' PerlSetVar GalleryThumbnailSize '100x75' PerlSetVar GalleryCopyrightImage 'htdocs/c.png' PerlOptions +GlobalRequest SetHandler modperl PerlResponseHandler Apache::Gallery Warning: Apache::Gallery does not work properly if mod_autoindex is loaded by Apache. Indeed, mod_autoindex overrides Apache::Gallery and does not let it display directory content. To check if your apache loads mod_autoindex, just look for this line in httpd.conf: LoadModule autoindex_module /usr/lib/apache/1.3/mod_autoindex.so If this line is not commented, Apache::Gallery will only work when an image is loaded directly. Whenever a directory listing is requested, Apache will respond with the classic (and ugly) directory listing performed by mod_autoindex. Copy the files from templates/ to where you pointed GalleryTemplateDir to. Create a directory called gallery in your Apache icons directory and copy the png files in htdocs to this directory. The gallery.css file from the template directory you choose must be copied to the DocumentRoot of your gallery. It is possible to include a graphical copyright notice on each picture now. By setting the GalleryCopyrightImage PerlSetVar you can define the path to a picture that you want include in the bottom right of each picture. Feel free to contact me with questions if you have problems setting up Apache::Gallery. You can write to michael@legart.dk Make sure you try the latest version of the gallery from before reporting bugs. If you are brave you can also download the latest snapshot from http://svn.apachegallery.dk/snapshots/ If you have problems installing Apache::Gallery, please make sure to run "make test" to see, what may be the problem. When reporting bugs please use this page and include the output from make test in your bugreport: Apache-Gallery-1.0.2/htdocs/0000755000175000017500000000000011573741742013713 5ustar milmilApache-Gallery-1.0.2/htdocs/video-avi.png0000644000175000017500000001027411573732716016311 0ustar milmil‰PNG  IHDR04Ì“»‘bKGDÿÿÿ ½§“qIDATxÚÕšklTç™Çç2Wǰc¨ ¡&Œ¹†º IKAU›Dù%ÍF »lÛD‰"íVÚ¤¹©©”~JC‰öC QTÒ‹ I Á!°cÇNlã`ì±Æ·¹xf|ΜË~˜™ÃŒm ín¥ô•F3žóúçúÿ?ÏsÀ~Àü&¼jjj®-Z´è7Àv °q Ëìéé1§¯X,fš¦iF£QóFKÓ4SQsllÌ4MÓ5ÿ/+›>ŸÏ|úé§3J-Ü€x#áÀ4MsÆ…p8Œiš˜¦IQQь뺮£iš¦‹Å¬½·ÝvÛuËÌrî\K×u’É$‰D‚ŽŽ¶lÙP \¦cúÿÜP³d2Iaa!š¦Í¸¦iÉdUUQU•d2IYY™µ7£Ì_»4MãÊ•+³zõjŽ;ð5P8g“Wžë°@ 0«bªª211ÁÕ«Wñù|´´´ÐÝÝ͵kר¼y3555,]º”­[·âp8$é–•H&“x½^Ö¯_Ï‘#Gxøá‡¿VeVOÜ0„ü~?••• ZÖ4M“H$B{{;}}}|ñÅ,_¾œºº:,X€®ë$ Z[[9þ<º®ó /pÇw`³Ý83ç+ŠÂ©S§hllÄ0 DQ¤¯¯ææ3ìÝûoD"‘JÜPþþþÁ†††xã7(**b÷îݬ]»6'æE¡§§»ÝNAAMMM¼öÚküèG?bÇŽx<ž9scj*ÁÉ“Ÿ²mÛ6TUE’$$I¢¥¥…žžyä‘ìœH¦^¯—D"ÁÐЂ °gÏAàĉ<÷Üs¼ñÆlذžü|ïlÄÔÔÇŽ}Àoû[âñ8¦i¤ƒÊÊJÙ±ã~|ðA€ÕÀe :§jkkyÿý÷9pà>ú(~ø!|ðëÖ­£²²’úúz ÃàÝwß%âñxáСC,]º”ýû÷£ë:uuuìØ±ƒ½{÷ÒÔÔ„ËåF–嘦‰a˜Üwß}””” ‰Çcƒ#„B!"‘ȈW˜F¥É9QèØ±cüå/aß¾}>|˜ãÇÓØØHaa!ÑhÓ4ñûýƒÁt O‹Å(++³<¤ª*^¯—yóæ±yófÞ~ûmžzê)¼^oV>¤´p8ˆ¢È† …B\¾ü5’$‡9yÒËG}`Ï ¨|#Tg``€††TU¥©©‰{ï½§ÓI,Ãét"óçϧ¨¨ˆX,† „B!^~ùevïÞ¢(LMM‘——G2™dÙ²e¼ùæ›<ñÄx£££˜¦®O÷¼‘•Ù(•ú2•77Q ÇÙ¸q£ÅŠ$“Iìv»µ_Ó4ë= òÕW_áõz©¯¯G×u"‘†aL&‰Åbˆ¢ˆ  ¡i:6›h…K.æ–"s•%òt(3M¸xñ"UUUæP¼¦i躎Ãá°,¬( G¥­­ Ã0e™ÖÖV{ì1Ün7Š¢à÷û·¼+I"‚kñŒ•¯GÂìÊܲêêꬿϜ9Ã{ï½G4¥¬¬ŒçŸY–-á?ûì3 A4McppÖÖV6nÜÈØØííí‚ÀÈÈÃÃÃÔÔ,A×2Ìõ‚9 bo\;‰ÙÖÏhÛßßOii)œ>}Ú²n(B–e4M£¿¿ŸŽŽ\.’$!Š"¢( 9yò$‚  ( 'Nœ ¼¼œO²,ašü7²àÔL'6Öõ”§ô¹HmN™drr’ÖÖVª««ÉÏÏG’$A@EKQ]×­ý’$ éèè`×®]ÄãqÎ;G<§¬¬ŒÖÖVJJJ())MËÈ ™Œ°)Ê|6æ,ÏåéñŸIÚññqÂá0yyy¨ªÊÐÐ.— ·Û(ŠVµ(IzN†‡‡ñûýüâ¿ ººšææfŽ9ÂÖ­[ñûý\¼x‘Ÿþô¿ðzós 6=draÔ¼µÊ>lÑ¢*.^¼ˆ,˸\.úúú8rä×®]ËÔ"¨ªJuu5åå娪Êðð0µµµ¼úꫬ[·Žööv~õ«_‘ŸŸO$¡««‹êêj/þ.—+ý&`¤Ã(EdÓ¿Ï(úWy ¡á»¼øâ‹466"ÍÍÍÔÖÖ²oß>êêê‡Ã†AQQÛ¶m#‘Hàv»),,Än·sþüyþð‡?Ð××ÇÎ;éíí¥½½W^y›MF×u+gÂd.ö߬±“s=е‚/ .´úÒ'Ÿ|’gžy—ËÅÄÄDþçåå!Ë)¡Ñh”7ß|“žž¶nÝJ8æÂ… Üu×]äåyðxòQ”)dÙfåNº-™§·ÖW˹0–z‰¢Ä‚?þÅÅŬZµ MÓ‡Ã9 k±XŒd2Éää$}}}¼ûªÊîÝ»inn&——G$æ­·ÞÂår2>>aƒ`âõpß}|ÿûߣ¼¼Y–rê¤ì‚o K0›MÆét±pa¯¿þ:O=õUUUȲl1q2™$ …|òÉ'„B!n¿ýv***eéÒ¥¬Y³†ùóçc·Ûq:”——ãõz±Ùl  ñûý|úé)ø5{öìa×®¬^úºn¢€a˜èº¦é(Š‚Ãaçî»·066ÊáÇ‘$‰-[¶XIëóùˆÅb„Ãa¢Ñ(¢(²råJ‰—/_f``€D"A2™¤¢¢‚5kÖà÷û¹óÎ;ÉÏÏÇétRVVF2™dhhˆ•+WÒÛÛËÇLww7Ï>› YQæ !«#‹Å&ÑuUU‰Çã?~EQ˜œœÄårrîÜ9††RHãñx¨¨¨ÀëõbãããôõõÑÕÕEAA+W® ªªŠH$B,#‹300@mm-ùùùVI’)3\R\\ÌÈÈgÏže×®عó~$I¶<ÐÚêcûöí÷_Ws’8å ]O…ÒÚµk9sæs–,YJee%Ñè$í 2<<ÌÀÀñxœ`0ˆÃá ºú[Üÿ.\ˆ¦é,XbY»ÝN p•wÞy‡;wât:©¯¯Çf³Yh”Ž9s†õë×sðà;lÞ¼…‚‚ü9Ç299 dyKEZZÎn· ›Í†(J¬X±ÇC$¥¬¬YNå‹ H’ÄÂ…UH’˜ó£š¦#Ë2ˆ¢È•+Wذa²,[¥„$I¨ªÊ’%Kðù|Ì›7sçÎÒÐЀÛí¾•$&@"’$b³É¬]»–Ï??M[ÛŬzÜn7n·MKá¹ @}}=/¶c·ÛrpÀn—p8ìȲŒªªØl6b±˜åÌÙ‘HI’˜7o=z”ººU8vA¼9‘eJ›Í†,ÛhkkÃnw Š’…P`XÖµÙŒôˆÄ¤«« ›MÆf“g´Š¦i"Ë2^o¾»™’\UU Ã`llÌ*Ù I&“œ={ŽÁA?…HÒìœ OËgA°à²¡á;45}Æš5õVâewY™}>õõ«¹p¡ —+ãn!‡_âñO>:tˆd2i½2óÖL%Ë2………ø|>jk¿î̹s@DD1e±––VœN.—ËšFgê•Ìa‰D—ËÅW_uãv§Š½Ìà*#|,ãÚµ áp˜@ ÀÄĉDE™JÌF2©bš ‚ÕèÄb1ÆÆÆ¬Òã& ˜iH[@bãÆïðùç§±ÙlH’d%]j«‘nÜn7kÖ¬¡µõn· ÃÈísGGG8uêÝÝÝÜ~ûí,ZTEii)……x<òòò²ú ‰ÉÉ(ýýW8xð«îº)„B9Š47ŸÁ0RܰaôÆâñ‰D‚©)…ááaËBõõõYHí—F>àï±þüÇßÍ6•0¬ñÆÆë9wî|Ú3BšÚ ‹a3q+I2õõ«ñù|V§•:ëz2_:ö¯ÿï üéè´Èe¤x 5=I¸µSSSÖM EQÓ°(ÓÑÑ‘fM!½ßLCä̸½ó‘)\|7ýÓñ›ïà¹m õ?lA‰ qö—•¬ÿ÷~œ‹¸ðëµÔÿ°%çŒS/ ³U£ÙD&PW·š¶¶6|¾6+?¦—¸)X¹r%_|ÑqÓ:>¯l5…‹ï hñ=ä•Õ»ÖÆäÕVã½¸Š—’Wº ÓHâ,XD|¬‡É«­œzIàŸ^0s„ŸÖ‘™Y3Aioo·ˆM’DKà _\ï…Eºº:Ó!–݈3´r㈧B³ríkÁÎC/ÙFqÍ6FÒßÝbC“Kj+V¬ ³³“åË—ç2Î2èÒÓÓcÁñlËž_IIí?£):ß{€u{z(Yþ —?y5ê'ØyˆEßýOŠ—lÃÐÕ¥ni¬r½©Q”èêúÒbÚõ¦SSS‚Hoï¥t?}š°`ý~DɆìð²qÿ’=Q²±`ݾ§Œ}ÅäÕ6¼ î¢`a“W}$Æ»oMÜ;%©áÛß^†(JYµ™3‚Q%B"K–ÔdÍzf**Ùó)¯ûZÞºƒS/ ´¾½ €òÕO"Ùó-‹ ¢„(Ùojý¸Î² Ë}}—eqšR{eÊ‚RQ”´¦Í¹á–zw—¬`´ç÷\iúoâ£]Ä‚í œþ£=¿Ç]²"ó]‡-Ït¶ÎÉ$ðôÏ9Yö‹¢ÈâÅ‹¹råÊ´)‰ª&Ñ4d2UɲDEEÃÃYï>D‡Î:3ófâÉrþV"4ýlfå™<7«¤FÙ~ÿ`Ö ßL÷Â*š¦£ë†¡[µ|0LW¢3ÃçÏü:úw!ãë¥D 0œã@ Àm·•,üÏ`þlŸ‹‹‹Ÿõ±€Ó§O[7±ÿÖG‚ÁQ~ò“Ÿü0 ’z{{ñxÜ9‹¢ÈÈHY–fZ°ˆ-UA¦ž­˜íDæ¼M›6ýÍ‚gÖ‡~”ùøeº'N…ÐÕ«W‰F£|“×ÐБH„Ùf,ߘç…nñõ?Àæô R&µ×yéÛ—Â7Ø& ¤5&3Â¥…—þÐÓÏIÄMÈ"4œefžVù_ÒuTK%yIEND®B`‚Apache-Gallery-1.0.2/htdocs/sound-mp3.png0000644000175000017500000000747611573732716016265 0ustar milmil‰PNG  IHDR04Ì“»‘gAMA± üa pHYs  d_‘tIMEÑ/W¼ÍIDATxÚÕš{pTu–Ç?÷ÙïN:ä!@ òpx¨PpGµRÎL¹ëޝÝu\ uvw(šÂ,^ëì–³ãŽÃŠ®b!q]¬rl DÔ!£ò y'$i:I§»ïã·ô#ÝIç¡U³åœª[¹¹÷ö½ßïïœï9ç÷»à§€ø&l%%%3fÌøoàv И€‰³gÏŠo‚…ÃaQSS#Ö¬Y“$5pò˜Ƴ¾¾>±iÓ&±wïÞq®´3ÿ³í¯´†!Âá°èîîL’¸j,R‚À˜.jii¡´´”ë®»ŽÒÒR4M£´´”²²²QFÄN»ýÄ-ÒÐÐÀܹs …B:t(ùŒ™@ìôßȹñ½÷ÞËc=ÆÞ½{Y¾|9†aP^^ÎÓO?͵×^›îJâƒ!}eðI3 ¿ßÏÒ¥KÙ½{7‡£(œÃ1Oˆ@KK uuulÞ¼€M›6±k×.–/_> x†& :ù{!­­­Ø¶M^^ .dûöWðûýYIŒK ¢¢‚¼¼:rœª£5ÿâÂ6(™UÂíeßA×´vœäú%xÜÎ䯀¸G~øaÂáp"ĵTTTÈ÷¾÷}€G€—€~ÀÌš…6oÞ̳Ï>‹išø|>jjj˜ž$lËİÞÀ æ]·Š¥7®dö¼…ضŒ‚$)øsò@U“Rá2$Üáád粎rnn.<ð`Æñ¤«ƒýQÞß··Ã…CÓ‘Èq˜F—o*‹JW²|ÅRyL™~%.·e ¦N›Î¥®|WؤpãûöD50ú(WWWóÀ°eË¿¤Å&øè0_|ù9þÜUUi3†iÃÊïÞÁªUߦ³£‹¶ævúúBȶ¦ª¨ªJÑ´bº:Û˜\T™¡4§Ìp×ÙB àÑG%‹qîÜ9|ðAlÛ¦0ʱšãX–‰Ëãd$UCV,†æÎîû1# ²J$fÓÕÞ°£øü¹äNAV|{{8ñ1#>Ú¶m'0Œó=0œ ¬^½šòòrîºë®Ôñ`°ªªjòòŠPU_gºîEV½,,]Žß릫g!kô‡Ã{:)š2 ÝåbÆì9ôõõQ{ê4Ï¿º›êFDBrFŸ[¨™Yç#É)âm·ýeB`‚Su-tttâ àrºP5 ËŠ!@G(¹r*ç/¶ÑØÔEOwË=Í»ZùþCpê\;9ù|öþN4÷$b1‹½ªY²àʆô¹ÃX6"mvøÐqÛÜzë­asøÄT͉ÓåEÖâ“$YÑÐ&åOf0¥ª¦Ž³gëh©?AÓÙ®( põÜ™8]±Pë>Ãã/ ïr¶I{Vf'Å=²Ù·¯’%K–àr¹Yºt½½Á™T^¶ jëšÑNTMC–YÕQU¢Bš.ðAå.5 ñÌ,c¿»ÿÇ{pëNñ Šìárw±Á~fF¤ðxm˜`J‘Õ«á¹çžcýúõ?~œ†††´¬heK-¸\~ÍÓéÁçñà÷å››GAa!‹/f û"ý]òâKÛ¹æ[óinn¥­¥žúÚ#D̽õxÜ]3+ÆI1gÖ†q40t‘àÃ?LMàý~ÿ0mÄ=% M×°L¿?—ˉ¦iä“_à†%×óãÝIÿå~ 'ù†"ìÿø3jkkiù#­ÍõœúüÓx±²,æ]³ˆ›o¸MU0 ˲]fK=,É-·ÜÂÍ7ß’Á:]@I/_VÊÛuµ ¢ªWÏœJaAù¹<.šbÑÀ´$Î7uqp%gOÖ $ÁÔé%ääøÉÏÍừâÔáÒ¥n|>/‡MÓÐu-k&•ÀPßÙNO±BLÓdÉ«9Ð?0@,2È‚y³p;4da $!lb44w°÷Ýw9vxÓ‹'3sZn·E–˜”ŸmÅhl¼H ‹aäãóùñxŸ—Ë9 ¼˜(tWIi¬†2eY˜¦‰a\êìÀ)qX1žÿí‹<÷\ Ÿ×ÁéÚ㻃¸\ “r𨠲¬IBMü‹©X–…$ÉhšŠÏçŲL,K¤õC#Ãy Ùf`C#Ÿ~MòF$DŽÇ¤( ÓÑÙGgK¯N¾¿—Ó" âú’åx“e EQÑu§Ó…ÇãÁãñàõzÑu‡–ŠÿñÀg,¯ƒ½Ã.ž4˲ˆÅb„ÃaÚÚÚhnn¢¹¹…Ö–BýD#ÄbQ Ãà‡?¼3S^‰‰Ž”ÌóR| H‘edYFUTEAVYJËöüa÷HÄÛ²’øƒEF×5\„ø|>ŠŠ® FˆD"˜¦‰Óá`Ëæ ©ûJ’„,K‰¿ àŠœ˜(è‰Ô©ª*²??žUלÌÔ@<äÓ¤UÄTå“e4MÃãñ I2n·‹œœ\,ËÄ4-,+¾4b™1ò~>ø¨Šæ¦‹üäчèëëàŽ¿þþù§?àöÛnâ½Ê3Þ\¨¯cûË/ÐpáNñÔi˜¦ÉŸWS¾ãå‘…¬½½m À™Ýh6½ ·S'¾ä•ÿÚÊŸÒ2êÀH dòÎø£,„`ÏvS]s’?µ¥<ÐÖÖšE Œ».3VÏrèÐ! Ãd¬~ë«Xgç%žxâ €5@7ð; ®®¯×=î| ;èѬX±"+p!¾žV*+÷'wO'R"nooO•ùoªµ´´ …²ºîó½Ð·×€›oì•d·¶ðú×þJãÿÇM|¹Ò ô'Áà•?0„“oê“]©ÄŸ‰äwCÿÇKìŽIEND®B`‚Apache-Gallery-1.0.2/htdocs/application-pdf.png0000644000175000017500000000672511573732716017506 0ustar milmil‰PNG  IHDR04Ì“»‘gAMA± üabKGDùC» pHYs  d_‘tIMEÒ,Ï1d RIDATxÚÕšyPÔgšÇ?*¨D‚i¼ƒG"Ƙ¨Éz¤²/Œ ¢Œ'QcÔÒ$¢(ºZëÌ$ê8›PF[뎋¯ÚAâÅáñ@ A3(0¢Ì*ÊÕ€r7tÓÇïÙ?ºûG74¨5›]÷©z«~ý¿~Îïó¼ïûXȋРTæççw˜tÜy’¼¼Ü¾¼Kr¥9!û›o䵘røsŸ}Fnî]²²²¨¬¬lư•¹ œœÄ{ï%00EQ Err2ï¼ó£FbÆ(u¾¢Ø…µZGQ:wîÜ‚?Õ…D„víÚ©“)¦CÆDG3,2£ÑHVV]ºt!ÿ‹/¨ýé'¦§¦¢swÇ`0àçççÒÇ­b…V¥™²‡ç¦õžžžètu\½šÊ´iÓ‚€'._¾Lûöí]–ým‰¬¬¬L…Å!C†0õÄ 4cÆpîW¿¢G_zõêÉÝ»will´¹†pøð!@˜µök[‹ÆbQøõúüzýND¬Ïs¢v1'j—í5>’““ðô|¹íbÎb±È¥K)""b6›ÕVríšÄöé#f³IL&“dggKvv¶˜L&1™Œb2¥òþ}‰íÓGÎÏž-F£Q@Í„v_Öâ;v¬ê õõ:|}5NÁçÙ¯o®‰àáÉ“äìÞ:]=÷ï?pX û÷ïgÁ‚…,Z´˜’-"BVÖmV­ZEBBŠ"œ<oÓ¼¢ZaêÔ©©©iÛf³IRR.ŠˆØ´kmyÇ©š5òã?ªÏFc£ÒØØ(ƒAþÛ·¯ z¹~=MÒÒ®Iyy¹Ô××ÛZ“¦­Ú®³i»¦Y«–êj{«’sçÎ=‹p€9q@¨/, ²²’.]^r³"F–7Qöc:‹‚¢XûµZ-øÃöîýgD`Ӧͬ\¹­¶D±¥K?aÓ¦ÍäæÞQ×Ù¡ÖþnW¤¢ÙlÂÍÍ“ÉÔÇ¿ëØ‰%TUUQUUÅÀUÄp—ÃL¹”B¡›;îîî ö¦$:#RK…a«DÅ©¿[·îTVVžþS[()))¸»»»L>OžTû­ Èêt…Ötÿjh(Š_4D„ýû÷óù矣ÕjQ!**ŠuëÖÙTlï´&²&7%¹³gÏâíÝݥܚgÌ–š͘1äìÞ͸ɓÑét©_T¨¼óí^|FfÌîÝË£k×®h4¾ˆÀòåËò€Ý,Ù‰‹rCœòAkäd &`46¶ðq͘Ñ<ÉÈàqr2&“ƒ¡E›ÿ+Ôò$#ƒ¿?|ˆ¢¢bkÞèï×B“—.]fË–-ªïß¾}›U«>UÇBBfræÌYU»rfÌæÉ“ÇmÇ@cc#©©©Lœ8Ñ–„š²¢®°ˆøÁƒпÿ>ï¯_Ç“'pçÛ½ÔÝÿ/FíÚÍÇùÔ××óúë¯Ó±£»“›9jعTp¶¶c¶Óõë× !11±õpv!ÅAðRŸÞ¼aÛu³³IZ¹ŠÝ}øÞˆulÛvòòî!C‡ÅÝÝÍ Îœ9ËÍ›7ù裸uë6"Bi©–Í›7L@@ 7nB«-åàÁƒÍJl¥Ír^µ€^¯ÇÃý^ïä㎨ð$#ƒ¼¸8*<=yyð`¼lV¡wïÞ¶‡‹zFqÙßRóMrT¬¯oOÊËK¹yóÏm[àÂ…ÿÄÃÃCÝ\ØK\;œùŒÅ{_ýo†‡ã5øu@Ðh|:ô 4 ŠB³à´ ¢›{ØØXD„£G²hÑ"V¯Ž„¬¬l©6l؈V[Ú" Oú_ßžm£=`›q¸xñ"áááÄÆvP?unPÐT’’™>}çÎuи•ÿÁøû[­µ`ÁæÏŸ¯®}ë­a(аlÙ²VΔÚÞ ¶w,e§L™‚NW§jßÜ›7oæÖ­[Lš4ÿ!ˆS¦hÛ¿Bqq±ƒÏ6bZZÉÉÉjÅ»pa8_~ù%Zm)¹¹¹Nàw¿û‚+W®Òl#3g†¢Õ·uuu¤¥]#(h*uuµª6fÍšÅÉ“ñÌœœ9sHOO'3ó–zTríZ*ƽŤI“HIIaܸqìÞ½«•½°cL‰Ë˜h¹åTHOO'4t¶Krse*G3ž´eàS§N!"ÌŸ?Ï %D„ììÛ͘pæâ«¯¾fêÔ©h4>lÚ´‰‰'òóÏ?óñÇKHJJ¦  €½{¿u dÇ* ­3ÕµµµxyyQSSÝʽåîÊq¬9’8£Ž´™Y] ïø®Þ½ûRRRÄ­[YmÕB ‰‰ tíúŠ’DFFrìØ1D`ëÖmlذ‘ãdzfÍZNœ8ëÖE±}ûï]h®ige)×–v®½šæYçÆÇÇÑ»wß§¡PsŸµþþæ›¶²AaË–TGçÍ›«þéÎÑNY×ÇiÕß][ÓÕ†å\¨ººŠW^éFUU¥SBY¿~=÷ïßgî̛ܹ7… Ù1c:óæÍeûöꈎþÚ‰ñ;9ÅüR”p6¾I€ªªJ®_¿Î´iÓ©¨xÒÆ©ZK9×ïÎËýK1G¾KüEHË8ëèBŠz¤âÈÜôé3?~QQëùðÃix{{{˜ˆßÿ;F£EÎÙµi1_Åœfã'!.Ð#¿u¸È°ð0¿„£“(xTªŽ‰ƒ‘âÂr’Î¥qëÏy-ÖÚé“ð­Î.TQñ˜îÝ5ek[8®´â£Ò¢ïîŽ|—¨2±ì£­ŒxÇŸÏ#çRRü˜ßüÃ>uì“ð­tóöbùª™ø¿ÑŸÝÇŸî87·€Ó©Ä™3§ññÑ8ôòå+aéÒ¥L˜0‰O?ý €={ö2“+VrñâEfÏSkû&ôQ\äíL«f}{x·<ί¬%ÖærÁ¡ãžêFn®#½É—÷ïÿ#Š"ÄÄü›rDDD¡ö´8]kþnÌPîå>t9^^fo·VÝÐn §LByy™£³gÏF£ñeß¾aÍš5*ewô1r²î?uŠB¥¥ZzöìEiiI+ÙOZÍØmÝØüõ^ùÿNáûïã …V[Ò‚±æÉêY¯šÎÆ“–qáËÆnOÛ§6/Àž÷ŽlmÔJFŽÚÊø³½÷îÝ»|ðÁxrrrì¥ÍZ 8ÞÎö±žž/Ñ«W´ÚâçúTàiO®ÞÏ^}µ?9þ+V¬h¹¡)--¥®®ŽÌÌÛ¼ˆ”“s‡ââbjkk]šî…ù^èÛ!`œíƾƒý¶oÐèèxø’@Pb¿'Ævußèðÿ@  s;‡ã•™qW‚(ÿ pë”`NާIEND®B`‚Apache-Gallery-1.0.2/htdocs/agfolder.png0000644000175000017500000000560211573732716016210 0ustar milmil‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“ 7IDATxÚíšil]ÇuÇwyWQ‹EÆ’#E•dDzà%±\§› ©d«Æ œÄI ´hŒ¢ò¡1Œ P·h‹ýÐ"p AÜÀAGpâ]’e8²%™©]â*’|ÜßþÞÝf&8¼||ÔbSi>äÃܹsïÿ?çΙ9CøÃõ‡ë]Æ*½Ã¨y— µßk»§CŽoÀd¨Ý2Ö$ÿ{7%ö½õï}|[{SÇèt~×LÞ}øÐLý¬¹J_5íÀ¿üÍCí{ïßÒº¥5hü»ýw¯{ì“Û×´·˜í}£™;‹®üKàÏ€µÀlˆŒ±ZdŒ0î›íÍÖ·Ïýàówfry¦’©ùI4°íöí456Ñ7QrÿçÅcù»¦³“EåZb‡q IMÝLµ3f¯}ë¡[výë_}¢£»³kBõ2Á”ó·îÞs&Çrîq,÷FŸ››©àOð4µÚ¶_ 8twÏ üçÞ]ÙTÒÎ¥Ó(ýmUýcB‚ib —–¶5lÛ±aFùó;>|r0ÿ<ð# ÷ýXâZ>°wß¾}ûøå6ÝÚÑ16–Ú‘N§? ìýÜ6«ýëŸÚÒ6rùJx(ßÀCå»(ßAr±DjtŒ©Ñq\,ubØ1€N Ú¿R²®a¿~úé§îýăl¾ïž»Ú¿ùÄW¶ïäónÙØøÝý[néï:nNá;ßG>Âõ‘ÂgÝ=Áîo¿@t͇(糸³#(€e |ß|u@D€·´xºÝ0«Ih'ð½+=_XÓÚÒàû¥ü ¦a’hlôlR}Ý=íÙ®—ÈM¥PÚv>þ [~§T ŸŸ&ÑØJ,ÞDîÜAÒÝ/QNã“ÿÑ?ô‡€Óº•´5Ôõ’1®rÿï~øáG~úü?[)f‘JR)f–¤Zh^ÓN$¥”žVg¦-»0 “b~Ž|f’*+‰$ÞÐJ,ÞLCC3ƒ=‚^~3ÝÕÕ5vèÐái`èNïÕ$Â3ûJLà'¯¿öÊŸîùø=›œJá{x^yÑQ¥Ô;Ð0LMëPJRÌN-ôIýìâ8Ôh^ßASãZæ29§§·/ûò+¯=ûìið§´…Þfj]“À>àkÙ¹©/»•JI\§ˆüeà—œõûº»n_skkÖnIJmÞ=Ö9qú̹¹çžû¿±¾¾¾ð¥<-±ö òÙóÌ?}ÿvPH)RþÒ™ Pµ$5}B˨޸ù¾\&E.B›Ú÷}ãñŽ/}ñÑmÛwî:´éP[¬‘T]ë€íŸùôC›}Ï™ÿ°‹¬ p©œjÊlj%–ÚJ^¥ÈHÿ)~øìÿNqMÀгžY‡Àý;wîl¼ãŽ;Ö¾‹<§¸PÍ;d=ðR.XwÜ"øùqbQ~R2==ίß86  šH¤vQhבϾ¯}õñÛ”óvÁªë}¡OVûÄ¢uu_6Wp3ÙbÔùªîЮ³tXû¥/>ºÃuJ@ ‚«è½Ž¦W¿Ôdˆ„XòN‰@’C‡ÎjÍO„ò²Ü`Ö:ï¾}{7¬_¿¾AJ‰žS¬«w¥d}€R¬Ó·(±åàÃ2š˜á•C'r@ð°#Ü [ê!ó§žúÇ;vüÑÖuB„ïá ¤ª«÷y©%U(qÕöUÎËH-¿0^Jrù<[¶nßðÑÛ·µKå†Ùtf3pЪ÷ÕŒj„5õð™ôÄ—ËÅ (çÓ7EïáwÊ‚ž[¡ët7}“´´¶°qã­)+ÃÉ©ÝcgÎ^ìþYqÃ>ðÀ“ßúÛÛ”ÐÎJZõô~5ðËb­³Ö„Íð3““£\º<‚/ "1‡Lzж¶µñÝ»ûÃ×·µ9{ñ²« ªÖ÷ïßÿÈmB "V”b¥pØrÈkÆ÷åz¯ëÐBàTÊ*>;‚ A ñ<‡+ý½üà¿~Ü«Ãi«~­g‡cÿƒ¼g“ç–±"1¢Ñl;†ï–|oáCËâ{ÄÕ’S=½/!(ž[ab:‹ð%‘(˜vÛ†ÉéYΜï™ð<ߎhQÀ^ ðÄ_½M*±dvMà oÂŽ„ôqʹ«è}¹³^KïUàU©ÔgÎ.G)%™|™JÅñÞ~çÔpHkÌ >Ð76^>Ɇ ·bFc äÂöÐ4-LÛÂ0,áã–r«¢÷Eðz á¹”Ê>±x ‰B¸>¿üÕ¡>½õü^йºùÕ0úб÷N&œBZmùȦ¶ÙÔŽ["bGÀ²1  °­v¬ˆE)»$¤ÖÓ»’b‰ŸTÁ‡û*n…¾þÆÆÓDcQâÑ8žëpex|®·ÿJxU×™Ê@N*W ¤×s»Îõ­ùÑs/ŒLMŽ©ˆ%íˆE,Ÿ™$‰cÚ6&&†a¢¤À²¢X¶£„@žÉ•ã;J-¿Ø'à7'.ñHx”\ß;|äÝ)Õ€ÞèT4ðlµP%P]4žé,<|4S*dŇn]ß27DÊ€X¼L( ‹7±H%‘¾WWï BÕôÍËhbfœ‹½)"¶iÙ(ÃàܹžÑ™ÙLxEÏzQƒÏk2¾U³Á7Qà,0Tª¸Å³¯$~úóW“™Ùa[Â^1–™JolÆ2 Ó\ph˲±íø‚Uá/Õ»bÁJaŽSaðÊ(©ñ ±Xß È Å“]çû€“@Ÿ–N6DÄ„U³¡*AZ< xýCãîÁ#åwŽwe*•¢X·6Ú23•$ð]â ͘†…2 ”X‘y"Ñh!%Âsj|!DBF“ý\êIâz‚À$^~ýí³J© àu=ÛM  ‹a jË*²¦ÌQõöa]5ÊÊ…3??p8YÈfE§Ääô(§Î&‰ØÞ>ÖÕ[®8¹éT·T[‘¸‘ó¶J:S(tŸH¼ôÆñ¤ |ÑÔ”°§Æ†b®[Æw‹Ä™›ÅóLFF'IMN¥û“ÃÀA`$”°ÂÒ jwdä|ÀÔÍÒ›íÓ ­Dè÷O€;Íwßµ£õcwmÛ°ûέ›D HÄ¢œ¾4LßÐtñ­£ïÖ¹èÅPÈL‡T««zFf„ÈXºEu “IÛ€»€=€ùØ£ŸÞtßîl~ó þ›ou^RŽÏkÝç5øŒ–’»ÒùÁjžYݨU U*ÀKº„XÕý\(ã+zWýÐí­Ó÷Mí_ᨓ×RZæ¸7›ÀX¥º1±4HWG›b¼¸ÙÝï×*‘ê®*TÞ G5ÿzÎ~WV²ŠòƒpÞ¹îã¦ÿõN>ßõ¿(üÞ\¿§:Çf-lfâIEND®B`‚Apache-Gallery-1.0.2/htdocs/sound-wav.png0000644000175000017500000000612711573732716016353 0ustar milmil‰PNG  IHDR04Ì“»‘bKGDÿÿÿ ½§“ IDATxÚÕšklTç™Çs.3ã±=ÆÃŰM 8&¦&4 ¼ŠCšìv[Á—®’*iV•ªÒ¤U*.ªÓݪªT%›,ÙˆJ¤dÑ¢M³¢|XhÀ4bLˆÁ±1_0¾_Æ3gæ¼o?œ¹™±1Hè+Ç~/ç<ÿçþ<¯~È;áSZZz½¤¤äwÀV Ð™Á—/_–wƒ²¹¹YîØ±#ªðÊTÄ;)¥äo1nõ¹¦i‰D˜œœäÂ… lܸ` p"ýŒò·"üv˜FéììÄçóQUU…ßïhŠw6z•;ðÔ‰Dðz½<øàƒ=z—Ë5%åN <~^JIww7B|>•••üö·ûñz½YAÜ€ññqêëëihh¸-ÂS N=/¥À4Í„:™¦Iii)÷Þ»Œ}ûö¥«“ã¶8P]]MUUÕÕÕèºNuu5uuu·hÐ’ÔéP(ıcÇØ¸q#—.]Âív300€ÇãÁårÒÑq•íÛ·¿¼ ÜŒ[ßWSSCmm-»víÂï÷súôiÚÚÚ(++ãý÷ßçüùóÓHÆNtê|(Âï?Æ¡C‡ƒH)⌦¨h=öM¶mÛPtc3¾^ZZʺuë(//·q¾¡¡;wÒÜÜ<‚íkRZçΣ¯¯`p‚¾¾ 3::Jkk+}ôÀ7€K@¿v«~Üï÷ãóùxë­·hhh ©©‰¦¦&ª««9{ö,•••·Ä}k¯5ér¹P…5kÖ0<!ÌŒsñýš¦M`*îïÝ»—õë× …¸qã†íq®uuu±}û¶´5ëÁ @òÒK/!¥Ä4¦)R@&¥?c©˜´=/ÛP2õ5óÀÞ½{ùøãÉËËcÏž=ßÀË/¿Laa!ùùù´¶¶RY¹2Å«ˆƒÃH ………<õÔS ŽZ„ÛÕ%~Æfj 7€3ñ×àt:©««‹']tv^¥¸¸8ã\ûµ.-(fË–ZXµj¥¥¥¼øâ iÒ¶ÛK’Ö÷©S§Øºu+À#@ Ð«Ø ›Úøìja­ìÙ³;!™Ý»wSTTlãfØœœ$2gž}öûF˜¶¶6ž~ú™˜ž‹w7Ütu2§W¡TÂìDg΃$‰ð½§Ÿ¥¿¿Ÿþþ~vî|)qFIp2Äå/ÿBwoáˆsðÌ3ßçÀƒ|ç;ßNìO¾?©VvÛ˜Z…´[Q™ÔaÞ>æÍñ¥©EèD0ÈD8J0BH—.·ÛS[[›Â»ÊX2ço*›© HŽó#„ ùâÂáHŠá‰Dp’̨ l„"#j28:‘âãã ¶"&51¢!Ó˜oCvñ¼ð‹¬{x=“ád‚ H$ÊðÈsçø,W)¢œ>y’ûÿ“«ím,ZRJŽË™òL9…ûNõJp³<3M2Cÿ-Eb^wºùîwÿ…P8BØ0k£c£œkiãZ Ç’€iòʯÁþ7ß`×®]\mÿ’ÎÎÎØ¿hKÑïtw9s7ªM•ÿÄu §oˆÙ³òil:”‚Ï?¿Èo~UÏüùw³åáÕ€$j SÒèaÁü"š/¶!'NP__€Ç“K[{']×™ GYV¾˜OÎ]`d|’<‹µ«+Œ4"&º¦f$|Ó2».ML&¸Ð78ÌÈØ(}ƒ#˜BðøßÂáÉ'Ÿddt aš„Œ(F$‚”‚ñP”ïýë9ðÖ;,¸g?Üñ}C ŽN2iD9úáIºƘ0}ƒ#ŒŒŽ12:Æ—×zB …gî…&‚aLa "Ñ(¦09óçËôô!„äóVAD*D¢’Нo¢bÍ7h9–3䃟RäuaD ‡'ùô³K“ò•ìü·W@J„ÁãT¹18‚‰rùZÚ{cÆE‘QþïøYæÍ¥0?‡žë’¼<jØ ÇíÄ©kÓÈqë‰FX\/¯Ž6 œN‡W-çØÿŸFq8Ð5 ·bòÀª¯¡k*ynpT£A]×(ð¨LF(2B^Ž‹‘I0%èNEqàÔ5KÊ"Ê?ýÃ.]n§§o€ÒŠ%¸]®Œ‚ç&6`×5)%å QÁªªP³f%ª.§Fõ}e„ ƒ¯·KÇW‡ ¸1NùÂ"r=š¿¸Æì|VUÐðÇOQdÄ2p©¡ª*NÝÒqaZÎâÞ²Å,-]”FðônHK7Úô4â“Ó§ø¯×_¡¥¥…ŠŠ &ƒ85UUY8¿˜Ž®æÍž…” * …¹‹ÞMÿ຦¡ÇD¯k*nÕÁê•÷5#ôõÅÒc‰T²qØîÖSJVɼ۞Nÿ|÷Ïx÷ÝC oâv»qªàrêH ¾‚<\ºÆ‚âÙº%.—Žªª–ªé*ª¢"¥Ä©kèªÀåÒÑ…†ƒ!œš 2ŠîÔ§ôûIÆró@–­6PUÅæ ½^/+ÊKðxrR—ëfA±¼î¾k^â¼Ã¡àÒ54- @sÄ#-Ì*ðr½߬Y,)Y‘ Ø5a†ÌžZãµ×þƒ÷Þ; ÀŠ+xýõ×)œåM€T%#ø€$??—üœ$]Spêjâ=ùy–——pWÑ\›ý¥Öé ä mÀ.Í›7±iÓ¦DÑn`qO’®º¦‘›ãFÄrj:š"lÏöä¸mÏöþ›5´©7$s’dv˜Y½Íž•—fpÉýªªàŽPMQ2L͉n§MŸ¨È†‡‡2¸›NxzҕαóŸžå«üáh¦ìýšé2T‰ÝƒYcÿ›¯}eÎ5_L5b{õ3}Y)„'ó÷$ˆš ›9|ÄÏŽçw°pa ‡øY~_?þÉÏ8|ÄO͉͆3»öþ’ÃGüìÚûÅKÊ8|ÄϾ7ßN:•}8|ÄÏâ%eÙÛ*™®L¦UNé…Gz9 .œ ¬l)ëÖoࡵ5,]ºÌ¶oÑâR*î·zM÷?@É¢%t´·ÑÓÝ…oöJJs÷‚{˜;¯ˆîîímÙ[Ù¸ŸÙUËŒv ÐÝ`î¼"¼ÞZWƒa¬ùú:æÌ‡oöº» ðØãß ­­€oÆþ8uò8U_[MÕªÕÖÜÇÇo¥¨—)ª2},u\øÌêP?òèãÏçèïßeV¡ÇÿñÛ1î7ÇÚ‘sxhm Áà¿þåÏ …B<´n>ß;€U«©ZUm›ËRÈ,M%‘Q!M×;M8ŸàîÐÐ ïÿïïcKí£´ÄÖ}ì 4MÃãÉåý¿Ãív£iu[Ÿ »+ÀÕŽ/Yºt9Ë–­H¨Õ4E}ºA§—›Ì¨Ü»Øòg„¸\nÎ6ý 3¥ùÜTUEÁÅ–Ïp»sؼź[xîGϲíŸëøés?`KmnwN‚㊪¢éºûÈÖ9Nmm¤‚Iö.3 œ ½ý MŸ4ZßgþÀÕ«íLLŒ³ðžšÎ4räѸÀµÎÞ;òß4idá=%1'Œjjèû‘ø ŠW‹aD"¶mÛÆ“O>‰×ë]ÄGàÃ*R266€‚x<ÎÆyì±}D"‘š >€¢¸”!Ä<¥çî ,Ël:Y–Egg'kÖ¬å‘GùtRÜË=¬··—cÇŽÐÝÝÍàà ÷¶·ÒÜãÊž.6oÚH¤½O<êvScft” zN›n¾ÿƒòê+/Vv¹\X–…eY¨ªŠª*Tã—ŠÅ"étšS§NáóùH§Óºº:Ù¿?{öìù:ðMÀôe8æ   Ò“9ƇFi©¯Ç £j”`ˆ‹Cƒ¤úÏÒºq332ÉôŒQYõ*5q¹\!Q¥Ò¶Eî»ï> …R g¡I&¹õÖÛ¾ ü#Ìe€íL•ÌfñåU†¦rœJ] í­“Ô5µ`‚¼ýì3˜ŠFËd–ÒÚkÑ €Õ«W£iZe•ÂBU]BHn¹å‰ 3LLL’ÉdÈf³ìÛ·ÏæQ~Ùs ™L’J¥èèè`xxø½ðÖÓ´¸ÝîÊ.ã´«ªŠc)AUÕJÿL&ÃÐÐY\.ÓÓÓ=ú"ßþö·nN©š¨hbbbÞï.¿ŸFŸF0ì" ÑÐÐ@ AÓ4Ü^C4rä…£¤Sƒ5çsÖ¶¬ÀöC¥H$¦M›(• \º”q†;¼›ïÄ ¤ë:š¦(•J•öëëêØÐ¤>™ Z¥±¾ÕímÔ%’xTw0Ìt”3£)^K ‡QUµ¢ä(•6ûñ BÈÊ={ŒDÓ|ø|¾E Qà(_ BÓ4Êå2`óxdd„M¡Ûâ44Æí¥Pb_eå 6ßÀBqÚ3Û|âA‰zqô’N±˜çbÚ¤(н„æ _§dJ«\Q¬z¾ùVpε½—nóÌ \ÐaêX8€æõ‹E¨‹E)óLO¥ill$èõâöGè÷„ñÌHü^{¬×;gz!¬ÊwÓ4RVÙQTQªÏ‡åËe, ñù|•]£½½ÑÑQ Ý¢”Ë£©*«ÚZñ'[n ÍëÃÊÍPš¼HNó“—Ú,eŠ…,RB A Š2K)Íy8RZH!Q9K% ä,µ”ÅÜ_ÀáY5››vƒãÄ…’`j*Kzr’b¦™`¢‰@}ªæ#}~œôð»Ôµª Æ(ê6xkên¾k‰wî¾ ÅåBHÁ'z{ˆÕ‡Ø±}%®pAyQF)#Êc(æ”­SÏ(µs›* Ì_}G<mÞ€RYçÒ”ÅÈÀy"!ܪ›¨a¡„¢ô½ñ¹tŽŽúÞä´@ €u[榟âækv³nÝ®XßÁÛÇßæä©~^}ñ ž9üë×ûùÜmõ¬mÍ!4Š™F !@™ÝZßÓµ¨¦ë¶#¶¶®dbb‚'œó`tÞìC\³”¨°{ÿ!T·ŸÖ¦$ö¯rç·p«dÓ%</^ÍC8¤£}-ÍMÔE¼;>Ê=øOüñôv™ÔÅWŒ (†r,vÖ°À|*9W'~Y(0k yUþæ/â¦_½!KLŽQž±0t a L)°„$àó±je+ªO°ûÖ]<øÿÅc>J0Þåï %X–@]œŒÍ°”æöî9éòûù•Æ«V7ÐÐÐ@¢¾žö¶UcõüôD?ûþûe¾ó­‡éééA@(†×ŸÃÐu,!1 I<§PÎ3t~SèìÜq%¿{ß—ø»¿ÚC ) ûÁåR±f#Ú…R1ÌÜ1‚Þ‹‚Ñ —‹mñÍM1¼ªª¢i>T·ÆÄt†£'úÙóÛŸg㦠f±„¥Cu#APÀ2-,Ë@óhüƒ#ƒ\˜¼@¡'QWÏgo¿‘‡þâiÆÓö¢:[m-Kn£s‡=‰Û¯Â4\ÒÑÖH¼!FI7)‚B©@j2Å3ÇN †ãÜqÇíøÂÌ’ŽYÖ1 %Ü!áXS¤°0M?à'3“adl„\nšH Âê¦6šã͘yxùçiŠCÈÚX@¡êÓϾúýy:’"ñÉP ›¹HöÒ©B–Á Üú[7â÷˜¢„;àCÕܘ…VÑ žl'’hGuk$:Ö1•NñâK‡˜Éçèníf}ûZZW¬"ÚPOK÷ÿþ1F/œ£[Ú¬¨å‡s”C%ef&’x"ŽQ2P%HË"ô±ju;ŠÇËT6ÃTQð“3S4Ƙº0A18ƒ/Âç áøpy‚¸xù•—xçwðx5¶_}›{¯%î ±ªi+ðF‚¸ü^šaŒÀUôœ£{‰-t‘æVߦM&“©Ä-ÿÆÃ=’]+~—¢ÍëßäÑï~ƒ| 0ܤF2hÞ,^¿ÐK,ÑH]s„çŸ}ž?ðOéËäî=¿ÎÞbuS eQFº\”%†Ä4!ÑÔEv¦Ú?—à8ËÜ6:ŸN ž·‹ÙZذ’‘©2Þ —¦¦$ªÛ B —åb‹,ÏE8ÀÙ±^ŸYäõW^epx˜+{z9‹eI KTÍ¥°ýq.õ\€=hæþ[‘Š‚ˆ5@WÊÊN”Õkèõm@µäð¬ó0: ƒÇQZ;àž¯Ñݽ†sƒ#Ô%£¸TÝ41M½¬cRÂ0 ,EÁç Ü>RžvB¦i’Ÿ¾ÄøðéJò¢"‘d/žçg'mzKi-ïĶHüÇ_D¬é…xVȱøüx<Šç‘ºHäH? „àºënäßÿm?o¿sœ€ßGY7ÐuÓ0 †Â\ÓÚÁ§®ÝÎë¯ÿ”¡¬$ðók»¯cKïJ¹,+[º™)NS(æÑËôr™‹FÙº,ËDYâ(^슂¼ý‹°ës(öO *Ü­o@^±Ùîw®á ¢"‘BL®àtÿ +››°, ÛC$"òsºÿçlݶ…ïýõä2ü•í[·¢¹LÊåÉ`ݦd™”¥A¾˜gjú zº,Kàr)ïuØ ì¬N¢¨* N (fÍë`T@J„æ­„ÆÍM¶lëåÍ×Þ %™¤.¥>^‡T$ýçN3òÆy¶nú$Ÿ¾þ3ø£qrÙ,ª%ÈONPÖ§q©~|./š¢aISèÙ6¯QgsˆÚyAÕIlóO¸µŠCK)+ƒjV*j‘8Š×‡®å‹ìüäZúúNXµ²•l1ÃÏÞùNôÀ(ñKIîÒ8'úNñòOsæÌ)Œ²‚GõcZy ‘CUt„¡óÌá#\½v‚x´f°âÑêB¥D²ü!$s¥?!DÍd\J>?.—Š*Rtµ©ÜqK‚£¯¾Fÿ¹Óœ/3ÃÏnÞfÚp7 ë€HËöyýüñn6üÆS(./žà Úw~«2W>õ&Å©¼‘‚›4¬Çm£î'Ÿz³6HUE Q¬ðú¨£øbg^¸;è¹Q é>|Ñ6”‚ésó·ÜtÿS¤ûŸb)™8ñ8+6£àZ´ú°ÀÇ®NHÚBNŽÌ @>õféÒ’ÊÖ’É“û+”<±ÑýÊA–JS{•çÚí‹ ±JêÐÿË9ð½§—-«ÌG°°f_-‡<ÁÁù~—% Œ±P¹…YÚrrèÐáñÒœ¨ªŠa•÷ÕV­dk!E!žbïÞ½_&ÇÝ„BªÁ—ÿþ×ñ‰]»n©~ΫÔêïÕóÍW~îÓìŒ8iku¹]Qžþ¨Ó©øÌR(•J‘Ëå.Káå¤ú¶³!Ìm ‹,¼Ú ²øÅ†¢(Œ“Ïç[s/øý_è2??nš}+4æÛóƒˆRuU«¾ØyÁþ»MFœ3i¶òNÝäÃH5€ª¸S»Yx•Ø1(3€éL®~À-§@­ïÕ¿å‚¶…¿kI5• ÿDóô?mر‘IEND®B`‚Apache-Gallery-1.0.2/htdocs/application-rtf.png0000644000175000017500000000647711573732716017534 0ustar milmil‰PNG  IHDR04Ì“»‘bKGDÿÿÿ ½§“ ôIDATxÚÕš{PTWžÇ?÷vóhMPPPŒŠ3•ÔÔlÌ£’JvvUGÞ¨‰ø˜8ñ5+à ‰ÉÖL&j4 q›²J4ƉHdŬJPÃj"Íct•ÃKÁnšî¾gÿ ûrowZkÝSu«šó¸÷÷ý}¯s¹€¸ž¨¨¨«‰ÀÀ[hâÂ… ânh‹EÔÖÖŠ¼¼<7¨`  Àݪªªþ®)Šr[Ýn‹E´µµ‰£GºADBæ4!BˆÛ^çp8øþûï áᇦ¼¼à20HÞÿ3{>V«U|õÕWêûÚÚÚDii© ÝŸ}ö™ºÔÔT²²²Ô¾'žxBý••¥ÓøC=¤[¿víZüñ!BÐØØ€¢(„„„ðàƒòþûEùdbHª¯¯ ººšÔÔT²²²?~>žöö÷TÉgò¥Q!¿M þF&w9ê&?kÅhôC6ø!Œ2²Áèå˜Ï>û,‡•óä“Oƒ¢(¤§gpèÐ!yä{ì1V­Z©ÎW7è>…(Š@`` —|F­ S§NU'kÛ#Ñd™+MíøKv R/’€¿AÁä/a³]F``d‰îF½ö?üðC„ÄÇ'¨ý¥¥{q:âââ|²â ˜Ífº»»Ôˆ6 €ªª*¦M›¦‚p3r_øh¢"Fpâ´#=د7#ƒÄ0A¯0ª_í¶:tk…ìØñsçÎ%#¯@ýðžMù<¿ €7®`æÊ·Ô±?äé¬áСrÌæ>ýÍèéd¾L)x„‰ áÌÿ<‰K—ë¹Ð²‚á 7x%%·&³³ç"”¼¹RíÁÇW Dßœ?äyde-‹GAYËÀ´iÑj&t/Bp­á Í7hn³!Y’0ý$‰ð`ÃLȃÁ€dUÜßݾ}µµ§™7oO>ùüìgÿÄ_þR‚’’=ÄÅűeËEðòËÿêXq™”`ÆŒ§èììŠÁ‘#•DGǨaÌÝFÝ 7®þ•‡ÌM«I’BÁnw`ï½Ý9I–Aô…Åå|îØ>wî<ˆž%ÈÌÌ$##C•áµ×Ö¹·_®˜˜8èhÓRg·Ûðó3|‘á~½€Y–%‰@£ƒÈÁÃ%d£ŒlœNEé{Oqq1óçÏcΜl„€… ALL },‘‘‘IB‚™­[ßU× ¡¸üq`R™ÃaÇhôÃn·ë&¬[·–Ø)S¿Ú®_§±é*!#ïEQœ 3™0úâ8œ›6hok廋gyùå—t‘D+D¿ƒ{*Ì„®?8xׯ·QSó_n&ÌÀy YÇ@ee%~~~:ûïcF¡Çj¥·×‚ÓÑ‹§²dÀétˆ„‚ÝÚJçõz £}6¼|ùr’“S¨¨¨DQ ,p™ÛÖûLFQ´WÔïïß¿ŸQCû€oÍô•Âþ&$YÆ? §ÃŽÅÒ$Æ™°Xº v/ƒŸ+ ]LçBí ¶mÛæ‘ì„Ì-tùà¢LŸ>Þ^›†>ºö^¡àp:±õôàt:q8œ8VKö^K6›­Ï™u5N¿&ßxc=‹/æÍ77!„`óæ#99!àÅW3}z,¯¼ò[„ûûÉÉ)´¶^Ül6ÕÕÕÄÆÆb³ÙÔx½hÑbBFŽDH€Ò—Öm¶^dƒ„ìV–$ú§Ýî 6m*н†õ¥‚gò®ŸNœ8AJJ*ôòL¨Ÿþ÷Þ{O“”¼MÌ3,ö×/ýý¹¹yDFN¢²²’¸¸8–-[ÆÎ;©ªªâÒ¥ËX,&NœHaáÛ°qãF¯­æQÈjµb2™°Z­^Y+Œç˜^“zÍõkSñÙï­y¼Àƒ ,l,--Í|ñÅé£þOL&“š€ú*CEw€Ö?&4v.ÔH¢wN'B(”•ígÕªU!ذañññ¤¥¥‚-[ÞEAnn3gÎâÈ‘£^½oß'„…œ‹ÅBuu5 ܼ٭j8&f:dgg³cÇ>Ëm³yååIJJæÏÞ¯Ñø@{½öµ÷6ÁçŸ×––îÓdmñ•@ww—ª}·s¿ôÒKœ9Ó·I‰‹‹çþû@AB‚™èè×þ\›}bÚ¸qk×®Cˆ¾Ç«¯¾JSS3ß~û-11Óyå•ßRUUEJJªG-iié455 Î@WWÇÃlžAW× UìÝ[JZZ*3gΤ¦¦†ÚÚ3j~8v¬šŸþôˆ‹‹£²²’©S§òöÛo  }­Æ…OŸðÞr*ÔÔÔžž9tòu4¸wï^@°oß>„<óÌlÝF\Á¹sg=„ÐK±aÃï˜1c¡¡£Y½z5±±±|ùå—üüç (/?Ä•+Wؼù¯è¦ßÜ …nܸAPPÚ«Vp_¶¬`à»gfõ^û®qãÆÓØXÏ™3_ î`Ĉ‘ºH²bÅ víÚ…°fÍZV­z>úˆÜÜ=ŽeË~ @aa!©©i,Z´„ŠŠ 23³Xºt—/שÑg f@ËÕë?Ø”ŒÞZÔÛòïÿŠ"(*úƒ.räää““£öÅÄDßÒýØû;ƒÓ©pú‹ï(Û{ô–Õš’† I—‰SRRii¹ª433“ÐÐ0¶n}—ÜÜ\Z[[ a„ “³œíÛ‹éìì$'g9uuuDFF|ãó·ÆOãÜÙÿ¦þo-· ÀÓ„Ü"ê(+ÛGjjW¯6©Œ”””¨ ßö¹¡™?žúÆI“"ÝÇþûæ~½æ<ýL,gk/ÐÙÑý÷1!mÒ ˜‘‘…ÃagÒ¤Hìö^Î;OuuK—þ’k×Zسçc¶o/æäÉSLœ8_|aÐ65¶²³ø §‘=[ ÷üù%5 5771vl8ÍÍPBcã¾³¬g»ðÝÕ;æèøä“RÒÓ3hjjôÌ3YÝÊUÓý¥?y˜;ÙŒCíS= °Û¹#Ë[¹„û"F»öÙÜöí½,K8Nl¶ÆŽÇéÓ§Ù¶mÀ¯&Àb¸xñ"÷Ü3ŒôôLššnë_†:xzúé,¯wÝ.‰'qåÊÿhNÎ9¥ÛÐ477ÓÕÕEmíYîÆvþü7444hOÍu¸kþ_èŸb`ªëÆÞà¾í{ økoïÂ&phtß㺺÷ ÿ8+`’æ÷nÜàCœjV–IEND®B`‚Apache-Gallery-1.0.2/htdocs/video-mpg.png0000644000175000017500000001025711573732716016316 0ustar milmil‰PNG  IHDR04Ì“»‘bKGDÿÿÿ ½§“dIDATxÚÕšYpT×™Çwiõ"©ÑÈ4 c (Ê&v%±=~pጓ{‚§&™JÊyHÇU®JÙ5/¶ì<8˜P!Á 6^&6KÈBBB´ „ZjÔ¢¥^ÔÛ½}î¾RKB&™q•sªnu×½§OËÿûßwÎØˆoµdÉ’¡òòò·‡€Y€;¢³³SLÑhT!D$·©TJ$“I„BܺuKü_F,ÍÍÍâùçŸÏ*U¸ùvÂK€BLy …B „ ¸¸xÊsÃ0H¥R¤R)¢Ñ¨5÷®»î·Ì4ëÎ4 Ã@×uâñ8mmmlݺ €9ù7·ÕL×uŠŠŠH¥RSž¥R)t]GÓ44MC×uÊÊʬ¹YeþÖ‘J¥èë룤¤„Õ«Wóá‡\ÊÇtòª3-æóù¦ÜO&“ƒAn޼Ʌ hll¤££ƒ¡¡!Ö®]˪U«¨¬¬¤¾¾»ÝŽ¢(“º®àv»Y·nGåñÇ¿–L&§õÄm!äõzY°`ýýý–5C¡mmmtwwséÒ%V¬XAuu5óçÏÇ0 âñ8MMM466b/¼ð+W®Äf›9³ë'“INž<ÉöíÛ1MY–ééé¡¡á,{÷>K8žV‰iª··W\»vM\»vMôôôˆS§N‰Ý»w‹={öˆ÷Þ{Oø|¾œù‰DB´¶¶Š+W®ŸÏ'þð‡?ˆ5kÖˆßÿþ÷" Ó4­Ë0Œi¯htL|ðÁB!’ɤH¥RB!ÅÛo¿ ìÅ™À–f„a,Y²„+W® i/¾ø"?ü0O=õ²œ Åîîn:::P»ÝŽ‚|»ï¾›‡zˆ`0È“O>‰ÝnG’¤‰¶g¢ó…€x|˜½{÷²páBÞÿ}vîÜi)ÑÚÚJss3n·›±±1hiiá™gž¡¼¼œW^y…ŸÿüçTTTPWW‡Û]Èôñ-2 ž~úib±B˜YCSV6—;¿ðcà5` Hͨ€a9r„'Ÿ|’'NðÑG±víZ,X@MM ¦irøða"‘ sèÐ!*++Ù·o†aP]]ÍÎ;Ù»w/§NÂét¢ªê!0MÁŽ;˜3g~¿ŸX,Šß?L0$sàÀ¬xEV»­7nÜàØ±c<ÿüó¼óÎ;|úé§lß¾¢¢""‘B¼^/~¿€D"A4¥¬¬Ìò¦i¸ÝnJKKÙ²e ¼ÁsÏý+n·{R§µ°ÛíȲL]]Á`ÞÞk(ŠB(âóÏÝ|òÉ'yYøO«ÀÈÈgΜá¾ûîCÓ4N:Å<€Ãá âp8$‰Ù³gS\\L4E’$‚Á /¾ø"<òÉd’D"A~~>º®³|ùr^}õU~ðƒ¡°°p þLÓÌÀ& %·Ûͽ÷Vg ct48‘=§æ!†apñâE4Mã‰'žààÁƒTWWS\\Œ‚ 6Xr:ìÛ·öövìv;6l@–e’ÉdÃi m6 .dùòåtwwSRR2!?LÓ´‚$LSLˆ 0MA^ž‡ÃÁmYöÏ"‘]]]Üÿý|÷»ßÅãñ ñx}ÚbT*E?MMM¬_¿ž@ @kk+’$1<<Ìàà K–,Å4Eç¹VÎUFL‚ÓôCžœH®_¿ÎܹshkkãÌ™3–uƒÁ ªª’J¥¸~ý:mmm8NEA–edYÆï÷óùçŸ#IÉd’Ï>ûŒyóæqãÆ |>ù(Šl ˜æsŠL`c=Odž1³éÉX‚ŒÑÔÔDEE………(Š‚$IȲŒiE ðæ+Š‚ßï§­­‡~˜X,Æùóç‰Åb”••ÑÔÔÄœ9s˜3g. e„2s “6ëôwsÆò\\—¸ÝnFFF…Bäçç£i8N\.²,[•¢¢(FÚ2ƒƒƒx½^~ûÛßRQQACCG¥¾¾¯×ËÅ‹ùå/™)%Ì)8Ÿ™\w¡ì¤òò…\¼xUUq:ôôôpôèQ†††xôÑGÐ4ŠŠ æÍ›‡¦i RUUÅK/½ÄÚµkimmåõ×_§°°p8LGG,ZTŽÃá´H - ™Q:‘M¾ŸEÆ{à¾û6ó«_ýŠíÛ·#I TUUñ“Ÿü„êêjB¡¦iR\\̃>H<ÇårQTTD^^;vŒžžvíÚEWW­­­ìßÿkEA×µ8N¥É\îÿªÆNÍõ€`Ö,7õõõVOúÃþŸýìg8NFGGsø???UU1 ŸÏG$áÕW_¥³³“úúzB¡.\`ýú:òó ÈÏ/ O`³)¨ªÍŠŸL_5‰NאָVsiL ª6î¹ç~ó›ßPRR½÷ÞK*•" ådXÓ4‰F£èºÎØØ===>|MÓxä‘GhhhÀçó‘ŸŸO(æ7ÞÀá°3::J$2f 6k–›;v°mÛ·ñx<(ŠŠ$1©OÈ¥ÜÛ(Æ_^ž ·»5kÖðòË/óÜsϱpáBTUµ2±®ëÄb1‚Á >Ÿ¿üå/ƒA–-[†ÇãáÖ­[TVVR[[ËìÙ³ÉËËÃáp0oÞ<Ün76›þþ~ü~?^¯—/¾8ÉÿÍ޽ϰ{÷nìv;ªªNbŸ¯PÀ4†a’J¸\. xüñÇxíµ×())aëÖ­VÐ677F …B™ì*³jÕ*âñ8½½½Ü¸qƒx<Ž®ëx<jkkñz½ÜsÏ=âp8(++C×uXµj]]]|öÙÿpõêU ²ixÝ1„Ò¼l)4MÃfËÃïfÁ‚„BAÞ|óMªªª(((Àãñàñx0M“‘‘zzzøøã1 ƒ-[6S_¿p8L4%qúôiªªª8yò¤U’d‹Ál.)))¡ººšsçÎqâÄ víÚ…,KSJƒ8톑ÆùÆÑumÛ¶‡hmmepp¡¡!z{{‰Åbøý~LÓdÛ¶m±yóft]gþü˜¦ÍfÃçóñÖ[¿c×®]8jjj°Ùle7ÆÎž=˺uë8xðM¶lÙ‚ÛíFU•;÷ÀÄ~[–e¾ü²»ÝAAA>²,³fÍZz{{ ƒÌŸ?UUp8hšŽªªVQ°ÛåœÖTQTFGG‘e™¾¾>êêê,Œ›¦‰¢(hšÆÒ¥Kinn¦´´”sçαiÓ&\.Wf#@ÜI)!2VÆfSÙ°a#6›Ê¥Kítww300€ªª”––PXX€ÓéB–\.'uuë°Ùl(JZ‰,Ef8+¤Íf#‹ÅH$$ «üV…ÒÒR<ÇH$!•Ò1ŒÔ„죣£Äãq’É$’ªjC×5„H’lõÇÑh”@ `1•$I_¥€È(@Æ ë×oä¯=“Á¶2!¹˜™VQÂårQ[[KSÓ\.§1€@ ÀÉ“_põêUªª¾ÅâÅ‹™;w6n·›‚‚\®|TUÉ´œ2cc®_ïãàÁ7 …BÖnÅWžƒ£9Š44œÅ4Ó0©««›Ôx@,%“H$´,TSSƒ$IHCðuÞýãTŒï H¬_¿Žóç3ž‘P!L+Ëf±«(*55«innFU•4£ÝþøkUà½ãS2ñx9›ÎM׎Sm"‘°5’I-C*mmm(Jš$iœµ7¿ ˆtÑüÖ?‘ŠðÔ>ËÒÿÀÉý›_ǶihŒùšèúèY¢CÍ-ú6‹¶þ'ŠÍ…kö·ˆ·3|ùýgöOWNLdÕÕ«iii¡¹¹ÅŠÉ%®$IH’ĪU«¸t©mÚ„ã,©då÷þLëÛÛPÅ,ÚºZ‹žÜ¯Pºl+¿÷'ªv¿Í—¯­`ñý/Q8¯–ËúgFz>Äæ(fɯÜ>ˆ³²I’LkkkŽLÓ´Îb>Ë8íˆM­[]ïSZ¹“åßyõŸ¢´rç4*˜ºÞÀQ¼×ì*ÂÞ3É F2Hû‘]·khr“ÚÝwßM{{;+V¬˜²2q\½z•eË–ÑÙÙiÑñÄÑuüGÌúQ;sW>N*âË×WRZé–SæT}/}Ô÷ŠÍ•>½ ÷ç@íä~iú–rB —­L{»ª0‘H I2]]ÝvÛr‡66ÈÕ÷öPº|7ÎwÑ"ÓÎÛü‚‰¡Ç¹uå(]=›>hÑ¢(yùH²mJ¼ÜÖÙaùòetvvMEv®¦%3,$³xñb®_¿>ÁIÂ:ÿL óÏ3²JÖªGÔ߆{Ázì³’íž¹šX0©ªBOO7ª*O³µ!H&“Ö9±,+ܸџÙqÿ¯TyíÓgñ·_bõžs¨öY$Ã^F{?šÈnÞôåüyoïu-ZD__ååå9{—š6ž #E<Çãñ08èÃã™—^xèø×ž^>6C ¨ª‚×;nÕ¬wt]#•22%®aÕó~¿?S‰¦•<þîyïø×žŒÇ=àó æxÀçóq×]óðù|fésºï%%%ŒŒŒä¼–pæÌt=5é ¿ûU¿ÿ?ýéOþ ¸Rººº((på,,Ë2ÃÃ~TU™FhÉJlB¤?C¡Ð”ˆ7N+èßóÀ‰Ÿd¿^.YA|óæM"‘ßä100@8žÖ•ߘ÷…îðú°%óˆ’%Þµ@~æøRú;BÉÌûƒÀXVØâŒðÊ?€b@Jš°;!ñ3Döm•ÿGy£Bú©IEND®B`‚Apache-Gallery-1.0.2/htdocs/sound-ogg.png0000644000175000017500000000773711573732716016342 0ustar milmil‰PNG  IHDR04Ì“»‘bKGDÿÿÿ ½§“”IDATxÚÕšyt\Õ}Ç?o³kF›mÉ–‘lÙ,MÃb–†-”SBÊpHÂ9m4äôæ„&¥ ‡ô„–¦a [ 6`Œ-cÇllo²-¯’µ/3I³¼yïÝþ1#yF’%Ã)mrÏyzK{ç÷»¿ß÷û»¿ß}÷âó^’„eI(²$$éóŸêª©©é©ªªz¸§ÑÄÁƒÅBK$¢¹¹YÜwß}cJU^@>•ð „üï5‘›>.ãÉdH&“ìÞ½›Õ«WT=@ p?ŸB€”&f8EÒ e,Ë¢»«—Áè 络P¨(oØØ2®Ìé´t:ͱcÇX¼x1ñxœ¦¦&®ºêªi•POwòx*Å ×ÓÚÚB_Wý=}ôw÷Q}Æú‡‡ …Š&¬¸ô…ì—Édƒ¬\¹’††n¾ùæ#étzJ%äig“N  …9zðCÇQÒ©««¢þ¬l+M*•šÚ]NÓ…„ãWgg'®ë‰D¨««ãé§Ÿ" Ê3_nùtWFQTæ–Í¡¨º’¶ö(ÇŽ à¸=ƒ4ºsÆñ®ÈQ(8_q!\ÇÀ¶mÇ¡¦¦†E‹óØcä+!}n7ïø”ß¾ó*×w• ëðàÃÿLÇñ¬}ó­I«/rVˆs¢»Ÿ€Ï,A"1‚®©TWÍAʳr*•býúõ¬^½š––LÓd``¯×‹aè=zŒ›nºéqà>À:- ¸®K:“æÀ±ƒŒ&2ÔÖ׉”"„Kݲ¬ÛðÎcÁ{[w³í“fv¶áf¨YPÃ5W}]3èìÙDz¥5ø¼æx8Bðï|‡D"î8–ÊË˸öÚ¯Ü<Œ¶:5,l×ÁÐ dY&FÕ5ÞywàÐÝÓKÈçãÙ†çØÕòña\ÛBR4×ÉÐ=0LcÓ^Ö64°eóFdEÂ2ë×oäÉ_ü’·Ö½‚®+¼õÎG\åE¨ª‚ë ®¼òJJKKéíí%‘¥··X,F<ç©§ž±(çF#êD0ŒŒ°áÝM8Ê‹.¥zÖ|†â1zôavíÝÃüªy ŇI&Ô¯¸—u›ß+  „C[çìäÙgžaß®m„^¼þ\Ùƒ-\’©$×_ûçüæågI¦,>øx;«.XŽadìüóÏ ‹qôèEahhˆ-[‚lܸ@cÐIM&Y¿eíû0ûÌJî½k o9çÖÖspç~|þræÏ›‹7á'ß¿+=LD3@÷"›îÞA·îåé'~ÁÑC{|HŠJÚJ!«2ªæ¡8RJw2ÉãϼÀ¿<øOþêeÎYºˆ€ßŸs›¬+ƒAêëÏÉá#A4›ÄÑ“(‰„ñ=œ{q¿ü·g8ÜÃeß¼†57ÝÆ5—]‚â QVàï¿w/Ö³àúz@"òÞöÃüëƒíïÂ0=ȲŠ$Bd˜¸’NqI9ë7þžô„¤ÒÑÑÅ¢Ú€„늼¨®+ÐuÓ4'¹»Z=A–d–.¨¦­ÿ7Ür5ÿ½i õ»ñÍ_P0xÙÊ Y¶òB@L$ؼm?¯½ú]'މD$IÎ "„•Í‹‚Œê 㤰cO+Eá"zûcÔ.tÇCGö.Æïª:²òÄ`‚$qÓÕ7’LZôt÷s㚯³¸¢Çu ö;…\í]¬}{[×â†I–€ìß (®›åzEÓ1<~Ö5~ˆéõ’HY¸®È‹îø–db¼˜R|Á¼þ>Ó 3Ã}W^ó5E)ø¤‰³ï^}c›6¼…#\4UC²š".®+êÅu%a#«†?DëÑv<†Ç%çjîøoL zÓ* „Àu±x”Mï¾CWÿ笨çöoÞÎÖ¦mض3Iè±ië‰ñüs¿&60€ÏïC–@’à GHhžRJÊ«0½>ìL]WÑtPTCS ,î$ef°@Öl‰t’Ö¶Vú»{ø ©‰¢P€o{Mž˜`xþÅŽiÁôç„Ï…ëØd?\Å’sW±ò¢‹©]R‡ëºÈ(H’B0Aš.ä7®Ëwrf² Œð¹ûŽ»8ÞÚÆÑÃmŒ¦-tÝ(Xý|¿ŒŽ¤Ø´±¯áÁÐt$rn{`gRxÔŸw1_¹`%áH)sæÍÇãõ"pqAÅÜy ôðzÆ…Í²ÐØ³{º˜†IÃÛkY~ÉWêåîoÝAmM͸ÀÉD+έL–1~ÿîV>Ûµ“`Q‹ª*9_¶°]¸øŠëYµêOèíé£ëD7ÃÃqd7ƒ¦ª¨ªJùÜJúz»˜=«tÜ®+rîTè®S55ߊ"óg—]F‘×iz¹èü•˜¦™Ôΰ®ñ-ŠŠŠX}Ñ¥ IŒ¦Ò|ºs7Žcãñù±’#HªŠk[8–…æŸÇ·\ÇŽ]û@VIYIú{znš@°ˆ’²9ÈJ€XtÃÇûñû}¨ŠœçÒ…”:£\ÛÆ4L®¾ü2.»d¦iäüÑáƒ?䥆7ÑhœmÛ¶‰”£ª¾@à ¡ë~dÕOÝy_!è÷Ò78Š5F bƒ½”Ï™‹îñPU»ˆááaZöíçÑ_5°cïñ ´)&dw3`@’eTÃDVµœJ®€Ö£‡ùÝÖufûéîãÃ–í¸® åP==½Â¥ø‚‘Yxƒa‚%sð•Ì¥f~‡Ûº8ÞÞÇáCm ô¶ëëäÒ+®Åô™UYÍŽM¿FóaYë6oÏü Ш$+Yö°mš>i¢åÀ>œLšW7ü—?üÞßRªÓs¸!\>Þs U31=~d-›(ÉŠ†fø(.™M2•f[s+¶Òqdí›™UfáâjL†u¾`)ÃCƒ¸vjJ¡ÇÀ=-ÆÍ%\6ðÕ55¼ðú+Ô-<‹=í»Y6)³*¸ÿþïcel„›¡¥õºi¢ª’$®Œ¬*¨ªFIYíÇŽòÙ®}ô÷v0ØuŸ?ÀmßZClp¯nÐüñÙÇÐ@Âu¨® OÈÐòW~ œ "·n%:ÒËÖmïÑøþZ,k”¯­¼EQ)--¥bÎl$Y£¿§'ˆ¢˜¦€ÏG0¢¨(BiYõË—3:ÐÆHßqÊÊÊxü‰§9ó¬³9q¢“®Ž#iÙJʶˆöÁç5¨?sAs'éó$u3³Æ6ªwÝø øñi?ÚCq¤œåµP»ha¥I’@4]ñm‚Á‰¦i”•–PRæÂËXsÇ Œ PV O±ñý´´´püÐ^†¢QtCG‘aŲ3™]ÁqÜ\=A*`¢S)Q@£c×Ìσ?üÇ;Nà÷ú8{ÑbdEÅÍÛÐ •ó«éhmÁv2TVÎA×U¼>sg•QZZ„¦€H%0T‡Þ¾>¶lÝOSÓGtv´³oçGÙ€å8,>³žK/\†¡«X–…¢(H’„,ËÓ®þÜ<¿ƒùUg0¿jþÉø;¨“xùÊùçñZk ÉdUÕXX]AYi„’">¦8Œ$F±‰Ãí}lÙ¸ƒ{›’ b^ ¡P’¢ºªCƒþþ?†a i*š¦3Q¾S*0¾óëR§ $c[âu Ù32:Š•J²tɼ††,2I.VŽèaÝoðéÇÌ«œÍsËñy½(²LqI ŽmÑÖvœp8Œe• ñù|hšž·°§‹IègRÉжm2™ åAƒ`q)«Î¨äȱNÞß¶‹Úšy˜†‚ÇôP1§œ­Û>㥗~Kk˧”ùñ2‰Ñì–D×u2¶mÛ„BAÒi EQQY–ñx<3VLÔÂ"Zžà¹’†( Ù¬¶m“N§‰GYY¿„¦mÛ¸îªK¸ðü¥Ø¶ƒa¨`»¼ôêk<ýÜK8é! ÙB•ýÄãqFF†QU ]×0M“T*M2™$?‰Çã¼Ó` °ÂœÏcô6VEîïëÆ”bèŽÅ£ÿñ8ó©L–et]ÇãñR\,áõz‡‹Æ+ÊŽãâºöø ksËmwQV>›H¤˜ht€î®.^záµàì¥çpó­w¢sio?ÎÇMïó_¯ÿfÚ¾I_íü0^`‚“ϲ,cšŠ¢`&~¿=©ÇÒÂÞîî¸ë»ÔÖ.ág?ý'šw|²å+ù›üwÜù]øáýÜzûªkòï<ÄΟâóû¹sÍ=ÓöM â©ñ"ÆY(_MÓ À6‘ŽÇ˜7ï ìß‹e¥9°/UUÙ÷•ssýûH$FI$FùéC?™±oŠ8P(ðÉH,f¤´ü½ûÄ6VÊÖ6c¹»‘{oÙû@¯¼þöø¸¿¸áªiû¦(«ˆ)ŠJî¤ éTÇC§¢»T*•;÷ ekã¹ÁtîýX¿¢ªã‚M;Uߤ”2Ð'ËùÁMäí\9Å1ÑdEÛŽ`ñ’³ÐuƒEKÎàxî}[[ö^RR:IÀéú â@oo÷$Þ/t›É%ÈÉ}…ã÷íÙÅSOþœ… sËík˜5k6áH1Ñè Ý]¼ø|–…j-áÖÛ×PYY…×ë%d÷g;yì?6mßöæ½'èîîšFà|\ˆ)ñ2USàÿ$LZb™—8­ÍU>×¾ÙÀöæ½_j4·@WWç$áò³´Ó=ïØšššÈdìSî·>Oëííçþûï¸^VZ[[ñû½3æ§úa:A.¸à‚)™ë‹´ 6Ž=îöŒÇîîn†‡‡ùCnÄãñ)M÷…¾ú¼ž.ÉØ+cYË À—;¾”þ€ !€tî£N`dLØpNxå@H À–ò"²ÄOcŸÜü¬Ú¸LLʳœIEND®B`‚Apache-Gallery-1.0.2/htdocs/video-mov.png0000644000175000017500000001035211573732716016330 0ustar milmil‰PNG  IHDR04Ì“»‘bKGDÿÿÿ ½§“ŸIDATxÚÕšklTç™Çç2ž›=Øì0PœØ\jˆc.¦@ÛÅŠê%Q?di·—ÐlÉVm•*ÒöCÑJQ£d÷KJÚ)¨¨”„„&i.Åà;€mŒÁöà1cÏÅs;·w?ÌÌaÆ6íj«ô•ŽÎèœ×ÇÏõÿžç€Ý€ø,555ÃUUU¯3w°ÄåË—ÅÄÇ…BÄb1q»e†H§Ó" !„¸yó¦ø¿¬D"!Z[[ÅÓO?Sª ðòí„—!„˜t#‰ „@AYYÙ¤û¦ib†aÇí½wÝu×-ËLñÜé–išèºN2™¤££ƒ 6TÃ@ °&þÍm5ÓuÒÒR ØtÏ0 t]GÓ44MC×u*++í½9eþÖeýýý”——óÀðÎ;ï\*×TòªÓ=,LºžN§ ‡ÃܸqƒsçÎÑÜÜLWWÃÃì\¹’¥K—²páBq:(Šò7)¡ë:>ŸU«VqèÐ!üñ+étzJOÜ6„˜7oׯ_·­‰Dèèè §§‡ .°dÉêêê˜;w.¦i’L&iii¡¹¹Ó4yöÙg¹÷Þ{q8¦ÏÅÜóÓé4ÇgÓ¦MX–…,ËôööÒÔtš]»¾G4R‰)ª¯¯O\¹rE\¹rEôööŠ'NˆíÛ·‹;wŠ#GŽˆ@ P°?•J‰öövqñâEÄo¼!V¬X!~÷»ß‰h4*,˲Ó4§<âñqñöÛo !„H§ÓÂ0 !„ÍÍÍâõ×_Ï%ö=ÙÄ–¦ !Ó4©©©áâÅ‹hšÆž={xôÑGùÆ7¾,†bOO]]](Š‚ÓéDÁ–-[¸ï¾ûxä‘G‡Ã<ñÄ8N$IÊ·=ùÎ’É$¡PˆO>ù—ËE(Âãñ°`A à±Çû1ðsÀ´is ³³“¦¦&<È®]»˜?>o½õ[·nµ•hoo§µµŸÏÇøø8ƒƒƒ´µµñä“ORUUÅ‹/¾È3ÏŸûï¯Ë(ÁØX8='ó€Ó49þ<š¦ñõ¯}ûöQWWGYYBÖ¬Yc[Èív³{÷n:;;q:¬Y³Y–I§ÓÙÎHèp8˜?>‹/¦§§‡òòò<~X–e'1HX–ÈË °,AQ‘ —ËÅm‰,÷Ïb±ÝÝÝ|ñ‹_àË_þ2~¿Ÿp8ŒßïgݺuÊΞ=›uëÖ!„ ‘H`Y¦iÚg!ñxœŠŠ fÍšÅÍ›7³V–1MkXy9‘Ÿ#™‹·rgÃÃÃ|õ«_µqÓ¦MèºNQQ‘½×0 û ¹xñ">ŸúúzLÓ$bYº®Ç‘eI’Â0L$IÎKä‰áTXŠLW–¨¡ìüùóø|>JKK è=‡JN§Ó¶p:æèÑ£´µµaYªªÒÒÒÂÎ;ñx<¤ÓiEA,C–%2T0QpQ lþõ;R ßuuuö†Ó§Oóæ›o‹Å¨¬¬ä'?ù ªªÚŸJ"‘àìÙ³$ *++iiiaöìÙÌž]HY¡¬‚É ›óNæ·5my®N¬K|>£££D"¼^/š¦188ˆÛíÆãñ ˲])*Š‚if,344ÄÀÀ/¼ðÕÕÕ455qèÐ!àüùóüô§?Í–Ö¤8Ï™BwB¹MUUó9þ<ªªâv»éííåСC óµ¯} MÓ¨®®fΜ9hšÆÐеµµüò—¿dåÊ•´··óÊ+¯PRRB4¥««‹êêjî¾» —Ëmƒ@F@+F"›x=wì|ˆŸýìglÚ´ I’hjj¢¶¶–ïÿûÔÕÕ‰D°,‹²²2¶lÙB2™ÄãñPZZJQQÍÍÍ>|˜ÞÞ^¶mÛFww7ííí<÷ÜÏQ]× Âq2Lbÿ§5vj¡3føhll´{ÒoûÛüèG?Âív366V€ÿ^¯UU1M“@ @,㥗^âòåË466‰D8wî«W7àõãõ“L¦p8TÕaçO¶¯š§wÖW«…0&PUË–-ã¿øåååÜÿý†A$)`X˲ˆÇãèºÎøø8½½½6oÞÌÆÿŠßïGQT$‰ }B!äÞFLü9ðùJX±bÏ?ÿׯ_' 200ÀGgïÞ_³kדlß¾§Ó‰ªªÐçS°,iZ†‰Ç㡤¤˜ÇŒ—_~™òòr6lØ`'mkk+ñxœH$’eW™¥K—’L&éëëãÚµk$“It]Çï÷³|ùrX¶l%%%¸\.*++ÑuÁÁA–.]Jww7|ðg.]ºd‡l&¼î8„2¸lšš¦áp Ž0oÞ<"‘0¯½öµµµã÷ûñûýX–Åèè(½½½üéOÂ4MÖ¯ˆÆÆD£Qâñ8ñx‚“'OR[[ËñãÇí’$W 渤¼¼œºº:Μ9ñcÇØ¶m²,M*5¦M⌠L3çk×®E×56nÜH4¡½½¡¡!†‡‡éëë#‘H ±,‹7RVVÊC=„®ëÌ;Ë2q8~ó›ß²mÛ6\.õõõ8‰rƒ±Ó§O³jÕ*öí{õë×ãóùPUåÎ=ßo˲ÌÇ7ãtº(.ö"Ë2+V¬¤¯¯p8ÌܹsQU—Ë…¦é¨ªšE§S.hMEell Y–éïï§¡¡ÁŽq˲PMÓX°`­­­Ìœ9“3gΰnÝ:<Ov Y†•q8TÖ¬Y‹Ã¡ráB'=== ¢ª*3g–SRRŒÛíA–<7 «p8(JF‰Dæ8'¤Ãá “H$H¥R¤R)»üV…™3gâ÷û9zôb±†¡cšF;OCd¹òÀáp ªÚÚÚ(*r"ËŠ Ÿ`‘m ²^ËX§³³‡CÅáPó;¾lG¦2c†Ï†Ý\I®i–e …ì’½´´]×9{ö,ýýýø|>EAQ¦æuœI’lÈ\·n-'Nœdùòz;ùò;­Ü[[[©¯€sçÚp»=YwK6†'“IŠ‹K`ÿþýèºn¹Yk®ÆRU•ÒÒRÚÚÚX¼xEEEYnÓç€$ÉȲ@UU>þ¸—ˉÛí¶§Ñ¹z%÷°d2‰ÛíæâÅKx<½%|08B$!066F2™$N#I ªt]C$ÉvÇ …B6RI’ôi ˆ¬d­ °zõZþú×SÙØVòÈÀʶЇåË—ÓÒrÇm‡@(âøñ¸téµµŸçž{î¡¢b>Ÿââb</ªªd[N™ññW¯ö³oßkD"{Zñ©ïÂá±EššNcY™0ihh˜Ðx@"'™L’J¥²-T__<Ê?b½ýÇßOöÀ­É€ÄêÕ«8{¶9ë EQ²Y6»Š¢R_ÿ­­­¨ª‚ô¼óÝÿwŽÄÄ·ÊÙ ´d]{ jS©”ýR#ֲШÒÑÑ¢"ÐCÏ ’£Ý´þæ ÉþåßcÁæÿàøs%s¿À=ÿ²WY5Î’¹h±!’c=ôýù„ePÿÍIG9óßóXõÔU\3ª8÷ë@ËÄj4ŸÈ$êê ­­ÖÖ6;?&–¸’$!IK—.åÂ…ŽI„ã._Ƚ_ùí¯oDu•q÷†ç î×lü¾y«éúýWí9JùÂGX²ã ªÅùß®%9Ú»|!ÞŠû–ŽkF‰ÐeÆo´L$2‘7êÈ B{{»Ml™F›þóyE‘éêê̆X¡›CÝo1ãsëXü¥×¨i|Èõ÷½KˆœÂ2D¯Ÿ ¸bÁÎý”/ØByÍF²×¦hh Ií¾û³“%K–Lä¯K—.±hÑ"._¾lÃqnuý3¾ÓIŽc¤"|üʽÌ\8`ßWм™6u|8sŽgβÃk+PõàQ¾` –©(5eKy+„ºº>±™övUa*•B’dº»{ò¦m·–6>Ä¥#;™¹x;¡ËD‹ ¾HÑâ(E^ÞÙèñaм•èÔãž ]düF¾¹_@“ñ­$G/ݾ©Ï/>ÿùÅȲ’ףЂL:΢̂5¨ª2eºü.ù7B—Mº¶g:³Ï­CV=ø>—™½Žg¯ç,.É ²RT`ýIƒ­[, ªªÐÛÛƒªæ¡nõÎétʆRYV¸vízvâü·½^í}ÿ„¯§¦ñEÖþxœšÆ÷Ä•÷~`ïé:`çæH穉ìÆ@Á?ïë»ÊÝwßM?UUU³KM»Å¦iL&ñûý ðûç ý‡ðÀó‡§ÉUU¸eÕ\9«ë†afK\Ó®çƒÁ`¶Í0ä‘ ßò@ 0Tà@ À]wÍ!ØøŸÃü©~———3::j–pêÔ)tݘâE÷§ÁàM~øÃü'pدtwwS\ì)x°,ËŒŒQUe ¡%›Ø„Èœ#‘HÁ ˆµk×ÞVпç3€cÇÞËýü¸`Ãè7ˆÅb|–×àà ÑhtJW~f¾ºÃã·Àúì J®òZ x³¯/¥Ï°#Î~/1Œç„-Ë ¯ü(`I R¡Iüó,‘ûZå@¾¥€_­îiIEND®B`‚Apache-Gallery-1.0.2/htdocs/video-asf.png0000644000175000017500000001032511573732716016300 0ustar milmil‰PNG  IHDR04Ì“»‘bKGDÿÿÿ ½§“ŠIDATxÚÕš[pS÷Ç?碫%Y6Ç µ!Äc®¡Þ…¤¥Îa›išÉC&Ùl¦°Èö¶ÍäaûnÒdKgÒ}Ø4”tÈfKšv ¹@B!0ò%8±ƒ±e ä›.–ä#Ë>H:H¾A¦Ó™ô?sÆò9ý.ßß÷w9``|Žêêêë‹-ú-° (,ÜÂ2ºººŒÉ+†a±X̘i©ªj(ŠbŒŒŒ†aÃÃÃÆ_²‰„á÷û§Ÿ~:§Ô"À ˆ3 /†aS.D" ÃÀ0 JJJ¦\×4 UUQU•xû,wÞy'ËÌñ˜»¿¢(œ:uŠÆÆFt]GEzzzhj:Ëž=ÿL4¢ÄŒ ôöö000Àþýû)))a×®]¬Y³¦óŠ¢ÐÕÕ…Õj¥¸¸˜Ó§Oóâ‹/ò½ï}íÛ·ãr¹f‰‰$'Oþ™­[·’J¥$ I’¸pá]]]<òÈ#ù1‘ y¶€ª®®¦»»›ªª*.]ºÄ /¼ÀÎ;yüñÇÅB8^¾|™ŽŽ$IÂf³a[·neÅŠlÛ¶p8Ì£>ŠÍfC„œíÉ×Å0 ™L222ÂgŸ}†Ýngdd§ÓÉ’%Õ>|˜ï|ç;?žT 5£:;;1 MÓüüç?gÏž=TVVؾ}»©D[[~¿ÇC2™d``Aؽ{7‚ pâÄ ~üã³ÿ~Ö¯_‡Ûí™HLLLpìØ;¼þúë$ CÏ‚ÊËç±}ûý<ôÐC«€+@lVÔÔÔðÖ[oqàÀ}ôQÞ}÷]ÞyçÖ®]Ë‚ ¨¯¯G×uÞxã b±.—‹¡¡!:ÄÒ¥KÙ·oš¦QWWÇöíÛÙ³g§OŸÆáp"Ër Ã@× î»ï>ÊÊÊ…B$qB¡!Âá0Ñh”äÄófYi|V:vìï½÷{÷îåðáÃ?~œÆÆF¼^/±X Ã0„B¡,†'ˆÇã”——›J¥Rx<æÌ™Ã¦M›xõÕWyê©§ðx€5Ç òL¬0::J__ ¤R)NŸ>Í·¾õ-ìv;ñx»ÝŽ Ì;—’’âñ8‚ ‡yþùçÙµkŠ¢011AQQétšeË–ñòË/óÄOàr™ðÈ-]׳°ÉäÇÃÊ•uYã$ ç³çÔ<‹MÓèììä‹/¾àÅ_äàÁƒÔÕÕQRR‚alܸѴ’Ãá`ß¾}\ºt ›ÍÆÆEEQ²8ÎÜÓb±PYYɲe˸|ù2¥¥¥Ùü` ëºÄ  ë†Å ¬V;v»Y>eÆb1÷Þ{/>ø >Ÿp8ŒÏ磡¡ÁÜ«ieee444`‰D]×Ñ4Íükñxœyóæ1wî\†‡‡1 M›ìy=/&òY*s277Q  ’H$ذaƒ™I§ÓX­Vs¿ªªæßP(Ä矎Ç㡾¾MÓˆF£èºN:&#Š"‚ 000€ªjX,¢ —B",,Ef+KäÉTfÐÚÚJee%^¯· Å«ªŠ¦iØl6ÓŠ¢pôèQZZZÐuY–innæ±ÇÃét¢( @€ÑÑQÓ»’$"…ÏYù¦Wæ–=PWWgþöìYÞ|óMb±ååå<óÌ3Ȳl ÿÑG™ ¢ª*ýýý477³aÃFFFhkkC†††¤ºz š¦$ÃB/“(væÚIÌ·~NÛÞÞ^æÍ›@{{;gΜ1­‡‘eUUéíí¥½½‡Ã$Iˆ¢ˆ(Š„B!Nž<‰ (ŠÂ‰'¨¨¨ ¯¯`0ˆËU„,KFŽÿõ<:5²y=ã)mv2›³'³‚ŒÓÜÜLUUn·I’QME5M3÷K’D(¢½½;w’H$8wî‰D‚òòrš››)++£¬l^ÖXzdrÂfX(÷YŸµ<—'ã?´£££D"ŠŠŠH¥R àp8p:ˆ¢hV‹’$¡eédpp@ À/~ñ ªªªhjjâÈ‘#lÙ²…@ @kk+?ùÉ¿áñ¸ 62…4jÜ„òo¶hQ%­­­È²ŒÃá §§‡#GŽpýúõ\-B*•¢ªªŠŠŠ R©ƒƒƒÔÔÔð³ŸýŒµk×ÒÖÖÆ¯~õ+Ün7Ñh”ŽŽªªªX¼øk8Ž,÷€ž…Q&‘M>ŸSôKy ¡áïxî¹çhllDššš¨©©aïÞ½ÔÕÕ‰DÐu’’¶nÝJ2™Äétâõz±Z­œ?ž·ß~›žžvìØAww7mmm¼ðÂóX,2š¦™PœJ“…ܳÆN.ô@kÅÅ.\hö¥O>ù$?üáq8ŒðQQ²œ* ‹Åxùå—éêêbË–-D".^¼ÈÝwßMQ‘ —Ë¢L Ë3v²mÉ$:½µ¾Z.¤±Ì!Šóçû8~ü}JKKY¹r%ªª‰D 2¬®ëÄãqÒé4ãããôôôðÆoJ¥ØµkMMMƒAŠŠŠˆF#¼òÊ+8vFGÇÌb <žb‘o~óTTøe© NÊ/øfQ@7³Xdìv VòÒK/ñÔSOQYY‰,Ëf&N§Ó$ Âá0Á`?üp8Ìí·ßŽÏçcxx˜¥K—²zõjæÎ‹ÕjÅn·SQQÇãÁb±ÐßßO("ðç?ŸâÀ_³{÷nvî|Àì¥oxà& 躦騪†¢(ØlVî¹g3##Ã>|I’ؼy³´~¿Ÿx‰¡P›ÍFUÕ׸ÿþí,\¸UÕ˜??“e­V+Áà5^{í5vìØÝn§¾¾‹Åb²Qn8vöìYÖ­[ÇÁƒ¯±iÓfŠ‹Ý³Že b@Èó–(Š\¸pp:X,DQbÅŠZ\.ÑhŒòòyÈr&^A@’$.¬D’Ä‚UU Y–CE®^½Êúõë‘eÙ,%$I"•J±dÉü~?sæÌáܹOhhhÀétÞJ“e I±XdÖ¬YÃÇŸ¡¥¥5¯^§Ó‰ÓéDU3|.P__OkkV«¥€Ç¬V ›ÍŠ,ˤR), ñxÜô@îÞÑhI’˜3g>Ÿ£GRW·›ÍŠ ˆ7Od¹ÒÀb± ËZZZ°Zmˆ¢d2è¦u-=;"1èèèÀb‘±Xä)­¢aȲŒÇã6i7W’§R)t]gddÄ,Ù½^/étšO>9G€âb/’4}N'Å3‚ ˜tÙÐðuNŸþˆÕ«ëÍÀËï²r7ôûýÔׯââÅŽœ»…‚ü’HÄq¹ÜŒpèÐ!Òé´yäæ­¹K–e¼^/~¿Ÿšš;²ýƒ1{ ‚ˆ(f,váB3v» ‡ÃaN£sõJîfÉd‡ÃÁçŸwâtfнÜà*'|<çúõ‘H„`0ÈØØÉdE™ÈÌB:Â0@³Ñ‰Ç㌌Œ˜¥ÇM0² µ€Ä† _çãÏ`±X$É ºÌV=Û& 8NV¯^MsóEœNº^ØçqêÔ):;;¹ýöÛY´¨’yóæáõãr¹(**Êë'$ÆÇcôö^åàÁ×̺ë¦y +P¤©é,ºž±àúõë'5HÄI&“LL( šª¯¯Ïó€Ž:Ƶ1Œ@U98­ Ë Š³ÔP”T–eÚÛÛ³YSÈîÏÂtοë‘ð.¾‡±Þhÿí7ÌóEå«XÒøKÜkHŒt2Ôq˜þŸçýS?¦«Fó™@]Ý*ZZZðû[Ìø˜\âfò€@mm-Ÿ~Ú~Ó:¾¨|ÞÅ÷P²ø^ŠÊëˆ_ÏÜù?ü/Ž’*.þz5©ñ UßÜ?­Ð3tdFÞŒÆ@DÚÚÚÌÄ&I¢)p._Üè…E::.e!–߈Oµÿ‚ ß 6˜æ‚õß7¯YsXx÷¿"ÛKùü÷ß^òÔ–òFR[±b—.]bùòå™u2娥««kZ¡ÍŒì^@YÍ·Q•(—Þ|€µ»»([þW>|†T,@×Ñ'©yà·”-ÿ6sk¤ëÿþ‘ëm¿1¿Ÿ¥œ7ÄÉÓ°”DQ¢£ã33ÓÎÔ›NLL "ÝÝ—§¤ûÉ{ç¯Û‡(Ym6ì@²!Jæ¯Ý ÀðgÿÃùÿªáZëo‘%ÿ9B¹c–¦>WØ ÜqÇ2DQÊ«mŒ‚Œ¢(YY²¤:oÖ3UxÉꦢðÊœú©@ó«+¨Xõ$’ÕÍ¼ŽžNhz)38¼ue†I7~T–%zz.#Ëâ4£ EQÌçÄ¢(Ñ××oN›§[β wý%ÒGb¸€x¨¾3ÿŽÕ=gÙ bÁfj~ÇœeÄÏÓ}l÷M0ÙµkÁ‚¿r¥—Å‹sõêU-ZT0»L¥näMSI&“ø|>ƒø|CǸ|ì»ü5Ö¼=ÃX%ç@ ?o†od{᪪¡i*º®™µ|(ÊV¢…ðùÓ~ÇòW[¦‚ÁÁƒAn»­‚`0hòŽó§û\ZZÊèèè´¯%œ9s†tZ¯/û4?æ?øÀ¿ÃÀ! »»—ËYèzQdh(„,KÓ-˜‰-SAfÞ­˜îÀÆÿ"ÁsëÝwßÏ}ü,Ûg tíÚ5b±_å500@4eºËWæ}¡[<þØ”}DÊe„µ@Qöñ¥ðv„(ÙW ñœ°%Y᥿´ì{ @ò2²ÀßÎ2ro«ü?P<{®ëIEND®B`‚Apache-Gallery-1.0.2/htdocs/video-mpeg.png0000644000175000017500000000667011573732716016467 0ustar milmil‰PNG  IHDR04Ì“»‘ IDATxÚÕšipUÇOV²!ìPla1e_FÖBDJBËÆ:.¨#NNi1U~PF©¢Êš/€øQ©A‘]@!€ˆ,a_ a ²õÜßéwßëN^Á©ôTÝêî{owŸå¶~ODd¦Îoaddd\îܹóRs>ÑŒffÄI#ÈÉÍÍuêRYY™oÞ¼é4DÕÕÕÎíÛ·k×®éõÕ«Wÿ…nݺåäää8o¾ù¦ª³IfD7Ä| Õ[())aAGZZZ½õšš1è0Â÷¶mÛ6¤™0ÏD<³ªªJÊËËåСC2f̦»™qÙŒ 3jëÞÓ d<¨yóæÊ`]bŽõÊÊJœ·iÓ&¸× s·ÄýgÏž•-ZHÿþýeݺuLŸ6£ áøô°‹/Ö›7‘ââb¹té’ìÛ·OvïÞ-G•Ë—/ËàÁƒåþûï—=zÈÃ?,Mš4‘˜˜˜»e@M›6•!C†ÈŠ+dÚ´i§Í{ÃZ¢AHÇŽåܹsAm+L{òäI9|ø°ôîÝ[úõë':tPócú½{÷ªP\Ïš5K²²²$..²/Ú磜ììlyä‘G¤¶¶V¢££åÔ©SòÓO;åÕW_“7n„"¬Cåçç;§OŸÖaâlÛ¶Í™2eŠ3}útgÕªUޱŽoEE…sðàAçøñãºöÕW_9ƒ r>ÿüsǼØ1 ‡.ì(++uÖ¬Y£Ï#8$ £géÒ¥Ö±»ŠëØQ!„MXÃâüÃ?”Ç\žþyÕŒ—°0.À>úè£Ò§O™8q¢Bî¹çžÓµ¨¨(¯îÅk|α¢‰jrìØ1IHHÐó¤¤$éÞ=C¾øâ ™:uêßÍÖ@¹•}àÈ‘#Æ|?É—_~iLøªtêÔIV¯^-“&M a´.&ô)fKKKåüùó²ÿ~™1c†˜˜.óæÍ“wÞyGºuë&C‡5ûR%¼;yñÅÅ„Ts^km‚DkóÞÇ8}ÅŒùf”ÂfD°ÂòåËU{6lõë׫£â Pœ"œÉ’’’"………²lÙ2uâ™3gêýø£CILL”ØØØ ÓV7è’ &H«V­äÊ•+Fˆ2s,T ʧŸ~jÙk.nT*mP€_~ùEV®\)&©¨é6mÚ¤ÎEh…a^ˆ£ó"Èø€æ©µÐÃ2ééé2zôhÃÀByýõ¿èœß])€÷a)ÆóóO+4 [¶4•7²oáV€ëׯˎ;däȑʚ?~¼b&9‚å–-[j’cŽk^ˆ¯<ñÄQ*99YCc¯^½ä“O>‘^ø³¤¦¦ÖÃ?„E]ظPBо}ûtKŠŠŠíÖ #ùà&Ì~àÀeüÙgŸ•E‹) `”õ|0¨!àTð´Ç„yÃ.‡„Qü!pxU(?8ʸubxJ!¿½ŽOPÅÕ¥X/óðÈËË“±cÇêõ“O>)íÛ·Wír1b„OXðÊ×0 3ÌÛ#óX¨uëÖj1S/´mÖý•ó!Ÿðúˆ;ò}ɪO?ý´^cF° âããƒ{qr{Ä·ìŹa§CîC,Ì.\¸`î©1ç6;ÒÃ'Н‰T–ÔÉQøÀÎj &lT*VÃ@eíÚµ6¹FCdb“ì4v³Ž£ãS0u£££ÄMuw|Ìzç%€×`ÞÒÎ;5”òr"̻ᆱŒZæ·oߌIéÆ Ó$Dž@ó„X´Ÿ‘Ñ]1íâܯe¿0N8…'OJuo:sæŒâ¢î!Yíâa”}¬ãÈ8$0€Ó–-[”i„ܼy³´k×NÃ2ÊIII6û£ƒ ºñ¿ÖNÝ_Ûu×7j" àn– #dU4I%ìÁ$L±ÆC(Ùý¬Ã8zˆ—PT’ˆä‰BîMÍš5U³Ûžô¥—^’·ß~[­QTTä‹ÿ@ K¡Q”HE¹››«Ï@Xº¶aÆš½):ÊË+LfŽ1÷Åý'ÐWy`#â-ò)€ë(<ø>úHS~ß¾}•Y˜ñfXŽ$(rÆ©Lµ–C(„,)¹! .4ði¢J¸y³4È £7î!Íô11±š'ü}‚?ä6 €‹¿øø8u4ÓMÉܹsMõøºÖ1hÚfb˜&ºVaò‡~Ðóž={*” ”ÔÔòû¨cð‚µù‚¨…ƒoÝšm*Õ›’{†˜®Oó ïóGŸ;€çS›æÁtjjŠi¦§ÊüùóÕÀÉ:- ÚÇ*nvÖf0­¨Æ|ÎF±,Ž0„VÖ‰pÜ‹¯lÞü½œ8q"Y^†—kjª•ɸ¸xm&h^JJŠeñâÅêÌ4.0ÅÀb„\àóÝwß)´Feð?N£B–•ÝÒlͽ4ì¶$±Å Í%(‰ ±k×.mž”uKˆNìZ ZS¦Ð>ó6Ùc”-|JY´h±6@À-66¦ñðöÛ\ÑOXŒ#¢xåÅéé-ÔG“”ᤤDÃÔÕ*÷2gC¤u`Ë${Ð8Ö£ccØò›=0<×®]§þU]]¥°eç,€„¶<à%„SÊäøø&Ê ŸdÈ@°š«º2„ex:>%æ—6ìÚ’x.U«-ÙIˆœSGa-`O4pár‚G—²!sĈá¦Þn¢È€ óy;-û@Ì>`@“´ö«U\sG„t4"¥¤¤*Œ ¾\À¤ö[«­±x?‚ À^½z*/nnˆ €-°è”¢£}Èž={5ùÒì×h[¯Ø‡ÁëÇŸP(…0bžhFÈÅ™‚9Jm¶ai{y·í±–±‘ŠgÞA' €´cJ€áòã;ØŽñ$Q(¹­b”2M¬ß»wŸ Qëiua";{«Æ÷ÌÌû¤k×®¦ßh©Ð $'%%ë»Ü–“2þ¦)ÕÏj$Bh}Sm½¯ê~ÜÀTqq‘O>¨â8\5ü‡èG§Ä’ïå^ÒšoÿSß¡/QÆCŒ3íX&J­ÀºÍ²‰fþäºWÖÖËÄzìÌð×´vûÎþ¨aiÔ,ƒõëy’³äR]~MçÚ|MºOø—žgÏŽÒ=–jk*¥ôâ^É[ÿš”]Αž“KÛ¾ò1—¿årnÇliÞå!é2柗$I-Â#Rxl¹®AuªÑÐÀv¿~ý5ääìXÁo-²ƒ”Ø¢‡d=õ\:NbÒÌKg‡ÕZölë{N6{¿–Ì)KeÏüÞAæ´.u;GRÛ ”c_ÿQ®ŸZ'qæÙãç×Ã@HÌFkéàµ>”ìðÒµ¼Õ’Þc’ôzl1wKɹmz]Ÿju/”–qG˜$µÌÔã‚Rs»XÇ‘å“à à½ÍMj|ß'AñKLÝO ÊÊ…SÁ¹¼µ/K³—Hë¬iR]Q"{d °%­2ŸÒ³’³[}+^˜Ykèösa×ëµ”–ȾG fÚ;U…•¥äĪé’ÞkŠ\ËýV*ož»oÔ,“«Êåêñê^ ¡šÊ2‰‰O–¨è¸z¾Ô l‰@ÌÍÍóõ¨õ­¢k¹ßèˆDᘌDeWIӎäI³NRQt²ÞºÏÞ‚‰ärêÔIs }„òî%“Æß+ Ó¥KÔ‘½Úe.wõt9½éoÒõ¡9Òú.‰mÒÌ@©@Šò7÷Ù¥K}ZÎÏ?#]ºtÑ‚ŠŸŠ¼ß.)Ÿ)+’n|OóÀÜ•| œ |ÇY‡º…¶“—LH2¹—´ÀÅ‹Äk ¯¶mÛéÑFLoø´G>«WUyÍ÷;ȯùž!ºr媼õÖ[œþÕŒ«f,S ÐP§¤$ù^J-,¼¢–ð2ížÛk‘¬¬>z´kîÏG~ª+įjÆöô˜‡9QøÛÝÏo™èéÚ¬¼k¿™ÿ 5r|fÆhqÿcƒò`3’Åýùòîõÿ—මÿ—ÀiK-³iæc~И—›qËŒjˬýÂú{!÷û»¡ÿ0Ò!¨”JÆIEND®B`‚Apache-Gallery-1.0.2/htdocs/c.png0000644000175000017500000000344511573732716014652 0ustar milmil‰PNG  IHDRd{À˜•gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<·IDATxÚbd``ðeƒÓh .@£2È@FÈ 4!ƒ  y V‡²oñ (›ˆå¡ìŸ@üˆÙ€X ˆ…¡já0SJ?G2‹ˆ¿ñgùSÿœBóä áòˆoSÓ¡„/BXA–îß¿?ĉŒŒ<÷âÅ‹E@¦‘abb¢ HüÝ»w¿gΜù(wnáÂ…‘:::‚ÉÉÉg/\¸°K¤XDEEـ˖-;¤®ÍŠÑÒÒâ¾víÚW ž%dDŠ4!<Ç‘àvÂÐî'PµçÉ3aWW×ÀŽŽÝM›6=ill\JÍH |¢3qâD7™èèèCÀ°Q}}½GCCƒ²B???ccã‡ååå7ÏŸ?ï>>b ‡#íÙŒ3d@j€©R(…ŒâÁé Hq@FÔf;77×)((H†íÉ“'_V®\ùDUU RRRÜÀä0þ|\9‘‘q ÐÜ«W¯¶¹ @7¾úÕ¡²²RÑÆÆFüÓ§O¿Ö­[÷dòäÉûpÙ ÊÍHÆrõ{K {A‚'Ož|*€nò•"BBB¬ óAf¤§§_†Õ:l‘@¸*uÉÐÐP1nnn6 )FVL­]»ö>Ð2ƒíÞ½{ 0À–Ccý*0ÕÝ©qwwÇRvÃСê@ r$rB{Á ÀºråÊ{Pà€rÈS Hæ" X$ÈÜÜ\PII‰\ñò‚=,**ÊMÍX0²ö,Y²ä>ˆššªJÁ‡¶%>¹À@åÙLhæ¸ì± wØ0ýÀ¤r³‚‚²œˆ ò——— (Ñ€Ô"©nF„+BxUTT¸‘Š”TþáÇ_Ь Ëš¡E ¸ˆ ºZÁc ‡‚°‘‘‘rñ¬L=_Av\ºt Tü0€”Â@lP€ °8pà(çÄÇÇ_·8nÞü*²€ d=ÔM¸ÀhQà ``À½ª"Ò¦~° \ËNdÀ%&H?¨$ºe4£Pxsò*CCýPóx Å Š’Ÿ ¬ ¤Ô/ ,´pTâ8¨ø€åPÄÀr(W~þü¹  ºd/0çí€ÙN] Ü‹$ðžPËVÌŠ`ŽbE–|ðàÁW°"›;wî|‰n(HÉ/`BûE(\ˆ‰PàƒêhJ¿ ”‹ Ô JÕgÏž 9 V¨GÊ‚Âêêê ÏB+0|àÿ!0>–ÉܰrVþ‚Š-P*ííí½ŒÀà¶§œ7L#¨8Õ[ V´)€òbÀbÈ¿´´TTÙ7A-.äf] ;AjA‘FÈNØ·o8g………)Í÷€Õd€œ–1 €0 EÏà^œ{’BǵWбàä¢ôU\\œÌƒˆ“ÍTúS~’Ÿ¼%¤Ä—»uuïÆfï}i$…ʶÖ6:ȵV‚2T¹´é®[ÆÛX¯i4íòr·sÎp‡®¾ÄDE“D°Ú GÏSJk¡—®†ä‰3w`ø@®$ç¬üùUÊ(ïf~*Õ¿í@ŒxF{-‘îìì,̲{Žß ¤Î"¬cøÚÄÆ œJ­’’’«€üõ8ú àÈâ³ =P1ŸÉ|6h]uJ«!¥þ‡Pñ·HfÀÌ=ÃN4½/Ð:ÀÈ~º«×°Ø©€äæ·Àœ «—@ PW”£ -5ä>’>@á‹!`ª ¦çÏŸµµµ= íþ V¨ß, ¶ƒZ]#`´îohŽùºjÕª{ÐÊÿ©†¾ChÊù Ñ;xÔÂ:GªXRépÈþF.1n"µ<‰D(BF@Žö2@£2È@€6ê7”gÐÌ IEND®B`‚Apache-Gallery-1.0.2/htdocs/application-doc.png0000644000175000017500000000701011573732716017466 0ustar milmil‰PNG  IHDR04Ì“»‘bKGDÿÿÿ ½§“ ½IDATxÚÕš{PTw–Ç?ýà­ ­`¢e1kf+ë#)3NÕH‚ ‚JÀÄW4¥…±‚8jw²ILR‰1¨ÉÄI71ÆWTÔâêHPC0Œï!QGä%Òòî¦_÷·t÷¥/Ý€ÖnvÝ_Õ-šß}ó=ç|Ï9¿ßXˆáˆŠŠº=räÈ@ øpCTUU‰aFQYY)rss]JuŸ ¸Fiiéÿ¨@’$Ý×aµZ…ÑhƒAœ×Ãõº­Ø; ªÝ-0yr¬œ Ýol¨¾Ì­ºVjït!¨Ô*|||Pƒµ ôG­Ñ ÑhPi4²®÷þéORQQAVV'>Åo;‰ââ„ìÞ½ ½^ÏæÍ›‘$ÁªU«ï•œ.%˜:5™ÖÖÖþ, øË_N«—iÌ5 ­u—0ÙÔ´wšQ«Õ!aµÚ°XZ±Øu¨4j B ¹ I‚ìì¥ìÚµ³‡• ++‹ÌÌLù]ë׿ë Üî÷9r„”””þ,€Âl.„«µ _ ºZøZBB­V¡V©ÔZ=¤‹Á@£Õ Ñ¨B`·KH’ã9ügæÌ™ÃÓOg",\¸ˆèèhJJŠB°iÓfÒÓgG~~¾|Ÿ’3{w!9‘ÙlV´Z¬V«â‚—_~™”øÀޝ¯?wšš¨©­gHh0’d'(0­¯?~þé0ƒáN#—®þ@^^ž‚IÜ…è𞀹òṖ†æî]ååß»,‘\8qâ>>>nè 9 MF#³Éf!°K Vk±Ûm¢RIX´4Ý”­éòáììl’“S())A’óç/`úô4§€’ÓÕ‰¬qIö€Ã‡£Ó î?zCÆn·áˆZ£Á×ß›ÕJgg*$ÑÑÑNà€`4Zì’ðàô-[>ró}Á¶mŸõ¨B…—Ì-ùàXâââ°XÌ ÿwÄ€I’°Úmt™LØívg½n£³£ «µ‹ŽŽ6Ì]fÔjM§É7ÞXËâÅ‹Y·nB6lØ@rr B@nn.z}kÖüAVB8©95u:MMwú޳ÙLYYñññ˜Íf™¯33³¢Ó90Én§ËlA­Q£V«P¡B¥•ÚAŸg |âF J„•¥BÏäY?9s†éÓÓ8zô¨G ôâBÝæß³g[Ròt±ž´Ø]¿tÏgg/%22’S§Êˆ‰‰aÅŠlݺ•3g¾ãúõëF""†óᇒ—÷6›6môh5ûe!“ÉD@@&“É##» ÓóœI%rÝhJ^ç=‘ÇCy„‡?Dcc?üð×ÞYÇŽ}C@@€œ€•¡¤X@ë>'Üü\ÈL¢ N;BH`ùrG}“—÷6ñññ¤¦NùùB°lÙ2fÍÊà›oþÓ# <@xøC}[Àh4RVVFbb"2Âz}Çgîܹlßþ¹×¦')i*EEG™6-•¯¿>ì†xo½€}wÄ=ÝEðÝw大Ïðj÷â+11‘ŽŽv}Wp¯Y³†sçÎ0…1cCAbb±±zgÿ µµµÎ¦D™˜òòÞæµ×^CAAAz}k×®¥¾¾+W® ×ÇñúëoPZZêÌ(˜0=}õõµ}[ ½½Ó§O‘”4•öö6™3g²!ééidffR^^Neå9y©äÔ©2üŸIHHàĉÄÄİqc~/è»#.¼Æ„gË)Q^^ÎŒ³úg!oKƒû÷ïtöȳ¸‚ ~ê!„RŠwÞy—©S§6„W^y…øøx~üñG.|Ž¢¢bª««ùàƒÍì¦lnúa¡¶¶6‚ƒƒimméÕ_Ý÷æËJzoÜ{fVoÊ»?kذêêj8wî|ß1pôèBB)˜dÅŠìܹ!àÍ7ßbõê—ØµkË—ç²{÷.@ðû߯bݺ?zANÈõJE”–V.n¹³@aá>† ‹è»RvAÝ(¾ÿþ$ÉÑX¿úêä³³ggÉ/ݰa½"ë*yœ^ýÝ»5½±Ö=¸PKK3ƒ…ÒÜ|W‘PV®\ Àµk×ÈÊÊböìÙÌ™3—ÔÔi̞źuyò=BàlHàòÅ~íqäpa·ÍÍw9sæ ))Ó0šúXÓñDLY¿;¹r©–/>=ú«*pºâ°» IŠÕט6-•É“cXµj%ÉÉ)èt:¶oÿœœ?þ‹ Iü}Éeïâ¥çÓ/ÙúÅkò3»º,ÔÞj¤èëÓœûkQ£#˜•¥',<”A¡Á´4·Óxû.ûöçÆµZûÍ(ffê €N‚ÑØÅñ’ïùêÀ·J2î0xp˜[ÙÚK½øh÷ W.ÕñŧGežŸû&¡º`/MgÌoFñçöqöûËüë니z4‚6ï幟;þYš“Á/U·xûÍOyuíóDF g[ÁaÎV\&((€y “Éw'§++W%¾úêC†„)zñâ%€`Ñ¢EÄÅ%ðÂ ËØ´iiié,Y’ÍñãÇ™5+ƒ¥K_pcÏÑ|·íN·š>#Ʊt9"€_ªna±Øø¥Ê±ñˆc ~Øð0GL]ºÉh¦éN ùïîôÆBx­Í?ùäc$IPPðï æÈÉÉ!''GžÓëcëA½ÆÛŽ€ ÀÏß×± ÜÚ@kk§cÞÏGqþ®á–U¦OO£±ñ¶BÐY³fΖ-±|ùršššÐétŒ1???rr^ä³Ï¶QUõ3ÕÕ7½|îÃ%xCƒs—?_ ¢­­“ ǼÙ*ÿõóó!TŒ¡©µ¯<‡$--Û·ëe‹ìÛ·OV°»ÑP¦ü æßg‡ê2wa2B–pëÖmF?:‚GÇ<Â…Ÿ~fô˜G[[Õ êšù0¢â»Køø1Q ›ÞÛåiIòLã3gf`³Y5*«ÕÂ… )++eéÒeܹÓÈÞ½_z ➣`û¿a6[¹u³ëwrñü5GÇ·ã2fÇó̼D–ædÐÒÒÁß®ü½»;²ðÞÌ|ZOrê¿0oa &Ž•{&²††zzèaêzARôš±½ª«·ÿwó(dÆŒ™Ô××yÖ3Yõ·Õtäp!§+ŽýêÙXÛ_ŸÚ³»×=²ÜUÙL˜øOýì¡ÝÛs¯^½Jtôd.^¼è*mr°Kåü؃yøááÔ××Þ×§ý- 'Apache::Gallery', 'VERSION_FROM' => 'lib/Apache/Gallery.pm', # finds $VERSION 'PREREQ_PM' => { Image::Info => 0, Image::Size => 0, Image::Imlib2 => 1.02, Text::Template => 0, URI => 1.23, CGI => 3.08, Test::More => 0, File::Spec => 0 }, # e.g., Module::Name => 1.1 ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (ABSTRACT_FROM => 'lib/Apache/Gallery.pm', # retrieve abstract from module AUTHOR => 'Michael Legart ') : ()), ); Apache-Gallery-1.0.2/README0000644000175000017500000002755411573741527013325 0ustar milmilNAME Apache::Gallery - mod_perl handler to create an image gallery SYNOPSIS See the INSTALL file in the distribution for installation instructions. DESCRIPTION Apache::Gallery creates an thumbnail index of each directory and allows viewing pictures in different resolutions. Pictures are resized on the fly and cached. The gallery can be configured and customized in many ways and a custom copyright image can be added to all the images without modifying the original. CONFIGURATION In your httpd.conf you set the global options for the gallery. You can also override each of the options in .htaccess files in your gallery directories. The options are set in the httpd.conf/.htaccess file using the syntax: PerlSetVar OptionName 'value' Example: PerlSetVar GalleryCacheDir '/var/cache/www/' GalleryAutoRotate Some cameras, like the Canon G3, can detect the orientation of a the pictures you take and will save this information in the 'Orientation' EXIF field. Apache::Gallery will then automatically rotate your images. This behavior is default but can be disabled by setting GalleryAutoRotate to 0. GalleryCacheDir Directory where Apache::Gallery should create its cache with scaled pictures. The default is /var/cache/www/ . Here, a directory for each virtualhost or location will be created automatically. Make sure your webserver has write access to the CacheDir. GalleryTemplateDir Full path to the directory where you placed the templates. This option can be used both in your global configuration and in .htaccess files, this way you can have different layouts in different parts of your gallery. No default value, this option is required. GalleryInfo With this option you can define which EXIF information you would like to present from the image. The format is: ' KeyInEXIF, MyOtherName => OtherKeyInEXIF' Examples of keys: ShutterSpeedValue, ApertureValue, SubjectDistance, and Camera You can view all the keys from the EXIF header using this perl-oneliner: perl "-e" 'use Data::Dumper; use Image::Info qw(image_info); print Dumper(image_info(shift));' filename.jpg Default is: 'Picture Taken => DateTimeOriginal, Flash => Flash' GallerySizes Defines which widths images can be scaled to. Images cannot be scaled to other widths than the ones you define with this option. The default is '640 800 1024 1600' GalleryThumbnailSize Defines the width and height of the thumbnail images. Defaults to '100x75' GalleryThumbnailSizeLS If set to '1', GalleryThumbnailSize is the long and the short side of the thumbnail image instead of the width and height. Defaults to '0'. GalleryCopyrightImage Image you want to blend into your images in the lower right corner. This could be a transparent png saying "copyright my name 2001". Optional. GalleryWrapNavigation Make the navigation in the picture view wrap around (So Next at the end displays the first picture, etc.) Set to 1 or 0, default is 0 GalleryAllowOriginal Allow the user to download the Original picture without resizing or putting the CopyrightImage on it. Set to 1 or 0, default is 0 GallerySlideshowIntervals With this option you can configure which intervals can be selected for a slideshow. The default is '3 5 10 15 30' GallerySortBy Instead of the default filename ordering you can sort by any stat attribute. For example size, atime, mtime, ctime. GalleryDirSortBy Set this variable to sort directories differently than other items, can be set to size, atime, mtime and ctime; setting any other value will revert to sorting by name. GalleryMemoize Cache EXIF data using Memoize - this will make Apache::Gallery faster when many people access the same images, but it will also cache EXIF data until the current Apache child dies. GalleryUseFileDate Set this option to 1 to make A::G show the files timestamp instead of the EXIF value for "Picture taken". GallerySelectionMode Enable the selection mode. Select images with checkboxes and get a list of filenames. GalleryEXIFMode You can choose how Apache::Gallery should display EXIF info from your images. The default setting is 'namevalue'. This setting will make Apache::Gallery print out the names and values of the EXIF values you configure with GalleryInfo. The information will be parsed into $INFO in pictureinfo.tpl. You can also set it to 'values' which will make A::G parse the configured values into the var $EXIFVALUES as 'value | value | value' If you set this option to 'variables' the items you configure in GalleryInfo will be available to your templates as $EXIF_ (in all uppercase). That means that with the default setting "Picture Taken => DateTimeOriginal, Flash => Flash" you will have the variables $EXIF_DATETIMEORIGINAL and $EXIF_FLASH available to your templates. You can place them anywhere you want. GalleryRootPath Change the location of gallery root. The default is "" GalleryRootText Change the name that appears as the root element in the menu. The default is "root:" GalleryMaxThumbnailsPerPage This options controls how many thumbnails should be displayed in a page. It requires $BROWSELINKS to be in the index.tpl template file. GalleryImgFile Pattern matching the files you want Apache::Gallery to view in the index as thumbnails. The default is '\.(jpe?g|png|tiff?|ppm)$' GalleryDocFile Pattern matching the files you want Apache::Gallery to view in the index as normal files. All other filetypes will still be served by Apache::Gallery but are not visible in the index. The default is '\.(mpe?g|avi|mov|asf|wmv|doc|mp3|ogg|pdf|rtf|wav|dlt|txt|html?|csv| eps)$' GalleryTTFDir To use the GalleryCopyrightText feature you must set this option to the directory where your True Type fonts are stored. No default is set. Example: PerlSetVar GalleryTTFDir '/usr/share/fonts/' GalleryTTFFile To use the GalleryCopyrightText feature this option must be set to the name of the True Type font you wish to use. Example: PerlSetVar GalleryTTFFile 'verdanab.ttf' GalleryTTFSize Configure the size of the CopyrightText that will be inserted as copyright notice in the corner of your pictures. Example: PerlSetVar GalleryTTFSize '10' GalleryCopyrightText The text that will be inserted as copyright notice. Example: PerlSetVar GalleryCopyrightText '(c) Michael Legart' GalleryCopyrightColor The text color of your copyright notice. Examples: White: PerlSetVar GalleryCopyrightColor '255,255,255,255' Black: PerlSetVar GalleryCopyrightColor '0,0,0,255' Red: PerlSetVar GalleryCopyrightColor '255,0,0,255' Green: PerlSetVar GalleryCopyrightColor '0,255,0,255' Blue: PerlSetVar GalleryCopyrightColor '0,0,255,255' Transparent orange: PerlSetVar GalleryCopyrightColor '255,127,0,127' GalleryCopyrightBackgroundColor The background-color of a GalleryCopyrightText r,g,b,a - for examples, see GalleryCopyrightColor GalleryQuality The quality (1-100) of scaled images This setting affects the quality of the scaled images. Set this to a low number to reduce the size of the scaled images. Remember to clear out your cache if you change this setting. Quality seems to default to 75, at least in the jpeg and png loader code in Imlib2 1.1.0. Examples: Quality at 50: PerlSetVar GalleryQuality '50' GalleryUnderscoresToSpaces Set this option to 1 to convert underscores to spaces in the listing of directory and file names, as well as in the alt attribute for HTML tags. GalleryCommentExifKey Set this option to e.g. ImageDescription to use this field as comments for images. GalleryEnableMediaRss Set this option to 1 to enable generation of a media RSS feed. This can be used e.g. together with the PicLens plugin from http://piclens.com FEATURES Rotate images Some cameras, like the Canon G3, detects the orientation of a picture and adds this info to the EXIF header. Apache::Gallery detects this and automatically rotates images with this info. If your camera does not support this, you can rotate the images manually, This can also be used to override the rotate information from a camera that supports that. You can also disable this behavior with the GalleryAutoRotate option. To use this functionality you have to create file with the name of the picture you want rotated appended with ".rotate". The file should include a number where these numbers are supported: "1", rotates clockwise by 90 degree "2", rotates clockwise by 180 degrees "3", rotates clockwise by 270 degrees So if we want to rotate "Picture1234.jpg" 90 degrees clockwise we would create a file in the same directory called "Picture1234.jpg.rotate" with the number 1 inside of it. Ignore directories/files To ignore a directory or a file (of any kind, not only images) you create a .ignore file. Comments To include comments for a directory you create a .comment file where the first line can contain "TITLE: New title" which will be the title of the page, and a comment on the following lines. To include comments for each picture you create files called picture.jpg.comment where the first line can contain "TITLE: New title" which will be the title of the page, and a comment on the following lines. Example: TITLE: This is the new title of the page And this is the comment.
And this is line two of the comment. The visible name of the folder is by default identical to the name of the folder, but can be changed by creating a file .folder with the visible name of the folder. It is also possible to set GalleryCommentExifKey to the name of an EXIF field containing the comment, e.g. ImageDescription. The EXIF comment is overridden by the .comment file if it exists. DEPENDENCIES Perl 5 Apache with mod_perl URI::Escape Image::Info Image::Size Text::Template Image::Imlib2 X11 libraries (ie, XFree86) Imlib2 Remember the -dev package when using rpm, deb or other package formats! AUTHOR Michael Legart COPYRIGHT AND LICENSE Copyright (C) 2001-2011 Michael Legart Templates designed by Thomas Kjaer Apache::Gallery is free software and is released under the Artistic License. See http://www.perl.com/language/misc/Artistic.html for details. The video icons are from the GNOME project. http://www.gnome.org/ THANKS Thanks to Thomas Kjaer for templates and design of http://apachegallery.dk Thanks to Thomas Eibner and other for patches. (See the Changes file) SEE ALSO perl, mod_perl, Image::Imlib2, CGI::FastTemplate, Image::Info, and Image::Size. Apache-Gallery-1.0.2/LICENSE0000644000175000017500000000034311573732721013431 0ustar milmil$Author: mil $ $Rev: 255 $ $Date: 2004-04-12 19:49:02 +0200 (Mon, 12 Apr 2004) $ Apache::Gallery is free software and is released under the Artistic License. See for details. Apache-Gallery-1.0.2/Changes0000644000175000017500000002566711573741722013740 0ustar milmil$Author: mil $ $Rev: 335 $ $Date: 2011-06-08 20:47:46 +0200 (Wed, 08 Jun 2011) $ Revision history for Perl extension Apache::Gallery. 1.0.2 Wed Jun 8 20:47:16 CEST 2011 - Extended GalleryUnderscoresToSpaces to filenames as well. (Debian bug #348724, Francesco Potortì) - Added txt to GalleryDocFile, the code in Gallery.pm already allowed it. (Luca Capello) - Added text-html.png and text-txt.png icons. (Debian bug #423004, Luca Capello) - Fixed counter typo for .folder in next directory menu item. (Luca Capello) - Added support to ignore items through .ignore. (Debian bug #619625, Luca Capello) - Fixed spelling typos in Gallery.pm and README. (Luca Capello) - GalleryCacheDir defaults to /var/cache/www/ per the FHS-2.3. (Debian bug #337197, Luca Capello) - Fixed two minor POD errors (Michael Legart) 1.0.1 Wed Feb 23 20:45:38 CET 2011 - Added missing template files to MANIFEST 1.0 Tue Feb 22 21:54:31 CET 2011 - Handle files that match both GalleryDocFile and GalleryImgFile correctly. (Claus Faerber) - Only respond to HEAD and GET requests, enabling users to use WebDAV for upload (Andreas Plesner) - Added new option GalleryCommentExifKey to get comments from EXIF data (Michael Legart) - Added new option GalleryEnableMediaRss to enable generation of a media RSS feed for each directory listing. This works with e.g. the plugin from http://piclens.com to enable 3D viewing of your gallery. (Michael Legart) - Make browser-caching work with mod_perl 2. Supports If-None-Match and If-Modified-Since headers. Sets Last-Modified-Date and ETag headers. (Michael Legart) 1.0RC3 Fri Sep 16 10:27:48 CEST 2005 - Add watermark even when picture doesn't need to be rescaled (Andreas Plesner) - Fix logging to work in Apache 1.3 (Andreas Plesner) - Bugfix: If only one GallerySize was specified, the image's max width was autmatically added to GallerySizes (Andreas Plesner) - Bugfix: Locate thm files if they are called .thm or .THM (Michael Legart) 1.0RC2 Wed Jun 1 09:11:50 CEST 2005 - Added access keys for navigation (Michael Knudsen) 1.0RC1 Tue May 24 13:31:50 CEST 2005 - Added submit button to form in selection mode (Vlad Marchenko) - Added new option GalleryRootPath for use when the gallery is not running from the root of the virtual host (Lubomir Host) - Report proper errors when there are problems with templates (Don Armstrong) - Support newest mod_perl2 version (Philip Paeps) 0.9.1 Sat Sep 11 23:52:16 CEST 2004 - Fix mod_perl 1 support that was broken with 0.9 (Michael Legart) 0.9 Sat Sep 11 22:03:20 CEST 2004 - Handle .thm for all filetypes and not just tiff, gif and png (Michael Legart) - Make GallerySortBy work for directories (Michael Legart) - Make GalleryDirSortBy override GallerySortBy for directories (Andreas Plesner) - Report 404 for HEAD requests to non-existing files or directories (Michael Legart) - Scale images when they are requested from the cache instead of before the index is displayed. (Michael Legart) - Sort pictures the same way when viewing images as when viewing directories (Andreas Plesner) - Make the "back" link on the error page work in IE (Michael Legart) - Fixed the TITLE tag for folder comments (Ondra Kudlik) - New option GalleryUnderscoresToSpaces to convert underscores to spaces in the listing of directories. (Ondra Kudlik) - Bugfix for when running outside a virtual host (Jeffrey Hartmann) - Support Apache2 on FreeBSD (Jesper Dalberg) - Avoid false 404 errors when running under mod_perl 2 (Tom Brown) 0.8 Sun Mar 7 11:22:00 CET 2004 - Remember choosen width by setting a cookie (Rene Joergensen) - Fixed a bug where $EXIFVALUES was left blank if a picture had a comment. (Michael Legart) - Fixed a bug where one line comments was showed as $COMMENT (Jesper Skriver) - Fixed a bug where comments did not get shown when using the variables exif mode (Thomas L. Kjeldsen) - Added two new configuration options GalleryDocFile and GalleryImgFile that makes it possible to configured which filetypes should be displayed. See the documentation for details. (Guillaume Rousse) - Added new option GalleryThumbnailSizeLS. If set to 1, GalleryThumbnailSize is the long and the short side of the thumbnail image instead of the width and height. (Don Armstrong) - Switched to use Text::Template instead of CGI::FastTemplate, see the UPGRADE file for details. (Don Armstrong) - Create copyright notices on pictures using truetype fonts instead of png images. Font, color and size can be configured (Thomas Petersen, Michael Legart) 0.7 Mon Sep 8 22:30:35 CEST 2003 - Support mod_perl version 1 and 2 (1.99) (Michael Legart) - Send status code 500 on errors, 404 on file not found and make IE show our own errorpage. (Thomas L. Kjeldsen) - Bugfix for directories named "0" (Andreas Plesner Jacobsen) - Added "selection mode". Select images with checkboxes and get a list of filenames. (Peter Andreasen) - Fix to let the module work with perl 5.005 (Aaron) - Do not allow scaling pictures to sizes above their original size (Aaron) - Added GalleryUseFileDate option to make A::G show the files timestamps instead of using the EXIF value (Dennis Haney) - Remember display size when turning Slideshow off (Hans Joergensen) - Nice new layout (Thomas Kjaer) - New option GalleryEXIFMode to control the way EXIF info is displayed. See docs for details (Michael Legart) - Support for the FNumber EXIF value (Thomas Corell) - Added GalleryRootText option to allow changing the name of the root element in the menu (Christopher Knight) - Use Image::Imlib2 instead of Inline::C (Andreas Plesner Jacobsen) - New option GalleryMaxThumbnailsPerPage to limit the number of thumbnails displayed per page. Disabled by default and requires templates update. (Michael Legart) - Bugfix for the GalleryThumbnailSize option. Both height and width max sizes are now obeyed. (David Gee) 0.6 Tue Apr 22 10:24:40 CEST 2003 - Apache now internally handles image dispatch which enables use of all Apache caching possibilities (Thomas Eibner) - Documentation and better implementation of the .folder feature. (Jesper Skriver) - Support the EXIF Orientation key for automatic rotate, if your camera supports that - like Canon G3. You can disable this by setting GalleryAutoRotate to 0 (Me) - Works with Inline > 0.42 (Andreas Plesner) - Show nice icons and allow downloads for doc,mp3,ogg,rtf,wav and wmv in addition to the current movie types (Me) - Now displays nice values for Aperture,FocalLength,ShutterSpeed exif values (Thomas Eibner) - Directory comments added (Hans Joergensen) - New GallerySortBy option to allow sort by time, size etc (Iain Wade) - Set width/height on thumbnail images for better performance (Iain Wade) 0.5.1 Sat Nov 9 11:49:29 CET 2002 - InlineDir is no longer configurable using PerlSetVar, which fixes make test. (Me) - Added test-suite (Me, Andreas Plesner Jacobsen) - Write to the error log if unable to open files in the cache (Me) - cache_dir changed to use File::Spec to make Apache::Gallery more portable. It may even run under Windows now? (Andreas Plesner Jacobsen) 0.5 Sun Sep 15 11:55:56 CEST 2002 - Added slideshow feature (Me) - Code cleanup (Me) - Moved the cache to one single directory outside the webscope (Rene Joergensen) - Allow user to customize the "No info found" message (Me) 0.4.1 Sun Aug 11 17:48:09 CEST 2002 - URI Escape image URL in the size selection URLs. (Me) - Fixed bug where .cache directory was not created when requesting images directly (Me) - Don't allow scaling images more than their original size (Jan Chrillesen) - Handle already rotated images correct (Jan Chrillesen, Me) - Fix bug when rotating pictures and a .thm file was present (Thomas Eibner) - Apache::Gallery now allows for regular files to be served correctly (Thomas Eibner) - Support for detailed flash information from Image::Info 1.11 (Me, Allan Joergensen) - Moved Apache::Gallery into subversion revision control instead of CVS (Me) 0.4 Sun Jun 2 13:11:09 CEST 2002 - Round height and width to integers when scaling to avoid widths like 640x479.393939393939 (Me) - Regenerate scaled pictures and thumbnails if the original image has changed, the image.rotate file has been added or changed or if the copyright image was added og changed. (Me) - Don't show files starting with "." in the thumbnail index (Yann Kerhervé) - Made thumbnailsizes configurable with the GalleryThumbnailSize option. (Me) - Print "Unknown" instead of $INFO in the imageinfo field if unable to find any EXIF information. (Me) - Added perldoc documentation of the module and a installationguide. (Me) - Always list directories before images (Me) - Allow textfiles (ie, robots.txt) (Me) - Fixed a bug where $FILES was printed instead of "Empty directory" if directory contained unsupported files (.txt, .htaccess etc) (Me) - New templates where folders doesn't get displayed one on each line (Thomas Kjaer) - Works without a VirtualHost now (Does not use DocumentRoot) (Peter Breton) - New option GalleryWrapNavigation to enable a new feature in the pictureview where "Next" at the end displays the first picture etc (Peter Breton/Me) - New option AllowOriginal for the user to be able to download the original picture, not enabled by default (Thomas Eibner) - TIFF and PPM support (Thomas Eibner) - Initial movie support - download movie clips (Rene Joergensen) 0.3.1 Thu Jan 10 15:47:39 CET 2002 - Fixed a huge memoryleak. 0.3 Wed Jan 2 00:25:21 CET 2002 - Made Inline dir configurable. (Tim Coleman) - Made it configurable which information about the image should be viewed. (Thomas Eibner) - Added GallerySizes option. You can now choose which resolutions the user can scale between. The Gallery will not allow scaling to 641x480 if you only configured 640x480. (To prevent evil people filling up your disk) (Me) - Handle spaces in files and directories correct. - Now possible to rotate pictures on the fly. (Thomas Eibner) - Copyright picture can be included on each picture (Thomas Eibner) - Comments for each picture changed to be in picture.jpg.comments (Thomas Eibner) - Scale thumbnails correct when images are rotated 90-degrees. (Me) 0.2 Sun Oct 14 19:57:06 2001 - addcomments.pl renamed to gallery-editcomments.pl - Added "viewing picture X of Y" when viewing images - Switched to using Imlib2 instead of GD. Apache::Gallery now supports all the image formats Imlib2 supports. - Added gallery-buildcache.pl script to generated thumbnails (Usefull if your browser times out the first time you visit a new gallery) 0.1.1 Sat Sep 30 01:10:03 2001 - Added src/addcomments.pl script for editing picture comments. - Templates have been updated by Erwin Lansing and Thomas Kjaer and are now much nicer by default! 0.1 Mon Aug 20 19:38:31 2001 - original version; created by h2xs 1.21 with options -XA -n Apache::Gallery Apache-Gallery-1.0.2/lib/0000755000175000017500000000000011573741742013175 5ustar milmilApache-Gallery-1.0.2/lib/Apache/0000755000175000017500000000000011573741742014356 5ustar milmilApache-Gallery-1.0.2/lib/Apache/Gallery.pm0000644000175000017500000016312511573741722016321 0ustar milmilpackage Apache::Gallery; # $Author: mil $ $Rev: 335 $ # $Date: 2011-06-08 20:47:46 +0200 (Wed, 08 Jun 2011) $ use strict; use vars qw($VERSION); $VERSION = "1.0.2"; BEGIN { if (exists($ENV{MOD_PERL_API_VERSION}) and ($ENV{MOD_PERL_API_VERSION}==2)) { require mod_perl2; if ($mod_perl::VERSION >= 1.99 && $mod_perl::VERSION < 2.0) { die "mod_perl 2.0.0 or later is now required"; } require Apache2::ServerRec; require Apache2::RequestRec; require Apache2::Log; require APR::Table; require Apache2::RequestIO; require Apache2::SubRequest; require Apache2::Const; Apache2::Const->import(-compile => 'OK','DECLINED','FORBIDDEN','NOT_FOUND','HTTP_NOT_MODIFIED'); $::MP2 = 1; } else { require mod_perl; require Apache; require Apache::Constants; require Apache::Request; Apache::Constants->import('OK','DECLINED','FORBIDDEN','NOT_FOUND'); $::MP2 = 0; } } use Image::Info qw(image_info); use Image::Size qw(imgsize); use Image::Imlib2; use Text::Template; use File::stat; use File::Spec; use POSIX qw(floor); use URI::Escape; use CGI; use CGI::Cookie; use Encode; use HTTP::Date; use Digest::MD5 qw(md5_base64); use Data::Dumper; # Regexp for escaping URI's my $escape_rule = "^A-Za-z0-9\-_.!~*'()\/"; my $memoized; sub handler { my $r = shift or Apache2::RequestUtil->request(); unless (($r->method eq 'HEAD') or ($r->method eq 'GET')) { return $::MP2 ? Apache2::Const::DECLINED() : Apache::Constants::DECLINED(); } if ((not $memoized) and ($r->dir_config('GalleryMemoize'))) { require Memoize; Memoize::memoize('get_imageinfo'); $memoized=1; } $r->headers_out->{"X-Powered-By"} = "apachegallery.dk $VERSION - Hest design!"; $r->headers_out->{"X-Gallery-Version"} = '$Rev: 335 $ $Date: 2011-06-08 20:47:46 +0200 (Wed, 08 Jun 2011) $'; my $filename = $r->filename; $filename =~ s/\/$//; my $topdir = $filename; my $media_rss_enabled = $r->dir_config('GalleryEnableMediaRss'); # Just return the http headers if the client requested that if ($r->header_only) { if (!$::MP2) { $r->send_http_header; } if (-f $filename or -d $filename) { return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } else { return $::MP2 ? Apache2::Const::NOT_FOUND() : Apache::Constants::NOT_FOUND(); } } my $cgi = new CGI; # Handle selected images if ($cgi->param('selection')) { my @selected = $cgi->param('selection'); my $content = join "
\n",@selected; $r->content_type('text/html'); $r->headers_out->{'Content-Length'} = length($content); if (!$::MP2) { $r->send_http_header; } $r->print($content); return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } # Selectmode providing checkboxes beside all thumbnails my $select_mode = $cgi->param('select'); # Let Apache serve icons without us modifying the request if ($r->uri =~ m/^\/icons/i) { return $::MP2 ? Apache2::Const::DECLINED() : Apache::Constants::DECLINED(); } # Lookup the file in the cache and scale the image if the cached # image does not exist if ($r->uri =~ m/\.cache\//i) { my $filename = $r->filename().$r->path_info(); $filename =~ s/\.cache//; $filename =~ m/\/(\d+)x(\d+)\-/; my $image_width = $1; my $image_height = $2; $filename =~ s/\/(\d+)x(\d+)\-//; my ($width, $height, $type) = imgsize($filename); my $imageinfo = get_imageinfo($r, $filename, $type, $width, $height); my $cached = scale_picture($r, $filename, $image_width, $image_height, $imageinfo); my $file = cache_dir($r, 0); $file =~ s/\.cache//; my $subr = $r->lookup_file($file); $r->content_type($subr->content_type()); if ($::MP2) { my $fileinfo = stat($file); my $nonce = md5_base64($fileinfo->ino.$fileinfo->mtime); if ($r->headers_in->{"If-None-Match"} eq $nonce) { return Apache2::Const::HTTP_NOT_MODIFIED(); } if ($r->headers_in->{"If-Modified-Since"} && str2time($r->headers_in->{"If-Modified-Since"}) < $fileinfo->mtime) { return Apache2::Const::HTTP_NOT_MODIFIED(); } $r->headers_out->{"Content-Length"} = $fileinfo->size; $r->headers_out->{"Last-Modified-Date"} = time2str($fileinfo->mtime); $r->headers_out->{"ETag"} = $nonce; $r->sendfile($file); return Apache2::Const::OK(); } else { $r->path_info(''); $r->filename($file); return Apache::Constants::DECLINED(); } } my $uri = $r->uri; $uri =~ s/\/$//; unless (-f $filename or -d $filename) { show_error($r, 404, "404!", "No such file or directory: ".uri_escape($r->uri, $escape_rule)); return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } my $doc_pattern = $r->dir_config('GalleryDocFile'); unless ($doc_pattern) { $doc_pattern = '\.(mpe?g|avi|mov|asf|wmv|doc|mp3|ogg|pdf|rtf|wav|dlt|txt|html?|csv|eps)$' } my $img_pattern = $r->dir_config('GalleryImgFile'); unless ($img_pattern) { $img_pattern = '\.(jpe?g|png|tiff?|ppm)$' } # Let Apache serve files we don't know how to handle anyway if (-f $filename && $filename !~ m/$img_pattern/i) { return $::MP2 ? Apache2::Const::DECLINED() : Apache::Constants::DECLINED(); } if (-d $filename) { unless (-d cache_dir($r, 0)) { unless (create_cache($r, cache_dir($r, 0))) { return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } } my $tpl_dir = $r->dir_config('GalleryTemplateDir'); # Instead of reading the templates every single time # we need them, create a hash of template names and # the associated Text::Template objects. my %templates = create_templates({layout => "$tpl_dir/layout.tpl", index => "$tpl_dir/index.tpl", directory => "$tpl_dir/directory.tpl", picture => "$tpl_dir/picture.tpl", file => "$tpl_dir/file.tpl", comment => "$tpl_dir/dircomment.tpl", nocomment => "$tpl_dir/nodircomment.tpl", rss => "$tpl_dir/rss.tpl", rss_item => "$tpl_dir/rss_item.tpl", navdirectory => "$tpl_dir/navdirectory.tpl", }); my %tpl_vars; $tpl_vars{TITLE} = "Index of: $uri"; if ($media_rss_enabled) { # Put the RSS feed on all directory listings $tpl_vars{META} = ''; } unless (opendir (DIR, $filename)) { show_error ($r, 500, $!, "Unable to access directory $filename: $!"); return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } $tpl_vars{MENU} = generate_menu($r); $tpl_vars{FORM_BEGIN} = $select_mode?'
':''; $tpl_vars{FORM_END} = $select_mode?'
':''; # Read, sort, and filter files my @files = grep { !/^\./ && -f "$filename/$_" } readdir (DIR); @files=gallerysort($r, @files); my @downloadable_files; if (@files) { # Remove unwanted files from list my @new_files = (); foreach my $picture (@files) { my $file = $topdir."/".$picture; if ($file =~ /$img_pattern/i) { push (@new_files, $picture); } if ($file =~ /$doc_pattern/i) { push (@downloadable_files, $picture); } } @files = @new_files; } # Read and sort directories rewinddir (DIR); my @directories = grep { !/^\./ && -d "$filename/$_" } readdir (DIR); my $dirsortby; if (defined($r->dir_config('GalleryDirSortBy'))) { $dirsortby=$r->dir_config('GalleryDirSortBy'); } else { $dirsortby=$r->dir_config('GallerySortBy'); } if ($dirsortby && $dirsortby =~ m/^(size|atime|mtime|ctime)$/) { @directories = map(/^\d+ (.*)/, sort map(stat("$filename/$_")->$dirsortby()." $_", @directories)); } else { @directories = sort @directories; } closedir(DIR); # Combine directories and files to one listing my @listing; push (@listing, @directories); push (@listing, @files); push (@listing, @downloadable_files); if (@listing) { my $filelist; my $file_counter = 0; my $start_at = 1; my $max_files = $r->dir_config('GalleryMaxThumbnailsPerPage'); if (defined($cgi->param('start'))) { $start_at = $cgi->param('start'); if ($start_at < 1) { $start_at = 1; } } my $browse_links = ""; if (defined($max_files)) { for (my $i=1; $i<=scalar(@listing); $i++) { my $from = $i; my $to = $i+$max_files-1; if ($to > scalar(@listing)) { $to = scalar(@listing); } if ($start_at < $from || $start_at > $to) { $browse_links .= "$from - ".$to." "; } else { $browse_links .= "$from - $to "; } $i+=$max_files-1; } } $tpl_vars{BROWSELINKS} = $browse_links; DIRLOOP: foreach my $file (@listing) { $file_counter++; if ($file_counter < $start_at) { next; } if (defined($max_files) && $file_counter > $max_files+$start_at-1) { last DIRLOOP; } my $thumbfilename = $topdir."/".$file; my $fileurl = $uri."/".$file; # Debian bug #619625 if (-d $thumbfilename && ! -e $thumbfilename . ".ignore") { my $dirtitle = ''; if (-e $thumbfilename . ".folder") { $dirtitle = get_filecontent($thumbfilename . ".folder"); } $dirtitle = $dirtitle ? $dirtitle : $file; $dirtitle =~ s/_/ /g if $r->dir_config('GalleryUnderscoresToSpaces'); $tpl_vars{FILES} .= $templates{directory}->fill_in(HASH=> {FILEURL => uri_escape($fileurl, $escape_rule), FILE => $dirtitle, } ); } # Debian bug #619625 elsif (-f $thumbfilename && $thumbfilename =~ /$doc_pattern/i && $thumbfilename !~ /$img_pattern/i && ! -e $thumbfilename . ".ignore") { my $type = lc($1); my $stat = stat($thumbfilename); my $size = $stat->size; my $filetype; if ($thumbfilename =~ m/\.(mpe?g|avi|mov|asf|wmv)$/i) { $filetype = "video-$type"; } elsif ($thumbfilename =~ m/\.(txt|html?)$/i) { $filetype = "text-$type"; } elsif ($thumbfilename =~ m/\.(mp3|ogg|wav)$/i) { $filetype = "sound-$type"; } elsif ($thumbfilename =~ m/$doc_pattern/i) { $filetype = "application-$type"; } else { $filetype = "unknown"; } # Debian bug #348724 # not images my $filetitle = $file; $filetitle =~ s/_/ /g if $r->dir_config('GalleryUnderscoresToSpaces'); $tpl_vars{FILES} .= $templates{file}->fill_in(HASH => {%tpl_vars, FILEURL => uri_escape($fileurl, $escape_rule), ALT => "Size: $size Bytes", FILE => $filetitle, TYPE => $type, FILETYPE => $filetype, } ); } # Debian bug #619625 elsif (-f $thumbfilename && ! -e $thumbfilename . ".ignore") { my ($width, $height, $type) = imgsize($thumbfilename); next if $type eq 'Data stream is not a known image file format'; my @filetypes = qw(JPG TIF PNG PPM GIF); next unless (grep $type eq $_, @filetypes); my ($thumbnailwidth, $thumbnailheight) = get_thumbnailsize($r, $width, $height); my $imageinfo = get_imageinfo($r, $thumbfilename, $type, $width, $height); my $cached = get_scaled_picture_name($thumbfilename, $thumbnailwidth, $thumbnailheight); my $rotate = readfile_getnum($r, $imageinfo, $thumbfilename.".rotate"); # Debian bug #348724 # HTML tag, alt attribute my $filetitle = $file; $filetitle =~ s/_/ /g if $r->dir_config('GalleryUnderscoresToSpaces'); my %file_vars = (FILEURL => uri_escape($fileurl, $escape_rule), FILE => $filetitle, DATE => $imageinfo->{DateTimeOriginal} ? $imageinfo->{DateTimeOriginal} : '', # should this really be a stat of the file instead of ''? SRC => uri_escape($uri."/.cache/$cached", $escape_rule), HEIGHT => (grep($rotate==$_, (1, 3)) ? $thumbnailwidth : $thumbnailheight), WIDTH => (grep($rotate==$_, (1, 3)) ? $thumbnailheight : $thumbnailwidth), SELECT => $select_mode?'  ':'',); $tpl_vars{FILES} .= $templates{picture}->fill_in(HASH => {%tpl_vars, %file_vars, }, ); if ($media_rss_enabled) { my ($content_image_width, undef, $content_image_height) = get_image_display_size($cgi, $r, $width, $height); my %item_vars = ( THUMBNAIL => uri_escape($uri."/.cache/$cached", $escape_rule), LINK => uri_escape($fileurl, $escape_rule), TITLE => $file, CONTENT => uri_escape($uri."/.cache/".$content_image_width."x".$content_image_height."-".$file, $escape_rule) ); $tpl_vars{ITEMS} .= $templates{rss_item}->fill_in(HASH => { %item_vars }); } } } } else { $tpl_vars{FILES} = "No files found"; $tpl_vars{BROWSELINKS} = ""; } # Generate prev and next directory menu items $filename =~ m/(.*)\/.*?$/; my $parent_filename = $1; $r->document_root =~ m/(.*)\/$/; my $root_path = $1; print STDERR "$filename vs $root_path\n"; if ($filename ne $root_path) { unless (opendir (PARENT_DIR, $parent_filename)) { show_error ($r, 500, $!, "Unable to access parent directory $parent_filename: $!"); return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } # Debian bug #619625 my @neighbour_directories = grep { !/^\./ && -d "$parent_filename/$_" && ! -e "$parent_filename/$_" . ".ignore" } readdir (PARENT_DIR); my $dirsortby; if (defined($r->dir_config('GalleryDirSortBy'))) { $dirsortby=$r->dir_config('GalleryDirSortBy'); } else { $dirsortby=$r->dir_config('GallerySortBy'); } if ($dirsortby && $dirsortby =~ m/^(size|atime|mtime|ctime)$/) { @neighbour_directories = map(/^\d+ (.*)/, sort map(stat("$parent_filename/$_")->$dirsortby()." $_", @neighbour_directories)); } else { @neighbour_directories = sort @neighbour_directories; } closedir(PARENT_DIR); my $neightbour_counter = 0; foreach my $neighbour_directory (@neighbour_directories) { if ($parent_filename.'/'.$neighbour_directory eq $filename) { if ($neightbour_counter > 0) { print STDERR "prev directory is " .$neighbour_directories[$neightbour_counter-1] ."\n"; my $linktext = $neighbour_directories[$neightbour_counter-1]; if (-e $parent_filename.'/'.$neighbour_directories[$neightbour_counter-1] . ".folder") { $linktext = get_filecontent($parent_filename.'/'.$neighbour_directories[$neightbour_counter-1] . ".folder"); } my %info = ( URL => "../".$neighbour_directories[$neightbour_counter-1], LINK_NAME => "<<< $linktext", DIR_FILES => "", ); $tpl_vars{PREV_DIR_FILES} = $templates{navdirectory}->fill_in(HASH=> {%info}); print STDERR $tpl_vars{PREV_DIR_FILES} ."\n"; } if ($neightbour_counter < scalar @neighbour_directories - 1) { my $linktext = $neighbour_directories[$neightbour_counter+1]; if (-e $parent_filename.'/'.$neighbour_directories[$neightbour_counter+1] . ".folder") { $linktext = get_filecontent($parent_filename.'/'.$neighbour_directories[$neightbour_counter+1] . ".folder"); } my %info = ( URL => "../".$neighbour_directories[$neightbour_counter+1], LINK_NAME => "$linktext >>>", DIR_FILES => "", ); $tpl_vars{NEXT_DIR_FILES} = $templates{navdirectory}->fill_in(HASH=> {%info}); print STDERR "next directory is " .$neighbour_directories[$neightbour_counter+1] ."\n"; } } $neightbour_counter++; } } if (-f $topdir . '.comment') { my $comment_ref = get_comment($topdir . '.comment'); my %comment_vars; $comment_vars{COMMENT} = $comment_ref->{COMMENT} . '
' if $comment_ref->{COMMENT}; $comment_vars{TITLE} = $comment_ref->{TITLE} if $comment_ref->{TITLE}; $tpl_vars{DIRCOMMENT} = $templates{comment}->fill_in(HASH => \%comment_vars); $tpl_vars{TITLE} = $comment_ref->{TITLE} if $comment_ref->{TITLE}; } else { $tpl_vars{DIRCOMMENT} = $templates{nocomment}->fill_in(HASH=>\%tpl_vars); } if ($cgi->param('rss')) { $tpl_vars{MAIN} = $templates{rss}->fill_in(HASH => \%tpl_vars); $r->content_type('application/rss+xml'); } else { $tpl_vars{MAIN} = $templates{index}->fill_in(HASH => \%tpl_vars); $tpl_vars{MAIN} = $templates{layout}->fill_in(HASH => \%tpl_vars); $r->content_type('text/html'); } $r->headers_out->{'Content-Length'} = length($tpl_vars{MAIN}); if (!$::MP2) { $r->send_http_header; } $r->print($tpl_vars{MAIN}); return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } else { # original size if (defined($ENV{QUERY_STRING}) && $ENV{QUERY_STRING} eq 'orig') { if ($r->dir_config('GalleryAllowOriginal') ? 1 : 0) { $r->filename($filename); return $::MP2 ? Apache2::Const::DECLINED() : Apache::Constants::DECLINED(); } else { return $::MP2 ? Apache2::Const::FORBIDDEN() : Apache::Constants::FORBIDDEN(); } } # Create cache dir if not existing my @tmp = split (/\//, $filename); my $picfilename = pop @tmp; my $path = (join "/", @tmp)."/"; my $cache_path = cache_dir($r, 1); unless (-d $cache_path) { unless (create_cache($r, $cache_path)) { return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } } my ($orig_width, $orig_height, $type) = imgsize($filename); my $imageinfo = get_imageinfo($r, $filename, $type, $orig_width, $orig_height); my ($image_width, $width, $height, $original_size) = get_image_display_size($cgi, $r, $orig_width, $orig_height); my $cached = get_scaled_picture_name($filename, $image_width, $height); my $tpl_dir = $r->dir_config('GalleryTemplateDir'); my %templates = create_templates({layout => "$tpl_dir/layout.tpl", picture => "$tpl_dir/showpicture.tpl", navpicture => "$tpl_dir/navpicture.tpl", info => "$tpl_dir/info.tpl", scale => "$tpl_dir/scale.tpl", scaleactive => "$tpl_dir/scaleactive.tpl", orig => "$tpl_dir/orig.tpl", refresh => "$tpl_dir/refresh.tpl", interval => "$tpl_dir/interval.tpl", intervalactive => "$tpl_dir/intervalactive.tpl", slideshowisoff => "$tpl_dir/slideshowisoff.tpl", slideshowoff => "$tpl_dir/slideshowoff.tpl", pictureinfo => "$tpl_dir/pictureinfo.tpl", nopictureinfo => "$tpl_dir/nopictureinfo.tpl", }); my %tpl_vars; my $resolution = (($image_width > $orig_width) && ($height > $orig_height)) ? "$orig_width x $orig_height" : "$image_width x $height"; $tpl_vars{TITLE} = "Viewing ".$r->uri()." at $image_width x $height"; $tpl_vars{META} = " "; $tpl_vars{RESOLUTION} = $resolution; $tpl_vars{MENU} = generate_menu($r); $tpl_vars{SRC} = uri_escape(".cache/$cached", $escape_rule); $tpl_vars{URI} = $r->uri(); my $exif_mode = $r->dir_config('GalleryEXIFMode'); unless ($exif_mode) { $exif_mode = 'namevalue'; } unless (opendir(DATADIR, $path)) { show_error($r, 500, "Unable to access directory", "Unable to access directory $path"); return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } my @pictures = grep { /$img_pattern/i && ! -e "$path/$_" . ".ignore" } readdir (DATADIR); closedir(DATADIR); @pictures = gallerysort($r, @pictures); $tpl_vars{TOTAL} = scalar @pictures; my $prevpicture; my $nextpicture; for (my $i=0; $i <= $#pictures; $i++) { if ($pictures[$i] eq $picfilename) { $tpl_vars{NUMBER} = $i+1; $prevpicture = $pictures[$i-1]; my $displayprev = ($i>0 ? 1 : 0); if ($r->dir_config("GalleryWrapNavigation")) { $prevpicture = $pictures[$i>0 ? $i-1 : $#pictures]; $displayprev = 1; } if ($prevpicture and $displayprev) { my ($orig_width, $orig_height, $type) = imgsize($path.$prevpicture); my ($thumbnailwidth, $thumbnailheight) = get_thumbnailsize($r, $orig_width, $orig_height); my $imageinfo = get_imageinfo($r, $path.$prevpicture, $type, $orig_width, $orig_height); my $cached = get_scaled_picture_name($path.$prevpicture, $thumbnailwidth, $thumbnailheight); my %nav_vars; $nav_vars{URL} = uri_escape($prevpicture, $escape_rule); $nav_vars{FILENAME} = $prevpicture; $nav_vars{WIDTH} = $width; $nav_vars{PICTURE} = uri_escape(".cache/$cached", $escape_rule); $nav_vars{DIRECTION} = "« prev"; $nav_vars{ACCESSKEY} = "P"; $tpl_vars{BACK} = $templates{navpicture}->fill_in(HASH => \%nav_vars); } else { $tpl_vars{BACK} = " "; } $nextpicture = $pictures[$i+1]; if ($r->dir_config("GalleryWrapNavigation")) { $nextpicture = $pictures[$i == $#pictures ? 0 : $i+1]; } if ($nextpicture) { my ($orig_width, $orig_height, $type) = imgsize($path.$nextpicture); my ($thumbnailwidth, $thumbnailheight) = get_thumbnailsize($r, $orig_width, $orig_height); my $imageinfo = get_imageinfo($r, $path.$nextpicture, $type, $thumbnailwidth, $thumbnailheight); my $cached = get_scaled_picture_name($path.$nextpicture, $thumbnailwidth, $thumbnailheight); my %nav_vars; $nav_vars{URL} = uri_escape($nextpicture, $escape_rule); $nav_vars{FILENAME} = $nextpicture; $nav_vars{WIDTH} = $width; $nav_vars{PICTURE} = uri_escape(".cache/$cached", $escape_rule); $nav_vars{DIRECTION} = "next »"; $nav_vars{ACCESSKEY} = "N"; $tpl_vars{NEXT} = $templates{navpicture}->fill_in(HASH => \%nav_vars); $tpl_vars{NEXTURL} = uri_escape($nextpicture, $escape_rule); } else { $tpl_vars{NEXT} = " "; $tpl_vars{NEXTURL} = '#'; } } } my $foundcomment = 0; if (-f $path . '/' . $picfilename . '.comment') { my $comment_ref = get_comment($path . '/' . $picfilename . '.comment'); $foundcomment = 1; $tpl_vars{COMMENT} = $comment_ref->{COMMENT} . '
' if $comment_ref->{COMMENT}; $tpl_vars{TITLE} = $comment_ref->{TITLE} if $comment_ref->{TITLE}; } elsif ($r->dir_config('GalleryCommentExifKey')) { my $comment = decode("utf8", $imageinfo->{$r->dir_config('GalleryCommentExifKey')}); $tpl_vars{COMMENT} = encode("iso-8859-1", $comment); } else { $tpl_vars{COMMENT} = ''; } my @infos = split /, /, $r->dir_config('GalleryInfo') ? $r->dir_config('GalleryInfo') : 'Picture Taken => DateTimeOriginal, Flash => Flash'; my $foundinfo = 0; my $exifvalues; foreach (@infos) { my ($human_key, $exif_key) = (split " => ")[0,1]; my $value = $imageinfo->{$human_key}; if (defined($value)) { $foundinfo = 1; if ($exif_mode eq 'namevalue') { my %info_vars; $info_vars{KEY} = $human_key; $info_vars{VALUE} = $value; $tpl_vars{INFO} .= $templates{info}->fill_in(HASH => \%info_vars); } if ($exif_mode eq 'variables') { $tpl_vars{"EXIF_".uc($exif_key)} = $value; } if ($exif_mode eq 'values') { $exifvalues .= "| ".$value." "; } } } if ($exif_mode eq 'values') { if (defined($exifvalues)) { $tpl_vars{EXIFVALUES} = $exifvalues; } else { $tpl_vars{EXIFVALUES} = ""; } } if ($foundcomment and !$foundinfo) { $tpl_vars{INFO} = ""; } if ($exif_mode ne 'namevalue') { $tpl_vars{INFO} = ""; } if ($exif_mode eq 'namevalue' && $foundinfo or $foundcomment) { $tpl_vars{PICTUREINFO} = $templates{pictureinfo}->fill_in(HASH => \%tpl_vars); unless (defined($exifvalues)) { $tpl_vars{EXIFVALUES} = ""; } } else { $tpl_vars{PICTUREINFO} = $templates{nopictureinfo}->fill_in(HASH => \%tpl_vars); } # Fill in sizes and determine if any are smaller than the # actual image. If they are, $scaleable=1 my $scaleable = 0; my @sizes = split (/ /, $r->dir_config('GallerySizes') ? $r->dir_config('GallerySizes') : '640 800 1024 1600'); foreach my $size (@sizes) { if ($size<=$original_size) { my %sizes_vars; $sizes_vars{IMAGEURI} = uri_escape($r->uri(), $escape_rule); $sizes_vars{SIZE} = $size; $sizes_vars{WIDTH} = $size; if ($width == $size) { $tpl_vars{SIZES} .= $templates{scaleactive}->fill_in(HASH => \%sizes_vars); } else { $tpl_vars{SIZES} .= $templates{scale}->fill_in(HASH => \%sizes_vars); } $scaleable = 1; } } unless ($scaleable) { my %sizes_vars; $sizes_vars{IMAGEURI} = uri_escape($r->uri(), $escape_rule); $sizes_vars{SIZE} = $original_size; $sizes_vars{WIDTH} = $original_size; $tpl_vars{SIZES} .= $templates{scaleactive}->fill_in(HASH => \%sizes_vars); } $tpl_vars{IMAGEURI} = uri_escape($r->uri(), $escape_rule); if ($r->dir_config('GalleryAllowOriginal')) { $tpl_vars{SIZES} .= $templates{orig}->fill_in(HASH => \%tpl_vars); } my @slideshow_intervals = split (/ /, $r->dir_config('GallerySlideshowIntervals') ? $r->dir_config('GallerySlideshowIntervals') : '3 5 10 15 30'); foreach my $interval (@slideshow_intervals) { my %slideshow_vars; $slideshow_vars{IMAGEURI} = uri_escape($r->uri(), $escape_rule); $slideshow_vars{SECONDS} = $interval; $slideshow_vars{WIDTH} = ($width > $height ? $width : $height); if ($cgi->param('slideshow') && $cgi->param('slideshow') == $interval and $nextpicture) { $tpl_vars{SLIDESHOW} .= $templates{intervalactive}->fill_in(HASH => \%slideshow_vars); } else { $tpl_vars{SLIDESHOW} .= $templates{interval}->fill_in(HASH => \%slideshow_vars); } } if ($cgi->param('slideshow') and $nextpicture) { $tpl_vars{SLIDESHOW} .= $templates{slideshowoff}->fill_in(HASH => \%tpl_vars); unless ((grep $cgi->param('slideshow') == $_, @slideshow_intervals)) { show_error($r, 200, "Invalid interval", "Invalid slideshow interval choosen"); return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } $tpl_vars{URL} = uri_escape($nextpicture, $escape_rule); $tpl_vars{WIDTH} = ($width > $height ? $width : $height); $tpl_vars{INTERVAL} = $cgi->param('slideshow'); $tpl_vars{META} .= $templates{refresh}->fill_in(HASH => \%tpl_vars); } else { $tpl_vars{SLIDESHOW} .= $templates{slideshowisoff}->fill_in(HASH => \%tpl_vars); } $tpl_vars{MAIN} = $templates{picture}->fill_in(HASH => \%tpl_vars); $tpl_vars{MAIN} = $templates{layout}->fill_in(HASH => \%tpl_vars); $r->content_type('text/html'); $r->headers_out->{'Content-Length'} = length($tpl_vars{MAIN}); if (!$::MP2) { $r->send_http_header; } $r->print($tpl_vars{MAIN}); return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } } sub cache_dir { my ($r, $strip_filename) = @_; my $cache_root; unless ($r->dir_config('GalleryCacheDir')) { $cache_root = '/var/cache/www/'; if ($r->server->is_virtual) { $cache_root = File::Spec->catdir($cache_root, $r->server->server_hostname); } else { $cache_root = File::Spec->catdir($cache_root, $r->location); } } else { $cache_root = $r->dir_config('GalleryCacheDir'); } # If the uri contains .cache we need to remove it my $uri = $r->uri; $uri =~ s/\.cache//; my (undef, $dirs, $filename) = File::Spec->splitpath($uri); # We don't need a volume as this is a relative path if ($strip_filename) { return(File::Spec->canonpath(File::Spec->catdir($cache_root, $dirs))); } else { return(File::Spec->canonpath(File::Spec->catfile($cache_root, $dirs, $filename))); } } sub create_cache { my ($r, $path) = @_; unless (mkdirhier ($path)) { show_error($r, 500, $!, "Unable to create cache directory in $path: $!"); return 0; } return 1; } sub mkdirhier { my $dir = shift; unless (-d $dir) { unless (mkdir($dir, 0755)) { my $parent = $dir; $parent =~ s/\/[^\/]*$//; mkdirhier($parent); mkdir($dir, 0755); } } } sub get_scaled_picture_name { my ($fullpath, $width, $height) = @_; my (undef, undef, $type) = imgsize($fullpath); my @dirs = split(/\//, $fullpath); my $filename = pop(@dirs); my $newfilename; if (grep $type eq $_, qw(PPM TIF GIF)) { $newfilename = $width."x".$height."-".$filename; # needs to be configurable $newfilename =~ s/\.(\w+)$/-$1\.jpg/; } else { $newfilename = $width."x".$height."-".$filename; } return $newfilename; } sub scale_picture { my ($r, $fullpath, $width, $height, $imageinfo) = @_; my @dirs = split(/\//, $fullpath); my $filename = pop(@dirs); my ($orig_width, $orig_height, $type) = imgsize($fullpath); my $cache = cache_dir($r, 1); my $newfilename = get_scaled_picture_name($fullpath, $width, $height); if (($width > $orig_width) && ($height > $orig_height)) { # Run it through the resize code anyway to get watermarks $width = $orig_width; $height = $orig_height; } my ($thumbnailwidth, $thumbnailheight) = get_thumbnailsize($r, $orig_width, $orig_height); # Do we want to generate a new file in the cache? my $scale = 1; if (-f $cache."/".$newfilename) { $scale = 0; # Check to see if the image has changed my $filestat = stat($fullpath); my $cachestat = stat($cache."/".$newfilename); if ($filestat->mtime >= $cachestat->mtime) { $scale = 1; } # Check to see if the .rotate file has been added or changed if (-f $fullpath . ".rotate") { my $rotatestat = stat($fullpath . ".rotate"); if ($rotatestat->mtime > $cachestat->mtime) { $scale = 1; } } # Check to see if the copyrightimage has been added or changed if ($r->dir_config('GalleryCopyrightImage') && -f $r->dir_config('GalleryCopyrightImage')) { unless ($width == $thumbnailwidth or $width == $thumbnailheight) { my $copyrightstat = stat($r->dir_config('GalleryCopyrightImage')); if ($copyrightstat->mtime > $cachestat->mtime) { $scale = 1; } } } } if ($scale) { my $newpath = $cache."/".$newfilename; my $rotate = readfile_getnum($r, $imageinfo, $fullpath . ".rotate"); my $quality = $r->dir_config('GalleryQuality'); if ($width == $thumbnailwidth or $width == $thumbnailheight) { resizepicture($r, $fullpath, $newpath, $width, $height, $rotate, '', '', '', '', '', ''); } else { resizepicture($r, $fullpath, $newpath, $width, $height, $rotate, ($r->dir_config('GalleryCopyrightImage') ? $r->dir_config('GalleryCopyrightImage') : ''), ($r->dir_config('GalleryTTFDir') ? $r->dir_config('GalleryTTFDir') : ''), ($r->dir_config('GalleryCopyrightText') ? $r->dir_config('GalleryCopyrightText') : ''), ($r->dir_config('GalleryCopyrightColor') ? $r->dir_config('GalleryCopyrightColor') : ''), ($r->dir_config('GalleryTTFFile') ? $r->dir_config('GalleryTTFFile') : ''), ($r->dir_config('GalleryTTFSize') ? $r->dir_config('GalleryTTFSize') : ''), ($r->dir_config('GalleryCopyrightBackgroundColor') ? $r->dir_config('GalleryCopyrightBackgroundColor') : ''), $quality); } } return $newfilename; } sub get_thumbnailsize { my ($r, $orig_width, $orig_height) = @_; my $gallerythumbnailsize=$r->dir_config('GalleryThumbnailSize'); if (defined($gallerythumbnailsize)) { warn("Invalid setting for GalleryThumbnailSize") unless $gallerythumbnailsize =~ /^\s*\d+\s*x\s*\d+\s*$/i; } my ($thumbnailwidth, $thumbnailheight) = split(/x/i, ($gallerythumbnailsize) ? $gallerythumbnailsize : "100x75"); my $width = $thumbnailwidth; my $height = $thumbnailheight; # If the image is rotated, flip everything around. if (defined $r->dir_config('GalleryThumbnailSizeLS') and $r->dir_config('GalleryThumbnailSizeLS') eq '1' and $orig_width < $orig_height) { $width = $thumbnailheight; $height = $thumbnailwidth; } my $scale = ($orig_width ? $width/$orig_width : 1); if ($orig_height) { if ($orig_height * $scale > $thumbnailheight) { $scale = $height/$orig_height; $width = $orig_width * $scale; } } $height = $orig_height * $scale; $height = floor($height); $width = floor($width); return ($width, $height); } sub get_image_display_size { my ($cgi, $r, $orig_width, $orig_height) = @_; my $width = $orig_width; my $original_size=$orig_height; if ($orig_width>$orig_height) { $original_size=$orig_width; } # Check if the selected width is allowed my @sizes = split (/ /, $r->dir_config('GallerySizes') ? $r->dir_config('GallerySizes') : '640 800 1024 1600'); my %cookies = fetch CGI::Cookie; if ($cgi->param('width')) { unless ((grep $cgi->param('width') == $_, @sizes) or ($cgi->param('width') == $original_size)) { show_error($r, 200, "Invalid width", "The specified width is invalid"); return $::MP2 ? Apache2::Const::OK() : Apache::Constants::OK(); } $width = $cgi->param('width'); my $cookie = new CGI::Cookie(-name => 'GallerySize', -value => $width, -expires => '+6M'); $r->headers_out->{'Set-Cookie'} = $cookie; } elsif ($cookies{'GallerySize'} && (grep $cookies{'GallerySize'}->value == $_, @sizes)) { $width = $cookies{'GallerySize'}->value; } else { $width = $sizes[0]; } my $scale; my $image_width; if ($orig_width<$orig_height) { $scale = ($orig_height ? $width/$orig_height: 1); $image_width=$width*$orig_width/$orig_height; } else { $scale = ($orig_width ? $width/$orig_width : 1); $image_width = $width; } my $height = $orig_height * $scale; $image_width = floor($image_width); $width = floor($width); $height = floor($height); return ($image_width, $width, $height, $original_size); } sub get_imageinfo { my ($r, $file, $type, $width, $height) = @_; my $imageinfo = {}; if ($type eq 'Data stream is not a known image file format') { # should never be reached, this is supposed to be handled outside of here log_error("Something was fishy with the type of the file $file\n"); } else { # Some files, like TIFF, PNG, GIF do not have EXIF info # embedded but use .thm files instead. $imageinfo = get_imageinfo_from_thm_file($file, $width, $height); # If there is no .thm file and our file is a JPEG file we try to extract the EXIf # info using Image::Info unless (defined($imageinfo) && (grep $type eq $_, qw(JPG))) { # Only for files that natively keep the EXIF info in the same file $imageinfo = image_info($file); } } unless (defined($imageinfo->{width}) and defined($imageinfo->{height})) { $imageinfo->{width} = $width; $imageinfo->{height} = $height; } my @infos = split /, /, $r->dir_config('GalleryInfo') ? $r->dir_config('GalleryInfo') : 'Picture Taken => DateTimeOriginal, Flash => Flash'; foreach (@infos) { my ($human_key, $exif_key) = (split " => ")[0,1]; if (defined($exif_key) && defined($imageinfo->{$exif_key})) { my $value = ""; if (ref($imageinfo->{$exif_key}) eq 'Image::TIFF::Rational') { $value = $imageinfo->{$exif_key}->as_string; } elsif (ref($imageinfo->{$exif_key}) eq 'ARRAY') { foreach my $element (@{$imageinfo->{$exif_key}}) { if (ref($element) eq 'ARRAY') { foreach (@{$element}) { $value .= $_ . ' '; } } elsif (ref($element) eq 'HASH') { $value .= "
{ "; foreach (sort keys %{$element}) { $value .= "$_ = " . $element->{$_} . ' '; } $value .= "} "; } else { $value .= $element; } $value .= ' '; } } else { my $exif_value = $imageinfo->{$exif_key}; if ($human_key eq 'Flash' && $exif_value =~ m/\d/) { my %flashmodes = ( "0" => "No", "1" => "Yes", "9" => "Yes", "16" => "No (Compulsory) Should be External Flash", "17" => "Yes (External)", "24" => "No", "25" => "Yes (Auto)", "73" => "Yes (Compulsory, Red Eye Reducing)", "89" => "Yes (Auto, Red Eye Reducing)" ); $exif_value = defined $flashmodes{$exif_value} ? $flashmodes{$exif_value} : 'unknown flash mode'; } $value = $exif_value; } if ($exif_key eq 'MeteringMode') { my $exif_value = $imageinfo->{$exif_key}; if ($exif_value =~ /^\d+$/) { my %meteringmodes = ( '0' => 'unknown', '1' => 'Average', '2' => 'CenterWeightedAverage', '3' => 'Spot', '4' => 'MultiSpot', '5' => 'Pattern', '6' => 'Partial', '255' => 'Other' ); $exif_value = defined $meteringmodes{$exif_value} ? $meteringmodes{$exif_value} : 'unknown metering mode'; } $value = $exif_value; } if ($exif_key eq 'LightSource') { my $exif_value = $imageinfo->{$exif_key}; if ($exif_value =~ /^\d+$/) { my %lightsources = ( '0' => 'unknown', '1' => 'Daylight', '2' => 'Fluorescent', '3' => 'Tungsten (incandescent light)', '4' => 'Flash', '9' => 'Fine weather', '10' => 'Cloudy weather', '11' => 'Shade', '12' => 'Daylight fluorescent', '13' => 'Day white fluorescent', '14' => 'Cool white fluorescent', '15' => 'White fluorescent', '17' => 'Standard light A', '18' => 'Standard light B', '19' => 'Standard light C', '20' => 'D55', '21' => 'D65', '22' => 'D75', '23' => 'D50', '24' => 'ISO studio tungsten', '255' => 'other light source' ); $exif_value = defined $lightsources{$exif_value} ? $lightsources{$exif_value} : 'unknown light source'; } $value = $exif_value; } if ($exif_key eq 'FocalLength') { if ($value =~ /^(\d+)\/(\d+)$/) { $value = eval { $1 / $2 }; if ($@) { $value = $@; } else { $value = int($value + 0.5) . "mm"; } } } if ($exif_key eq 'ShutterSpeedValue') { if ($value =~ /^((?:\-)?\d+)\/(\d+)$/) { $value = eval { $1 / $2 }; if ($@) { $value = $@; } else { eval { $value = 1/(exp($value*log(2))); if ($value < 1) { $value = "1/" . (int((1/$value))); } else { $value = int($value*10)/10; } }; if ($@) { $value = $@; } else { $value = $value . " sec"; } } } } if ($exif_key eq 'ApertureValue') { if ($value =~ /^(\d+)\/(\d+)$/) { $value = eval { $1 / $2 }; if ($@) { $value = $@; } else { # poor man's rounding $value = int(exp($value*log(2)*0.5)*10)/10; $value = "f" . $value; } } } if ($exif_key eq 'FNumber') { if ($value =~ /^(\d+)\/(\d+)$/) { $value = eval { $1 / $2 }; if ($@) { $value = $@; } else { $value = int($value*10+0.5)/10; $value = "f" . $value; } } } $imageinfo->{$human_key} = $value; } } if ($r->dir_config('GalleryUseFileDate') && ($r->dir_config('GalleryUseFileDate') eq '1' || !$imageinfo->{"Picture Taken"} )) { my $st = stat($file); $imageinfo->{"DateTimeOriginal"} = $imageinfo->{"Picture Taken"} = scalar localtime($st->mtime) if $st; } return $imageinfo; } sub get_imageinfo_from_thm_file { my ($file, $width, $height) = @_; my $imageinfo = undef; # Windows based file extensions are often .THM, so check # for both .thm and .THM my $unix_file = $file; my $windows_file = $file; $unix_file =~ s/\.(\w+)$/.thm/; $windows_file =~ s/\.(\w+)$/.THM/; if (-e $unix_file && -f $unix_file && -r $unix_file) { $imageinfo = image_info($unix_file); $imageinfo->{width} = $width; $imageinfo->{height} = $height; } elsif (-e $windows_file && -f $windows_file && -r $windows_file) { $imageinfo = image_info($windows_file); $imageinfo->{width} = $width; $imageinfo->{height} = $height; } return $imageinfo; } sub readfile_getnum { my ($r, $imageinfo, $filename) = @_; my $rotate = 0; print STDERR "orientation: ".$imageinfo->{Orientation}."\n"; # Check to see if the image contains the Orientation EXIF key, # but allow user to override using rotate if (!defined($r->dir_config("GalleryAutoRotate")) || $r->dir_config("GalleryAutoRotate") eq "1") { if (defined($imageinfo->{Orientation})) { print STDERR $imageinfo->{Orientation}."\n"; if ($imageinfo->{Orientation} eq 'right_top') { $rotate=1; } elsif ($imageinfo->{Orientation} eq 'left_bot') { $rotate=3; } } } if (open(FH, "<$filename")) { my $temp = ; chomp($temp); close(FH); unless ($temp =~ /^\d$/) { $rotate = 0; } unless ($temp == 1 || $temp == 2 || $temp == 3) { $rotate = 0; } $rotate = $temp; } return $rotate; } sub get_filecontent { my $file = shift; open(FH, $file) or return undef; my $content = ''; { local $/; $content = ; } close(FH); return $content; } sub get_comment { my $filename = shift; my $comment_ref = {}; $comment_ref->{TITLE} = undef; $comment_ref->{COMMENT} = ''; open(FH, $filename) or return $comment_ref; my $title = ; if ($title =~ m/^TITLE: (.*)$/) { chomp($comment_ref->{TITLE} = $1); } else { $comment_ref->{COMMENT} = $title; } while () { chomp; $comment_ref->{COMMENT} .= $_; } close(FH); return $comment_ref; } sub show_error { my ($r, $statuscode, $errortitle, $error) = @_; my $tpl = $r->dir_config('GalleryTemplateDir'); my %templates = create_templates({layout => "$tpl/layout.tpl", error => "$tpl/error.tpl", }); my %tpl_vars; $tpl_vars{TITLE} = "Error! $errortitle"; $tpl_vars{META} = ""; $tpl_vars{ERRORTITLE} = "Error! $errortitle"; $tpl_vars{ERROR} = $error; $tpl_vars{MAIN} = $templates{error}->fill_in(HASH => \%tpl_vars); $tpl_vars{PAGE} = $templates{layout}->fill_in(HASH => \%tpl_vars); $r->status($statuscode); $r->content_type('text/html'); $r->print($tpl_vars{PAGE}); } sub generate_menu { my $r = shift; my $root_text = (defined($r->dir_config('GalleryRootText')) ? $r->dir_config('GalleryRootText') : "root:" ); my $root_path = (defined($r->dir_config('GalleryRootPath')) ? $r->dir_config('GalleryRootPath') : "" ); my $subr = $r->lookup_uri($r->uri); my $filename = $subr->filename; my @links = split (/\//, $r->uri); my $uri = $r->uri; $uri =~ s/^$root_path//g; @links = split (/\//, $uri); # Get the full path of the base directory my $dirname; { my @direlem = split (/\//, $filename); for my $i ( 0 .. ( scalar(@direlem) - scalar(@links) ) ) { $dirname .= shift(@direlem) . '/'; } chop $dirname; } my $picturename; if (-f $filename) { $picturename = pop(@links); } if ($r->uri eq $root_path) { return qq{ $root_text }; } my $menu; my $menuurl = $root_path; foreach my $link (@links) { $menuurl .= $link."/"; my $linktext = $link; unless (length($link)) { $linktext = "$root_text "; } else { $dirname = File::Spec->catdir($dirname, $link); if (-e $dirname . ".folder") { $linktext = get_filecontent($dirname . ".folder"); } } if ("$root_path$uri" eq $menuurl) { $menu .= "$linktext / "; } else { $menu .= "$linktext / "; } } if (-f $filename) { $menu .= $picturename; } else { if ($r->dir_config('GallerySelectionMode') && $r->dir_config('GallerySelectionMode') eq '1') { $menu .= "[select] "; } } return $menu; } sub resizepicture { my ($r, $infile, $outfile, $x, $y, $rotate, $copyrightfile, $GalleryTTFDir, $GalleryCopyrightText, $text_color, $GalleryTTFFile, $GalleryTTFSize, $GalleryCopyrightBackgroundColor, $quality) = @_; # Load image my $image = Image::Imlib2->load($infile) or warn("Unable to open file $infile, $!"); # Scale image $image=$image->create_scaled_image($x, $y) or warn("Unable to scale image $infile. Are you running out of memory?"); # Rotate image if ($rotate != 0) { $image->image_orientate($rotate); } # blend copyright image onto image if ($copyrightfile ne '') { if (-f $copyrightfile and (my $logo=Image::Imlib2->load($copyrightfile))) { my $x = $image->get_width(); my $y = $image->get_height(); my $logox = $logo->get_width(); my $logoy = $logo->get_height(); $image->blend($logo, 0, 0, 0, $logox, $logoy, $x-$logox, $y-$logoy, $logox, $logoy); } else { log_error("GalleryCopyrightImage $copyrightfile was not found"); } } if ($GalleryTTFDir && $GalleryCopyrightText && $GalleryTTFFile && $text_color) { if (!-d $GalleryTTFDir) { log_error("GalleryTTFDir $GalleryTTFDir is not a dir\n"); } elsif ($GalleryCopyrightText eq '') { log_error("GalleryCopyrightText is empty. No text inserted to picture\n"); } elsif (!-e "$GalleryTTFDir/$GalleryTTFFile") { log_error("GalleryTTFFile $GalleryTTFFile was not found\n"); } else { $GalleryTTFFile =~ s/\.TTF$//i; $image->add_font_path("$GalleryTTFDir"); $image->load_font("$GalleryTTFFile/$GalleryTTFSize"); my($text_x, $text_y) = $image->get_text_size("$GalleryCopyrightText"); my $x = $image->get_width(); my $y = $image->get_height(); my $offset = 3; if (($text_x < $x - $offset) && ($text_y < $y - $offset)) { if ($GalleryCopyrightBackgroundColor =~ /^\d+,\d+,\d+,\d+$/) { my ($br_val, $bg_val, $bb_val, $ba_val) = split (/,/, $GalleryCopyrightBackgroundColor); $image->set_colour($br_val, $bg_val, $bb_val, $ba_val); $image->fill_rectangle ($x-$text_x-$offset, $y-$text_y-$offset, $text_x, $text_y); } my ($r_val, $g_val, $b_val, $a_val) = split (/,/, $text_color); $image->set_colour($r_val, $g_val, $b_val, $a_val); $image->draw_text($x-$text_x-$offset, $y-$text_y-$offset, "$GalleryCopyrightText"); } else { log_error("Text is to big for the picture.\n"); } } } if ($quality && $quality =~ m/^\d+$/) { $image->set_quality($quality); } $image->save($outfile); } sub gallerysort { my $r=shift; my @files=@_; my $sortby = $r->dir_config('GallerySortBy'); my $filename=$r->lookup_uri($r->uri)->filename; $filename=(File::Spec->splitpath($filename))[1] if (-f $filename); if ($sortby && $sortby =~ m/^(size|atime|mtime|ctime)$/) { @files = map(/^\d+ (.*)/, sort map(stat("$filename/$_")->$sortby()." $_", @files)); } else { @files = sort @files; } return @files; } # Create Text::Template objects used by Apache::Gallery. Takes a # hashref of template_name, template_filename pairs, and returns a # list of template_name, texttemplate_object pairs. sub create_templates { my $templates = shift; # This routine is called whenever a template has an error. Prints # the error to STDERR and sticks the error in the output sub tt_broken { my %args = @_; # Pull out the name and filename from the arg option [see # Text::Template for details] @args{qw(name file)} = @{$args{arg}}; print STDERR qq(Template $args{name} ("$args{file}") is broken: $args{error}); # Don't include the file name in the output, as the user can see this. return qq(); } my %texttemplate_objects; for my $template_name (keys %$templates) { my $tt_obj = Text::Template->new(TYPE => 'FILE', SOURCE => $$templates{$template_name}, BROKEN => \&tt_broken, BROKEN_ARG => [$template_name, $$templates{$template_name}], ) or die "Unable to create new Text::Template object for $template_name: $Text::Template::ERROR"; $texttemplate_objects{$template_name} = $tt_obj; } return %texttemplate_objects; } sub log_error { if ($::MP2) { Apache2::RequestUtil->request->log_error(shift()); } else { Apache->request->log_error(shift()); } } 1; =head1 NAME Apache::Gallery - mod_perl handler to create an image gallery =head1 SYNOPSIS See the INSTALL file in the distribution for installation instructions. =head1 DESCRIPTION Apache::Gallery creates an thumbnail index of each directory and allows viewing pictures in different resolutions. Pictures are resized on the fly and cached. The gallery can be configured and customized in many ways and a custom copyright image can be added to all the images without modifying the original. =head1 CONFIGURATION In your httpd.conf you set the global options for the gallery. You can also override each of the options in .htaccess files in your gallery directories. The options are set in the httpd.conf/.htaccess file using the syntax: B Example: B =over 4 =item B Some cameras, like the Canon G3, can detect the orientation of a the pictures you take and will save this information in the 'Orientation' EXIF field. Apache::Gallery will then automatically rotate your images. This behavior is default but can be disabled by setting GalleryAutoRotate to 0. =item B Directory where Apache::Gallery should create its cache with scaled pictures. The default is /var/cache/www/ . Here, a directory for each virtualhost or location will be created automatically. Make sure your webserver has write access to the CacheDir. =item B Full path to the directory where you placed the templates. This option can be used both in your global configuration and in .htaccess files, this way you can have different layouts in different parts of your gallery. No default value, this option is required. =item B With this option you can define which EXIF information you would like to present from the image. The format is: ' KeyInEXIF, MyOtherName => OtherKeyInEXIF' Examples of keys: B, B, B, and B You can view all the keys from the EXIF header using this perl-oneliner: perl C<-e> 'use Data::Dumper; use Image::Info qw(image_info); print Dumper(image_info(shift));' filename.jpg Default is: 'Picture Taken => DateTimeOriginal, Flash => Flash' =item B Defines which widths images can be scaled to. Images cannot be scaled to other widths than the ones you define with this option. The default is '640 800 1024 1600' =item B Defines the width and height of the thumbnail images. Defaults to '100x75' =item B If set to '1', B is the long and the short side of the thumbnail image instead of the width and height. Defaults to '0'. =item B Image you want to blend into your images in the lower right corner. This could be a transparent png saying "copyright my name 2001". Optional. =item B Make the navigation in the picture view wrap around (So Next at the end displays the first picture, etc.) Set to 1 or 0, default is 0 =item B Allow the user to download the Original picture without resizing or putting the CopyrightImage on it. Set to 1 or 0, default is 0 =item B With this option you can configure which intervals can be selected for a slideshow. The default is '3 5 10 15 30' =item B Instead of the default filename ordering you can sort by any stat attribute. For example size, atime, mtime, ctime. =item B Set this variable to sort directories differently than other items, can be set to size, atime, mtime and ctime; setting any other value will revert to sorting by name. =item B Cache EXIF data using Memoize - this will make Apache::Gallery faster when many people access the same images, but it will also cache EXIF data until the current Apache child dies. =item B Set this option to 1 to make A::G show the files timestamp instead of the EXIF value for "Picture taken". =item B Enable the selection mode. Select images with checkboxes and get a list of filenames. =item B You can choose how Apache::Gallery should display EXIF info from your images. The default setting is 'namevalue'. This setting will make Apache::Gallery print out the names and values of the EXIF values you configure with GalleryInfo. The information will be parsed into $INFO in pictureinfo.tpl. You can also set it to 'values' which will make A::G parse the configured values into the var $EXIFVALUES as 'value | value | value' If you set this option to 'variables' the items you configure in GalleryInfo will be available to your templates as $EXIF_ (in all uppercase). That means that with the default setting "Picture Taken => DateTimeOriginal, Flash => Flash" you will have the variables $EXIF_DATETIMEORIGINAL and $EXIF_FLASH available to your templates. You can place them anywhere you want. =item B Change the location of gallery root. The default is "" =item B Change the name that appears as the root element in the menu. The default is "root:" =item B This options controls how many thumbnails should be displayed in a page. It requires $BROWSELINKS to be in the index.tpl template file. =item B Pattern matching the files you want Apache::Gallery to view in the index as thumbnails. The default is '\.(jpe?g|png|tiff?|ppm)$' =item B Pattern matching the files you want Apache::Gallery to view in the index as normal files. All other filetypes will still be served by Apache::Gallery but are not visible in the index. The default is '\.(mpe?g|avi|mov|asf|wmv|doc|mp3|ogg|pdf|rtf|wav|dlt|txt|html?|csv|eps)$' =item B To use the GalleryCopyrightText feature you must set this option to the directory where your True Type fonts are stored. No default is set. Example: PerlSetVar GalleryTTFDir '/usr/share/fonts/' =item B To use the GalleryCopyrightText feature this option must be set to the name of the True Type font you wish to use. Example: PerlSetVar GalleryTTFFile 'verdanab.ttf' =item B Configure the size of the CopyrightText that will be inserted as copyright notice in the corner of your pictures. Example: PerlSetVar GalleryTTFSize '10' =item B The text that will be inserted as copyright notice. Example: PerlSetVar GalleryCopyrightText '(c) Michael Legart' =item B The text color of your copyright notice. Examples: White: PerlSetVar GalleryCopyrightColor '255,255,255,255' Black: PerlSetVar GalleryCopyrightColor '0,0,0,255' Red: PerlSetVar GalleryCopyrightColor '255,0,0,255' Green: PerlSetVar GalleryCopyrightColor '0,255,0,255' Blue: PerlSetVar GalleryCopyrightColor '0,0,255,255' Transparent orange: PerlSetVar GalleryCopyrightColor '255,127,0,127' =item B The background-color of a GalleryCopyrightText r,g,b,a - for examples, see GalleryCopyrightColor =item B The quality (1-100) of scaled images This setting affects the quality of the scaled images. Set this to a low number to reduce the size of the scaled images. Remember to clear out your cache if you change this setting. Quality seems to default to 75, at least in the jpeg and png loader code in Imlib2 1.1.0. Examples: Quality at 50: PerlSetVar GalleryQuality '50' =item B Set this option to 1 to convert underscores to spaces in the listing of directory and file names, as well as in the alt attribute for HTML tags. =back =over 4 =item B Set this option to e.g. ImageDescription to use this field as comments for images. =item B Set this option to 1 to enable generation of a media RSS feed. This can be used e.g. together with the PicLens plugin from http://piclens.com =back =head1 FEATURES =over 4 =item B Some cameras, like the Canon G3, detects the orientation of a picture and adds this info to the EXIF header. Apache::Gallery detects this and automatically rotates images with this info. If your camera does not support this, you can rotate the images manually, This can also be used to override the rotate information from a camera that supports that. You can also disable this behavior with the GalleryAutoRotate option. To use this functionality you have to create file with the name of the picture you want rotated appended with ".rotate". The file should include a number where these numbers are supported: "1", rotates clockwise by 90 degree "2", rotates clockwise by 180 degrees "3", rotates clockwise by 270 degrees So if we want to rotate "Picture1234.jpg" 90 degrees clockwise we would create a file in the same directory called "Picture1234.jpg.rotate" with the number 1 inside of it. =item B To ignore a directory or a file (of any kind, not only images) you create a .ignore file. =item B To include comments for a directory you create a .comment file where the first line can contain "TITLE: New title" which will be the title of the page, and a comment on the following lines. To include comments for each picture you create files called picture.jpg.comment where the first line can contain "TITLE: New title" which will be the title of the page, and a comment on the following lines. Example: TITLE: This is the new title of the page And this is the comment.
And this is line two of the comment. The visible name of the folder is by default identical to the name of the folder, but can be changed by creating a file .folder with the visible name of the folder. It is also possible to set GalleryCommentExifKey to the name of an EXIF field containing the comment, e.g. ImageDescription. The EXIF comment is overridden by the .comment file if it exists. =back =head1 DEPENDENCIES =over 4 =item B =item B =item B =item B =item B =item B =item B =item B (ie, XFree86) =item B Remember the -dev package when using rpm, deb or other package formats! =back =head1 AUTHOR Michael Legart =head1 COPYRIGHT AND LICENSE Copyright (C) 2001-2011 Michael Legart Templates designed by Thomas Kjaer Apache::Gallery is free software and is released under the Artistic License. See B for details. The video icons are from the GNOME project. B =head1 THANKS Thanks to Thomas Kjaer for templates and design of B Thanks to Thomas Eibner and other for patches. (See the Changes file) =head1 SEE ALSO L, L, L, L, L, and L. =cut Apache-Gallery-1.0.2/UPGRADE0000644000175000017500000000677311573732721013453 0ustar milmil# $Author: mil $ $Rev: 297 $ # $Date: 2005-06-07 09:50:49 +0200 (Tue, 07 Jun 2005) $ For users upgrading to 1.0 If you are using mod_perl2 version mod_perl-2.0 is now required. Also, CGI 3.08 is required if using mod_perl2. To enable access keys for navigation update the navpicture.tpl and showpicture.tpl templates. For users upgrading from 0.7 to 0.8 You need to create new directory called gallery in Apaches icons directory. Copy the png files from the htdocs dictory to this new directory. For those of you with pre-existing templates, a simple cd templates; perl -pi -e 's/(? DateTimeOriginal, Flash => Flash' PerlSetVar GallerySizes '640 1024 1600 2272' to your virtualhost. Apache-Gallery-1.0.2/META.yml0000666000175000017500000000135011573741742013703 0ustar milmil--- #YAML:1.0 name: Apache-Gallery version: 1.0.2 abstract: mod_perl handler to create an image gallery author: - Michael Legart license: unknown distribution_type: module configure_requires: ExtUtils::MakeMaker: 0 build_requires: ExtUtils::MakeMaker: 0 requires: CGI: 3.08 File::Spec: 0 Image::Imlib2: 1.02 Image::Info: 0 Image::Size: 0 Test::More: 0 Text::Template: 0 URI: 1.23 no_index: directory: - t - inc generated_by: ExtUtils::MakeMaker version 6.55_02 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4