#!/bin/sh

# PLEASE SUBMIT BUGS AND REQUESTS AT:
#  http://code.google.com/p/vee/issues/list

VERSION=0.9.9-zeta

if [ ! ${EDITOR} ]; then
  EDITOR=vi
fi
MARGIN=64
FORMAT=html
INDEX=vee.html
DIR=.vee
DRAFT=${DIR}/.vee.tmp.$$
DATE=`date`
YEAR=`date "+%Y"`
TIME=`date "+%Y-%m-%dT%H:%M:%S"`
SEC=`date "+%s"`
TITLE=
DEFAULT_TITLE="Entry #${SEC}";
HEADERTXT=  # text or `cat some.header.txt` 
FOOTERTXT="Powered by <a href=\"http://www.0x743.com/vee\">vee</a><br/>Copyright &copy; 2006-${YEAR}"  
TOP_TPL=./vee-top.tpl
BOT_TPL=./vee-bottom.tpl
PREFORMAT_FILTER=./vee-filter     # the filter is assumed to be executable, else it is ignored
USE_EDITOR=1
LISTENSTDIN=0
SORT_ALL="sort -t. +0f -1 +1nr"   # sorts all in file listing
SORT_NEWEST="sort -t. -nr"        # sorts all new to old 
SORT_OLDEST="sort -t. -r"         # sorts all old to new
PUBLISHED=`date "+%m/%d/%Y"`      # date formated for index page entry
FORMAT_FUNC=format_with_groff
FORMAT_DISPATCHER=default_set_format_func       
FORMAT_CUSTOM_DISPATCHER=custom_set_format_func
UPDATE_INDEX=update_index
OUTPUT_TOP=output_top
OUTPUT_BOT=output_bottom
# define custom format file
FORMAT_CUSTOM_DEFS=./vee-custom.sh              # see example in vee/sample-custom-format/   

#
# vee is a zero configuration, commandline blog tool that
# requires NO installation other than dropping the vee 
# script into your ~/bin, or someother directory in your PATH
#
# vee accepts input when in batch mode (-b), so it is well 
# suited for use in batch situations, such as in a cronjob 
#

# System utilities required via PATH:

# cd, pwd, ls, sort, head, tail, cat, grep, groff, fold, expr (built in)

# change log
# Applied patch from efbeha@gmail.com: 
#   added code to keep words whole when using fold
#   added code to remove extraneous lines from groff
# made sort options customizable
# made publish date format customizable
# initial implementation of pre format filter
# externalized the use of custom formats
# added ability to edit and reformat any post

 disclaimer()
{ echo "Copyright (c) 2007 /me" 
  echo "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:"
  echo "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software."
  echo "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
}

#
# vee - the minimal, zero configuration command line blog thingy
#
# Contact (bugs, patches, suggestions)
#  estrabd+vee 'at' gmail
#  AIM: bz743
# 
# Instructions:
#  1. put in directory accessible via PATH
#  2. go to a web visible directory and type 'vee'
#  3. put in your title and write your post in vi
#  4. tell your mom to visit: http://..../yourdir/vee.html
#
# Tips:
#
# 1 You can force the index to be index.html using "-I", or 
#   you can specify the index with "-i somefile.html". But,
#   if you do this, you'll have to specify this for all other
#   commands, otherwise vee defaults to vee.html 
#
# 2 vee respects your EDITOR environmental variable 
#
# 3 What you do with vee.html or the formatting is up to you :)
#

# CREDITS
#  efbeha (efbeha@gmail.com) - supplied first patch ever :)
#  Oliver @ forums.bsdnexus.com
#  arun   @ chat.taucher.net #bsd
#  J65nko @ bsdforums.com

if [ -e "${FORMAT_CUSTOM_DEFS}" ]; then
  . "${FORMAT_CUSTOM_DEFS}"
fi

