uphpmvault-0.8build1/0000755000000000000000000000000011604127521011554 5ustar uphpmvault-0.8build1/.git/0000755000000000000000000000000011604127336012421 5ustar uphpmvault-0.8build1/.git/COMMIT_EDITMSG0000644000000000000000000000110611557565173014522 0ustar Lame release to fix source archive inclusion of git control files. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # modified: debian/changelog # # Untracked files: # (use "git add ..." to include in what will be committed) # # debian/files # debian/uphpmvault.debhelper.log # debian/uphpmvault.substvars # debian/uphpmvault/ # dumpw.o # uphpmvault # uphpmvault.o # uphpmvault_unstripped uphpmvault-0.8build1/.git/HEAD0000644000000000000000000000002711025616626013046 0ustar ref: refs/heads/master uphpmvault-0.8build1/.git/branches/0000755000000000000000000000000011025616626014210 5ustar uphpmvault-0.8build1/.git/config0000644000000000000000000000013411025616626013611 0ustar [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true uphpmvault-0.8build1/.git/description0000644000000000000000000000007211025616626014670 0ustar Unnamed repository; edit this file to name it for gitweb. uphpmvault-0.8build1/.git/hooks/0000755000000000000000000000000011025616626013546 5ustar uphpmvault-0.8build1/.git/hooks/applypatch-msg0000644000000000000000000000067111025616626016426 0ustar #!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, make this file executable. . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : uphpmvault-0.8build1/.git/hooks/commit-msg0000644000000000000000000000156711025616626015556 0ustar #!/bin/sh # # An example hook script to check the commit log message. # Called by git-commit with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, make this file executable. # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } uphpmvault-0.8build1/.git/hooks/post-commit0000644000000000000000000000023011025616626015737 0ustar #!/bin/sh # # An example hook script that is called after a successful # commit is made. # # To enable this hook, make this file executable. : Nothing uphpmvault-0.8build1/.git/hooks/post-receive0000644000000000000000000000077611025616626016110 0ustar #!/bin/sh # # An example hook script for the post-receive event # # This script is run after receive-pack has accepted a pack and the # repository has been updated. It is passed arguments in through stdin # in the form # # For example: # aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master # # see contrib/hooks/ for an sample, or uncomment the next line (on debian) # #. /usr/share/doc/git-core/contrib/hooks/post-receive-email uphpmvault-0.8build1/.git/hooks/post-update0000644000000000000000000000031711025616626015737 0ustar #!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, make this file executable by "chmod +x post-update". exec git-update-server-info uphpmvault-0.8build1/.git/hooks/pre-applypatch0000644000000000000000000000060311025616626016421 0ustar #!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, make this file executable. . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : uphpmvault-0.8build1/.git/hooks/pre-commit0000644000000000000000000000325211025616626015547 0ustar #!/bin/sh # # An example hook script to verify what is about to be committed. # Called by git-commit with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, make this file executable. # This is slightly modified from Andrew Morton's Perfect Patch. # Lines you introduce should not have trailing whitespace. # Also check for an indentation that has SP before a TAB. if git-rev-parse --verify HEAD 2>/dev/null then git-diff-index -p -M --cached HEAD -- else # NEEDSWORK: we should produce a diff with an empty tree here # if we want to do the same verification for the initial import. : fi | perl -e ' my $found_bad = 0; my $filename; my $reported_filename = ""; my $lineno; sub bad_line { my ($why, $line) = @_; if (!$found_bad) { print STDERR "*\n"; print STDERR "* You have some suspicious patch lines:\n"; print STDERR "*\n"; $found_bad = 1; } if ($reported_filename ne $filename) { print STDERR "* In $filename\n"; $reported_filename = $filename; } print STDERR "* $why (line $lineno)\n"; print STDERR "$filename:$lineno:$line\n"; } while (<>) { if (m|^diff --git a/(.*) b/\1$|) { $filename = $1; next; } if (/^@@ -\S+ \+(\d+)/) { $lineno = $1 - 1; next; } if (/^ /) { $lineno++; next; } if (s/^\+//) { $lineno++; chomp; if (/\s$/) { bad_line("trailing whitespace", $_); } if (/^\s* \t/) { bad_line("indent SP followed by a TAB", $_); } if (/^([<>])\1{6} |^={7}$/) { bad_line("unresolved merge conflict", $_); } } } exit($found_bad); ' uphpmvault-0.8build1/.git/hooks/pre-rebase0000644000000000000000000001024611025616626015521 0ustar #!/bin/sh # # Copyright (c) 2006 Junio C Hamano # publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` fi case "$basebranch,$topic" in master,refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Is topic fully merged to master? not_in_master=`git-rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git-rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git-rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git-rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git-rev-list --pretty=oneline ^${publish} "$topic"` perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi exit 0 ################################################################ This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git-rev-list ^master ^topic next git-rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git-rev-list master..topic if this is empty, it is fully merged to "master". uphpmvault-0.8build1/.git/hooks/prepare-commit-msg0000644000000000000000000000223411025616626017202 0ustar #!/bin/sh # # An example hook script to prepare the commit log message. # Called by git-commit with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, make this file executable. # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2 $3" in merge) sed -i '/^Conflicts:/,/#/!b;s/^/# &/;s/^# #/#/' "$1" ;; # ""|template) # perl -i -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" uphpmvault-0.8build1/.git/hooks/update0000644000000000000000000000553611025616626014764 0ustar #!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by git-receive-pack with arguments: refname sha1-old sha1-new # # To enable this hook, make this file executable by "chmod +x update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") if [ -z "$projectdesc" -o "$projectdesc" = "Unnamed repository; edit this file to name it for gitweb." ]; then echo "*** Project description file hasn't been set" >&2 exit 1 fi # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. if [ "$newrev" = "0000000000000000000000000000000000000000" ]; then newrev_type=delete else newrev_type=$(git-cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag ;; refs/heads/*,commit) # branch ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 uphpmvault-0.8build1/.git/index0000644000000000000000000000213011557565156013464 0ustar DIRCJL)HWZ FC\G Y0z%1COPYINGMM mR4/H֠MakefileMgMg O[f=Ԍ)Idebian/changelogJL)Ha6 P=`C۝,( debian/compatJL)HnD QfQ`~mA:r]debian/controlJL)H\yG R*fՇ`"S8mdebian/copyrightJL)Hn܁ T _HנQ-debian/manpagesJL)HaB U%Xq1aY0L` debian/rulesJL)HW[Z s*8D2mN)dumpw.ccJL)HW[N WЅM]mndumpw.hJL)HW[- P7g+2$ZF exception.hJL)HW[ aox-勳? xF' oprintf.hJL)Hn` BA)B"/TI6lm uphpmvault.8MM 9QW4j!]ՆCGqȳt uphpmvault.ccORsVX3Ї ,uphpmvault-0.8build1/.git/info/0000755000000000000000000000000011025616626013356 5ustar uphpmvault-0.8build1/.git/info/exclude0000644000000000000000000000036011025616626014731 0ustar # git-ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ uphpmvault-0.8build1/.git/logs/0000755000000000000000000000000011025616751013366 5ustar uphpmvault-0.8build1/.git/logs/HEAD0000644000000000000000000000340511557565173014027 0ustar 0000000000000000000000000000000000000000 e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 Marc Singer 1213668841 -0700 commit (initial): Initia repository for HP Media Vault recovery program e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 e999884c15287c43ec797711ecfc8421903a931b Marc Singer 1213684653 -0700 commit: Added copyright messages e999884c15287c43ec797711ecfc8421903a931b 07ab8fc5572281f1db8de4dc0efdde002b3cec87 Marc Singer 1214019749 -0700 commit: Ignoring beacons with empty IP addresses. 07ab8fc5572281f1db8de4dc0efdde002b3cec87 78f42f905849b16f8818337b2dbeb28dc9c2f10a Marc Singer 1214117333 -0700 commit: Changed from reading input file to mmap'ing it. 78f42f905849b16f8818337b2dbeb28dc9c2f10a 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 Marc Singer 1214289556 -0700 commit: Added argp support. 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 bf708f4765d3f1c9b4cc8472d12d9a60e2357925 Marc Singer 1214374089 -0700 commit: Preparing initial release for Debian. bf708f4765d3f1c9b4cc8472d12d9a60e2357925 2494d64c179fa7bfca25f9993a6b389578d967b3 Marc Singer 1215225726 -0700 commit: Fixed package build for Debian. 2494d64c179fa7bfca25f9993a6b389578d967b3 21f1015e603ec04fe7dd26157cef44f9d3428614 Marc Singer 1215226419 -0700 commit: Added build target to Makefile to document how to build within git 21f1015e603ec04fe7dd26157cef44f9d3428614 2828f9e8e880eb468c110b078ea52660b1bf3844 Marc Singer 1304356635 -0700 commit: Fixing bug opened on package due to GCC 4.6 2828f9e8e880eb468c110b078ea52660b1bf3844 b7d262efbdf02b036ffe9f744819bc10d78e4b75 Marc Singer 1304357486 -0700 commit: Lame release to fix source archive inclusion of git control files. uphpmvault-0.8build1/.git/logs/refs/0000755000000000000000000000000011025616751014325 5ustar uphpmvault-0.8build1/.git/logs/refs/heads/0000755000000000000000000000000011025616751015411 5ustar uphpmvault-0.8build1/.git/logs/refs/heads/master0000644000000000000000000000340511557565173016644 0ustar 0000000000000000000000000000000000000000 e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 Marc Singer 1213668841 -0700 commit (initial): Initia repository for HP Media Vault recovery program e22ca0169000e8b82d5d11ad3adc6eed30a6ae74 e999884c15287c43ec797711ecfc8421903a931b Marc Singer 1213684653 -0700 commit: Added copyright messages e999884c15287c43ec797711ecfc8421903a931b 07ab8fc5572281f1db8de4dc0efdde002b3cec87 Marc Singer 1214019749 -0700 commit: Ignoring beacons with empty IP addresses. 07ab8fc5572281f1db8de4dc0efdde002b3cec87 78f42f905849b16f8818337b2dbeb28dc9c2f10a Marc Singer 1214117333 -0700 commit: Changed from reading input file to mmap'ing it. 78f42f905849b16f8818337b2dbeb28dc9c2f10a 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 Marc Singer 1214289556 -0700 commit: Added argp support. 92d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc0 bf708f4765d3f1c9b4cc8472d12d9a60e2357925 Marc Singer 1214374089 -0700 commit: Preparing initial release for Debian. bf708f4765d3f1c9b4cc8472d12d9a60e2357925 2494d64c179fa7bfca25f9993a6b389578d967b3 Marc Singer 1215225726 -0700 commit: Fixed package build for Debian. 2494d64c179fa7bfca25f9993a6b389578d967b3 21f1015e603ec04fe7dd26157cef44f9d3428614 Marc Singer 1215226419 -0700 commit: Added build target to Makefile to document how to build within git 21f1015e603ec04fe7dd26157cef44f9d3428614 2828f9e8e880eb468c110b078ea52660b1bf3844 Marc Singer 1304356635 -0700 commit: Fixing bug opened on package due to GCC 4.6 2828f9e8e880eb468c110b078ea52660b1bf3844 b7d262efbdf02b036ffe9f744819bc10d78e4b75 Marc Singer 1304357486 -0700 commit: Lame release to fix source archive inclusion of git control files. uphpmvault-0.8build1/.git/objects/0000755000000000000000000000000011557565173014066 5ustar uphpmvault-0.8build1/.git/objects/02/0000755000000000000000000000000011033561034014264 5ustar uphpmvault-0.8build1/.git/objects/02/9d18b5f2b897791bf832584b84a614221b4c190000644000000000000000000000046011033561034021136 0ustar x+)JMU066b040031Qpsg*8!F}cx# WQ5< U⛘ʰrŊA6__q* PHIMLcЬTx|b$ݬܡ%'3*um #Źk&}k|(%5yP%ɩ%yz KHm5NԦ oܠ 2JҀ}#y8Bif{'*܎Cd%Y08>Ǡt~sZ;h6EDљqn';uphpmvault-0.8build1/.git/objects/04/0000755000000000000000000000000011033557552014300 5ustar uphpmvault-0.8build1/.git/objects/04/87a74c96802f85be9c3959792b6eafa140000b0000644000000000000000000000046011033557552021307 0ustar x+)JMU066b040031Qpsg*8!F}cx# WQ5< U⛘ yE-ke4&d);L511Ԥ<շ;%o8eX5%'3*um #Źk&}k|(%5yP%ɩ%yz KHm5NԦ oܠ 2JҀ}#y8Bif{'*܎Cd%Y08>Ǡt~sZ;h6EDљqn'8uphpmvault-0.8build1/.git/objects/05/0000755000000000000000000000000011025655646014305 5ustar uphpmvault-0.8build1/.git/objects/05/a550c437c0679b2b32248a96dc5ab2e080ec460000644000000000000000000000110611025655646021343 0ustar xTak0g7 ]VFAHBׅ5Fϱ$MJw$ :t޽{8t7~_ Y1Ie##todjI&F#(Czct'*'$-JiQ4b>VAcdBP.32mA:uvsYlcr2p%YY"\nqE0oJf)K1`&>nK`zDWP;)B 6(5 rrBVvEaos*qLNk/{Q8}UV59Y5>Z MX&sOIV ӇݎZJ:)*%ęV0;Z$oeh¨0z1J-=_Y}^[U\nO9{\ogbO0oon? Z{]kX' T]^9MUu?=PNWYEA>\v0/z=9N}8iFp0r b;x;ONDqgҹN$8_&euphpmvault-0.8build1/.git/objects/07/0000755000000000000000000000000011027074245014277 5ustar uphpmvault-0.8build1/.git/objects/07/ab8fc5572281f1db8de4dc0efdde002b3cec870000644000000000000000000000027011027074245022064 0ustar xM1F]u_'ٺ*K$% eNN&OI-|xf3l > [mRK4-jҾv .6aۣ ܽSsM.ɋ\%,D,I^-v.V+8[2zF>I4-d6~U m26=%IY97pF͝oiJPɮ,&?\2'h( IORTYN-! j\]ME j3[HkڝM޸Ae敤Fp~\OTQ**-(-K,)Ӌ=SN}ѡ(hFd'-wxuphpmvault-0.8build1/.git/objects/24/0000755000000000000000000000000011033557576014310 5ustar uphpmvault-0.8build1/.git/objects/24/94d64c179fa7bfca25f9993a6b389578d967b30000644000000000000000000000027111033557576021436 0ustar xKj0D)cBCvYV3?BjY*> @_Fmc`9F%\ dA] ޕN2G,\:EsvݎM:ʽg𹿁A]@VӝDUSW ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]?|ai?5WqFQB7{iuphpmvault-0.8build1/.git/objects/28/0000755000000000000000000000000011557563446014320 5ustar uphpmvault-0.8build1/.git/objects/28/28f9e8e880eb468c110b078ea52660b1bf38440000644000000000000000000000027011557563446021322 0ustar xAj0E) k$YPJ!Ь di-#d+dySݶa"w|tКRQ[a9J"#6އ-;m8i9OO,D64Ių?j}+YR}M:g,i8(rP9CW|2 ?9MLHuphpmvault-0.8build1/.git/objects/29/0000755000000000000000000000000011033561034014275 5ustar uphpmvault-0.8build1/.git/objects/29/7f197920e3c840dda31162075eb8258b05e2470000644000000000000000000000032111033561034021124 0ustar x+)JMU024b040031QHHKOOg(Vac`I[0) E]Aۍ0E% rm/==WG@p: Opy%E9 n{-a\G"gcJ *23Jv~ҽ_ye2(71 1=A&ԑ,||Wo՘*~z=ěĉ> E[uphpmvault-0.8build1/.git/objects/32/0000755000000000000000000000000011025616714014276 5ustar uphpmvault-0.8build1/.git/objects/32/5b5688468b88166f1af417d2b4f51647d1b8240000644000000000000000000001070311025616714021154 0ustar xZkSH>_ͯ&f͒ZNfٜKX] ajLuL$[88Zb9ׁYzy s54:bndqCCRߋT4q*4WF^%0d#Ywpr\6`,D,"}/ũ[bHް D+F B Q+?c0CZgI^h/g O/'dhֹ^pʹ蕇veaP)v%2 x2rPu<ZcDȽ;;F xd0nN-^PzH"K>"K5L83I4\FaS.H R!\+ǩ7 YZXpU~jo=_gkd߳葝 QhΏ bd'Q量be/7`}.\21&#!Y-5h NJnfҹl](1"5d_BҐe+ꜳe XFܘPPINx"͆]wU/ Q g,CCVr:GoSm;$wkjQO/mÅ-jY#*78fD$Dt qlC鶊AՎs} Ps3tVϵ2ʆKV/A.*aveis+GnÕ? &#d@Mk(HK aqwr<"SGbb:dRt5~K,%hLMlFk [^HrkGZ#?241JҦ̗#_ȍ$srkPً`t!P$'fMbFr͍YIYt(ПّgEnnv&6$Yc>#@MƊi.&c9B"(u2W1d[WQ|2z)?*{ ؽ1,I9JG!i]̸r'{JƐ`TP,UyIcIvg b"(]J?K5f'1o`R,׷>΄)vYTB?Q R} " Aa@"8U?߀5 \ X[ iw/񦈭e":{Ry)54ZZ5 72nvʡ%*$κj=09TN;Q+ŀ?lz Q AAD'[z3!5oW W3=Z mXn KKMWm!dz } kdYJI6aFSHp?GRӡϦlR_ 鋼?&cm`iFڑ5p1霽1/`L f-Pux fU'߀FeJz\kaX+OsdUWkB[$)hpd#Mah_]VNqfT XSn }VNΞ>=6MAn;Nc\#C 5 '/ZKr #gT2Gԃm;=s$AR0DO6K@=s)_oI1ߝ DuFȏ+,'8)vLEߚ(#rL o %Tk0łKo(*wx1! ~ uOx} c|&rr'b\![i Dk nҚa@7 ێDS9O^ʸVH\a/g51 A] DV=C?|3ܔRO ^cHsѳ s-+vF:\D.Ihڰº>6Wgn C-x&63.ju4ǿ· 11xi)r|[:A@KH_s8L ʊv#a} ~F#;yڬ tTR8`'. vMk|SĈocC*#w)܈dSvk_auVדh9a>~W;>^(`Gw0/%{*^c}[>Hn|ȇoRwUmGآ*xe@pVrWyG@ <$|+yc|1g" dՒ!@ [I<'"l<r-Le˕r ߤ CBƜRhk/\jħg6f[d)k s Ps񱛯V |BAXOrg!uphpmvault-0.8build1/.git/objects/35/0000755000000000000000000000000011025616714014301 5ustar uphpmvault-0.8build1/.git/objects/35/e36b74b55106f3799fdd8c665e8bfe7d0c51130000644000000000000000000000111611025616714021456 0ustar xS]o@k+FTP—R!T)J~<g|99{@BHٽݙ%LΠ^m,SX,W-=[iiP7hRͅv>> v{PNFybO1;[em%+T&R8 H: u=O",PXıQRr2l%ǘN!e1n6Ka!!Q93|܀'F]&+} ˹L ĺ dd&Al9e wZѣcNJOOxcjRy>#I#/`c: LSU>|N}flH0V>qi ]ALN_bW\hR4< qPf<:|vwm+?)irJz ZX,}R'GH̠ 2y猽_%c^nV{< \xgc Dޫxݪ vկ*yNCҸ8w߉l֪1ya?эInl&Ymk[ȢSc%[܂~F Ηݞ# 8u'7= ݖp]Up%E% vo~?AKX UWZ I ~>@]7jMMJs NTQhxM{HN_Juphpmvault-0.8build1/.git/objects/4e/0000755000000000000000000000000011557565156014377 5ustar uphpmvault-0.8build1/.git/objects/4e/721e5c584c3c597bd9ee6c16efedbbeb2403160000644000000000000000000000045711557565156021765 0ustar x+)JMU066b040031Qpsg*8!F}cx# WQ5< U⛘ʰ%hQgk>zڂ&@޸Ǐc_aeVFPCRJs ^:`鶄5DQ>B5_K~N>ےqʚ<ԊԂ< ֥G6Rv'jӃ7nPeEy%i@E澑<_{=nGԡJ 2 rKsJ,c|:II9sY\Lu@7և1{{%؇|uphpmvault-0.8build1/.git/objects/5d/0000755000000000000000000000000011557565156014377 5ustar uphpmvault-0.8build1/.git/objects/5d/5b59eb7f338c4e08be717969e8ff69433a32480000644000000000000000000000032211557565156021433 0ustar x+)JMU024b040031QHHKOOgH#㩶^^ңt~O܂~F Ηݞ# 8u'7= ݖp]Up%E% vo~?AKX UWZ I ~>@]7jMMJs NTQhxM{HNE_uphpmvault-0.8build1/.git/objects/5d/f4c91aed1b70ac34ba298e94025d669b0e186f0000644000000000000000000000067611025616714021607 0ustar xSn09_q^˦"X7^JƘ!!rvSvI#^S{fe㻳7'\VV*]F'- ߸q/BhWp%2NOz("3~f*/W0 c Sz[L_ I̗\`cgx]RI+y)q^)cv5gK^'0epcgēogzmTsf;!!=/s*Zqsq?ԥi*ڌX-yLMB븣 yy/TRXR$;NUiۆsԫyǢ#<=7ŮB:o ¹l xqݯ-?%IBV_?juphpmvault-0.8build1/.git/objects/66/0000755000000000000000000000000011557565156014322 5ustar uphpmvault-0.8build1/.git/objects/66/bc12e1cfe3953de6e9d21bd48c29e5b51abf490000644000000000000000000000067511557565156021770 0ustar xj@{E IX%}HZc}Z&rg|3Zwͻ8Qvh|##=f5It$i@'t*g5ZɣuvIb @8٫=%\bGdErHRG%U"Ys4#4ː*6MgˋQ$%d/xǜG/ˠl8ZPU-'H<9='t=gzϺ,̥+Ա{_&_M[c48gX']zl ex2}™5( vo},|=,6 [RSSBܔ0`'h!DG06`Ggm JVy-NNq+ |[!+զZ;).:*w53ob y^X uphpmvault-0.8build1/.git/objects/70/0000755000000000000000000000000011025655314014277 5ustar uphpmvault-0.8build1/.git/objects/70/8cc480b9a5dd81f4971a51f3ed957c77b16d7c0000644000000000000000000000123111025655314021533 0ustar xSn0޵\[7ѬI$ DU&`6IylU+M0>~ss|ja5zoxhshP~XU -/K ᑛB7Տr k3HL4iNGc!1gV8ڹ6Yy' ŗ_wZ;y&d .p=} h琖/D8Ad=  ,yG DڰF Nsh -Q].E Qֿܲ5H3{zf^V@Ah,=vpl@%ArI+$-Ѩi; )=Ū)V &^f }j9戦ȑ+fx>]H=K}l&KEv^dHN9} mJJKTwd%HL,PRZbtk1& *PC=нq@01ճ$S:<a&6i41x<M4GGF8|qqSߴl-(z1Miy{Z*!i<-C(]CΝuo}wǨ&5$>6Z]Q}m4_/oŏuuphpmvault-0.8build1/.git/objects/73/0000755000000000000000000000000011033557552014306 5ustar uphpmvault-0.8build1/.git/objects/73/240316000465fd7de16250642715f820c13db10000644000000000000000000000033711033557552020751 0ustar xJ0a׽iMnf!@~m|MJ8xfA7} 'iM'8bs䖨[k03E EDx{-|Ĕ̈G"l?&0X+źn6Yc v Y11*)pQ7j(R^JY>ٰDb Y5 UHԛoli{uphpmvault-0.8build1/.git/objects/78/0000755000000000000000000000000011027372725014313 5ustar uphpmvault-0.8build1/.git/objects/78/f42f905849b16f8818337b2dbeb28dc9c2f10a0000644000000000000000000000026711027372725021464 0ustar xKj!E3vo֣4>j-hB ㌲}ЖXo2=˹j-jFڠ.d_n)n 5zڈ#uؐrTZ\DEΑeab˞b0;uJ<3ʕZt =`tS|= 0ho$=(q jMy4Ouphpmvault-0.8build1/.git/objects/7a/0000755000000000000000000000000011557563433014372 5ustar uphpmvault-0.8build1/.git/objects/7a/61c153b4c9893ff81057a94190dafa7f9dbf2f0000644000000000000000000000046011557563433021624 0ustar x+)JMU066b040031Qpsg*8!F}cx# WQ5< U⛘ʰ%hQgk>zڂ&@ÕBxnQ:5$4\/9U .nK1-]M5 /^xC-mɃ*IHN-(``]p@lm#iw6=hxU_PWTnO7s->QvD ,4Dς<ͧC<ךHTts`}YW~;\uphpmvault-0.8build1/.git/objects/7d/0000755000000000000000000000000011027372706014366 5ustar uphpmvault-0.8build1/.git/objects/7d/e2f3b6107f27bd3934671c89a1f83c9cdbf3850000644000000000000000000000042711027372706021543 0ustar x+)JMU04b040031Qpsg*8!F}cx# WQ5< U⛘ʰu/'mw,Iﶉ(&e&1ܙ̼w 8Vv['8jHJinA^r2ëZ,\>ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]ה. @m,fV}{Muphpmvault-0.8build1/.git/objects/7f/0000755000000000000000000000000011030351301014346 5ustar uphpmvault-0.8build1/.git/objects/7f/8f011eb73d6043d2e6db9d2c101195ae2801f20000644000000000000000000000002111030351301021366 0ustar xKOR0b03uphpmvault-0.8build1/.git/objects/80/0000755000000000000000000000000011025655655014310 5ustar uphpmvault-0.8build1/.git/objects/80/26e0676a8ec7a00cb78edfd795d8b39d8ab00d0000644000000000000000000000006611025655655021676 0ustar x+)JMU06g040031QH/,L(aXz> );.J\uphpmvault-0.8build1/.git/objects/81/0000755000000000000000000000000011033557552014305 5ustar uphpmvault-0.8build1/.git/objects/81/9ad5427c28a0e990753834e9044da739bf85670000644000000000000000000001115511027074204021164 0ustar xZkSXޯWa bc00YRCd؀Mc3ٮ,咥c,y$B2<9GC[T7A$J&RVl1Q54sɃR_ VJ2V{d񐆷\5[^"wF0S4MŸTk%Kk,*Ai8YZ`'1XIN|Uy<_:֩$ }u:δPp,L@@ !G&8Q2Ҟ)1'rE$I;~!i2T:(1mzQjsNh`{Ԃjzʖۓ$  tW/݇Qt ( 7RD$ SFB6@F%-{ v#ՙI<N4Y{/g*$snd1 p%>>I?(`DX^zL9 |+pTGK(FPYLD^+Sw4M"yÊZxgUb<4 -3Dd>#ugvqЈRp :g^D Eg9Boikscb[@{B1ğyɤ)lu, %l~/Uwڇn}Cg,ҙ>M$kv`h #X!BEbP#(I*%(Ppdu`,SluX04^@k]y']wZ2 W:$GQ}3M#tʋ"'0$u$m*q>ψ- D_jI/Q?% MX$8!¶Ű)؁M®Sx:C_dveaP r̐%2 xRrPu,ZcDȼ{ɻF xd0nNR)^"> @|#Ya ,Ϣ 7*:키 m`h?@>)¥ѿ"xz'Dd8_ 7^' S5Al"~-n@9`و-F3w@GDAluGQ7( Vvy>V"%ڴk&3fF*կC')#JB~CGpѠ8w ^zlT/j 'Ka,*[(1uElkH6SK`ƣ.{j~ t<8FūW. rR"A1jjFm~-ѨX)&Ov/SuMi,h]fQ/mQ;;6%L8Ӥ_uiT[~^p CPm!\Y|zq] vi&Dqު\{_ܾ8:׳}o?u|`EBZNQ,S@ -T\ΘhEl)5D5st+md,6jVyxڼKC]qa/n\ǟͪАzpnh$fr#c/xlYdBAL7oTseCV7#Q8kjolw;Lm}9/:z*('+'v K߽Am)ǽ~Q|e'p= hA{2V4ŲKK{h\.WW6[Fh4-_#z7/-WGB^[cN{NU͉pho ?^2av{̘cd%Mzu6 O\_\F>ҏ(z6GWg!R-qh,SiˣG'0Ԑ-NT<8f2db8]ףBk41%lf3XI4Fl;ɂ=e5`}q4NH^ONj$ ֎֜(9OY![ˢ,?@|n!'fp\1UjziT=l.l=W]Kduxkp*VSI(*M5U[N-(@yǤ;zQ6\ r94vA?)VZj[72Ď ?\0*22K t(ni-b-x-&,noVNUrB@aa&TXg)*9`0~KI?!+S(C֘ }62Xf,l14ZJ-Ca)t\%m H2G(9͍f"EromL$&PWܘuZIw(~gf׵4qs}E2&( 2DrTOBl2jk.c_fZ̃0^-yX NPf΄)v^TB?Qm LÈjPaړ@6NU ejv"©$V¶8{#c @)b+b^ _& +l)zYCى5pGqg̛(/BY T5BsGrFe17 l>>@YŶ\kݗaXTsdUWG$)hpdRAh߉TVNqfT S }N֎->=2MAnSc\#C hM 5 '/ZK˸5#+ L(sD=׶î30L$՜|#H4`[A0Ϲ$Z=q)__1ߝ DUFͻ1'͗]GUIr37h,ezNQ07-PT"HW.\Cn'ɄP*A>8K1iH[r4*fc,Ƽ}}RzE`-]CȖZ sڿi|hVDnvF:m(ȱTրǵx mC\8 a/g91|څ EDlj `>a.2QsI}ܮÜǽGG oj}mL%i|zKg*g>^)ߋT0pʵ sEnlV]A8UTsr.3MZёNZM.B_Gnu1V8lbUj=K#3\fqf4S Y׈/43u,b/N,ݫY.)z.!OBu/m01]\ jǹ"=qYwbt(\ 4DB#b6`NC7\nrTg:WPWObe:+rvߚjϏ-1M rDF+xJemc#\,(]~9R 2ԻfS04EV7pw;>f8Mg~ƿ>h?F1 2*HlR5bX#&p2 V9@%<',^)>  \|YNZH7]h0* s8r*EqNc+P#q8NT6W@ypuKMƄ<:qXґz2Y ۍ<'G7O\0gi#L<༕[ނoͽ[>bK-]K ;$߅p Q;؇W@&9kB?aoKTmE[P56b;0(K`qVԖi|C_@Up,,+GI ["¨ ˶lXf1xk"ǙwG\_(XFe[2&?{Q1*a_A@̵Avu+Ry*'t[OR <4V`l ƭ^ 9؏U?F0+<#Z-D홚>d0:n Heߛv]u`[s! :(hY9<;)=> AdrDE|bH xu0o,r0,9H$Q|^b!2 f-]g9f8S^̟{#T1ٕnVxMDƟ~ WW">xbm̏ENhmOׇe.>א$a> HkĽ4R xM7ju+׉d;qBL3$m&\nҪ#,H}|Tnқ؇ O:To gC[닋vG4f"x*K"/ pyY"/7K&l]wUjZNuQ{r1EEi/0鲢LXND⾙]S_ ]NDlK3xs P}TA䤛LhSzΕv}/ٔrD,Jo,m<;5;M妕Դ .Tv5IoO@2\ %t!|ITEn18`2W:Lr`[ Jkv:E2퇳PNGRCmm+,a1B:3 -)6`(:" {OlģH&eRBҁȿ' ^\R7aihĚpLkLv.h V}U #"ԉC,tlJW2@I4ۭOme;0D[6oPh8yYׁڑj 0>V'᛫O_',$Eλ@lJD2lQ,q"9hN8) ,)6P ` zӒSl,W0hb e9|lR,fFJ O>9?l!gsh#uAD#Fz[)<$XǤC[a 6opvMANʷhh5Y2C :FCwLȚ-,0˽Ip$SMa9lC$FZbП T(WX7M/ᯓiO>Q  Ǔ׽Ahŋ&~[<қXn7H-1K.21KA^y1|ZҶ`4k~ :?n^ ~Ą˺./v?:K sN٭&~xT $-4aؚrz|3y1(oz[[wl>HnW,)ݲoweBEC+_$|1pj "XkKx*I0кͳHՍK+YU°r9X Lo D$j**H@G69۫/`R6LdrhFՇE_d嶥:Zb<8Fc>|b>δq|r̺k磟Po|=9\o|At}K3hq1fӕjOO.-wȤ}HPz5Burfx|A&)G8V(N\HlgPHV qS"KKoMwMo|vQ_>dd8Pt;1&Gn5\b(\˚+PmRe§΁.EÞ!(ăb[OX̨J17DUO L?z ^ QEN/2*4AIٌ E* `#dj\%2O $ItHx6 A'Ʒ tNi89l5B cf?3 sޅ-aS-["' :p:rÿ<2!騩L M)4HGXfRJZ!Jw3Id0sgIE}LY6zPƺI]e` f5Zhk]Ӏ0yEZEd\>wYGf\Xk ٜ(h;o)J fl⼉-(Q(9 㾭5xe]QUv$K;b[eZ,gzMEԎ?GڥYMTt[}O3avվIվq)7kf|z3ZA$]Z3zxj BE"ee+]'K[6rGƿP[ڑ HX/1앳\մ-{1S븧Yn/7˝<*.2L`಺u2XWچJX0D+-aXv LSG؉|h-1aܲMl5Ri+H6`8jrmI,#Cdr4Zִ2 of֓ZL$ɆjlVKkͩZȍ /П9agZz;vut57uțZzP!h90 E0(0c|iYtM ar zvvob:5Ȧ}yHk9!Vhbw¹Ut@J>ƹbDt\uJ"H{wP9Bܤ+E/]b`e9 <sQXn50lRQ,y+<ǑYw)sH)e^C GY#uY'ڻ _kMC1^21.# h}76Q8yҒÿoRFfdx^#8k;.`4`F\;tQybk\,D<=uaح)'Lj$9z\~ؾ66;|IKg9cy(SeVfu}SCatE!sj\-ׅgHU^.w\shef9b&`'8PǑÝ5%6> Oq'?z<5W #;{$(kS WE>. ?m; Zջy_e̋JZs%~پ^Aҧ@cqWBMU{4}j5N:(~l揫ޙ{Uc6yquphpmvault-0.8build1/.git/objects/85/0000755000000000000000000000000011030360277014302 5ustar uphpmvault-0.8build1/.git/objects/85/2b12d13997480d354c5d1686139969da8e8a380000644000000000000000000000021311030360277021100 0ustar x M0P=ŷT#d ĕ Wz0oolHM=9o#aœjdl=$wG)`́H-^Ew;8phVK x+\%BuCڢHZ/+Uuphpmvault-0.8build1/.git/objects/87/0000755000000000000000000000000011025655646014317 5ustar uphpmvault-0.8build1/.git/objects/87/97d085d64d10e3a4f993c25d846d86f194ac6e0000644000000000000000000000056611025655646021431 0ustar x]QMk0Y\vM\ )ٶ$e! 9^iIGÒd.Ҽ7ofѷTW~Z &͠c$vz%&~X]g]ʜ0pA|/zBmBCnS$pvK׽7l&gHB$x;;ؒ##v-w I:+)|ȔJUn|ck ![:9e]ݝV`&51lj!.]5ͯǻSil| T]k1qݘ Z'a:|z}<?{6˽ ݠn~ w}F _#8T\ Q]$n,uphpmvault-0.8build1/.git/objects/8f/0000755000000000000000000000000011025655646014376 5ustar uphpmvault-0.8build1/.git/objects/8f/ee9dec19c36f782de58bb33f0aa3c87846c4270000644000000000000000000000077211025655646021721 0ustar xUS]k@~Ŕ@+.iKlBKiMM>"Ҟu ߉S]߻'n9m*&>kS\I؄@=+`언Ob6~ro\g-76~iIx춬vf"xÓbcʂ0>4`-&ksllAPr{ dUULo&'멝g1I"K*₱2σ*Hz *R} &;V(;Oh KMFAAʧI2$Ʌx]6Vz}ͲarE@9I2mpg)ȣݰPMkq':]utR1ٟA-<|xi[2S̪#X'ʰ^ 9'Ա:xM WWodVq=8^,92F7N=pS/DU'V ')XHd] uphpmvault-0.8build1/.git/objects/92/0000755000000000000000000000000011030113224014264 5ustar uphpmvault-0.8build1/.git/objects/92/d7bd7ba468bf6b5ce4dd07e8cb3156baf81dc00000644000000000000000000000024511030113224022056 0ustar xK0 YU⦍-!` āJޟ^uxjUpHV$dIlHFdg1[4T<y>p!rA0 RN8M{5sZ^Zᢟr}JS GalXsP=gkmkmt%E<uphpmvault-0.8build1/.git/objects/99/0000755000000000000000000000000011033557552014316 5ustar uphpmvault-0.8build1/.git/objects/99/690136941080c88d42c5995e4638c9948e3c1f0000644000000000000000000001352011033557552021051 0ustar x[ksFݯԯpP#+Gޑ%ʣD*$oe@SD`xxP3U%qEH s2p2CRBcQ 㢖T\aN"WVe7gbQ20ca""PwLRcQ!O-Ne:u vcBw0aM1 3dUr:F848k呷`[s𥁏8RyE׮R, :$߅0 Q;؇W@&П߹ F%1\51-l! ETuE[P568PK`qVĖi/* p,,+GII Y£B ͶdXf1xm"řwG\_(XFaedOR-0`d¾jkVpUN$*ZkU'?K)h%(z-`?Vάhgj A"kh*d"I~oF}-&ׁnq-v^Kzg묣 e8(P!}M"9A̲A( |LGB7zSGD.(c@y`NL{2WEdwY ,›k ۻr<1˃0_UV (aNX6wGޤ4Zaaa}K}ؚ':{lԾLwõe4Шרnқ-%;juJDZs`Ȍc7> )$M\ueϚ/76|MzMP!V*휎g}q(,:W4G S}BY%Kt!"E^ ˍ/5’I,GW{u2wwvfغ=Xr ݻEDh/鲣LXND<]S_ hXNmK3m P}A6㸛L`?ަ]?K!u6Im_f JZE9F\W-G,x2[sޅnv5ʃNGmd M:Lr]S.HVQ/2퇳Pv"b6`1| X:RHM2*cYfmR,JlG Xp.XR`ݚ;4j䠲BHrvQH[/eX&".jiE3%&`!r0Z}V#B_@.`F_8-uloo9dyX6I)ڤd0zvXΫ0L, @ ] /:P;R[MTP~%̄ 1xjS ~1!hn۲L[ fAC+|jD?hKTgM MiIw(TڽhBY$:1)6!~Y*zSOJ۽gK=D^:u߅G]Bc^nhV" 1Цp-M+5B!)D-,Z DD72;gTfS >r$\Ƞcx*[zs->O`*+Oƿ^&ധZ{(ɠh^<}ä_v﷕c!U& '{j= 6NCg E|5σߜC}G';ݗ}a[~x/Ӫl 4*`{md8/ƻfFAA;лxq0l4=ȄkI5{9*g:fIo42o~:C~{~q{s|1Z?NtH|45?F~p ~op5} '3¨F!UKPjj6.WXΎM"4"b/c-69Dҿk0oQ3 EYaIgLN +|rzFV7ָ3MzN) l?̣o̕<֩a$%D~hn`[a5̇fT `Vd6-vkebptX3Ӆn,F|&qgĸ/C+uN5r]/VY_1sen+ߊ捂? pݨ,GfA͈͡8 0I0P[O* Uྣ,~ 3x+ _Jh| _bUjZ[WUxr"|(6񯽈d.վ/a= gI@ِKV@f PWyL"Rl`EtcIv|"i#S tq;U*eWO Іܙ-lhlcpE`A%iɱ>CEVL7wg/zyi!_N _* V pn/ZV'[ƟSڻk kOhȂ!]zY$$lvފ)*y;zBbg{hsdz=p׷2Un;5>n#)ȋ[.ls(:re !,#1Z ,]zXZ!W&巕<3eOd4 ¦U /[yhѪ)86G$>p*+ Q& ռsd8jx`%uEnO5U[B1k\W:HsmޭOzeλu˽'۔oK5՛ET[TbofoBH#w2W(:jX߶} f:J% [h\.G$u$DvݒZԛq'8b#o !k.3e,,e2"eϒ ֧JQP[ =29ATͥFWǵ˗ST(<!xhcP(#8GgeIѥ\3E"aP"cT3P6*6ݹ-B!A !?bv#:a} )k6JhaPZOLi1T%-5K_< u7@p.THk TgcKr X,[OWxxPutп0p/Wfֵ) =$玵wzx[a9`cKp_&߭WnjS~Ec7'lȹ0@`əE(A ,8^1蹩8mpZ#T UݮfgkW5my7 n?juphpmvault-0.8build1/.git/objects/9e/0000755000000000000000000000000011025616714014367 5ustar uphpmvault-0.8build1/.git/objects/9e/bdc52bb58d5057800c27586f2fb0f6ccef972d0000644000000000000000000000034311025616714021671 0ustar x]OMK0_16/ + *Cۤi 4ߛlaYw.IfոߔWض*n;1y"3onH+6x weXw]@ˏ VŵT!% ?|!rJ-RI7 xƎR HN_RϱVe/| '3r)q44]0i0:td],vR$c-~Zu@ G(L&F'3RLKi;N0 H#-ɨiH}d.2񝵶 ^jWdovc0{NCS5 -U, %nѦ~{wQqJ%J!JJlťտ[^嗮 gfY3$k'$]'LYp0i9-'Ԥ*d 7=[n"Prw-wMWM ,H[D~e:GHUIųuphpmvault-0.8build1/.git/objects/a5/0000755000000000000000000000000011025655314014356 5ustar uphpmvault-0.8build1/.git/objects/a5/2625d4f74ab80f8e00681a4663dc05ca3ed2b90000644000000000000000000000121711025655314021503 0ustar xSj0޵\N`4c͚4&v(}ʒ~9J c1e}Lѧ:@OF8* U\UZ )Y& |CYƭ6A; x{S"M@Xy',q Óxa{ԼB3a 84pE_GLpGA$$;q3t%Q1X )0)ڰVW KqhZ p I_HQZ,olCTߞ]n; Pо#Kk\. ٯ &HN#M>~Ujƺ# M#b'!X2R=.x8MMїѽ&!ȶ!2Ʒ,@'fN" nCZ'|~&Xf{ӧTZ]߼%hHz>V5$Y SnS>on.`Z)59g:pT<, ʋ"w/:V%No`}A8d]369!O= uphpmvault-0.8build1/.git/objects/af/0000755000000000000000000000000011027074204014432 5ustar uphpmvault-0.8build1/.git/objects/af/5506d2d75decaa53d3840daba503f63ff067f30000644000000000000000000000042611027074204021716 0ustar x+)JMU04b040031Qpsg*8!F}cx# WQ5< U⛘ʰu/'mw,Iﶉ(&e&14=H;g{Sol۵jHJinA^r2ëZ,\>ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]:h,x9%ru{)uphpmvault-0.8build1/.git/objects/b1/0000755000000000000000000000000011030360277014350 5ustar uphpmvault-0.8build1/.git/objects/b1/5a25deed3db2115a47760936be9e0c96c32b0f0000644000000000000000000000026111030360277021554 0ustar x+)JMU047c040031QHHKOOghh9݃'VMxf歾. ܂~F Ηݞ# 8u'8j!QQ/ԕJ *23Jv~ҽ_ye2T4'K'޴'N4I80/AJ3uphpmvault-0.8build1/.git/objects/b5/0000755000000000000000000000000011025616714014360 5ustar uphpmvault-0.8build1/.git/objects/b5/b7c877844cf4c8a6b11319696bfec6622f8edb0000644000000000000000000000067011025616714021625 0ustar xRn@+#HV<YA2hJjpHI(hY/`ؖ/Eyw`PTK^3^ OW8?:%b8{-֠H//3h ~Kx_qz'yVۦֽ_'φ$ 9Z ]!7 X )s^^( 9T7@Lwojk;|1\t#s̚6K5вƨrI=63tE+]DR&eey$)[j de*#!k-r45j7ynoۛ [T$5ck'&SްL8}xÑzy:,htߧUPʓ}9h8U:[\VM-[ WB_Ǯ$efuphpmvault-0.8build1/.git/objects/b7/0000755000000000000000000000000011557565173014376 5ustar uphpmvault-0.8build1/.git/objects/b7/d262efbdf02b036ffe9f744819bc10d78e4b750000644000000000000000000000030411557565173021700 0ustar xm0Dsfۀ D#H)M@2R~B0m [oy`89 ȸdv&ذ- f1:'N&eޫxgmwhtÚ?Y\ndn=Yk51_aE<@R.tԳ h? TvYϣԝjx@[]⸪?Vuphpmvault-0.8build1/.git/objects/ba/0000755000000000000000000000000011557563433014445 5ustar uphpmvault-0.8build1/.git/objects/ba/8452be1d342fc548e6ac008af3baebebd6a0f70000644000000000000000000000106711557563433022147 0ustar xS]o0k+h")e]V$Z;iZdC@`Ze}אuOC\߯s|| 4`8p3"62&{wGev!'{\8gAs]!o0v7c(BAmcΣw`Ml[@Ggq X %c"dZe(x!UP"(g49&CVs݈?p ~1n %C|.h\׵KS%$32VHTdΉbנ#U"2o\`\&GlIfxhTxRI vj#TfoIu.9@\U ^G"i%ɄZ蓔h,.V3.1uphpmvault-0.8build1/.git/objects/bf/0000755000000000000000000000000011030360311014422 5ustar uphpmvault-0.8build1/.git/objects/bf/708f4765d3f1c9b4cc8472d12d9a60e23579250000644000000000000000000000026111030360311021352 0ustar xKJE1DgNt' ܏ļ-5*P\'8§9Tl/A TEi&p2?ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]n[Hy&rc }|+uphpmvault-0.8build1/.git/objects/cb/0000755000000000000000000000000011030351301014416 5ustar uphpmvault-0.8build1/.git/objects/cb/e925d7587131c8ec8761915930894c60c096fd0000644000000000000000000000005511030351301021227 0ustar xKOR0dPV/-.OMNUMRLPPqy uphpmvault-0.8build1/.git/objects/d5/0000755000000000000000000000000011025655314014361 5ustar uphpmvault-0.8build1/.git/objects/d5/11905c1647a1e311e8b20d5930a37a9c2531cd0000644000000000000000000001704711025655314021255 0ustar xmsƵSMڍۇĝe%]!P/@Zѷ9()I$y=o_?]gl2ӣ$hڲw}U6Q}hۻ]xyȾ 'MQy}ϛ"j`( |˚.0߱z7 '.uOwo~}.,LC eE)wbvuXBNȫUX)"7,,7awǓrYTmVr)*g}XmY݆rz/Vo2ah|s.@Xi6M@wh~Um/EPWFwZ+۽ tW&ooY*|.0FF vEn9ޡ~(}%_lPCW۰o.jဴH˷5&^ %YoHI!҄mS6&h/EJplߺ 񱃳Oe \C}Z0~jwEz*zy-&Hp=r҄|՛laEˢ0̊-$tK4{V:DoUy#(N9l(xvv yMduWpBa;6"*77y+DŲDDn>RXqʌ ҳ#f`j( ^|>cJGG{$X#v0TC0ɒjd )J=!lwNwŶ!| (.cF^]ܱ0 Lw%BZr]- 5̞yG"{n#+ 2nD倿5rI;{E „vǢp( Wu +=ؑ'jX" ǽT_FZBT!m㏡Ȍ>E!KBFAhP :FeG,) ";'6jt2,ht*'5 p,oX,qr@T$c0# rs^B:d[}SwA%^V$-=`F"f'Z_^Dҥ3X| vOP˛Zi DߠD \w)ʡ.MR`ZrI*h5e)7n+ PYG>Eg銥J7Scdigx/gFx:_̦/-t~<=2oX\hO~ cP^o\QݮWa:wZ%bC;̬ذ" h>]H1ܹ@nR Ex^+׹v6a.7B7WF]u~ _|m[Dsu#x.1"]!އ!`%Gмli[ŮqDL@,z]GT"뒄QYVp/P9'a~7_ $ؼ /r/D%LI%'cwRn,[P,of_UE2+8f7(^@5?GmeCmQVu[h<ǎAp(:`اh,{# R)-QSX\C[.In̩Z ŖjDf=xNHM7 c̐w=rx!reN#nj-[73`떘p:3͵]%o,vd{הhooH :pa U_,s:)7!%s(󎐳=Ȱv\-\w1mxEO0l*>'[XEhYŧkHmCzc(=9mF5b{()0KJ2ƲYu@ D/_̽= d$xCuf7셰~hqU*RBVTQEz]qC Beݬ ^''H)$Jr}I^Ut'Z1QX#'y<32+R%|AttS%| wv::oʼ-ޚyAVO6u~`01kz VkI'.Iͤ+`EYvmƕ(USBBz7 z=3 )F'nRR9; 7{*&TJ֑!|4Zy&Cծ)s@ZZcGr/Z’:!&YWR[`r4:@2UAĔr06b𘃥F|$% j;7C >@X~x#218Û!niVD<luw"_H#5I[^zrA;o{OI ^3HXpCwţM"IL]k|(AT7dsk2R5vv8&?&r^Gyk YŵwБä^SZ"ų_[)aN8CzbX1G;hoIHy&f6 1Is(fAņOKBV ^4Q&{tƋ׊"|*KT7"Ym53DbŶ9d;\o-o vZ;?Đ)g(%ړ5YGkgf5%6Y*uǔ=ТíSntlvTjScr{b?d UTE#JQp+m[ĨCn_#8 : +|{ EXZµd'A#<XVGe cAJ䟺PVՕQyJn{9 EE6{OmSk"ϱ:d+{*Z/ݘcbfbN] Il,lا=,̐]&K<upM~d,؟EC*܍E ݚohZɻ7&ənʺ^b]6喔̝l+iJ7P=s&>xZvd\Ʃ=:QH >؎].g@xFRjWƝ jټ&7߉+ӗΡ( .$,'ݐ#4nPzLrPƒ+[ v!(=M/{*Hm2:e쮔 ̙߲5G04XڴC\fxFu–f<HGJ[.vBK46[j&xl[4 ۧ $@dWT6ArJ o3t8 ⥈:Tt2KqbOWsrTrE7ZDbW6Ij  ;%_ev#V& Ojs(@o J)JTݨUhfN)MutEZSF%kMTow܍~Utc@ː>։Oo.@YN_ &'wN?^dfm#7l5.OI[/VUw@zkk@yEo9vqȅZOjsEaNuݒL78>v; vFi'p.VV99^M(ZBG= Avn 10i~XfGcjnPYyoIq<+ [@z NLohx\ZLXޯn@Ϡ8mnTzEb5ᥤcoxٶ}5RnP(.]J" /iHbʩ"񳄄j9{WpNjaNظ~LG{QXlYႌZĿ, "Oe pco2ԖY¯xJ]z7ihőXO,F~%gbS"ۓ:0T H J%1xs!w|&Cf\^<iB:'C\Bΐ4k'HK*Y4cuEdQ{;˭ CK$6Gn`T(@vyJ>em*tW@GYy- LQֆk[(t/k7eØFSi:j;-zܩ*ʼ'MOʄᱺ?tܶ8]qKo+ ]@ŞV aH PxePv)B|2=5=QQžjLv33~Q~Ov#^R>%qvs]$@2*B7H2@kNdu;YoytOP~USh (ďgZƝ$8qH؅^]c$tG|WkV=ށV5]piX6YtaB ;>ttV%(E(ʙ(:$7`}!9,La#n &^kLØwhZAe7M ;5\3j|u,Xgk\fZ1s@ڋ_轮WѠ]Lkp ]/^0GG'5LCC#.ucY1T+kO؛f;$YgFBEUwnf(d6Xs 0b\@|OO"z V67jU|7t\뢑fns#&L)@2|$spTR0|͓_x{a -gDB{;uSTyj{QE!YӁuX.$t_?I X0pI rjG $L4[{xw{Fj Fv%2N${}go0,#kvU2.Rʀsf0ضH" 4.~[3#6U; Wg Sd}>RZ~;tߩ07E)bDe ?y.Fu`<LJL!E<]|<(17> „o'3hMqOP_NOzdz0~Ilr1"~ Hf} m(L~.NlKy cIg. =V^W Medvcۇ=:)̩B$xia2e(/&GS \RZ䃸INė O* kg #._g?Ÿpqz|xk+D3a,fN㣣z/1)%|8'{p2^Hp'#BmiXL! ds@phtep [OphMWXfz4o3mnhaJ,V1qu]oʷH4t99gYKTafTE&A ^z[Z }\skGx0xTW44~׽oyh;Fxόȧ)1ZY7bMwOۮbf$f4vt/ WfOy8[~;]X^GjfW¿貁TLJHtj@t]8 uF! {'٢xsҬoJܪŭ/:*,FW! Ox󣟻1F2ߥޡ= CSy?+cD=J6#'/QƾK%nl( #!sC A>J "(Vaws;dʹ0+ɫ7SlJ.}xEVEK8~q&e!/WĬֆK7y?uL ullvzD+F-0GT$j vqNW@ɗ 5uU.͸9?ԫ`\s$@ėJ 1e?lu$O;鲮T*rluuhRqG~1 Bg͎\GM+j8j'"onfRCGUUZA>J7CB{تγkb'}*#v4gmw]|r~jMEOZo+(KQCՉ{90QOZ^Ҽb4WvYT\hr޾~-_JI"DflK_<vjM4J~KM֪g,8EhXb:~#dV-_R0{ة* y :~U!~g]a 킩[r_+&p=fXyOt9:đ= %1Hs$K#dk aYbDIz'r}[}ŻPVGc%$mxõ&5b݈lThthO=ZIՑR {wx⠯]Z6w2Ѥj: jJBvlE8Q8@ %a.sb~?ˏzuphpmvault-0.8build1/.git/objects/d6/0000755000000000000000000000000011027372706014365 5ustar uphpmvault-0.8build1/.git/objects/d6/2250d08e25c39016aec05f3d899a0317bdeaa80000644000000000000000000001127011027372706021505 0ustar xZSH__UMdˑ!,;`3T.咥6VE !@OK0AZqk/h{ O;,|Jd0Pt(f6g8!w/zQxLzLxea*4}W/[#8tfϯcyOڴ "VeQZ_z?J: ԝ9Y T[]&1VE1 ZqtaɁtC|LÕ`,IϑhTS8»Ed0ɱ 6I+u0c 3"bK"0@~Z%} s lOb Cg,O]abX&aWj)PfiC_d veaP r%2 xRrPu,ZcDȼ;ۋ/NȤa܂RE(G( pG*@DX*-%V4[1H2&%hLp8<{ݛnfA$n4Z{UoK V|S.m7aw_PClGRK[6Q2V>}xK[s+{=GN%9//J\Pq8C}%^NhcZ}u6 wzƅqvv*S]C.O޺钵4R{,˕j6Qm7Qar[mӹ:TxEnQ*v&rQKnNvi)@[[HGG(;BIϪCVw#Qkjn?t_fR'An[cEț>wT|a'p= hA{z2V,0h-eW c/Utx5~m4~|h>X>MzލOphxb(^n#ۧhϘWg}g&fG? _ή/.60o/.zëMf/&K5x2n|5wë Rפ?< (L|hq2:vAN)6v1 P:sp` tr~^OWC0 VdpSY%$+ă)#qBش$xj9]%iNX)CDQ!I߂H~N 6SD=d﯌`K];LVt VL)fK"A;8{DZMkdQgOPh&^]F">ebcutDz0#iZ|m5F6=}7]Ձ݌^qXA8B1;4S}W"b`#nP4D-n좎rslq0t}8[/WN+ޓ=jA%x=:hxsGli sz(>8 ?ԓ@lI6͌s0Qs( &nx r5W^hQÊ APRQj`# W_I"r)~O<;LGZ\mAvvLY̚4VMҧ9 7x !A6J؋`&"P$'fė$N+eQ?O =MuAuެ66-hLl sNJ$P.o@hȶ.:e%`iw -IxCڼ̸/r׀{Zƨ`\\Uzq$ag b"(]JL5f'1o`R,׷>΄)v7^TBž[GJ>ՠ°u(mn@@n@n혉E]ߍI6q)c @<)b+bd_݃h $ طQe$@ ŇrA I?L,8(lQ1F1H9&;nJZ &Ÿ@=}=:cR ?{8ÜUL)evGŗ3X#7[J!fbvu{,5$[`H@Z}3Î xm0GmdRjӡn|R\v%oǨt"Gjœ%ub|>{kn`EAوP5BsFr?0w8l>n@=~=/\-  z۰,֜)YA(IAg#9$2rlGW3KDFK&Yz;ZwpHӴƸ,GNʛF$kN^ԕĸ%5#+2 L sD=30L#yG43`kA0찃Z=s%)c_׻KV*Z#kR > GeXm:LJߛPƟbL%+7C.NCx11 }cy JƤ!mUۖ*BbuK +|t ![k6/D!iZ] q pچQc{,x mC\l8 a/g91|څLCDlQf `>a.u(Ȥ\Kv imÜ^]##HOS!uvAX)_aeτ_`Y7×|6.T-Eo+_wȞ3$h߮ ㇏"~4,i:if7hlJcnӖ5Mo% 1U-=!LA*Ü^5%ɞ\uAMapkKBNsSmysTV_.l[FQBC:]uwAMqhYXGw7`og7<>2ouwAmKآ&ӡqK:!/QrE5+o?q8b`M.l"/%VĜE@Y=p!Z_ͯTM̄͒Z&l63rR"K^Il>ݺ9U!/.Md/kw{[uFZ[Ey76~0uK}5  U^'> ojdvEairz ?g*Kf>Y)ߋU0pʵ snb. sq:U\\L%3yxۿVouS/RWi"uiVYngs?B:#=#K:KqU= #3bNH.ЋwB$UU tQ1b4 L]/ ,L߮%x?ռovI+>x ^ HBQ$'`^AnHgm[JZ&w!9F3 Vy-jXԫLBwEw^5TSI,08`=bf P2J|(5]~Q 2J @6VΨXu 9WP@ƽ Wo!Y,DO%^x#h0Zg ZbF2H) !Kd!¡,VY"nƈ~yw 7wNȤa܂RE(G( pG*a_DX*v_?gRgבpn׽taQE`Xu曕%K)-j23`aփI +p@}؜뎢5P9­:R{FJD(JiX&3fF*TY%V_$c1\4(3Ep˽H.g JL](  z׫d;7ur98@ʃxw|27?xQ|/-%3Vf_Z1H2K*јҟaDjʻ7U ƂhEUks?^T^Lr+ Me],N4D v̇?:W¡]b2%s*on/O~K[6+XV3T/T29r%|D׮3&Z7[EJM4QJm>Z/7^A!16o0pFWi\ёgk2c5),XJ(e']Xfe}vK)&Z}?mHٞMM&^n;ɤ CH$-p^NqԈ-Q8kjn>tz{TIq6VNF=X) r#JNح?| lq vO{Z~+&hZVrBc2_Z&pK-λeFc:lp86l 9r|{^:;;\O׉6'ONzF9pz>zwv}q΄==\3cu6h,Pi_/ǧ0z-NLfVIɒ_5?`J}a\62%=ZLIyQF0R# C{bໃ$] l!MiK3߭UD53 螩%GT<58Xf@$Dft qlCZm cZ=W(.iE p ܟ+-#KO2Ď ?\0*22K t(^i-bx)c!,TNUѲ'0B0cH [灀 aXj2o$֟mhL>y} InHku@6`ƘٰCaVI2_B!7̉#iAyI^ "9 vm76[&n4knJ:;E̎<33p}8dq̾"m2wUZx圑H\N@h^Őm]F 4UI`is&(o2@Z]E+CQN@9Ty'O gC7 eH2U=09TN;0bt[ hLF? #vRC~߲Fe@KyWAfdEc ev{FI?al|-9$_kq8e-)SdyD_g? R={c%3#qr`\LvX؀Dy6XpIՙmZv?ńTD&*P1ԙ>Y}CLU S c0 4O6j BӚ)|AuM{@%P )ȶ#ekFA䓗2$%#:k>fclEKY,,rBli2U ~Џ( eԳgBn}ܮmÜqƽFFN6K(6첁.9P`1L2o j9|!{ʏwA|%${r x?k c]$H};^y#Ao8Z}zd'O1a0ܛJ@JpPea.Z voJQmlHv.%laCTu~yPgEL`~=ҶO?k^(`Gw0/%;*^c-I7>7%lQAboͲ `@fs8 +R9za<&R^_@̘;S|K2j/OT$FLH6MzS9&J9oRa!!sFcNG j4l WQiM~D3|fb rC5 H}WF`x !,Pn7zuphpmvault-0.8build1/.git/objects/dc/0000755000000000000000000000000011027372706014442 5ustar uphpmvault-0.8build1/.git/objects/dc/9dffcc9eee2b7fa1c6e8c676d6414b1d0c53630000644000000000000000000000006611027372706022112 0ustar x+)JMU06g040031QH/,L(ax{ J~X|\yQuphpmvault-0.8build1/.git/objects/e2/0000755000000000000000000000000011025616751014361 5ustar uphpmvault-0.8build1/.git/objects/e2/2ca0169000e8b82d5d11ad3adc6eed30a6ae740000644000000000000000000000023611025616751021701 0ustar xA 0E]s%iv(i2)c*x{sicJ. 3أd86XK7HX3jF=Yh˯$БxxedOåߢ3ئA u*ruS%H wI0ŸMX>\*irDDuphpmvault-0.8build1/.git/objects/e4/0000755000000000000000000000000011033561136014356 5ustar uphpmvault-0.8build1/.git/objects/e4/2d1a5252aff0012ec05d7ca17f7ac0fc79f7dc0000644000000000000000000000043211033561136021767 0ustar xmQS@{OqĻk .Px3ok;;;;?MB%Ē66NYRXcui2: C)A4H>a}-[x[VnSBJ,JmLccr+݀/ Mxœ!x&Gloݜ1a%+? I;* Wy.6ʼQbFݾ6c ea;+к{$kR1B#=auphpmvault-0.8build1/.git/objects/e7/0000755000000000000000000000000011027372706014367 5ustar uphpmvault-0.8build1/.git/objects/e7/66bbb6d587df6022defb87c0a453d4ea38a96d0000644000000000000000000000120611027372706021751 0ustar xS_o0߳?= IUS3MYFJDU `6;lU+M{al].uݧ:k[ϓΡ B9z :^K BhG9nMO3HMTyNOe!0gV8ƹ> mD7{QI۰n,t7Q7p;~Qc)UzW a=`){*'jZ]j?ri-j\{XB%}.EQܲ DK=t'͝j(h5^KH+<` ?Hx FCՈIH-V `/i %Jht5wG<m'#) Wn 1YOgۧh@OF87#s HM[BQ79*.>+SDCt[;X-PO?G#ք! iZn(>6\.7mIuphpmvault-0.8build1/.git/objects/e9/0000755000000000000000000000000011025655655014376 5ustar uphpmvault-0.8build1/.git/objects/e9/99884c15287c43ec797711ecfc8421903a931b0000644000000000000000000000025011025655655021253 0ustar xK0 Egq> ,+pmS"Q0`t L9Gs@4z3cLTYB(cbaL=7{v0"aVBtX%i@lCt>'kgi|WYC.1{ݶn):;̶<~$G,uphpmvault-0.8build1/.git/objects/ea/0000755000000000000000000000000011030114060014416 5ustar uphpmvault-0.8build1/.git/objects/ea/0bc46131dac288eb2336de5d6939987c2033540000644000000000000000000001221211030114060021332 0ustar xZs8_ؒ#ˏLYgZŖؒGR&ʦT YH$8} 9:"t7 LT쨿…Vd,o"Ɔ6 \Gjz.W0֩zS3$NzIKkKdxf*I[*|Z,^x|/R,O**̕{pvUTsr.3ez#z u.B_]2-4 cЭ$^T8."WVe=XGt[58! !UKN6-ϽEX+,O=A5|+||:{d,}-tfׯ"!xOUA(lR+Dl']m.8Q<^-uGVFS=/qc(,t8c-<(V9Ld& MvM48ĶasRCVK-`lQ+Pam[ ^q[`T RFo  K'h6vmK9ܿŐہnC?$G*VK4/~[ f2^YG m'%a>7d "86QaU9cF쿾hNc8[d>aPY OU6P'X6̿{u,|Vvfؾn}A&Nn"QA7j_}tP8^'f&>vɷ*YLs!ki&[:-鵅MgMS2(պ䔇EWKɑ #ۗMcy m+"=q:eD&d!zMaB24TP0# hrsPh1e;[1X^4 A@\꽝Y $))d@M& T-mG &bpɒ;׽dmlB *0US럖4gb\dY!ʔ9,/>cAd!p7N^_o ~}X pѹ*^:G:%<(IΑkbp _ԛJz!XV-uȃf!'yZ Ob ">MƔM0˽Hu0 Ud޾e2;x2~{՛ {'z÷iO5?QL Ǔɠh4iF~}u)aGt Q \r(FX)*ؠt;SғXж0j_}sl+8ߦ0H?v|SoCa<@0(|{Rz-ַ5Qkjxfbe~VF~Q~dl`33-D2!8Ƈ$+1nG0&`II~<|tOKRjD"xQ?NQؗ]>.v 7ݓ란DG%xZrq;JwIg7o&pkqPwÈh<7h|oq0l4{1Oȑk4k+&ah ^O׉63'']#L8=:C {1Zߌymkxx5 ׯ\ƽyGdz6~!ie;)^6+/&b=rn)uj .x,P_&xr5MڡE67N.=ĝ8aCx޽r~OH62d$q=eIsdg"e@r E*u3US۵X@oMVl5>Xlf8$ 0uФ̼eXu&x'sh`/T?=N.%vH}XTJMF*MN_-dX9BB!ƷjqxY8M?DH pS26Ҭmu6y]Qէw5K~B#-0K JhTی8cNr((2;SS K1 0*؃@tA’jFQA$byD.d,]mVr5LBOBS6AX@aODٗ@XZ\ iԏسe:40kN4JQϡ$KLKÊI#g5!KL$2OTS kY0ϜxbFAA ,k `/@u2S[fi .82*[plXFCOX*=hqlP<1YJm(!mb,njΉ 2Łg=xi}m M?4oUzHCaCu`#*>085T]Ahb(8*-UE Pr1s+iue99w ܟ#-+C2Oè8,˪&!/[Hj(&L33cpwr򯲖nJf|L5rxVȑ3}KI?%Kmd{(z8<} Inֈ,l@w1!:CK6AH2qN@7dE!F)Y2qQkfL K;$IR?3sbq`SQ_[+ar{MN&32[Q s@<BsPmW!P5V/=-9ґ6 >t񽀔kqd_\Blɓm%*)kZOx5[Zq*4k`I L|߯<\2Bx@7Epe(ݑ! U /ZJbefMɊ8Q:zFf~-{D1m|.<j.q8 SEUcr'zUm{UH[k3(}w,MeƦҗ? 6`* ~&DMf…Si<^|g/' 7ѾA Hg*f;dTܖ#,S~abA!FFsWZ g-M5]k!Z!q ms; ښRpv3SʹEI 96wftY ͪAٺA!¶J+d0h)ouWUB|()u|1GMbvqOl9TgH_i=</L |iېYx.fLdRc~a("lI~1qz _eL/ ,pK\.-A4Db{j8p{Vݫ܄]0L,l oY~KaHП .[)'[ 1`:N 5&Wef;JUJ8,mZȸǤ~Rv=Ō\(2}GhUZ$0hI xJrXB GS2yfy]9t} aO0ۼ_F71SzHُx&*LQ<,)Ϭ )j6w1^\}z>GCbVF>;G,0` %F !q;;r] 6ʹIGs` JB/6ٻutFy%˟L3ؐe%Jϣ4V{0hFl`V8uKS J쌰 {w*m<ˑͥ+wS>kȳ6Xުqòڸq!\K0@ՈVxoMIrڬil"m𷧾w$dAZ\84m;vSdѹ=T!(E zzm;A ڥ}ا]{[x{}GZJ-7uphpmvault-0.8build1/.git/objects/f2/0000755000000000000000000000000011030360277014355 5ustar uphpmvault-0.8build1/.git/objects/f2/e85c41bc18941ac9aa936bd140725a729859890000644000000000000000000001352011030360277021312 0ustar x[ksFݯԯpP#+Gޑ%ʣD*$oe@SD`xxP3U%qEH s2p2CRBcQ 㢖T\aN"WVe7gbQ20ca""PwLRcQ!O-Ne:u vcBw0aM1 3dUr:F848k呷`[s𥁏8RyE׮R, :$߅0 Q;؇W@&П߹ F%1\51-l! ETuE[P568PK`qVĖi/* p,,+GII Y£B ͶdXf1xm"řwG\_(XFaedOR-0`d¾jkVpUN$*ZkU'?K)h%(z-`?Vάhgj A"kh*d"I~oF}-&ׁnq-v^Kzg묣 e8(P!}M"9A̲A( |LGB7zSGD.(c@y`NL{2WEdwY ,›k ۻr<1˃0_UV (aNX6wGޤ4Zaaa}K}ؚ':{lԾLwõe4Шרnқ-%;juJDZs`Ȍc7> )$M\ueO/76|MzMP!V*휎g}q(,:W4G S}BY%Kt!"E^ ˍ/5’I,GW{u2wwvfغ=Xr ݻEDh/鲣LXND<]S_ hXNmK3m P}A6㸛L`?ަ]?K!u6Im_f JZE9F\W-G,x2[sޅnv5ʃNGmd M:Lr]S.HVQ/2퇳Pv"b6`1| X:RHM2*cYfmR,JlG Xp.XR`ݚ;4j䠲BHrvQH[/eX&".jiE3%&`!r0Z}V#B_@.`F_8-uloo9dyX6I)ڤd0zvXΫ0L, @ ] /:P;R[MTP~%̄ 1xjS ~1!hn۲L[ fAC+|jD?hKTgM MiIw(TڽhBY$:1)6!~Y*zSOJ۽gK=D^:u߅G]Bc^nhV" 1Цp-M+5B!)D-,Z DD72;gTfS >r$\Ƞcx*[zs->O`*+Oƿ^&ധZ{(ɠh^<}ä_v﷕c!U& '{j= 6NCg E|5σߜC}G';ݗ}a[~x/Ӫl 4*`{md8/ƻfFAA;лxq0l4=ȄkI5{9*g:fIo42o~:C~{~q{s|1Z?NtH|45?F~p ~op5} '3¨F!UKPjj6.WXΎM"4"b/c-69Dҿk0oQ3 EYaIgLN +|rzFV7ָ3MzN) l?̣o̕<֩a$%D~hn`[a5̇fT `Vd6-vkebptX3Ӆn,F|&qgĸ/C+uN5r]/VY_1sen+ߊ捂? pݨ,GfA͈͡8 0I0P[O* Uྣ,~ 3x+ _Jh| _bUjZ[WUxr"|(6񯽈d.վ/a= gI@ِKV@f PWyL"Rl`EtcIv|"i#S tq;U*eWO Іܙ-lhlcpE`A%iɱ>CEVL7wg/zyi!_N _* V pn/ZV'[ƟSڻk kOhȂ!]zY$$lvފ)*y;zBbg{hsdz=p׷2Un;5>n#)ȋ[.ls(:re !,#1Z ,]zXZ!W&巕<3eOd4 ¦U /[yhѪ)86G$>p*+ Q& ռsd8jx`%uEnO5U[B1k\W:HsmޭOzeλu˽'۔oK5՛ET[TbofoBH#w2W(:jX߶} f:J% [h\.G$u$DvݒZԛq'8b#o !k.3e,,e2"eϒ ֧JQP[ =29ATͥFWǵ˗ST(<!xhcP(#8GgeIѥ\3E"aP"cT3P6*6ݹ-B!A !?bv#:a} )k6JhaPZOLi1T%-5K_< u7@p.THk TgcKr X,[OWxxPutп0p/Wfֵ) =$玵wzx[a9`cKp_&߭WnjS~Ec7'lȹ0@`əE(A ,8^1蹩8mpZ#T UݮfgkW5my7 >juphpmvault-0.8build1/.git/objects/f3/0000755000000000000000000000000011030114060014341 5ustar uphpmvault-0.8build1/.git/objects/f3/a619ed53e93c3ae3c98c11f20a1ff12bb3f9480000644000000000000000000000042511030114060021632 0ustar x+)JMU04b040031Qpsg*8!F}cx# WQ5< U⛘ʰu/'mw,Iﶉ(&e&1ܙ̼w 8Vv['8jHJinA^r2ëZ,\>ݖ0bZ}(j2ڧ_h+xɇb[r>NYUZZP4F*]Dmz ,(3$ 7+tvoZ|:TQiAFAnYbiN ]G oxlv/6rFq|zuphpmvault-0.8build1/.git/objects/f9/0000755000000000000000000000000011030113211014344 5ustar uphpmvault-0.8build1/.git/objects/f9/1e9f74f40487ca9438c2f51711f9325a1258d90000644000000000000000000001217611030113211021227 0ustar xZsI_忢e &V2Ŗ<<Vw@n}/203wqqzdf;jjoOkw{[}.Z%dyy76~n0uwK}5 k3Uqr\5[2^"{0SI_RYY~W" 4r\yQ8gw\ENU>*2SL>^k[tr% xiaPQK [9Rc3X-|2?Z8] qp"gLYMl6qӑ,sEy|c ʇ7IW",-ugɧ"V[4FhμE[WiʮBgv=ZCL9mzA !_Ԧݲn4Pؘɱ{lP[Kyޢ2hvs}jeD26MnB Ƣ(b Yǩh34N;|}9y{7/f'<|t*В5F*P f-K "\ ,(QFLFSRӟ!rϒ%g_HPEAJ#Ùp8IW{!"YcHq!tTLxQ %;!O/Jj!zVX-uȡv1'[Z Rmb r)/ ]b{5pek'alɜsLefy ld7&j} tkX8'zAh>ٳrFg~9R>0x#:( .9qw\R,ĔGҽLJObA۲H֚ڢ ଟm .K[qޞZp!?@CLXCpvJCmM5D9m^z}=۳}o]e5CٷJ%uwhh9v7_vNcAq6?[T,Գygё+Wjk*2eUr+),7)> D5Q@ {yfpC;~ScqPxAUM&^n{dI)ĂCU[Ȅ Ƈ I#VXkB|4S>~|tܟ*ԈgEdSv M@_<͏>fp} hAzAU!ttpcO*'86\N_bFh4 tFqxF{a@6<]#GO~ث1SL;\O։6+ǽ]#,899E~3{v~{=\L v~$3Mz}6OE~pr5 /? =l'ë"mGhz#m+q1h> PhAj⻥\ԉIh!N@}1.zr5hCl4n"]8:\zl;qf\5omd,"f9I $1ϡ]U~xDoTp(R Tݮmzh f2e3@O"\ MuQfB5!RbDu8!ݮI!AԴj{.f.#ƷjqxYGMEH pS2CBҬmu:yQ/%oj@ӗZKxGH[zaE;ҦB׭g=<(x6#蘓ʦ-ʡ50+hA @aI5(E 1EdA2гeE!!W $Dˈ(9eT|P@+\#2K\$=l1) Zmqqs1c0s2Ұb:~M~Gd1S?ɤT G:7WQu1Z4(. PK{X7{±K>;.̺oQG(y6V&OJ/^iqlPÕ3FPa2(UmoU9rB淸,R3צ4zH sVQU+jxiG=t&l=RQqJ DBmFC1Tn%*z-)@eDŽ;rQ#h pZ:#Ԏ m>;*gÖ? #㰤/@يDR[D1`⦘5K;;ϕPB0cH܆/5@K+SFvFáYHrc-F|gdj6k7ZB) z_Eyt c-0*(UM͒sLZE13)k$K4ȾVt5oHܻ-kh@'9)pr֥@<[EU|F7,y C|z1EqW^ Y]-Vr1Fy'+$t-(CQnE˾% \ui.D J\8F,P/q=v}筡ZGt)7͈S:@OU!eנj"z>پհ*pNq~;¶— 5v@oaukPPWذ͸P$s*' +^[#sD30L#ly#KA0׹谅pP=u))m_V؝_T>X%?-'~7Qua־G[%6zTflQ.} b6]) Yp\KY I:{.ruHD9%Tu؅Q%l[13FJ/N3 o 6.Ts[#~)VBx+${x˧+ޠ GxG(l^cjӦ5ӛJ@Z6{PC Y='j8fSP&$ YG^JO@|3b7o4y٤[NoLF]@lŝ&aheOs'^6d ӳEX{_cXgu_bL\^|/H篲ftNO8-.s "hr9q=iD^B&0L,l m~'?-] Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. uphpmvault-0.8build1/Makefile0000644000000000000000000000215511557562346013236 0ustar # Makefile TARGETS:=uphpmvault uphpmvault_SRCS:=uphpmvault.cc dumpw.cc OBJ = $(patsubst %.c,$O%.o,$(patsubst %.cc,$O%.o,$1)) uphpmvault_OBJS := $(uphpmvault_SRCS) uphpmvault_OBJS := $(call OBJ,$(uphpmvault_OBJS)) CC:=gcc CXX:=g++ CFLAGS:=-O2 -g LFLAGS:=-g CFLAGS += -Wall -Wformat -Wstrict-aliasing .PHONY: all all: $(TARGETS) # --- Target Rules uphpmvault: $(uphpmvault_OBJS) @echo "LINK " $@ @$(CXX) -o $@ $^ $(LFLAGS) @cp $@ $@_unstripped @strip $@ .PHONY: install install: install -d $(DESTDIR)/usr/bin install -s uphpmvault $(DESTDIR)/usr/bin .PHONY: build build: # Override MAKELEVEL or the debian-helpers get mad MAKELEVEL= dpkg-buildpackage -I.git # --- Inference Rules $O%.o: %.c @printf "COMPILE %-30.30s %s\n" "$@" "$(CFLAGS) $(CFLAGS_C)" @$(CXX) -c $(CFLAGS) $(CFLAGS_C) -o $@ $< $O%.o: %.cc @printf "COMPILE %-30.30s %s\n" "$@" "$(CFLAGS) $(CFLAGS_CXX)" @$(CXX) -c $(CFLAGS) $(CFLAGS_CXX) -o $@ $< # --- Maintenance Rules .PHONY: tidy tidy: -rm *~ .PHONY: clean distclean clean distclean: @echo "CLEAN" @touch _clean @-rm _clean $(wildcard *.o *~ $(TARGETS) *_unstripped) uphpmvault-0.8build1/debian/0000755000000000000000000000000013635705747013020 5ustar uphpmvault-0.8build1/debian/changelog0000644000000000000000000000260513635705747014675 0ustar uphpmvault (0.8build2) focal; urgency=medium * No-change rebuild for libgcc-s1 package name change. -- Matthias Klose Sun, 22 Mar 2020 17:01:43 +0100 uphpmvault (0.8build1) bionic; urgency=high * No change rebuild to pick up -fPIE compiler default -- Balint Reczey Tue, 03 Apr 2018 12:48:57 +0000 uphpmvault (0.8) unstable; urgency=low * Added stddef.h s.t. offsetof macro is available. Required by GCC 4.6. (closes: bug#632569) -- Marc Singer Sun, 03 Jul 2011 11:02:58 -0700 uphpmvault (0.7) unstable; urgency=low * Releasing a second time to remove git control files from source archive. -- Marc Singer Mon, 02 May 2011 10:31:16 -0700 uphpmvault (0.6) unstable; urgency=low * GCC 4.6 changes (exposes) a missing prototype for ::fstat. Including the proscribed headers solves issue. (closes: bug#624912) * Fixed type-pun warnings. * Fixed sizeof in printf warning exposed on 64 bit host. -- Marc Singer Mon, 02 May 2011 10:12:31 -0700 uphpmvault (0.5) unstable; urgency=low * Added 'install' target to Makefile. Package not much good without it. * Added man page. -- Marc Singer Fri, 04 Jul 2008 14:39:30 -0700 uphpmvault (0.4) unstable; urgency=low * First release of package. -- Marc Singer Tue, 24 Jun 2008 22:03:45 -0700 uphpmvault-0.8build1/debian/compat0000644000000000000000000000000211030350466014173 0ustar 7 uphpmvault-0.8build1/debian/control0000644000000000000000000000167213260674071014416 0ustar Source: uphpmvault Section: utils Priority: optional Build-Depends: debhelper (>= 7) Maintainer: Ubuntu Developers XSBC-Original-Maintainer: Marc Singer Standards-Version: 3.7.3 Vcs-Git: git://scarlet.buici.com/uphpmvault Package: uphpmvault Architecture: any Section: utils Depends: ${shlibs:Depends}, ${misc:Depends} Description: upload recovery images to HP MediaVault2 via Ethernet The HP MediaVault--generation 2 a.k.a MV2--implements a custom recovery protocol for rescuing a device when the operating system image is corrupt. The uphpmvault application listens for broadcast Ethernet packets from an MV2 devices waiting for recovery. On receipt of one of these 'beacon' packets, uphpmvault transmits a recovery image to the waiting device which will automatically boot the recovery image. . The primary purpose of this application is for installing Debian GNU/Linux on an MV2. uphpmvault-0.8build1/debian/copyright0000644000000000000000000000205211027074507014734 0ustar This program is written, maintained, and packaged for Debian by Marc Singer . The upstream source may be found on this web site http://scarlet.buici.com/git. Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. The full text of the GPL copyright may be found in the original source tarball in the COPYING file file, or on your Debian system here: file:///usr/share/common-licenses/GPL uphpmvault-0.8build1/debian/manpages0000644000000000000000000000001511033556201014505 0ustar uphpmvault.8 uphpmvault-0.8build1/debian/rules0000755000000000000000000000003511030347502014050 0ustar #!/usr/bin/make -f %: dh $@ uphpmvault-0.8build1/dumpw.cc0000644000000000000000000000264311025655532013231 0ustar /** @file dumpw.cc written by Marc Singer 4 Jun 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. @brief Routine to perform a hexadecimal dump (hd) of a buffer. */ #include #include #include #include void dumpw (const char *rgb, int cb, unsigned long index, int width) { int i; if ((width == 2 && ((unsigned long) rgb & 1)) || (width == 4 && ((unsigned long) rgb & 3))) { printf ("%s: unable to display unaligned data\n", __FUNCTION__); return; } while (cb > 0) { printf ("%08lx: ", index); for (i = 0; i < 16; ++i) { if (i < cb) { switch (width) { default: case 1: printf ("%02x ", (unsigned char) rgb[i]); break; case 2: printf ("%04x ", *((uint16_t *) & rgb[i])); ++i; break; case 4: printf ("%08x ", *((uint32_t *) & rgb[i])); i += 3; break; } } else printf (" "); if (i % 8 == 7) putchar (' '); } for (i = 0; i < 16; ++i) { if (i == 8) putchar (' '); putchar ((i < cb) ? (isprint (rgb[i]) ? rgb[i] : '.') : ' '); } printf ("\n"); cb -= 16; index += 16; rgb += 16; } } uphpmvault-0.8build1/dumpw.h0000644000000000000000000000112711025655516013071 0ustar /** @file dumpw.h written by Marc Singer 4 Jun 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. */ #if !defined (__DUMPW_H__) # define __DUMPW_H__ /* ----- Includes */ /* ----- Types */ /* ----- Globals */ /* ----- Prototypes */ void dumpw (const char *rgb, int cb, unsigned long index, int width); #endif /* __DUMPW_H__ */ uphpmvault-0.8build1/exception.h0000644000000000000000000000221111025655455013730 0ustar /** @file exception.h written by Marc Singer 22 Feb 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. */ #if !defined (__EXCEPTION_H__) # define __EXCEPTION_H__ /* ----- Includes */ #include /* ----- Types */ struct Exception { char* sz; void initialize (const char* szFmt, va_list ap) { size_t cb = 256; sz = new char[cb]; vsnprintf (sz, cb, szFmt, ap); } Exception () : sz (NULL) {} Exception (const char* szFmt, ...) { va_list ap; va_start (ap, szFmt); initialize (szFmt, ap); va_end (ap); } ~Exception () { delete sz; } }; struct ResultException : public Exception { int result; ResultException (int _result, const char* szFmt ...) { result = _result; va_list ap; va_start (ap, szFmt); initialize (szFmt, ap); va_end (ap); } }; /* ----- Globals */ /* ----- Prototypes */ #endif /* __EXCEPTION_H__ */ uphpmvault-0.8build1/oprintf.h0000644000000000000000000000154111025655421013411 0ustar /** @file oprintf.h written by Marc Singer 30 Aug 2007 Copyright (C) 2007 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. */ #if !defined (__OPRINTF_H__) # define __OPRINTF_H__ /* ----- Includes */ #include #include /* ----- Types */ struct oprintf { char sz[512]; oprintf (const char* szFormat, ...) { va_list ap; va_start (ap, szFormat); vsnprintf (sz, sizeof (sz), szFormat, ap); va_end (ap); } friend std::ostream& operator<< (std::ostream& o, const oprintf& op) { return o << op.sz; } }; /* ----- Globals */ /* ----- Prototypes */ #endif /* __OPRINTF_H__ */ uphpmvault-0.8build1/uphpmvault.80000644000000000000000000000210211033555540014047 0ustar .TH uphpmvault 8 4-July-2008 "Debian GNU/Linux" .SH NAME uphpmvault \- upload recovery images to HP MediaVault2 via Ethernet .SH SYNOPSIS .B uphpmvault [\fIOPTION\fR...] \fIIMAGE_FILE\fR .SH DESCRIPTION .PP Transmit the recovery file IMAGE to an HP MediaVault2 waiting for recovery. .TP \fB\-q\fR, \fB\-\-quiet\fR suppress program output .PP The HP MediaVault--generation 2 a.k.a MV2--implements a custom recovery protocol for rescuing a device when the operating system image is corrupt. The \fBuphpmvault\fR application listens for broadcast Ethernet packets from an MV2 devices that is waiting for recovery. On receipt of one of these \fIbeacon\fR packets, \fBuphpmvault\fR transmits the recovery file \fIIMAGE\fR to the waiting device which will automatically boot the recovery image. .SH AUTHOR Written by Marc Singer .SH COPYRIGHT Copyright \(co 2008 Marc Singer .PP License GPLv2: GNU GPL version 2 .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. uphpmvault-0.8build1/uphpmvault.cc0000644000000000000000000003501007414221726014275 0ustar /** @file uphpmvault.cc written by Marc Singer 8 Jun 2008 Copyright (C) 2008 Marc Singer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Please refer to the file debian/copyright for further details. @brief Upload recovery firmware to an HP Media Vault (MV2). The U-BOOT boot loader on the Media Vault will enter a recovery mode if the firmware fails to load or if the device is powered on while the reset button is pressed. This program watches for 'beacon' broadcast message UDP packets from Media Vault devices on the local Ethernet network. It will upload a firmware image using TFTP [1] to the first found MediaVault. [1] http://www.faqs.org/rfcs/rfc1350.html NOTES ----- o The address received from the beacon packet is not the address we use to send the TFTP commands. Instead, we use the address in the UDP header since that will be most reliable. Still, we require that the IP address in the beacon be non-zero. o The main loop should wait for beacon packets for a little more than 5 seconds before initiating a recovery. If there are several devices waiting for recovery, we'll have seen them all. If there is more than one, a command line switch will distinguish between them. o poll vs. epoll. We're using poll because we aren't a high performance application and the semantics of poll are simpler for our application. With epoll, we'd have to read from the beacon socket until we saw an EWOULDBLOCK before entering epoll. With poll, we can simply call poll and wait. o Need to add a check for an application timeout if we don't receive ACKs or when there are no Beacons. o Note that the number of blocks sent will include an empty block if the file is an even multiple 512 bytes, per the RFC. o There is no real retry logic. We should at least be able to cope with dropped acknowledgements. o alloca is used in favor of stack arrays of characters to guarantee alignment. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dumpw.h" #include "exception.h" #include "oprintf.h" const char* argp_program_version = "uphpmvault 0.5"; struct arguments { arguments () : szImageFile (NULL), verbose (false), quiet (false) {} const char* szImageFile; bool verbose;; bool quiet; }; struct argp_option options[] = { // { "verbose", 'v', 0, 0, "Verbose output, when available" }, { "quiet", 'q', 0, 0, "Suppress output" }, { 0 } }; error_t arg_parser (int key, char* arg, struct argp_state* state); struct argp argp = { options, arg_parser, "FILE", " Upload recovery firmware to HP MediaVault (MV2) devices awaiting recovery.\n" "\v" "This program listens for broadcast beacon packets on any network\n" "interface from HP MediaVault devices in recovery mode. On receipt of\n" "a valid beacon message, the application will upload the specified\n" "firmware image file to the device and then terminate.\n" "\n" "The format of the recovery image is a pair of U-BOOT image files,\n" "concatenated with padding between them such that the second image\n" "starts exactly 2MiB from the beginning of the combined image file.\n" "The first U-BOOT image is a Linux kernel and the second is an initrd\n" "or initramfs.\n" }; error_t arg_parser (int key, char* arg, struct argp_state* state) { struct arguments& args = *(struct arguments*) state->input; switch (key) { case 'v': args.verbose = true; break; case 'q': args.quiet = true; break; case ARGP_KEY_ARG: if (args.szImageFile) argp_error (state, "only one image file is permitted"); args.szImageFile = arg; break; case ARGP_KEY_END: if (!args.szImageFile) argp_error (state, "you must specify an image file"); break; default: return ARGP_ERR_UNKNOWN; } return 0; }; /** Enumeration of the system state. */ enum { Idle = 0, ///< Waiting for a beacon BeaconReceived, ///< Beacon detected WRQSent, ///< TFTP Write RQ sent Acked, ///< ACK received to last command DataSent, ///< Data packet sent Done, ///< Upload complete }; #define PACKET_TYPE_RECOVERY_MODE (0xde) #define PORT_BEACON (8488) #define VERSION_BEACON (1) ///< Only one version of Beacon recognized #define STATE_RECOVERY (1) ///< Only one state exists /** Payload of a Beacon message. */ struct Beacon { // header uint8_t packet_type; ///< Beacon packet type uint8_t version; // payload uint16_t state; uint8_t ip_addr[4]; ///< IP address of device (redundant) uint8_t mac_addr[6]; ///< MAC address of device (redundant) uint8_t szName[16]; ///< Name of device manufacturer uint8_t szModel[50]; ///< Model name of device Beacon () { bzero (this, sizeof (*this)); } bool is (void) { return version == VERSION_BEACON && packet_type == PACKET_TYPE_RECOVERY_MODE && state == STATE_RECOVERY; } bool is_mediavault2 (void) { return strcasecmp ((const char*) szName, "HP P2 NAS") == 0; } bool is_valid (void) { return ip_addr[0] | ip_addr[1] | ip_addr[2] | ip_addr[3]; } } __attribute__((packed)); std::ostream& operator<< (std::ostream& o, const Beacon& b) { o << oprintf ("%-16.16s %02x:%02x:%02x:%02x:%02x:%02x (%d.%d.%d.%d)", b.szName, b.mac_addr[0], b.mac_addr[1], b.mac_addr[2], b.mac_addr[3], b.mac_addr[4], b.mac_addr[5], b.ip_addr[0], b.ip_addr[1], b.ip_addr[2], b.ip_addr[3]); return o; } #define PORT_TFTP (69) #define TFTP_OP_RRQ 1 #define TFTP_OP_WRQ 2 #define TFTP_OP_DATA 3 #define TFTP_OP_ACK 4 #define TFTP_OP_ERROR 5 #define TFTP_OP_OACK 6 #define TFTP_ERROR_NONE 0 #define TFTP_ERROR_FILENOTFOUND 1 #define TFTP_ERROR_ACCESSERROR 2 #define TFTP_ERROR_DISKFULL 3 #define TFTP_ERROR_ILLEGALOP 4 #define TFTP_ERROR_UNKNOWNID 5 #define TFTP_ERROR_FILEEXISTS 6 #define TFTP_ERROR_NOUSER 7 #define TFTP_ERROR_OPTIONTERMINATE 8 #define US_BETWEEN_RETRIES (100*1000) #define C_RETRIES (5) #define CB_DATA_PAYLOAD (512) // Default DATA payload size #define MS_TIMEOUT_POLL (200) struct message_tftp { uint16_t opcode; uint8_t data[]; } __attribute__((packed)); /** Berkeley UDP socket wrapper class. It can open a listening socket for either a specific port, or an OS selected port. */ struct Socket { int m_port; int m_s; Socket () : m_port (0), m_s (-1) {} Socket (int port) : m_port (port), m_s (-1) {} void open_udp (void) { struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl (INADDR_ANY); addr.sin_port = htons (m_port); m_s = ::socket (AF_INET, SOCK_DGRAM, 0); if (m_s == -1) throw Exception ("unable to create socket"); int options = ::fcntl (m_s, F_GETFL, 0); if (::fcntl (m_s, F_SETFL, options | O_NONBLOCK) != 0) throw Exception ("unable to make socket non-blocking"); if (::bind (m_s, (struct sockaddr*) &addr, sizeof (addr)) != 0) throw Exception ("unable to bind socket"); // printf ("m_port %d m_s %d\n", m_port, m_s); // Recover port if we've asked OS to pick one if (m_port == 0) { socklen_t cbAddr = sizeof (addr); if (::getsockname (m_s, (struct sockaddr*) &addr, &cbAddr) != 0) throw Exception ("unable to get socket address"); m_port = ntohs (addr.sin_port); }} }; /** Simple TFTP serving class. The base class is the UDP socket class to handle opening the listening socket. There are methods to send the important TFTP protocol elements. */ struct TFTP : Socket { struct sockaddr m_addr; TFTP () { } TFTP (int port) : Socket (port) { } void bind (struct sockaddr addr) { m_addr = addr; ((struct sockaddr_in*) &m_addr)->sin_port = htons (PORT_TFTP); } void set_port (int port) { ((struct sockaddr_in*) &m_addr)->sin_port = htons (port); } /** Send write request for named file. The file type will be 'octet'. */ void wrq (const char* szFile) { static const char szMode[] = "octet"; int cbMessage = sizeof (struct message_tftp) + strlen (szFile) + 1 + strlen (szMode) + 1; char* rgb = (char*) alloca (cbMessage); ssize_t cb; struct message_tftp& m = *(struct message_tftp*) rgb; m.opcode = htons (TFTP_OP_WRQ); cb = sizeof (m); cb += snprintf (rgb + cb, cbMessage - cb, "%s", szFile) + 1; cb += snprintf (rgb + cb, cbMessage - cb, "%s", szMode) + 1; // dumpw (rgb, cb, 0, 0); for (int retries = C_RETRIES; retries--; ) { ssize_t cbSent = sendto (m_s, rgb, cb, 0, &m_addr, sizeof (m_addr)); // printf ("sendto: %d -> %d\n", cb, cbSent); if (cb == cbSent) break; if (retries) { usleep (US_BETWEEN_RETRIES); continue; } throw ResultException (errno, "error sending WRQ on %d (%s)", m_s, strerror (errno)); } } /** Send write data. The block index starts with 1. The size of the buffer to send may reference all of the data remaining in the file. This function will only send messages of the negotiated size, probably 512 bytes. The return value is the number of bytes transmited. */ size_t wdata (int block, const char* rgb, size_t cb) { size_t cbSend = cb; if (cbSend > CB_DATA_PAYLOAD) cbSend = CB_DATA_PAYLOAD; size_t cbPacket = sizeof (message_tftp) + 2 + cbSend; char* rgbPacket = (char*) alloca (cbPacket); message_tftp& msg = *(message_tftp*) rgbPacket; msg.opcode = htons (TFTP_OP_DATA); { unsigned short s = htons (block); memcpy (msg.data, &s, sizeof (s)); } memcpy (msg.data + 2, rgb, cbSend); // printf ("sending data block %d %d bytes\n", block, cbSend); // dumpw (rgbPacket, 16, 0, 0); for (int retries = C_RETRIES; retries--; ) { ssize_t cbSent = sendto (m_s, rgbPacket, cbPacket, 0, &m_addr, sizeof (m_addr)); // printf ("sendto: %d %d\n", sizeof (rgbPacket), cbSent); if (cbSent == (ssize_t) cbPacket) break; if (retries) { usleep (US_BETWEEN_RETRIES); continue; } throw ResultException (errno, "error sending %d DATA on %d (%d '%s')", cbSend, m_s, errno, strerror (errno)); } return cbSend; } }; /** UDP/TFTP server loop and state machine. It waits for broadcast beacon messages and uploads the recovery image when it finds receives a valid beacon. The cBlocks calculation rounds up and may add a full extra block if the file to send is an even multiple of the block size, per the RFC. */ void server (struct arguments& args, void* pvFile, size_t cbFile) { Socket sBeacon = Socket (PORT_BEACON); sBeacon.open_udp (); TFTP tftp; Beacon b; tftp.open_udp (); struct pollfd fds[] = { { sBeacon.m_s, POLLIN, 0 }, { tftp.m_s, POLLIN, 0 }, }; int result; int state = Idle; int block = 0; int cBlocks = (cbFile + CB_DATA_PAYLOAD)/CB_DATA_PAYLOAD; size_t ibFile = 0; struct sockaddr addr; socklen_t cbAddr = sizeof (addr); while (state != Done) { char rgb[1500]; int cb; switch (state) { // Read from our sockets case Idle: case WRQSent: case DataSent: if ((result = poll (fds, sizeof (fds)/sizeof (*fds), MS_TIMEOUT_POLL)) > 0) { // Read Beacon if (fds[0].revents & POLLIN) { cb = recvfrom (sBeacon.m_s, rgb, sizeof (rgb), 0, &addr, &cbAddr); if (cb > 0 && !b.is ()) { memcpy (&b, rgb, sizeof (b)); bool recover = state == Idle && b.is_mediavault2 () && b.is_valid (); if (!args.quiet) std::cout << b << (recover ? "" : " [ignoring]") << std::endl; if (state == Idle && b.is_mediavault2 () && b.is_valid ()) { if (!args.quiet) { printf ("Recovering %02x:%02x:%02x:%02x:%02x:%02x\n", b.mac_addr[0], b.mac_addr[1], b.mac_addr[2], b.mac_addr[3], b.mac_addr[4], b.mac_addr[5]); printf ("Sending file of %d bytes in %d blocks of %d bytes\n", int (cbFile), cBlocks, CB_DATA_PAYLOAD); } tftp.bind (addr); state = BeaconReceived; } } } // Read ACKs if (fds[1].revents & POLLIN) { if ((cb = recvfrom (tftp.m_s, rgb, sizeof (rgb), 0, &addr, &cbAddr) > 0)) { uint16_t opcode; memcpy (&opcode, rgb + offsetof (message_tftp, opcode), sizeof (opcode)); opcode = ntohs (opcode); uint16_t blockAck; memcpy (&blockAck, rgb + offsetof (message_tftp, data), sizeof (blockAck)); blockAck = ntohs (blockAck); if (opcode == TFTP_OP_ACK && blockAck == block) { if (state == WRQSent) tftp.set_port (ntohs (((sockaddr_in*)&addr)->sin_port)); state = Acked; ++block; } } } } break; // We've seen a beacon, send the write request case BeaconReceived: tftp.wrq ("uImage"); // The name, itself, is unimportant state = WRQSent; break; // We've been ACKd, send another block or terminate case Acked: if (block - 1 >= cBlocks) { state = Done; break; } ibFile += tftp.wdata (block, (const char*) pvFile + ibFile, cbFile - ibFile); state = DataSent; break; } } } int main (int argc, char** argv) { struct arguments args; argp_parse (&argp, argc, argv, 0, 0, &args); int fh = ::open (args.szImageFile, O_RDONLY); if (fh == -1) { printf ("unable to open file %s\n", args.szImageFile); exit (2); } struct stat stat; ::fstat (fh, &stat); size_t cb = stat.st_size; void* pv = ::mmap (0, cb, PROT_READ, MAP_FILE | MAP_SHARED, fh, 0); if (!args.quiet) { printf ("Recovery image %s is %d bytes\n", args.szImageFile, int (cb)); printf ("Waiting for broadcast beacon packets.\n"); printf ("Press ^C to cancel\n"); } try { server (args, pv, cb); } catch (const Exception& e) { printf ("exception: %s\n", e.sz); } catch (...) { printf ("exception: \n"); } return 0; }