[LON-CAPA-cvs] cvs: loncom /html/adm/lonIcons branch.gif navmap.correct.gif navmap.icons.gimp.xcf navmap.open.gif navmap.wrong.gif /interface lonnavmaps.pm doc/loncapafiles loncapafiles.lpml

bowersj2 lon-capa-cvs@mail.lon-capa.org
Tue, 01 Oct 2002 19:15:22 -0000


This is a MIME encoded message

--bowersj21033499722
Content-Type: text/plain

bowersj2		Tue Oct  1 15:15:22 2002 EDT

  Added files:                 
    /loncom/html/adm/lonIcons	branch.gif navmap.correct.gif 
                             	navmap.icons.gimp.xcf navmap.open.gif 
                             	navmap.wrong.gif 

  Modified files:              
    /doc/loncapafiles	loncapafiles.lpml 
    /loncom/interface	lonnavmaps.pm 
  Log:
  Adds icons for nav map. Installs icons for nav map. Commits original gimp file.
  Installs new icons with loncapafiles. 
  
  Correctly unties the course hashes! Update to this if you care about the lonnavmaps.
  
  
  
--bowersj21033499722
Content-Type: text/plain
Content-Disposition: attachment; filename="bowersj2-20021001151522.txt"

Index: doc/loncapafiles/loncapafiles.lpml
diff -u doc/loncapafiles/loncapafiles.lpml:1.176 doc/loncapafiles/loncapafiles.lpml:1.177
--- doc/loncapafiles/loncapafiles.lpml:1.176	Mon Sep 23 15:52:37 2002
+++ doc/loncapafiles/loncapafiles.lpml	Tue Oct  1 15:15:22 2002
@@ -3,7 +3,7 @@
 <!-- loncapafiles.lpml -->
 <!-- Scott Harrison -->
 
-<!-- $Id: loncapafiles.lpml,v 1.176 2002/09/23 19:52:37 harris41 Exp $ -->
+<!-- $Id: loncapafiles.lpml,v 1.177 2002/10/01 19:15:22 bowersj2 Exp $ -->
 
 <!--
 
@@ -3276,6 +3276,7 @@
 aboutlon.gif;
 accessbutton.gif;
 arrow_up.gif;
+branch.gif;
 cab.gif;
 cab_big.gif;
 capapanel.gif;
@@ -3327,6 +3328,9 @@
 mov_big.gif;
 move_up.gif;
 move_down.gif;
+navmap.correct.gif;
+navmap.open.gif;
+navmap.wrong.gif;
 page.gif;
 page_big.gif;
 pdf.gif;
Index: loncom/interface/lonnavmaps.pm
diff -u loncom/interface/lonnavmaps.pm:1.58 loncom/interface/lonnavmaps.pm:1.59
--- loncom/interface/lonnavmaps.pm:1.58	Tue Oct  1 03:20:31 2002
+++ loncom/interface/lonnavmaps.pm	Tue Oct  1 15:15:22 2002
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Navigate Maps Handler
 #
-# $Id: lonnavmaps.pm,v 1.58 2002/10/01 07:20:31 albertel Exp $
+# $Id: lonnavmaps.pm,v 1.59 2002/10/01 19:15:22 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -848,16 +848,38 @@
     # Defines a status->color mapping, null string means don't color
     my %colormap = 
     ( $res->NETWORK_FAILURE        => '',
-      $res->CORRECT                => '#BBFFBB',
+      $res->CORRECT                => '',
       $res->EXCUSED                => '#BBBBFF',
-      $res->PAST_DUE_ANSWER_LATER  => '#FFAA00',
-      $res->PAST_DUE_NO_ANSWER     => '#FFAA00',
-      $res->ANSWER_OPEN            => '#FF00AA',
+      $res->PAST_DUE_ANSWER_LATER  => '',
+      $res->PAST_DUE_NO_ANSWER     => '',
+      $res->ANSWER_OPEN            => '#CCFFCC',
       $res->OPEN_LATER             => '',
-      $res->TRIES_LEFT             => '#FFFF00',
-      $res->INCORRECT              => '#FFAA00',
-      $res->OPEN                   => '#FFFF88',
+      $res->TRIES_LEFT             => '',
+      $res->INCORRECT              => '',
+      $res->OPEN                   => '',
       $res->NOTHING_SET            => ''        );