# ideas:
 default_set_format_func()
{ case "$1" in
    default) FORMAT_FUNC=format_with_groff
             echo using $FORMAT_FUNC
             ;;
    groff)   FORMAT_FUNC=format_with_groff
             echo using $FORMAT_FUNC
             ;;
    fold)    FORMAT_FUNC=format_with_fold
             echo using $FORMAT_FUNC
             ;;
    none)    FORMAT_FUNC=with_no_formatting
             echo using $FORMAT_FUNC
             ;;
             # if not a supplied format, see if it is in
             # the custom format file, if it exists
    *)       if [ -e "${FORMAT_CUSTOM_DEFS}" ]; then
               # call dispatch function that is defined in
               # the custom format file, pass on format nickname
               ${FORMAT_CUSTOM_DISPATCHER} "${1}"
             else
               echo "bad format type" 
               die_cleanly
             fi
  esac 
}

 usage()
{ echo "                                                                              " 
  echo " vee - the Zero-conf, commandline blog tool thingy                            "
  echo "                                                                              "
  echo "Version: ${VERSION}                                                           "
  echo "                                                                              "
  echo "Usage:                                                                        "
  echo "  See below.                                                                  " 
  echo "                                                                              " 
  echo "Options:                                                                      " 
  echo "  -b                batch mode; used when piping in msg via stdin             " 
  echo "  -B  file          define bottom template; default is ./vee-bottom.tpl       " 
  echo "  -c  [1-9\d*]      specify the number of characters 'fold' allows per line   " 
  echo "                      this only applies when 'fold' (-f) is used              " 
  echo "  -d  'publis_dir'  specify the directory .vee is in - defaults to PWD        " 
  echo "  -f  'format'      use defined format instead of the default, groff;"
  echo "                    'groff', 'fold', and 'none' are supported out of the box"
  echo "  -h                prints this blurb                                         " 
  echo "  -i  'custom.html' specify a custom index file over the default              "
  echo "  -I                force index file to be \"index.html\"                     "
  echo "  -l                edit latest post's *.raw; used with '-r' publishes changes;"
  echo "                    calls reformat automatically;                             " 
  echo "  -L  [1-9\d*]      edit the Nth latest, relative to last post; lp starts at 1"
  echo "  -m  'message ...' specify entry message at commandline and avoid vi         " 
  echo "  -n                lists all entries, newest first, then quits               "
  echo "  -o                lists all entries, oldest first, then quits               " 
  echo "  -p                see what *raw files don't have an entry in the INDEX      "
  echo "  -P                forever deletes all *raw and formatted files associated with"
  echo "                    posts that are listed with -p;                            "
  echo "  -r  [1-9\d*]      reformats the Nth latest post                             "
  echo "  -R                reformats _all_ .vee/*.raw files; -c applies as well      "
  echo "  -s  "summary"     placed below title in INDEX                               "
  echo "  -t  'title'       specify title at commandline and avoid annoying default prompt" 
  echo "  -T  file          define top template; default is ./vee-top.tpl             " 
  echo "  -v                version and exit                                          " 
  echo "  -x  filter        defines filter if not using default "./vee-pre"; filter     "
  echo "                    must be executable, i.e., chmod 755 vee-pre               "
  echo "                                                                              " 
  echo "Examples:                                                                     "
  echo "                                                                              " 
  echo "%vee                                                                          " 
  echo "                                                                              " 
  echo " user will be prompted for title and presented with vi                        "
  echo "                                                                              " 
  echo " if no default dir/files are found, they will be created                      "
  echo "                                                                              " 
  echo "%vee -t \"this is the title\"                                                 "
  echo "                                                                              " 
  echo " user will just be presented with a vi session;                               "
  echo "                                                                              " 
  echo "%cat text.txt | vee -b -t \"my title\" -m \"text to go before stdin\"         " 
  echo "                                                                              " 
  echo " publishes contents of text.txt with provided title; -m's msg will be         " 
  echo " shown above the cat'd text                                                   " 
  echo "                                                                              " 
  echo "%vee -l       # edit and reformat the latest post                             " 
  echo "%vee -L 5     # allows one to edit and reformats the fifth latest post        " 
  echo "%vee -r 8     # reformats the 8th latest post                                 " 
  echo "%vee -R       # reformats ALL posts that have *.raw files                     " 
  echo "                                                                              " 
  echo "To delete a post forever:                                                     " 
  echo "1) delete the entry in the INDEX                                              " 
  echo "2) purge the entry: "
  echo "  vee -p    # make sure it is the one you want to purge"
  echo "  vee -P    # purge it!"
  echo "                                                                              " 
  echo " brings up the latest entry as a vi sessions; when changes are save,          " 
  echo " all messages are reformatted                                                 " 
  echo "                                                                              " 
  echo "Notes:                                                                        "
  echo "                                                                              " 
  echo "1. Batch mode looks for piped input via STDIN; if none after a short time,    "
  echo "   message creation fails UNLESS something was passed in via '-m' as well.    " 
  echo "   If nothing was passed in via '-t' for the title, some default is used;     "
  echo "   This is set at the top of the script as 'DEFAULT_TITLE'.                   "
  echo "                                                                              " 
  echo "2. Interactive mode (default) prompts for a title if no '-t' is provided.     "
  echo "   Such is the case even if '-m' is used.  If '-m' is not used in this        "
  echo "                                                                              " 
  echo "3. Patches are welcome; the goal is not more feature bloat, but a nicer       "
  echo "   way of dealing with standard in, etc would be welcomed.                    " 
  echo "                                                                              " 
  echo `disclaimer` 
  exit 1
}

# formats post link on index page
 update_index() 
{ echo "<!-- ;${SEC}; -->${PUBLISHED}:<a href=\"${DIR}/${SEC}.${TIME}.${FORMAT}\"> ${TITLE}</a>" >> ${INDEX}
  if [ -n "${SUMMARY}" ]; then
    SEC=`expr $SEC - 1`
    echo "<!-- ;${SEC}; -->${SUMMARY}" >> ${INDEX}
  fi
}

 output_top()
{ echo ${HEADERTXT} > ${FINAL}
  if [ -e "${TOP_TPL}" ]; then
     cat "${TOP_TPL}" >> ${FINAL}
     echo "<pre>"   >> ${FINAL}
   else
     echo "<!-- <?xml version=\"1.0\" encoding=\"UTF-8\" ?> --><!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\">"  >> ${FINAL}
     echo "<meta http-equiv=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">" >> ${FINAL}
     echo "<head><title>${TITLE} - ${DATE}</title></head>"  >> ${FINAL}
     echo "<body>"  >> ${FINAL}
     echo "<pre>"   >> ${FINAL}
     echo "<a href=\"../${INDEX}\">[index]</a><a href=\"./${RAWNAME}\">[raw]</a><a href=\"../\">[main]</a>" >> ${FINAL}
   fi
   echo           >> ${FINAL}
}

 output_bottom()
{ echo          >> ${FINAL}
  echo --       >> ${FINAL}
  echo ${FOOTERTXT} >> ${FINAL}
  if [ -e "${BOT_TPL}" ]; then
    cat "${BOT_TPL}" >> ${FINAL}
  else
    echo "</pre>" >>  ${FINAL}
    echo "</body>" >>  ${FINAL}
    echo "</html>" >>  ${FINAL}
  fi
} 

# begin formatting funcs

 format_with_groff()
{ #sed 1liner from http://sed.sourceforge.net/sed1line.txt
  groff -man -Tascii ${RAW} >> bla.raw
  sed '/^$/N;/\n$/D' bla.raw >> ${FINAL}
  rm bla.raw
#  groff -man -Tascii ${RAW} >> ${FINAL}
}

 with_no_formatting()
{ cat ${RAW} >> ${FINAL}
} 

 format_with_fold()
{ if [ 0 -lt "${MARGIN}" ]; then
    fold -s -w ${MARGIN} ${RAW} >> ${FINAL}
  else
    with_no_formatting 
  fi
}