+    # And a special case in the nav map; what to do when the assignment
+    # is not yet done and due in less then 24 hours
+    my $hurryUpColor = "#FFCCCC";
+
+    my %statusIconMap = 
+	( $res->NETWORK_FAILURE    => '',
+	  $res->NOTHING_SET        => '',
+	  $res->CORRECT            => 'navmap.correct.gif',
+	  $res->EXCUSED            => 'navmap.correct.gif',
+	  $res->PAST_DUE_NO_ANSWER => 'navmap.wrong.gif',
+	  $res->PAST_DUE_ANSWER_LATER => 'navmap.wrong.gif',
+	  $res->ANSWER_OPEN        => 'navmap.wrong.gif',
+	  $res->OPEN_LATER         => '',
+	  $res->TRIES_LEFT         => 'navmap.open.gif',
+	  $res->INCORRECT          => 'navmap.wrong.gif',
+	  $res->OPEN               => 'navmap.open.gif' );
+
+    my %condenseStatuses =
+	( $res->NETWORK_FAILURE    => 1,
+	  $res->NOTHING_SET        => 1,
+	  $res->CORRECT            => 1,
+	  $res->OPEN               => 1 );
 
     my %filterHash;
     # Figure out what we're not displaying
@@ -868,16 +890,18 @@
     }
 
     # Begin the HTML table
-    # two columns: the title/icon on the left, the info on the right
+    # four cols: resource + indent, chat+feedback, icon, text string
     $r->print('<table cellspacing="3" cellpadding="0" bgcolor="#FFFFFF">' ."\n");
 
     my $mapIterator = $navmap->getIterator(undef, undef, \%filterHash);
     my $curRes = $mapIterator->next();
     undef $res; # so we don't accidentally use it later
     my $indentLevel = -1;
-    my $indentString = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
+    my $indentString = "<img src=\"/adm/lonIcons/whitespace1.gif\" width=\"25\" height=\"1\"/>";
 
     my $isNewBranch = 0;
+    my $now = time();
+    my $in24Hours = $now + 24 * 60 * 60;
 
     while ($curRes != $mapIterator->END_NAV_MAP) {
         if ($curRes == $mapIterator->BEGIN_MAP() ||
@@ -894,17 +918,60 @@
 
         if (ref($curRes) && $curRes->src()) {
 
+	    # Step one: Decide which parts to show
             my @parts;
             if ($curRes->is_problem()) {
+		# Is it multipart?
                 @parts = @{$curRes->parts()};
-                if (scalar(@parts) > 1) { shift(@parts); }
+
+		my $multipart = scalar(@parts) > 1;
+		
+		if ($multipart) {
+		    # If it's multipart, see if part 0 is "open"
+		    # if it is, display all parts, if it isn't,
+		    # just display first
+		    if (!$curRes->opendate("0")) {
+			@parts = ("0"); # just display the zero-th part
+		    } else {
+			# Otherwise, only display part 0 if we want to 
+			# attach feedback or email information to it
+			if (!$curRes->hasDiscussion() && !$curRes->getFeedback()) {
+			    shift @parts;
+			} else {
+			    # If there's discussion or feedback, that counts
+			    # as a difference, so display the parts.
+			    
+			    # Now, we decide whether to condense the
+			    # parts due to similarity
+			    my $status = $curRes->status($parts[0]);
+			    my $allSame = 1;
+			    for (my $i = 1; $i < scalar(@parts); $i++) {
+				if ($curRes->status($parts[$i]) != $status){
+				    $allSame = 0;
+				}
+			    }
+			    
+			    # $allSame is true if all the statuses were
+			    # the same. Now, if they are all the same and
+			    # match one of the statuses to condense, then
+			    # only display part 0.
+			    if ($allSame && defined($condenseStatuses{$status})){
+				@parts = ("0");
+			    }
+			}
+		    }
+		}
+
             } else {
                 @parts[0] = "0"; # this is to get past foreach loop below
                  # you can consider a non-problem resource as a resource
                  # with only one part without loss
             }
 
+	    # Step two: Show the parts
             foreach my $part (@parts) {
+
+		my $deltalevel = 0; # for inserting the branch icon
                 
                 # For each thing we're displaying...
 
@@ -923,8 +990,9 @@
                 # If this is a new branch, label it so
                 # (temporary, this should be an icon w/ alt text)
                 if ($isNewBranch) {
-                    $newBranchText = "NB -> ";
+                    $newBranchText = "<img src=\"/adm/lonIcons/branch.gif\" border=\"0\">";
                     $isNewBranch = 0;
+		    $deltalevel = 1;
                 }
 
                 # links to open and close the folders
@@ -960,10 +1028,11 @@
                     }
                 }
 
+		# FIRST ROW: The resource indentation, branch icon, and name
                 $r->print("  <tr><td align=\"left\" valign=\"top\">\n");
 
                 # print indentation
-                for (my $i = 0; $i < $indentLevel; $i++) {
+                for (my $i = 0; $i < $indentLevel - $deltalevel; $i++) {
                     $r->print($indentString);
                 }
 
@@ -972,13 +1041,52 @@
 
                 if ($curRes->is_problem() && $part != "0") { $partLabel = " (Part $part)"; }
 
-                $r->print("  <a href=\"$link\">$title$partLabel</a></td>".
-                          "<td $colorizer align=\"right\">\n");
+                $r->print("  <a href=\"$link\">$title$partLabel</a></td>");
+
+		my $discussionHTML = ""; my $feedbackHTML = "";
+
+		# SECOND ROW: Is there text or feedback?
+		if ($curRes->hasDiscussion()) {
+		    $discussionHTML = $linkopen .
+			'<img border="0" src="/adm/lonMisc/chat.gif" />' .
+			$linkclose;
+		}
+
+		if ($curRes->getFeedback()) {
+		    my $feedback = $curRes->getFeedback();
+		    foreach (split(/\,/, $feedback)) {
+			if ($_) {
+			    $feedbackHTML .= '&nbsp;<a href="/adm/email?display='
+				. &Apache::lonnet::escape($_) . '">'
+				. '<img src="/adm/lonMisc/feedback.gif" '
+				. 'border="0" /></a>';
+			}
+		    }
+		}
+
+		$r->print("<td align=\"left\">$discussionHTML$feedbackHTML</td>");
+
+		# THIRD ROW: Problem status icon
+		if ($curRes->is_problem()) {
+		    my $icon = $statusIconMap{$curRes->status()};
+		    if ($icon) {
+			$r->print("<td width=\"50\" align=\"right\">$linkopen<img src=\"/adm/lonIcons/$icon\" border=\"0\" />$linkclose</td>\n");
+		    } else {
+			$r->print("<td></td>\n");
+		    }
+		} else { # not problem, no icon
+		    $r->print("<td></td>\n");
+		}
+
+ 		# FOURTH ROW: Text description
+		$r->print("<td $colorizer align=\"right\">\n");
                 
                 if ($curRes->kind() eq "res" and 
                     $curRes->is_problem() ) {
                     $r->print (getDescription($curRes, $part));
                 }
+
+		$r->print("</td></tr>\n");
             }
         }
         $curRes = $mapIterator->next();
@@ -986,6 +1094,8 @@
 
     $r->print("</table></body></html>");
 
+    $navmap->untieHashes();
+
     return OK;
 }
 