# load custom functions if defined above and file exists
if [ -e "${FORMAT_CUSTOM_DEFS}" ]; then
  . "${FORMAT_CUSTOM_DEFS}"
fi

# end formatting funcs 

#
# all filters must accepted STDIN and output via STDOUT
# default arguments include:
#
 preformat()
{ if [ -x "${PREFORMAT_FILTER}" ]; then
    cat "${DRAFT}" | "${PREFORMAT_FILTER}" "${FORMAT_FUNC}" > "${DRAFT}.tmp" 
    mv -f "${DRAFT}.tmp" "${DRAFT}" 
  fi 
}

# postformat()
#{ if [ -x "${POSTFORMAT_FILTER}" ]; then
#    cat "${FINAL}" | "${POSTFORMAT_FILTER}" > "${FINAL}.tmp" 
#    mv -f "${FINAL}.tmp" "${FINAL}" 
#  fi 
#}

 format_main()
{ FINAL=${DIR}/${1}
  FINALNAME=${1}
  RAW=${DIR}/${2}
  RAWNAME=${2}
  preformat
  # save raw form before formatting if it doesn't exist
  # which is the case when reformatting all
  if [ ! -e ${RAW} ]; then
    echo ${DATE}   > ${RAW}     # in RAW, line 1 is date
    echo          >> ${RAW}
    echo ${TITLE} >> ${RAW}     # in RAW, line 2 is title
    echo          >> ${RAW}
    echo "--"     >> ${RAW}
    echo          >> ${RAW}     # this blank line is important
    cat ${DRAFT}  >> ${RAW}
  fi
  ${OUTPUT_TOP} 
  ${FORMAT_FUNC} 
  ${OUTPUT_BOT} 
  #postformat # not sure about this one yet
}

 reformat_singleton()
{  if [ -e "${DIR}/${1}.raw" ]; then
     #echo "Reformatting message: \"${1}\""
     cat "${DIR}/${1}.raw" > "${DRAFT}"
     format_main "${1}.${FORMAT}" "${1}.raw"
   fi
}

 reformat_all()
{ FILES=`ls -c ${DIR}/*.raw | ${SORT_ALL}`
   for RAW in $FILES; do
     # From: Randall R Schulz <rrschulz at cris dot com>
     FULLNAME="${RAW}"
     DIR="${FULLNAME%/*}"
     FILE="${FULLNAME##*/}"
     MAXBASE="${FILE%.*}"
     MINBASE="${FILE%%.*}"
     MAXSUF="${FILE#*.}"
     MINSUF="${FILE##*.}"
     reformat_singleton "${MAXBASE}"
   done
}

 newest_first() 
{ FILES=`ls -c ${DIR}/*.raw | ${SORT_NEWEST}`
  echo ${FILES}
}

 list_newest_first()
{ FILES=`newest_first`
  COUNT=1
  for FILE in ${FILES}; do
     FULLNAME="${FILE}"
     DIR="${FULLNAME%/*}"
     FILE="${FULLNAME##*/}"
     MAXBASE="${FILE%.*}"
     TITLE=`head -n 3 ${DIR}/${FILE} | tail -n 1` 
     printf "%7d)  " $COUNT
     echo ${MAXBASE} ::  ${TITLE}
     COUNT=`expr $COUNT + 1`
  done
}

 oldest_first()
{ FILES=`ls -c ${DIR}/*.raw | ${SORT_OLDEST}`
  echo ${FILES}
}

 list_oldest_first()
{ FILES=`oldest_first`
  for FILE in ${FILES}; do
     FULLNAME="${FILE}"
     DIR="${FULLNAME%/*}"
     FILE="${FULLNAME##*/}"
     MAXBASE="${FILE%.*}"
     TITLE=`head -n 3 ${DIR}/${FILE} | tail -n 1` 
     echo ${MAXBASE} ::  ${TITLE}
  done
}

 get_path2post()
{ FILES=`ls -c ${DIR}/*.raw | ${SORT_NEWEST}`
  GOAL=${1}
  COUNT=1
  for FILE in ${FILES}; do
     FULLNAME="${FILE}"
     DIR="${FULLNAME%/*}"
     FILE="${FULLNAME##*/}"
     MAXBASE="${FILE%.*}"
    if [ ${COUNT} -eq ${GOAL} ]; then
     echo ${MAXBASE}
     break
    fi
    COUNT=`expr ${COUNT} + 1`
  done
}

 purge_entries()
{ LEVEL=$1 
  COUNT=0
  if [ ! -e "${INDEX}" ]; then
    echo "Can't find index, \"${INDEX}\""
    die_cleanly
  fi
  FILES=`newest_first`
  for FILE in ${FILES}; do
     FULLNAME="${FILE}"
     DIR="${FULLNAME%/*}"
     FILE="${FULLNAME##*/}"
     MAXBASE="${FILE%.*}"
     ENTRY=`grep "$MAXBASE" $INDEX`
     if [ -z "${ENTRY}" ]; then
       COUNT=`expr $COUNT + 1`
       if [ $LEVEL -eq 1 ]; then
         echo "$DIR/$FILE (not really purged, use -P for realz)"
       elif [ $LEVEL -eq 2 ]; then
         echo "$DIR/$MAXBASE[.raw,$FORMAT] (purged for realz)"
         rm -f $DIR/$MAXBASE*
       fi
     fi
  done
  echo removed $COUNT entrie\(s\)...
}

 die_cleanly()
{ if [ -e ${DRAFT} ]; then
    rm -f ${DRAFT}
  fi
  exit 0
}