@@ -1054,10 +1164,14 @@
         return "Opens: " . timeToHumanString($res->opendate($part));
     }
     if ($status == $res->OPEN) {
-        return "Due: $status " . timeToHumanString($res->duedate($part));
+	if ($res->duedate()) {
+	    return "Due: $status " . timeToHumanString($res->duedate($part));
+	} else {
+	    return "Open, no due date";
+	}
     }
     if ($status == $res->PAST_DUE_ANSWER_LATER) {
-        return "Answer: " . timeToHumanString($res->answerdate($part));
+        return "Answer opens: " . timeToHumanString($res->answerdate($part));
     }
     if ($status == $res->PAST_DUE_NO_ANSWER) {
         return "Was Due: " . timeToHumanString($res->duedate($part));
@@ -1065,6 +1179,20 @@
     if ($status == $res->ANSWER_OPEN) {
         return "Answer available";
     }
+    if ($status == $res->EXCUSED) {
+	return "Excused by instructor";
+    }
+    if ($status == $res->TRIES_LEFT) {
+	my $tries = $res->tries();
+	my $maxtries = $res->maxtries();
+	my $triesString = "($tries of $maxtries tries used)";
+	if ($res->duedate()) {
+	    return "Due: $status " . timeToHumanString($res->duedate($part)) .
+		" $triesString";
+	} else {
+	    return "No due date $triesString";
+	}
+    }
 }
 
 # I want to change this into something more human-friendly. For
@@ -1288,6 +1416,29 @@
     $self->untieHashes();
 }
 
+# Private function: Does the given resource (as a symb string) have
+# current discussion? Returns 0 if chat/mail data not extracted.
+sub hasDiscussion {
+    my $self = shift;
+    my $symb = shift;
+    if (!defined($self->{DISCUSSION_TIME})) { return 0; }
+
+    return $self->{DISCUSSION_TIME}->{$symb} >
+	   $self->{LAST_CHECK};
+}
+
+# Private function: Does the given resource (as a symb string) have
+# current feedback? Returns the string in the feedback hash, which
+# will be false if it does not exist.
+sub getFeedback { 
+    my $self = shift;
+    my $symb = shift;
+
+    if (!defined($self->{FEEDBACK})) { return ""; }
+    
+    return $self->{FEEDBACK}->{$symb};
+}
+
 =pod
 
 =item * B<getById>(id): Based on the ID of the resource (1.1, 3.2, etc.), get a resource object for that resource. This method, or other methods that use it (as in the resource object) is the only proper way to obtain a resource object.
@@ -2020,6 +2171,30 @@
 
 =over 4
 
+=item * B<hasDiscussion>: Returns a false value if there has been discussion since the user last logged in, true if there has. Always returns false if the discussion data was not extracted when the nav map was constructed.
+
+=item * B<getFeedback>: Gets the feedback for the resource and returns the raw feedback string for the resource, or the null string if there is no feedback or the email data was not extracted when the nav map was constructed. Usually used like this:
+
+ for (split(/\,/, $res->getFeedback())) {
+    my $link = &Apache::lonnet::escape($_);
+    ...
+
+and use the link as appropriate.
+
+=cut
+
+sub hasDiscussion {
+    my $self = shift;
+    return $self->{NAV_MAP}->hasDiscussion($self->symb());
+}
+
+sub getFeedback {
+    my $self = shift;
+    return $self->{NAV_MAP}->getFeedback($self->symb());
+}
+
+=pod
+
 =item * B<parts>(): Returns a list reference containing sorted strings corresponding to each part of the problem. To count the number of parts, use the list in a scalar context, and subtract one if greater then two. (One part problems have a part 0. Multi-parts have a part 0, plus a part for each part. You may or may not wish to filter out part 0.)
 
 =item * B<countParts>(): Returns the number of parts of the problem a student can answer. Thus, for single part problems, returns 1. For multipart, it returns the number of parts in the problem, not including psuedo-part 0.
@@ -2087,7 +2262,7 @@
 
 =over 4
 
-=item * B<getDateStatus>($part): ($part defaults to 0). A convenience function that returns a symbolic constant telling you about the date status of the part, with the following possible results:
+=item * B<getDateStatus>($part): ($part defaults to 0). A convenience function that returns a symbolic constant telling you about the date status of the part. You should still check to see if there is a due date at all, if you care about that. The possible return values are:
 
 =back
 
@@ -2099,6 +2274,7 @@
 
 =item * B<OPEN>: Open and not yet due.
 
+
 =item * B<PAST_DUE_ANSWER_LATER>: The due date has passed, but the answer date has not yet arrived.
 
 =item * B<PAST_DUE_NO_ANSWER>: The due date has passed and there is no answer opening date set.
@@ -2146,10 +2322,10 @@
         # should this be the same as "open later"? think multipart.
         return $self->NOTHING_SET;
     }
-    if (!$open || $now < $open) {return $self->OPEN_LATER};
-    if (!$due || $now < $due) {return $self->OPEN};
-    if ($answer && $now < $answer) {return $self->PAST_DUE_ANSWER_LATER};
-    if ($answer) { return $self->ANSWER_OPEN; };
+    if (!$open || $now < $open) {return $self->OPEN_LATER}
+    if (!$due || $now < $due) {return $self->OPEN}
+    if ($answer && $now < $answer) {return $self->PAST_DUE_ANSWER_LATER}
+    if ($answer) { return $self->ANSWER_OPEN; }
     return PAST_DUE_NO_ANSWER;
 }
 
@@ -2222,7 +2398,7 @@
 
 =item * NETWORK_FAILURE: The network has failed and the information is not available.
 