POST2REFORMAT=0
REFORMATALL=0
PURGELEVEL=0
POST2EDIT=0
SUMMARY=
MESSAGE=

# get opts ! stdin append to anything passed in by -m 
while getopts 'f:m:t:T:c:d:i:IbB:hRr:lL:novx:X:Pps:' option; do
    case "$option" in
    i) INDEX="${OPTARG}"  # specify INDEX to $OPTARG
       ;;
    I) INDEX="index.html" # force INDEX to index.html
       ;;
    d) if [ -d "${OPTARG}" ]; then
         cd "${OPTARG}"
       else
         echo "${OPTARG}" is not a directory!
         die_cleanly
       fi
       echo `pwd`
       ;;
    r) POST2REFORMAT="${OPTARG}"
       ;;
    R) REFORMATALL=1
       ;;
    b) LISTENSTDIN=1 
       USE_EDITOR=0
       ;;
    B) BOT_TPL="${OPTARG}"
       ;;
    f) ${FORMAT_DISPATCHER} "${OPTARG}"  # default is set_format_func
       ;;
    c) MARGIN=${OPTARG} # this option is about to be deprecated
       ;;
    l) POST2EDIT=1
       ;;
    L) POST2EDIT="${OPTARG}"
       ;;
    m) MESSAGE="${OPTARG}" 
       USE_EDITOR=0
       ;;
    n) list_newest_first
       die_cleanly 
       ;;
    o) list_oldest_first
       die_cleanly 
       ;; 
    s) SUMMARY="${OPTARG}"
       ;; 
    t) TITLE="${OPTARG}"
       ;;
    T) TOP_TPL="${OPTARG}"
       ;;
    v) echo $VERSION
       die_cleanly
       ;;
    p) PURGELEVEL=1
       ;; 
    P) PURGELEVEL=2 
       ;; 
    h) usage
       die_cleanly
       ;;
    x) PREFORMAT_FILTER="${OPTARG}"
       ;; 
    ?) #usage | less
       die_cleanly
       ;;
    esac