-=item * NOTHING_SET: No dates have been set for this problem (part) at all. (Because only certain parts of a multi-part problem may be assigned, this can not be collapsed into "open later", as we don't know a given part will EVER be opened.)
+=item * NOTHING_SET: No dates have been set for this problem (part) at all. (Because only certain parts of a multi-part problem may be assigned, this can not be collapsed into "open later", as we don't know a given part will EVER be opened. For single part, this is the same as "OPEN_LATER".)
 
 =item * CORRECT: For any reason at all, the part is considered correct.
 
@@ -2280,7 +2456,7 @@
     # by 4 matrix (date status).
 
     if ($dateStatus == PAST_DUE_ANSWER_LATER ||
-        $dateStatus == PAST_DUE_NO_ANSWER) {
+        $dateStatus == PAST_DUE_NO_ANSWER ) {
         return $dateStatus; 
     }
 

Index: loncom/html/adm/lonIcons/navmap.icons.gimp.xcf
+++ loncom/html/adm/lonIcons/navmap.icons.gimp.xcf
gimp xcf file    d   d                B  B           \      /   gimp-comment       Created with The GIMP                           #  9  N  c  x            d   d      Open                             	          
                                                                      D          [       d   d     s         d   d    R    
    ^ !     ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 
5 	6 7  < < < < < < < < < < < < < < < < < < < < <8 7 6 ^ !     ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 
5 	6 7  < < < < < < < < < < < < < < < < < < < < <8 7 6 ^ !B  B B  B! B" B# B$ B% B& B' B( B) B* B+ B, B- B. B/ B0 B1 B2 B3 B4 
B5 	B6 B7 B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B <B8 B7 B6 B^ U ! U ! U ! U ! U ! # $ % & ' ( ) * + , - . / 0 1 
2 	3 4 5 6 7  5Uq < < < < < < < < < < < < < < < < < < < 68 7 6   ! !         	 
              
 	         ! "             	 
    ! !         	 
              
 	         ! "             	 
   B ! B! B  B B B B B B 	B 
B B B B B B B B B B B B B B B
 B	 B B B B B B  B !B "B B B B B  B B B B B B B B	 B
 B  U ! U   U  U  U  U  U  U  U  U  	U  
U  U  U  U  U  U  U  U  U  U  U  U  U 
 U 	 U  U  U  U  U  U  U  8                 	  
         5 	4 
3 2 1 0 / . - , + * ) ( ' & % $ # " !         5 	4 
3 2 1 0 / . - , + * ) ( ' & % $ # " !         5 	B4 
B3 B2 B1 B0 B/ B. B- B, B+ B* B) B( B' B& B% B$ B# B" B! B  B B  B  B 5 4 3 	2 
1 0 / . - , + * ) ( ' & % $ # "                UU             
 	         !               
 	         !   B B B B B B B B B B B B 
B 	B B B B B B B B  B! B                
  	                          2   2       b   V      Drop-Shadow#3                      	          
                                                                    \          5       b   V     M         b   V  i  	              ' '   

  ").01121/,%	  ,?NY^`aaba^XL;(  "<Ys~gJ/  #@c
tP  5X~	Խw  $@e  'Ei  	(Fj  	)Fj  	)Fj   	)Fj ! 	)Fj " 	)Fj$ 	)Fj% 	)Fj& 	)Fj & 	)Fj( 	)Fj) 	)Fj* 	)Fj+ 	)Fj + 	)Fj- 	)Fj. 	)Fj/ 	)Fk  %+Im  		&
3Pu  '!'3Gd (4<@AAB'BCEKWk 	-G]krttu(uvy~ !Bi)꭯ *S*/\,1a-2b32b32b32b32b32b32b32b32b32b32b31a.0^, ,V+ %Hr* 
5Sm~)ꋏ 2AKPQQR(RTYcs   $''((*/8Ic  	'0Km  &%@b / "<_ . !;^. !;^- !;^, !;^+ !;^ ) !;^   C         1  Q2  xR2  xR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2 
 ŸxR2 	 ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  ŸxR2  	ŸxR2  
ŸxR2  ŸxR2  ŸxR2 ŸxR2ŸxR2ŸxR2ŸxR1ŸwP/rI׸`ěkܾeɦ|Q˫[8̬^; ̬^<!̬^<!̬^<!̬^<! ̬^<!  
̬^<!  
̬^<!  	̬^<!  ̬^<!  ̬^<!  ̬^<!  ̬^<!  ̬^<!  ̬^<! 	 ̬^<! 
 ̬^<!  ̬^<!     ) !;^( !;^' !;^& !;^ $ !;^$ !;^# !;^" !;^   !;^  !;^  !;^   ;]  7Y˫  	/Pv	Ȫ   <`
˼]  #>]z
vX9  2I[hpsuuvutrk]I3  	 ,6=@AABA?:2%  		  		
	  B    ̬^<!  ̬^<!  ̬^<!  ̬^<!  ̬^<!  ̬^<!  ̬^<!  ̬^<!  ̬^<!  ̬^<!  ̬^<!  ^<!  ^<!  ^<!  ;!  !            1   +       c   d      Wrong#2                       	          
                                                                                     c   d       #       c   d       !  "       U
 5	 5	 5	 5	 5	 5	 5	 ,	  6  6  6  6  6   8 !   U !    !   U !   8            	  
 8q  q	  
   	  
 
q 	 	  
 
  8	  
   U
	  
 
  8	  
 
  	  
 8q  	   8  U    8 	    
       UU    U                8U    U    8    U    q        U8    U 	   Uq    U	   q	  	 U 	   q  q	   q  U	     8	U U  U  U  U  U  U  U  U  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU    UU  U  UU  U  UU  8  UU    UU  q  UU    UU  8  UU  U  UU   	 UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU    UU  qU  UU    UU    UU    UU    UU  	 	 	 U	   8U  	   q 	 	     8	     	   
  8	          "  	 88 #   UU %  6  6  6  6  6  6 U,U	 5	 5	 5	 5	 5	 5	 5	 5U  UU  UU    UU    UU    UU    UU   	 UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  U  U  U  U  U  U  U  U     1   2       V   V      Drop-Shadow#2                       	          
                                              
                      Y          $       V   V     $  9       V   V  $  1  6;  8G          
 4 4 4 	(.011232 &;NZ_aab3b <^|3 (O|3.Z30`21b/2b.2b-2bȯ-2bѮm\UR-R2bƛmJ4+(()(2b]5
2bὊU+
2b༉R(  	#%
  2b༉R(  	$6CD7#  2b༉R(  
)C\mjU6
    2b༉R(  	+HisJ& 
 2b༉R(  )Hm^3  
 &**' 2b༉R(  $CjǣqA  	)8EPVWPD4#2b༉R(  9aضS*  (;Pexu^D,2b༉R(  +Rƚg9	  3KfmK2b༉R(  
<jկ}L'  	$<Yxϸq2b༉R(  $K~•c7	  
)Ccֻ2b༉R(  *VӬ|L',IjҰ2b༉R(  -[–f;
-Koؼ2b༉R(  -ZհS-,Lr˳2b༉R(  )TǞoD&,Jp̻2b༉R(  #J}ڹa>.2ImϹxe2b༉R(  	<kЬaOUoĩqZG92b༉R(  -Vȧy׽|]C0"2b༉R(  AnȲֺrQ6"2b༉R(  -TػnJ.2b༉R(  ;eۿoI+  2b༉R(  'HtğtL,
  2b༉R(  	0Tʦ|R0
  2b༉R(  8^ѮY5  2b༉R(  !?fٸb;  2b༉R(  &EnǞpE%  2b༉R(  ,P|۸Z3	  2b༉R(  =iسU/	  2b༉R( 	 :fܻb<!  2b༉R(  %Gt̨Y9"	  2b༉R(  ;bť^?(  2b༉R(  5YǪhJ2 
 2b༉R(  3T}ͳvY?+
2b༉R(  2RyտkP:)2b༉R(  4Sy ̵gQ?0&2b༉R( 
"8V{Űn\M2b༉S(
+A^ýŴ2b༉S)
)9Pkγ2b༉S+&2@Pfұobk2b༉T-0EZn׷gH:AXx2b༉T. *DdܾlE*"3Np2b༉T.!-KsğtK*-Gh2b༉T-'Dmɦ|R0

'@^ͬ2b༉S+3X ˪X5!7Rqˮ2b༉S)!=c˫\9  .FcϿa2b༉S(%Chɪ];   %9Rly[=2b༉S(	'Dg\;!  ,?Ses{zq`K4 2b༉R(	'A`yX9   *7AGF?4&   

 
  
  
21.*!  b	ba`\RB- 	hG( 	ȿ^5 	Şl=	 Чr@
 ժuB
 իuB
 ֬vB
 튍֬vB
 RRSYf֬vB
 ((*0A`֬vB
 +M}֬vB
 !Ew֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  H
Bu֬vB
   
Bu֬vB
 
 
Bu֬vB
 
Bu֬vB
 -	
Bu֬vB
 J)Bu֬vB
 i@ Bu֬vB
 V/
Bu֬vB
 f:Bu֬vB
 g>Bu֬vB
 xW5Bu֬vB
 Q;%
Bu֬vB
 ,
Bu֬vB
 Bu֬vB
 
Bu֬vB
   
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  r
Bu֬vB
   
Bu֬vB
 
Bu֬vB
 Bu֬vB
 @3& Cv֬vB
 o\F/"Cv֬vB
 dB'#Dv֬vB
 tJ*#Dv֬vB
 ğqE%"Cv֬vB
 _7!Cv֬vB
 sH&Bu֬vB
 U0Bu֬vB
 _9Bu֬vB
 >"
Bu֬vB
 #
Bu֬vB
 
Bu֬vB
   
Bu֬vB
    2b༉R(#8RkiM3 
 ! 	2b༉R(,>P^ff^O=*  

2b༉R(  '0660'
    2b༉R(    2b༉T*	

	2bᾍY0

 
2bĖgA+!-2bͧ_MEB-B2bڿ}wu-u2bƹ-2b.2b/1a0/\4 *S3 !Bi3 	-H^lsuuv3v (4<@AAB3B 4 		4
 4?      
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
 Cv֬vB
 

&I{֬vB
  '8X֬vB
 BBCIXs֬vB
 uuvz֬vB
 ֬vB
 ֬vB
 իuB
 ҨsA
 
ɡn>	 	ɴc7 	tO, v	vutncO6 B	BA@>7,  	  
	
	  
    +   +       d   d      Check Mark Excused                       	          
                                                                                :       d   d     :  N       d   d  :  B  I~  L     4N
 4N
 4N
 4N
 4N
 4N
 4N
 4N
 N6 N* N 	 N* N 	 N) N
 N( N
 N' N
 N' N
 N& N
 N% N
 N% N
 N$ N
 N# N
 N" N
 N" N
 N! 	N
 N  
N
 N  
N
 N N
 N N
 N N
 N N
 N N
 N N N
 N N N
 N N	 N
 N N N
 N N N
 N N N
 N N N
 N N N N N N N N N N !N N  N N N 	N N 
N N N N N N N N N N N N N N N N	  4
 4
 4
 4
 4
 4
 4
 4
 6 *  	 *  	 ) 
 ( 
 ' 
 ' 
 & 
 % 
 % 
 $ 
 # 
 " 
 " 
 ! 	
   

   

  
  
  
  
  
   
   
  	 
   
   
   
   
           !      	  
               	  4
 4
 4
 4
 4
 4
 4
 4
 6 *  	 *  	 ) 
 ( 
 ' 
 ' 
 & 
 % 
 % 
 $ 
 # 
 " 
 " 
 ! 	
   

   

  
  
  
  
  
   
   
  	 
   
   
   
   
           !      	  
               	  4
 4
 4
 4
 4
 4
 4
 +
  6  6  6  6  6  6  6  6  6  *  	  )  	  (  	  '  	  & 
  & 
  % 
  $ 
  # U
  " U
  ! 8
     	    8 	   U  q 
   8U  q    U  U    UU 
 U    U
 	     U      8  UU          8      
  qq    
8      	  8    8
8 q    	   	 	q   	 U   
 8   
 8    8    8        U   N N N N N N N N N N N N N N	 N	 N
 N N N N N N N N N N N N N N N NN N 	N 
N 	N 
N 	N 	N 	N N 	N N 	N N 	N N 	N N 	N N 	N N 	N N	 	N N
 	N N
 	N N 	N N  	N N  	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N               	 	 
                  	 
 	 
 	 	 	  	  	  	  	  	  	  	 	 	 
 	 
 	  	   	   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	               	 	 
                  	 
 	 
 	 	 	  	  	  	  	  	  	  	 	 	 
 	 
 	  	   	   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 8 q  q  8    U  U 	 8 
 U  U  U  U  
U  UU  UU  UU  UUU  UUU  U UU  U8  UU  UU  UU  8U  UU    UU    UU    UU    UU  U  UU    UU    UU    UU   	 UU  U 
 UU    UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU   N N N N N N N N N N N N N N N NN )N (N 'N &N %N $N $N 7N 7N 7N 6N 6N	 5N	 5N	 5N
 4N
 N% N& N& N( N( N* N+ N, N. N0 Na                  ) ( ' & % $ $ 7 7 7 6 6	 5	 5	 5
 4
 % & & ( ( * + , . 0 a                  ) ( ' & % $ $ 7 7 7 6 6	 5	 5	 5
 4
 % & & ( ( * + , . 0 a 
       q        U    U        8    8    q     8 !   #  6  6  6  6 U+U
 4
 4
 4
 4
 4
 4
 4
 4U   	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N N N N N N N N N N  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	           	 	 	 	 	 	 	 	 	 	 	 	 	 	 	           UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  U  U  U  U  U  U  U  U     2   2       d   d      Check Mark Good                       	          
                                                                                OJ       d   d     Ob  cs       d   d  O~  W  ^G  ai     45
 45
 45
 45
 45
 45
 45
 45
 57 57 5+ 5 	 5+ 5 	 5* 5
 5) 5
 5( 5
 5( 5
 5' 5
 5& 5
 5& 5
 5% 5
 5$ 5
 5# 5
 5# 5
 5" 	5
 5! 
5
 5! 
5
 5  5
 5 5
 5 5
 5 5
 5	 5 5
 5 5 5
 5 
5 5
 5 5	 5
 5 5 5
 5 5 5
 5 5 5
 5 5 5
 5 5 5 5 5 5 5 5 5 5 5 55 5 5 5	 5 	5 5 
5 5 5 5 5 5 5 5 5 5 5 5 5 5	  4
 4
 4
 4
 4
 4
 4
 4
 7 7 +  	 +  	 * 
 ) 
 ( 
 ( 
 ' 
 & 
 & 
 % 
 $ 
 # 
 # 
 " 	
 ! 

 ! 

   
  
  
  
 	  
   
  
 
  	 
   
   
   
   
               	  	  
             	  4]
 4]
 4]
 4]
 4]
 4]
 4]
 4]
 ]7 ]7 ]+ ] 	 ]+ ] 	 ]* ]
 ]) ]
 ]( ]
 ]( ]
 ]' ]
 ]& ]
 ]& ]
 ]% ]
 ]$ ]
 ]# ]
 ]# ]
 ]" 	]
 ]! 
]
 ]! 
]
 ]  ]
 ] ]
 ] ]
 ] ]
 ]	 ] ]
 ] ] ]
 ] 
] ]
 ] ]	 ]
 ] ] ]
 ] ] ]
 ] ] ]
 ] ] ]
 ] ] ] ] ] ] ] ] ] ] ] ]] ] ] ]	 ] 	] ] 
] ] ] ] ] ] ] ] ] ] ] ] ] ]	  4
 4
 4
 4
 4
 4
 4
 +
  6  6  6  6  6  6  6  6  6  *  	  )  	  (  	  '  	  & 
  & 
  % 
  $ 
  # U
  " U
  ! 8
     	    8 	   U  q 
   8U  q    U  U    UU 
 U    U
 	     U      8  UU          8      
  qq    
8      	  8    8
8 q    	   	 	q   	 U   
 8   
 8    8    8        U   5 5 5 5 5 5 5 5 5 5 5 5 5 5 5	 5	 5
 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 55 5 5 
5 5 
5 5 	5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5	 5 5
 5 5
 5 5 5 5  5 5  5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5                	 	 
                   
  
  	                	  
  
                          ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]	 ]	 ]
 ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]] ] ] 
] ] 
] ] 	] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]	 ] ]
 ] ]
 ] ] ] ]  ] ]  ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] 8 q  q  8    U  U 	 8 
 U  U  U  U  
U  UU  UU  UU  UUU  UUU  U UU  U8  UU  UU  UU  8U  UU    UU    UU    UU    UU  U  UU    UU    UU    UU   	 UU  U 
 UU    UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU   5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 55 )5 (5 '5 &5 %5 $5 85 75 75 75 65 65	 55	 55	 55
 5$ 5% 5& 5& 5( 5( 5* 5+ 5, 5. 50 5!                    ) ( ' & % $ 8 7 7 7 6 6	 5	 5	 5
 $ % & & ( ( * + , . 0 !  ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]] )] (] '] &] %] $] 8] 7] 7] 7] 6] 6]	 5]	 5]	 5]
 ]$ ]% ]& ]& ]( ]( ]* ]+ ], ]. ]0 ]! 
       q        U    U        8    8    q     8 !   #  6  6  6  6 U+U
 4
 4
 4
 4
 4
 4
 4
 4U   5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5                           ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  UU  U  U  U  U  U  U  U  U     2   2       Z   Z      Drop-Shadow                       	          
                                              
                      X          d'       Z   Z     d?  x       Z   Z  d[  n  ss  v'           4 4 4 	(.011232 &;NZ_aab3b <^|3 (O|3.Z30`21b/2b-2b+2bȯ*늍2bѮm\UR)RTW_m2bƛmJ4+((()-4BY2b]5'*Aa2bὊU+&	6V|2b༉R( % 2Rx2b༉R( $ 1Qx2b༉R( # 
/Pw2b༉R( " 	-Mu2b༉R( ! 	*Jq2b༉R(   	)Gm2b༉R(   (Fk2b༉R(  'Ej׹2b༉R(  %Ch2b༉R(  #?eǡv2b༉R(   <`ͪU2b༉R(  8\Ӳ]82b༉R(  4Wٺf?!2b༉R(  
0R{›oF&2b༉R(   	,Mv˦zO,2b༉R(  	  (HpӱY3
2b༉R(
  $Bjۻe<2b༉S()3;>:0"
  <bŞqF% 2b༉S(	-?QaloiYB+  5ZΪ~Q-  2b༉S)&<TmlL.
  	/R}׵]7  2b༉T,,FdȵrL,  (Isj@!  2b༉U0#.IlֽnF%  "Ai˥xL)  2b༊W5/Bfعc:8_ֳY3
  2b༊X96NvҮS-	0Uh>  2b༊X85LsǞnA (Ju̦xK(  2b༊W5-=^ٷX0!@iصZ3	  2b༉U/!)@ḅrD$6\Úk@   2b༉T+%>aܹ\8)2Q{Ъ|O*  2b༉S)#>bͤvQBNpۺ_6
  2b༉S($BiܼpcpȠqD#  2b༉R((JtаֱU.  2b༉R(	0U˷—g<  2b༉R(;eѫ{M) 	 2b༉R( &Jx޽`6
 
 2b༉R(  	4]ͥuG$ 
 2b༉R(  "Es۸Z2  2b༉R(  1ZʠoB!  2b༉R(  !DsشU.  2b༉R(  1\ǜk>  2b༉R(  #GwײS,  2b༉R(  5aŚi=  2b༉R(  &M~Ь~P*  2b༉R(  	;iҴa8     +    	  
#,/( 	#4FRTG1	#2F]q}xcC%2235<H[rpJ(bbcfmzgA"rO/	 	˷uQ2 Ȧ|T3  ޾b9  ڴP)  دzG!  ׭wC  ꢴ֬vB
  ֬vB
  y֬vB
  ꆭ֬vB
  ֬vB
  ֬vB
  ׾֬vB
  |hm֬vB
  ĠyYKY֬vB
  Ȧ}V<7Mz֬vB
  ͬY8&*Gw֬vB
  겉_:!#Dv֬vB
  f?" Cv֬vB
  mE&
Bu֬vB
  L+	Bu֬vB
  1

Bu֬vB
  
Bu֬vB
   
Bu֬vB
    
Bu֬vB
    
Bu֬vB
    
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
     2b༉R(  ,VγiC$  2b༉R(   DuǫfE(  2b༉R(  4aԽ^@'	  2b༉R(  (OɲsS7"	  2b༉R(  
>jgH/  2b༉R(  .QuvZ>'  2b༉R(  8Q^[J4 	  2b༉R(  !083'  2b༉T*2bᾍY0
	


2bĖgA+!
 2bͧ_MEBBCBB2bڿ}wu-u2bƹ-2b.2b/1a0/\4 *S3 !Bi3 	-H^lsuuv3v (4<@AAB3B 4 		4
 4?     
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  
Bu֬vB
  Cv֬vB
  
&I{֬vB
   '8X֬vB
  BCIXs֬vB
  uvz֬vB
  ﯵ֬vB
  ֬vB
  իuB
  ҨsA
  ɡn>	  
ɴc7  
tO,  
vutncO6  
BA@>7,  
  

	  
#    -   -       d   d       Background                      	          
                                                                                x       d   d     x  y+       d   d  x  y  y  y       	 	 	 	 	 	    2   2    
--bowersj21033499722--