done

 post_opts() 
{ if [ ${PURGELEVEL} -ge 1 ]; then
    purge_entries "${PURGELEVEL}"
    die_cleanly
  fi 

  if [ ${POST2EDIT} -ge 1 ]; then
    LATEST=`get_path2post ${POST2EDIT}`
    ${EDITOR} ${DIR}/${LATEST}.raw
    POST2REFORMAT=${POST2EDIT}
  fi

  if [ ${POST2REFORMAT} -ge 1 ]; then
    LATEST=`get_path2post ${POST2REFORMAT}`
    reformat_singleton "${LATEST}"
    die_cleanly
  fi

  # if "-R", or reformat all, is set 
  if [ ${REFORMATALL} -eq 1 ]; then
    # future may yield seperate "rebuild reindex" functionality 
    reformat_all
    die_cleanly
  fi

  # blocks vee -l (without the -r) from going on 
  if [ ${POST2EDIT} -ge 1 ]; then
    die_cleanly
  fi

  # Batch message creation: -m and stdin
  # handles -m
  if [ -n "${MESSAGE}" ]; then
    echo "${MESSAGE}" >> ${DRAFT}
  fi

  if [ ${LISTENSTDIN} -eq 1 ]; then
    IFS="" # ensures that leading spaces are retained
    while read -r IN <&0 ; do # break after 1 sec of no stdin
      echo "${IN}"            # echo's stdin back out so user can see 
      echo "${IN}" >> ${DRAFT} 
      LISTENSTDIN=1
      USE_EDITOR=0
    done
  fi
}

# generates INDEX file if none exists
 setup()
{ mkdir -p ${DIR} || echo ${DIR} exists...
  if [ ! -e ${INDEX} ]; then
    echo
    echo "...creating ${INDEX}"
    echo "<!-- ;10000000000000000000000000; open pre tag --><!-- <?xml version=\"1.0\" encoding=\"UTF-8\" ?> --><!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>my vee index</title></head><body><pre>" >> ${INDEX}
    echo "<!-- ;1000000000000000000000000; utf8 meta tag  --><meta http-equiv=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">" >> ${INDEX}
   # header stuff
    echo "<!-- ;100000000000000000000000; fixed content -->" >> ${INDEX}
    echo "<!-- ;10000000000000000000000;  fixed content -->" >> ${INDEX}
    echo "<!-- ;1000000000000000000000;   fixed content -->" >> ${INDEX}
   # footer stuff
    echo "<!-- ;3; fixed content -->" >> ${INDEX}
    echo "<!-- ;2; fixed content -->" >> ${INDEX}
    echo "<!-- ;1; fixed content -->Powered by <a href=\"http://www.0x743.com/vee\">vee</a>" >> ${INDEX}
    echo "<!-- ;0; closing pre tag --></pre></body></html>" >> ${INDEX}
    echo
  fi
}

 sort_index()
{ #echo sorting ${INDEX} ...
  #sort -t";" +0f -1 +1nr ${INDEX} > .${INDEX}.$$.sorted
  #${SORT_INDEX} 
  sort -t';' +0f -1 +1nr ${INDEX} > .${INDEX}.$$.sorted
  #echo rebuilding ${INDEX} 
  mv .${INDEX}.$$.sorted ${INDEX} # "rebuild ${INDEX}
}

 use_editor()
{ if [ ${USE_EDITOR} -eq 1 ]; then 
    OK=0
    ${EDITOR} ${DRAFT} && OK=1
    if [ $OK -ne 1 ]; then
      echo there has been a problem with your editor session
      exit
    fi
  #else
    #echo ...vi mode off
  fi
}

# ask for title if not set with -t and not in batch mode
# if in batch mode with no -t set, use default title below
 get_title()
{ if [ -z "${TITLE}"  ]; then
    TITLE=$DEFAULT_TITLE
  fi
}

 read_config()
{ if [ -e ./.veerc ]; then
    . ./.veerc
  fi
} 

# Main program body

read_config   # done after all options are read in, could look in -d before
              # opts are processed though so opts could override defaults
              # and config file .. yeah do that
post_opts
setup
get_title 
use_editor

if [ -e ${DRAFT} ]; then
  format_main "${SEC}.${TIME}.${FORMAT}" "${SEC}.${TIME}.raw" 
  $UPDATE_INDEX 
  sort_index
  die_cleanly
else
  echo Error! ${DRAFT} not found
fi

