Keith Vetter 2005-01-11 : Here's an implementation of the card game
Crazy Eights that lets you play against three computer opponents. It can play several different variants of the basic game.
I initially added a very basic algorithm for determining the computer move, only to discover that I'm constantly losing to it. (Actually, I think it means that the game is pretty much random, and losing 3 times out of 4 seems overwhelming.)
I welcome people trying to develop better heuristics--check out the routine
GetBestMove at the end of the program. I can set it up a little competition with different computer players playing different algorithms.
##+##########################################################################
#
# Crazy Eights
# by Keith Vetter, January 2007
#
package require Tk
package require tile
namespace import -force ::ttk::button
# IDEAS
# better computer AI
# change rules dialog instead of menu
# resizeable
# hint
# game score tally
# saving state--rules and game tally
array set RULES {
win 500
StartingHandSize 5
2Draw2 1
JSkip 1
KReverse 1
Draw1 0
}
array set S {title "Crazy Eights" w 700 h 550 margin 10 cs 2 cheat 0
anim,step 1 anim,delay 1 pause 200 animate 0 tableau {-100 -75 100 105}}
array set CLRS {table \#045a5c tableau \#c4c2c4 cantmove \#c4c2c4}
array set GAME {next,c,w n next,c,n e next,c,e s next,c,s w
next,cc,w s next,cc,n w next,cc,e n next,cc,s e
s Spades h Hearts d Diamonds c Clubs
a Ace t 10 j Jack q Queen k King ? ""
}
proc DoDisplay {} {
global S CLRS
wm title . $S(title)
wm resizable . 0 0
DoMenus
pack [frame .screen -bd 2 -relief raised] -side top -fill both -expand 1
set h2 [expr {$S(h)/2}]; set w2 [expr {$S(w)/2}]
canvas .c -bd 0 -height $S(h) -width $S(w) -highlightthickness 0 \
-scrollregion [list -$w2 -$h2 $w2 $h2] -bg $CLRS(table)
label .msg -textvariable S(msg) -bd 2 -bg white -relief ridge
pack .msg -in .screen -side bottom -fill both
pack .c -in .screen -side top -fill both -expand 1
bind all <Key-F1> Help
bind all <Key-F3> {console show}
update
PickNames
PositionCards
}
##+##########################################################################
#
# DoMenus -- sets up our menus
#
proc DoMenus {} {
. configure -menu [menu .m -tearoff 0]
.m add cascade -menu [menu .m.game -tearoff 0] -label "Game" -underline 0
.m add cascade -menu [menu .m.rules -tearoff 0] -label "Rules" -underline 0
.m add cascade -menu [menu .m.help -tearoff 0] -label "Help" -underline 0
.m.game add command -label "New Game" -under 0 -command NewGameCmd
.m.game add command -label "History" -under 0 -command ShowHistory
.m.game add separator
.m.game add checkbutton -label "Cheat" -under 0 \
-variable ::S(cheat) -command Cheat
.m.game add separator
.m.game add command -label "Exit" -under 1 -command exit
.m.rules add checkbutton -label "Jack => Skip" \
-variable ::RULES(JSkip)
.m.rules add checkbutton -label "King => Reverse" \
-variable ::RULES(KReverse)
.m.rules add checkbutton -label "2 => Draw Two" \
-variable ::RULES(2Draw2)
.m.rules add checkbutton -label "One Draw Limit" \
-variable ::RULES(Draw1)
.m.help add command -label Help -under 0 -command Help \
-accelerator "F1"
.m.help add command -label About -under 0 -command About
}
proc PickNames {} {
global GAME tcl_platform
set names [Shuffle {Abigail Andrew Anthony Ashley Ava Barbara Brenda Brian
Charles Christopher Cynthia Daniel David Deborah Debra Donna Elizabeth
Emily Emma Erin Ethan Hannah Isabella Jacob James Jeffrey John Joseph
Joshua Karen Keith Kenneth Kevin Kimberly Kristina Linda Lisa Lori
Madison Marissa Mark Mary Matthew Michael Nancy Olivia Pamela Patricia
Paul Richard Robert Samantha Sandra Scott Sharon Steven Susan Tessa
Thomas Timothy Valerie William}]
if {[info exists tcl_platform(user)]} {
set n [lsearch $names $tcl_platform(user)]
set names [concat $tcl_platform(user) [lreplace $names $n $n]]
}
foreach {GAME(name,s) GAME(name,w) GAME(name,n) GAME(name,e)} $names break
}
proc PositionCards {} {
global S GAME CLRS
set S(cards) [list 8s 8d 8c 8h]
foreach suit {s h c d} {
foreach v {k q j t 9 7 6 5 4 3 2 a} {
lappend S(cards) "$v$suit"
}
}
set img [Card2Image b 0]
set S(cw) [image width $img]
set S(ch) [image height $img]
.c delete all
set n [.c create rect $S(tableau) -fill $CLRS(tableau) -fill black -width 0]
.c move $n 10 10
.c create rect $S(tableau) -fill $CLRS(tableau) -outline black -width 0
set y [expr {($S(ch)/2 + [lindex $S(tableau) end]) / 2}]
.c create image 0 $y -image ::img::h -anchor c -tag suit
# Player names
set x [expr {$S(w) / 4}]
set y [expr {$S(h) / 4}]
.c create text 0 $y -text "$GAME(name,s) - 0" -fill white \
-font {Times 12 bold} -tag txt,s
.c create text 0 -$y -text "$GAME(name,n) - 0" -fill white \
-font {Times 12 bold} -tag txt,n
.c create text -$x 0 -text "$GAME(name,w)\n0" -fill white \
-font {Times 12 bold} -tag txt,w -justify c
.c create text $x 0 -text "$GAME(name,e)\n0" -fill white \
-font {Times 12 bold} -tag txt,e -justify c
# Position discard and stock
set x [expr {($S(cw) + $S(cs)) / -2.0}]
.c create image $x 0 -anchor c -tag discard
set x [expr {round($x + $S(cw) + $S(cs))}]
foreach i {3 2 1} {
set xx [expr {$x + $i * 2}]
.c create image $xx 0 -anchor c -tag stock$i
}
.c create image $x 0 -anchor c -tag [list stock stock0]
.c bind stock <Button-1> [list UserMove stock]
.c bind stock <Button-3> [list UserMove xstock]
}
##+##########################################################################
#
# Card2Image -- returns the image name for a card--the back of the card
# if the card should not be revealed.
#
proc Card2Image {card reveal} {
if {$card == ""} {return {}} ;# No card -- show nothing
if {! $reveal} { set card "back" } ;# Hidden card -- show back
set iname "::img::$card"
return $iname
}
proc Card2Name {card} {
if {$card eq "cant"} { return "-"}
foreach {value suit} [split $card ""] break
if {[info exists ::GAME($value)]} {set value $::GAME($value)}
return "$value of $::GAME($suit)"
}
proc NewGame {} {
global ROUND GAME S
destroy .top
array set GAME {
total,s 0 total,w 0 total,n 0 total,e 0
score,s 0 score,w 0 score,n 0 score,e 0
held,s 0 held,w 0 held,n 0 held,e 0
leader s
}
.c itemconfig txt,s -text "$GAME(name,s) - $GAME(total,s)"
.c itemconfig txt,n -text "$GAME(name,n) - $GAME(total,n)"
.c itemconfig txt,e -text "$GAME(name,e)\n$GAME(total,e)"
.c itemconfig txt,w -text "$GAME(name,w)\n$GAME(total,w)"
ClearMessage n e w s
StartRound s
MoveNext
return 1
}
proc NewGameCmd {} {
# We have an "update is evil" problem. To avoid it, we only allow
# new game to be done during the user's turn.
if {$::ROUND(turn) eq "over"} {
NewGame
return
}
if {$::ROUND(turn) ne "s"} return
#set n [tk_messageBox -message "Start new game?" -type yesno -icon question]
set n [YesNo "Start new game?"]
if {$n eq "no"} { ;# Continue existing game
if {$::ROUND(turn) ne "s"} MoveNext
return
}
NewGame
}
proc MenuUpdate {} {
set state [expr {$::ROUND(turn) eq "s" ? "normal" : "disabled"}]
if {$::ROUND(turn) eq "over"} { set state normal }
.m.game entryconfig 0 -state $state
.m.rules entryconfig 0 -state $state
.m.rules entryconfig 1 -state $state
.m.rules entryconfig 2 -state $state
.m.rules entryconfig 3 -state $state
}
proc StartRound {lastDealer} {
global ROUND CARDS S
unset -nocomplain ROUND
set ROUND(turn) $lastDealer
set ROUND(dir) c
set ROUND(dealer) $lastDealer
ClearHistory
Deal
ShowCards
MenuUpdate
foreach {ROUND(value) ROUND(suit)} [split $CARDS(discard) ""] break
.c itemconfig suit -image ::img::$ROUND(suit)
}
proc Shuffle {what} {
global S CARDS
set len [llength $what]
set len2 $len
for {set i 0} {$i < $len-1} {incr i} {
set n [expr {int($i + $len2 * rand())}]
incr len2 -1
# Swap elements at i & n
set temp [lindex $what $i]
lset what $i [lindex $what $n]
lset what $n $temp
}
return $what
}
##+##########################################################################
#
# DealACard -- pops the next card off the deck
#
proc DealACard {} {
global CARDS
set card [lindex $CARDS(deck) 0]
set CARDS(deck) [lrange $CARDS(deck) 1 end]
return $card
}
proc Deal {} {
global CARDS RULES
unset -nocomplain CARDS
set CARDS(deck) [Shuffle $::S(cards)]
for {set i 0} {$i < $RULES(StartingHandSize)} {incr i} {
foreach who {n e s w} {
lappend CARDS($who) [DealACard]
}
}
foreach who {w n e s} {
SortHand $who
}
set CARDS(discard) [DealACard]
}
proc SortHand {who} {
set ::CARDS($who) [lsort -command SortHandCmd $::CARDS($who)]
}
proc SortHandCmd {c1 c2} {
set p1 [lsearch $::S(cards) $c1]
set p2 [lsearch $::S(cards) $c2]
return [expr {$p1 - $p2}]
}
proc ShowCards {{reveal 0}} {
ShowOneHand s 1 ;# Always reveal south's hand
ShowOneHand n $reveal
ShowOneHand w $reveal
ShowOneHand e $reveal
ShowStock
if {$reveal > 1} { ;# Cheat
.c itemconfig stock -image [Card2Image [lindex $::CARDS(deck) 0] 1]
}
}
proc Cheat {} {
ShowCards
set ::S(msg) $::CARDS(deck)
if {$::ROUND(turn) eq "s"} {
ShowLegalMoves s
}
}
proc ShowOneHand {who reveal} {
if {$::S(cheat)} { set reveal 1 }
if {$who eq "s" || $who eq "n"} {
ShowHandHorizontal $who $reveal
} else {
ShowHandVertical $who $reveal
}
}
proc ShowHandHorizontal {who reveal} {
global S CARDS
.c delete hand,$who
set w2 [expr {[winfo width .c] / 2}]
set left [expr {-$w2 + 2*$S(margin) + $S(cw) + $S(cw)/2}]
set right [expr {-$left}]
set y [expr {([winfo height .c]/2 - $S(margin) - $S(ch)/2) * ($who eq "s" ? 1 : -1)}]
set maxDelta [expr {$S(cw) + $S(cs)}]
set num1 [expr {[llength $CARDS($who)]-1}]
set total [expr {$right - $left}]
set need [expr {$S(cw) + $num1 * $maxDelta}]
set excess [expr {$need - $total}]
set delta $maxDelta
if {$excess > 0} { ;# Need to overlap
set delta [expr {($total - $S(cw)) / double($num1)}]
}
set left [expr {$left + $S(cw)/2}] ;# For center anchor
foreach card $CARDS($who) {
set img [Card2Image $card $reveal]
.c create image $left $y -anchor c -image $img \
-tag [list hand,$who hand,$card]
if {$who eq "s"} {
.c bind hand,$card <Button-1> [list UserMove $card]
}
set left [expr {$left + $delta}]
}
}
proc ShowHandVertical {who reveal} {
global S CARDS
.c delete hand,$who
set h2 [expr {[winfo height .c] / 2}]
set top [expr {-$h2 + $S(margin)}]
set bottom [expr {$h2 - 2*$S(margin) - $S(ch) + $S(ch)/2}]
set x [expr {([winfo width .c]/2 - $S(margin) - $S(cw)/2) * ($who eq "e" ? 1 : -1)}]
set maxDelta [expr {$S(ch) + $S(cs)}]
set num1 [expr {[llength $CARDS($who)]-1}]
set total [expr {$bottom - $top}]
set need [expr {$S(ch) + $num1 * $maxDelta}]
set excess [expr {$need - $total}]
set delta $maxDelta
if {$excess > 0} { ;# Need to overlap
set delta [expr {($total - $S(ch)) / double($num1)}]
}
set top [expr {$top + $S(ch)/2}] ;# For center anchor
foreach card $CARDS($who) {
set img [Card2Image $card $reveal]
.c create image $x $top -anchor c -image $img \
-tag [list hand,$who hand,$card]
set top [expr {$top + $delta}]
}
}
proc ShowStock {} {
array set TAGS {0 stock 1 stock1 2 stock2 3 stock3}
.c itemconfig discard -image [Card2Image [lindex $::CARDS(discard) end] 1]
set img [Card2Image back 0]
set len [llength $::CARDS(deck)]
foreach i {0 1 2 3} {
set img [expr {$len > $i ? $img : ""}]
.c itemconfig $TAGS($i) -image $img
}
}
proc Draw {who} {
set newCard [DealACard]
if {$newCard eq {}} {return $newCard}
foreach card $::CARDS($who) { ;# Find card position
if {[SortHandCmd $newCard $card] <= 0} break
}
AnimateCard stock hand,$card back
lappend ::CARDS($who) $newCard
SortHand $who
ShowOneHand $who [expr {$who eq "s"}]
if {$who eq "s"} {
ShowLegalMoves s
}
return $newCard
}
proc Discard {who card {newSuit "?"}} {
global CARDS ROUND
lappend CARDS(discard) $card
foreach {ROUND(value) ROUND(suit)} [split $card ""] break
if {$newSuit ne "?"} {set ROUND(suit) $newSuit}
.c itemconfig suit -image ::img::$ROUND(suit)
set which [lsearch $CARDS($who) $card]
set CARDS($who) [lreplace $CARDS($who) $which $which]
ShowOneHand $who [string match s $who]
ShowStock
}
proc ShowLegalMoves {who} {
array set dxy {s {0 -10} n {0 10} w {10 0} e {-10 0}}
foreach {all suits values eights} [GetLegalMoves $who] break
foreach {dx dy} $dxy($who) break
foreach card $all {
.c move hand,$card $dx $dy
}
return [llength $all]
}
proc IsEndRound {} {
global CARDS ROUND
if {$CARDS($ROUND(turn)) eq {}} { return 1 }
if {$CARDS(deck) ne {}} { return 0}
foreach i {0 1 2 3} {
if {[lindex $ROUND(moves) end-$i 1] ne "cant"} { return 0 }
}
return 1
}
proc MoveNext {} {
global ROUND CARDS GAME S RULES
set value [string index [lindex $ROUND(moves) end 1] 0] ;# Last card played
if {$RULES(2Draw2) && $value eq "2"} { ;# 2 => draw 2
set next $GAME(next,$ROUND(dir),$ROUND(turn))
PlayerMessage $next draw2
Draw $next
Draw $next
}
if {[IsEndRound]} {
set winner [ScoreHands]
set S(msg) "$GAME(name,$winner) won this round"
set ROUND(turn) over
ClearMessage n e w s
ShowCards 1
ShowScore
# Check for victory
if {$GAME(total,$GAME(leader)) >= $RULES(win)} {
Winner $GAME(leader)
set n [YesNo "Play again?"]
if {$n eq "yes"} {
NewGame
} else {
MenuUpdate
}
return
}
StartRound $GAME(next,$ROUND(dir),$ROUND(dealer))
}
# Special card check
if {$RULES(KReverse) && $value eq "k"} { ;# K => reverse
PlayerMessage $ROUND(turn) reverse
set ROUND(dir) [expr {$ROUND(dir) eq "c" ? "cc" : "c"}]
}
set ROUND(turn) $GAME(next,$ROUND(dir),$ROUND(turn))
if {$RULES(JSkip) && $value eq "j"} { ;# J => skip
PlayerMessage $ROUND(turn) skip
set ROUND(turn) $GAME(next,$ROUND(dir),$ROUND(turn))
}
MenuUpdate
set S(msg) "$GAME(name,$ROUND(turn))'s turn"
if {$ROUND(turn) ne "s"} {
after $S(pause) ComputerMove
} else {
set ROUND(drawn) 0
ClearMessage $ROUND(turn)
# See if the user can move or draw
if {[ShowLegalMoves $ROUND(turn)]} return
if {$CARDS(deck) ne ""} return
AddHistory s cant 0 ?
MustPass
MoveNext
}
}
##+##########################################################################
#
# UserMove -- handles the user's turn
#
proc UserMove {which} {
global ROUND S CARDS RULES
if {$ROUND(turn) != "s"} return ;# Not our turn
if {$S(animate)} return ;# In the middle of animation
if {$which eq "xstock"} { ;# Draw only if user has no move
foreach {all . . . .} [GetLegalMoves s] break
if {$all ne {}} return
set which "stock"
}
if {$which eq "stock"} {
if {$RULES(Draw1) && $ROUND(drawn) > 0} return
set newCard [Draw s]
if {$newCard eq {}} return ;# Empty deck -- can't happen
incr ROUND(drawn)
foreach {all suits values eights} [GetLegalMoves s] break
if {$all ne {}} return ;# Has a legal move
if {$RULES(Draw1) || [llength $CARDS(deck)] == 0} {
PlayerMessage s cantmove
AddHistory s cant $ROUND(drawn) ?
MoveNext
}
return
}
foreach {all suits values eights} [GetLegalMoves s] break
if {[lsearch $all $which] == -1} return ;# Not legal move
set newSuit "?"
if {[string match 8* $which] && [llength $CARDS(s)] > 1} { ;# 8 needs suit
set newSuit [PickSuit]
if {$newSuit eq "x"} return
}
AddHistory s $which $ROUND(drawn) $newSuit
AnimateCard hand,$which discard $which
Discard $ROUND(turn) $which $newSuit
MoveNext
}
proc ComputerMove {} {
global ROUND
if {$ROUND(turn) eq "s"} {
puts "BAD TURN"
StackTrace
return
}
ClearMessage $ROUND(turn)
foreach {move draws newSuit} [GetBestMove $ROUND(turn)] break
AddHistory $ROUND(turn) $move $draws $newSuit
if {$move ne "cant"} { ;# Did a move
AnimateCard hand,$move discard $move
Discard $ROUND(turn) $move $newSuit
} else {
PlayerMessage $ROUND(turn) cantmove
}
MoveNext
}
proc AnimateCard {from to card} {
global S CARDS
set S(animate) 1 ;# We're animating
foreach {x0 y0} [.c coords $from] break
foreach {x1 y1} [.c coords $to] break
set dx [expr {$x1 - $x0}]
set dy [expr {$y1 - $y0}]
set dist [expr {hypot($dx,$dy)}]
set dx [expr {$S(anim,step) * $dx / $dist}]
set dy [expr {$S(anim,step) * $dy / $dist}]
.c create image $x0 $y0 -tag animate -image [Card2Image $card 1]
if {$from ne "stock"} { .c delete $from }
if {$from eq "stock"} { .c itemconfig stock[llength $CARDS(deck)] -image {}}
set steps [expr {int($dist / $S(anim,step))}]
_AnimateCard $dx $dy $steps
tkwait variable S(animate)
return
}
proc _AnimateCard {dx dy steps} {
if {$steps == 0 || ! $::S(animate)} {
.c delete animate
set ::S(animate) 0
return
}
.c move animate $dx $dy
after $::S(anim,delay) _AnimateCard $dx $dy [incr steps -1]
}
proc GetLegalMoves {who} {
global ROUND CARDS
set suits {}
set values {}
set eights {}
foreach card $CARDS($who) {
foreach {value suit} [split $card ""] break
if {$value == 8} { lappend eights $card; continue }
if {$value == $ROUND(value)} { lappend values $card }
if {$suit eq $ROUND(suit)} { lappend suits $card }
}
set all [concat $suits $values $eights]
return [list $all $suits $values $eights]
}
##+##########################################################################
#
# SuitTally - return sorted list of the points for each suit (sans 8)
#
proc SuitTally {who} {
global CARDS
foreach suit {s h d c} {
set which($suit) {}
}
foreach card $CARDS($who) {
foreach {value suit} [split $card ""] break
if {$value == 8} continue
lappend which($suit) $card
}
set all {}
foreach suit {s h d c} {
set len [format %02d [llength $which($suit)]] ;# To break ties
lappend all [list $suit "[ScoreOneHand $which($suit)].$len"]
}
set all [lsort -decreasing -index 1 -real $all]
return $all
}
##+##########################################################################
#
# SortHandByScore -- returns hand sorted with highest scoring cards first
#
proc SortHandByScore {hand} {
set l {}
set l2 {}
foreach card $hand {
lappend l [list $card [ScoreOneHand $card]]
}
set l [lsort -decreasing -index 1 -integer $l]
foreach a $l {
lappend l2 [lindex $a 0]
}
return $l2
}
proc PlayerMessage {who type {debug 0}} {
array set dxy {n {0 35} s {0 0} e {15 65} w {-10 65}}
array set msgs {cantmove "%w\ncan't move" skip "Skipping\n%w"
reverse "%w\nreverses" draw2 "%w\ndraws 2"}
regsub -all {%w} $msgs($type) $::GAME(name,$who) txt
if {$who eq "s" || $who eq "n"} {set txt [string map {\n " "} $txt]}
ClearMessage $who
foreach {x y} [.c coords txt,$who] break
foreach {dx dy} $dxy($who) break
set x [expr {$x + $dx}]
set y [expr {$y + $dy}]
label .c.$who -text $txt -font {Times 18 bold} -bd 2 -relief raised -padx 5
.c create window $x $y -window .c.$who -tag .c.$who
if {! $debug} {
after 3000 ClearMessage $who
}
}
proc ClearMessage {args} {
foreach who $args { destroy .c.$who ; .c delete .c.$who }
}
proc ShowScore {} {
.c itemconfig txt,s -text "$::GAME(name,s) - $::GAME(total,s)"
.c itemconfig txt,n -text "$::GAME(name,n) - $::GAME(total,n)"
.c itemconfig txt,e -text "$::GAME(name,e)\n$::GAME(total,e)"
.c itemconfig txt,w -text "$::GAME(name,w)\n$::GAME(total,w)"
set W .top
destroy $W
set font {Times 12 bold}
set leaders [FindLeader]
toplevel $W -padx 15
wm withdraw $W
wm title $W "$::S(title) Score"
wm attributes $W -toolwindow 1
wm transient $W .
wm resizable $W 0 0
label $W.title -text "$::S(title) Score" -font {Times 24 bold} -fg red ;#-bg $bg
label $W.c1 -text "Held in hand" -font $font
label $W.c2 -text "Score" -font $font
label $W.c3 -text "Total" -font $font
grid $W.title - - - -pady 5 -padx 15
catch {grid [::ttk::separator $W.sep] - - - -pady 5 -sticky ew}
grid x $W.c1 $W.c2 $W.c3
foreach who {s w n e} {
set fg [expr {$::GAME(score,$who) > 0 ? "blue" : "black"}]
if {[lsearch $leaders $who] > -1} {set fg "red"}
set winner [expr {$::GAME(total,$who) > $::RULES(win)}]
foreach what {name held score total} {
set txt $::GAME($what,$who)
if {$what ne "total" && $txt == 0} { set txt "" }
label $W.$what,$who -text $txt -font $font -fg $fg -bd 0
if {$winner} {
$W.$what,$who config -fg blue -bg magenta
}
}
$W.name,$who config -anchor w
grid $W.name,$who $W.held,$who $W.score,$who $W.total,$who -sticky ew
}
button $W.ok -text OK -command [list destroy $W]
bind $W <space> [list $W.ok invoke]
grid $W.ok - - - -pady 15
CenterWindow $W
wm deiconify $W
grab $W
tkwait window $W
}
proc FindLeader {} {
global GAME
set leader {}
set best 0
foreach who {n e w s} {
if {$GAME(total,$who) < $best} continue
if {$GAME(total,$who) > $best} { set leader {} }
lappend leader $who
set best $GAME(total,$who)
}
return $leader
}
proc PickSuit {} {
set W .top
destroy $W
#set bg $::CLRS(tableau)
set ::ROUND(newSuit) "x"
toplevel $W -padx 15 ;#-bg $bg
wm withdraw $W
wm title $W "Choose Suit"
wm attributes $W -toolwindow 1
wm transient $W .
wm resizable $W 0 0
label $W.title -text "Choose Suit" -font {Times 24 bold} -fg red ;#-bg $bg
foreach suit {h d c s} {
label $W.a$suit -image ::img::a$suit ;#-bg $bg
bind $W.a$suit <1> "set ::ROUND(newSuit) $suit ; destroy $W"
}
grid $W.title - -pady 5 -padx 15
catch {grid [::ttk::separator $W.sep] - -pady 5 -sticky ew}
grid $W.ah $W.ad -padx 5 -pady 10
grid $W.ac $W.as -padx 5 -pady 10
button $W.cancel -text Cancel -command [list destroy $W]
bind $W <space> [list $W.cancel invoke]
bind $W <Escape> [list $W.cancel invoke]
grid $W.cancel - -pady 15
CenterWindow $W
wm deiconify $W
grab $W
tkwait window $W
return $::ROUND(newSuit)
}
proc Winner {who} {
set W .top
destroy $W
set ::ROUND(newSuit) "x"
toplevel $W
wm withdraw $W
wm title $W "Winner"
wm transient $W .
wm resizable $W 0 0
set txt "$::GAME(name,$who) Wins!"
label $W.title -text $txt -font {Times 24 bold} -fg red
button $W.ok -text "OK" -command [list destroy $W]
bind $W <space> [list $W.ok invoke]
grid $W.title -pady 15 -padx 15
grid $W.ok -pady {0 15}
CenterWindow $W
wm deiconify $W
#grab $W
tkwait window $W
return
}
proc MustPass {} {
set W .top
destroy $W
#set bg $::CLRS(tableau)
toplevel $W ;#-bg $bg
wm withdraw $W
wm title $W "Pass"
wm attributes $W -toolwindow 1
wm transient $W .
wm resizable $W 0 0
set txt "You must pass"
label $W.title -text $txt -font {Times 24 bold} -fg red ;#-bg $bg
button $W.ok -text "OK" -command [list destroy $W]
bind $W <space> [list $W.ok invoke]
grid $W.title -pady 10 -padx 15
grid $W.ok -pady {0 15}
CenterWindow $W
wm deiconify $W
grab $W
tkwait window $W
return
}
proc YesNo {msg} {
set W .top
destroy $W
#set bg $::CLRS(tableau)
set ::S(yesno) yes
toplevel $W ;#-bg $bg
wm withdraw $W
wm title $W " "
#wm attributes $W -toolwindow 1
wm transient $W .
wm resizable $W 0 0
label $W.icon -image ::img::quest ;#-bg $bg
label $W.title -text $msg -font {Helvetica 12} ;#-bg $bg
frame $W.buttons ;#-bg $bg
button $W.yes -text "Yes" -command "set ::S(yesno) yes; destroy $W"
button $W.no -text "No" -command "set ::S(yesno) no; destroy $W"
bind $W <space> [list $W.yes invoke]
bind $W <y> [list $W.yes invoke]
bind $W <n> [list $W.no invoke]
bind $W <Escape> [list $W.no invoke]
grid $W.icon $W.title -pady 10 -padx 5 -sticky w
grid $W.buttons -
grid $W.yes $W.no -pady {10 15} -padx 5 -in $W.buttons
grid columnconfigure $W 1 -weight 1
CenterWindow $W
wm deiconify $W
grab $W
tkwait window $W
return $::S(yesno)
}
proc CenterWindow {w {W .}} {
update idletasks ;# Need to get geometry correct
set wh [winfo reqheight $w] ; set ww [winfo reqwidth $w]
set sw [winfo width $W] ; set sh [winfo height $W]
set sy [winfo y $W] ; set sx [winfo x $W]
set x [expr {$sx + ($sw - $ww)/2}] ; set y [expr {$sy + ($sh - $wh)/2}]
incr y -130
if {$x < 0} { set x 0 } ; if {$y < 0} {set y 0}
wm geometry $w +$x+$y
}
proc ScoreHands {} {
global CARDS GAME
set winner {}
set best 99999
set sum 0
foreach who {s w n e} {
set GAME(score,$who) 0
set GAME(held,$who) [ScoreOneHand $CARDS($who)]
incr sum $GAME(held,$who)
if {$GAME(held,$who) < $best} {
set winner $who
set best $GAME(held,$who)
}
}
incr sum -$GAME(held,$winner) ;# Possibly non-zero
set GAME(score,$winner) $sum
incr GAME(total,$winner) $sum
if {$GAME(total,$winner) > $GAME(total,$GAME(leader))} {
set GAME(leader) $winner
}
return $winner
}
proc ScoreOneHand {cards} {
global RULES
set total 0
foreach card $cards {
foreach {value suit} [split $card ""] break
switch -- $value {
a { incr total 1 }
2 { incr total [expr {$RULES(2Draw2) ? 25 : 2}] }
8 { incr total 50 }
t { incr total 10 }
j { incr total [expr {$RULES(JSkip) ? 25 : 10}] }
q { incr total 10 }
k { incr total [expr {$RULES(KReverse) ? 25 : 10}] }
default { incr total $value }
}
}
return $total
}
##+##########################################################################
#
# Help -- a simple help screen
#
proc Help {} {
catch {destroy .help}
toplevel .help
wm title .help "$::S(title) Help"
wm transient .help .
set t .help.t
text $t -relief raised -wrap word -width 70 -height 29 \
-padx 10 -pady 10 -cursor {} -yscrollcommand {.help.sb set}
scrollbar .help.sb -orient vertical -command [list $t yview]
button .help.dismiss -text Dismiss -command {destroy .help}
pack .help.dismiss -side bottom -pady 10
pack .help.sb -side right -fill y
pack $t -side top -expand 1 -fill both
set bold "[font actual [$t cget -font]] -weight bold"
set italic "[font actual [$t cget -font]] -slant italic"
$t tag config title -justify center -foregr red -font "Times 20 bold"
$t tag configure title2 -justify center -font "Times 12 bold"
$t tag configure header -font $bold -spacing3 5
$t tag configure bold -font $bold
$t tag configure italic -font $italic
$t tag configure n -lmargin1 10 -lmargin2 10
$t tag configure bullet -lmargin1 20 -lmargin2 35 -tabs 35
$t insert end "$::S(title)\n" title "by Keith Vetter\n\n" title2
set txt "$::S(title) is a card game for two or more players. "
append txt "The object is to get rid of all your cards to the "
append txt "discard pile by matching the suit or rank of the "
append txt "previous discard.\n\n"
$t insert end "Introduction\n" header $txt
set txt "There are a huge number of variations of this game, with "
append txt "almost as many different names, such as Crates, Switch, "
append txt "Swedish Rummy, Last One, Mau-Mau, Tschausepp or Pesten. "
append txt "Uno is a specialized version of this game.\n\n"
$t insert end $txt
set txt "Starting with the player to dealer's left, and continuing "
append txt "clockwise, each player in turn must either play a legal card "
append txt "face up on top of the discard pile, or draw a card from the "
append txt "undealt stock. Legal plays are:\n\n"
$t insert end "Basic Game\n" header $txt
set txt "if the top card of the discard pile is not an eight, you may play "
append txt "any card which matches the rank or suit of the previous card "
append txt "(for example if the top card was the jack of spades you could "
append txt "play any jack or any spade)\n"
$t insert end \u25cf\t$txt bullet
set txt "an eight may be played on any card, and the player of the eight "
append txt "must nominate a suit, which must be played next\n"
$t insert end \u25cf\t$txt bullet
set txt "if an eight is on top of the pile, you may play any card of the "
append txt "suit nominated by the person who played the eight\n"
$t insert end \u25cf\t$txt bullet
$t insert end \n
set txt "This program implements a few of the more common variations "
append txt "of the game.\n"
$t insert end "Variations\n" header $txt
set txt "Only draw once if you cannot play\n"
$t insert end \u25cf\t$txt bullet
set txt "Jack played skips next player's turn\n"
$t insert end \u25cf\t$txt bullet
set txt "King changes direction\n"
$t insert end \u25cf\t$txt bullet
set txt "Two makes next player draw two cards\n\n"
$t insert end \u25cf\t$txt bullet
set txt "Use the right button to draw a card because it will not "
append txt "draw if you already have a card you can play.\n"
$t insert end "Inside Information\n" header $txt
$t config -state disabled
}
proc About {} {
set txt "$::S(title)\n\nby Keith Vetter\nJanuary 2007"
tk_messageBox -icon info -message $txt -title "About $::S(title)"
}
proc ShowHistory {} {
if {[winfo exists .history]} return
toplevel .history
wm title .history "$::S(title) History"
wm transient .history .
set t .history.t
text $t -relief raised -wrap word -width 50 -height 29 \
-padx 10 -pady 10 -cursor {} -yscrollcommand {.history.sb set}
scrollbar .history.sb -orient vertical -command [list $t yview]
button .history.dismiss -text Dismiss -command {destroy .history}
pack .history.dismiss -side bottom -pady 10
pack .history.sb -side right -fill y
pack $t -side top -expand 1 -fill both
set bold "[font actual [$t cget -font]] -weight bold"
set tabs {1.1i center 2i center 2.5i center}
set tabs2 {.75i left 2i center 2.5i center}
$t tag configure colHeader -font $bold -underline 1 -tabs $tabs
$t tag configure data -tabs $tabs2
$t delete 0.0 end
$t insert end "Player\tCard Played\tNext Suit\tDraws\n" colHeader
foreach move $::ROUND(moves) {
foreach {who card draws suit} $move break
set name $::GAME(name,$who)
if {$draws == 0} {set draws ""}
set card [Card2Name $card]
set suit $::GAME($suit)
$t insert end "$name\t$card\t$suit\t$draws\n" data
}
$t see end
$t config -state disabled
set x [expr {[winfo x .]+[winfo width .]+10}]
if {$x < [winfo screenwidth .] - 100} {
wm geom .history "+$x+[winfo y .]"
}
}
proc AddHistory {who card draws suit} {
lappend ::ROUND(moves) [list $who $card $draws $suit]
set t .history.t
if {! [winfo exists $t]} return
set name $::GAME(name,$who)
if {$draws == 0} {set draws ""}
set card [Card2Name $card]
set suit $::GAME($suit)
$t config -state normal
$t insert end "$name\t$card\t$suit\t$draws\n" data
$t see end
$t config -state disabled
}
proc ClearHistory {} {
set ::ROUND(moves) {}
set t .history.t
if {! [winfo exists $t]} return
$t config -state normal
$t delete 0.0 end
$t insert end "Player\tCard Played\tNext Suit\tDraws\n" colHeader
$t config -state disabled
}
################################################################
# Card images from Patience card game, see
# http://uebb.cs.tu-berlin.de/~krischan/patience/patience-english.html
# http://www.tcl.tk/starkits/patience.kit
namespace eval ::img {}
image create photo ::img::2c -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
lhiecEi65QQaolI3Kh6byygLeqJKryar84jtIrlbr/hb1QotY2fW3LukoWjyMCmGP8HMzNgenOvr
d31+cYBeaIdsRIlnHnhKWoQ2jYs7VoI0k5R5ZZEzmY5+nJoubjGXUXZfpqArcTmdqK8dg2lyHoyw
V023tY+BSKq9S5CjwjLErMaSym/JzIrOz4zShtHUm9e61tme29wtxd9T3uIq4eUp5+hl66Htbe/w
8djzmOTz6vH57/vt/ev/0AUsN1BcwW8HuSXMtvBaQ2oPpUV8NpFZRWUXjWUUtrFXx1ofgYcRq0cK
T0hcwAidrDRLDqBcx1pehBmTg5oursJsQgTkHrhSqvKdWviJZSeimYxa8tkqqVFSOBtFrbaqarVm
NLsJmkgHl5ubVL9OA8v1z1iVTLUejDRz7VKSnKDC1clursu6c1OBhdvViN2gTyj8NYdjcBUYaSH6
CCHik+PHjUJEAAA7}
image create photo ::img::2d -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
loNgkEcskm45gXBpbOpGpGF04KzKoCipdetKmoTcsAkL1IrDZKW5ST2XyGBr3I2Nr3fL9rmuv9fy
flV8eUWAc1yDTESGgU1pVYyHVo9skZJOaXqFlmJwjTSRe0mERqGdOYaVpKdTq5uXW1CpTrCxo4qQ
bm9etbqOXkq+osLElMSIwMdoycq2zXTMz5jR0kbG1UXX2D3U2zva3jbd4TTg5Ffj5y3m6ivs7Snv
8Cfy87v23+n4Y/r7R/3+6uETaI/gPIPwELZTqI7hOYfkIIaT6I3iNovYMFbTKI3jM4/NiEAqE3mM
ZDGA+0yG0SRA5ZZDJFmWwiWy1x9A/3S5WoSzJcqbO/H05GjqlRaijGiZ0WhJJh56P1s0/cRNTFNW
VpPyXIV0Fg+vHr1+7aMHZFAdUubUpAqUnzCnW6H6O3HJpap4UasFsjuzzL25rWj+AKxGLQXC7nAg
dgEjb0YfIUR4mEy5cocQEQAAOw==}
image create photo ::img::2h -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
loNgkEcskm45gXBpbOpGpGF04KzKoCipdetKmoTcsAkL1IrDZKWZx5yunWSwcTmkU7dY+Vtmp/bx
SVp7LX2FgGV0bIV2h25tOouMVmlOkYmTXlaWg0SUlZtceXWchJFoOUyPO4tiUKxFf62ohnOqobOx
tXdnopeVZyVxtsBVaXLEt1nIssvNns3J0MTP0sWZ1Y3Yp9rM3NHemODZ4k3U5DbX5zvm6lfp7TTs
8Cvy8yn19if4+cHv/Cr7/gXkNzBfQXsH5yWEt7BdQ3UPz0UkN1FcRXAXvWXktlFbR2wfk6uFlDYS
Wkln/vjt6vcvxbEjKef5EnByJZFcJV+uojVyJiSeMXUNm/Hq46ufo6R0tKTIj5aNm2yWC7qT6bgq
UUk9oVojq1QWOLnS8Ir0UUayXXc9FUuUUa62bliGcesz7cqlx4a2tXlS05u+n74CbjJocK0ycls6
OoZEMaKnFByz8PFDsgsYbClSxuyhs+fPHEJEAAA7}
image create photo ::img::2s -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
lhiecEi65QQaolI3Kh6byygLeqJKryar84jtIrlbr/hb1Q7BXqrluh6Tw+/zxQ2to22ZsT0o5Ij3
cz0daXdEHmaGhXIeXYh9h46CLouHWFZtO5CRmVx8TEExeWxPop9NOYGjW6WPilGnG4mYhKuebkt2
SHG3uGCzvL1lrsCfxLebxonJesPLj8600JbN0njVqtev1NktyNzd298q3uLj4eVl6M/qnOzt7tbw
NOTy9PD27vjs+ur86P7lAIoT+I0gN4PZEF5TWI2hNIfQIDqTuIxiMovGMDa6dC4hR3lZfELF0agt
ya6Nv0yJwphSJR+HgVC1BOeJYZ5QtualOqlEU0c4QH6u8HnGhVBzkKahHKR0GqOmTmMJqnl0itSp
qSiaXDeyKk2BsEgdUzhLo9eQvs5m1EKyZIq2wd6qBZbLCcigNX/c/YLJx9yHOPa+hfGXro8QInwq
XnwoRAQAOw==}
image create photo ::img::3c -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
khqecCi45YoZolI3Auaay2gLWqJKr66jE8tNUTHdMNKUVFrEW6+2d0Fbq2tmuQutx21zrh08DIa/
bWaBf3eCMWdneoV9HotCb4lyjY47Vnx4k1iWgzSTb0SbkZgjh5xRdkillU1Pn4JOHIyUr6kbj6aa
rbFoS3tFqbyncaLBtGSuxavJvMjLvbPOt9GE03TQ1XjYudpXzdzZ38/h4uOg17fnbG643emjxO1i
ftbyedv18PGKpfz0uR6K/jW6J8WTOxbeJA3U1w5RrYMIIUZ8AssfPmYSZVyyWE5dR2kfmz2GlDNS
WUlwJ2ckTJmG5ZSM5VaylBkOHs1vNmEWcxjp5jSAY/D5hGUr6EV0RYe+pAiMJKIjSleA4Td0o1Fh
mRSuiaom67sTXLN4xZRlX4eA+4DlM2Zt7Vc4Qt1qnBNWqj2SLeuqmCcSrE67cufu/Qv4GSe9yTYi
XrbJ5bGyjoOicjzPCOUyPghj8/EjMlgYmndyBm2wtGkPISIAADs=}
image create photo ::img::3d -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
koOgcMArGgW3nGAoPDp1IyBxOX1aW1FT8MplZaXdcOrLFJuRSurQWj1/te1i84xWbY9lt/JOxTPj
XFl/gDSDfF1ka0aGhE9vbIyNR49OkXOBaUtPlmKJkoWGZoKKi6GdOYOVf3pSeX6Xp62kr3R1sp86
uI5psLVXb7q+O5TCiJnFYcTIVsrLTs3ORtDRPcfUz9bX0tna1d2/3N824eIz0+Ve5OjpvsGT6rR0
53KzyfA8qaL3uab2Zoz6xHDy18XSIWb7QAEkGGYhw4L9jJ3JF2tiPYl0ej3852veOhcJoD+W8Chy
ZMiSJEvaUkkjJcqTIl3GhPlRZk2a62zmxHktjk5qsH7KcDeUlFAWGvGtWinw4o58R1NQpJcn6gmH
VPlYhTOVqomtt5biOQHWIFFzPKVGqtgw4tNZYMMmnUExrlw/JbSmXeGKngq7eQ8q/bsXKSS4hYX1
BWyRbGLFgBi3BUNCMpe6P1gGrkpBswwfmT2PgfG4I2jSHlKrXs0hRAQAOw==}
image create photo ::img::3h -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
koOgcMArGgW3nGAoPDp1IyBxOX1aW1FT8MplZaXdcOrLFJuRSurQuJZuu19tVcck1uFpOa9uv1+z
b1R7fHxcgH50hIhPZG07iotOcU+QZX95VpWBVpOUmnglTU1FlWFRa46PhGKnq2yRl26wiaOsOYqe
c6ZKhZlnJI21v7FyusOMmMbHkpjLu87DndDE07bVZtLXR9naRdzdO9/gNs3jPeXmUOjpNOLsXuuv
gamc8YOoltRXhb31YZrCmP0DqMybPVqf9GUiaOggQlwNxQAEJRHSMzMQKWKchWxYvou/swJqDBnN
4bsxJk+ecKfSRcqWwF7CZAmzBM2aaHCS09lOZsubNYHO9AnOmNCim3LyDJXqKJ1cjpzSEFkDolQZ
Hx+2ucqin9ZRXFVkrCoKLNGuFlX1qRL2xMSIA0vB5UKw4Lm4CckKa8v07VREfGXJ/cvU5tkU/DiK
LRhY8FqqaFU0ltXX7opFk898zBxSF+eNLpcWFhRTtJqoP5b28nHYnI/Upk28ptB62osQtD3o3s2b
Q4gIADs=}
image create photo ::img::3s -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
khqecCi45YoZolI3Auaay2gLWqJKr66jE8tNUTHdMNKUXGrD1uq5l8a2x0SwGEpf28rdupwdzGv3
Ox5+XB5vQ4ZChXZxi4mKjWwuh49uZxaOipVkF3yXMXhRepyBl0VOiJFIfZOQZk8bjKVor6tioUcj
n622TJaovKQnssC3xMC/xozJtsjLqc6Eu9DB05rVV83XMtnaLNzdKt/gWcfH0qy84jSA0XOg1tG1
2Od3HIOVgvBSmfqu/Pv0tlGah69QPyVJdI0CGO/JqYAC06lbB7HexIjjlGWctJFjx2cfku+EpDaS
YkmRJ2dczLhyXMtlw+CkVONr5hZdamzak+knZq8+L1f4/FkmKE2HqiquMpo0V1OlC3n6M8hHWEWh
A3uQm/evWMGdBL/COjhVnsU/V6eM7SSL6SZ2vXJucTcU5Va6rsKlXXcrqltmfvdOs/IX8N2ZTerY
fIrrB+KiFBaHwyFZGAzBzl6EoPCos+fOISIAADs=}
image create photo ::img::4c -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
ujmecHgLlizDpHBkuiifNiMGSm0xBchrddvMIbFGLpfJYX2JWh15s5ounb0wKX3SxN1qOdicucPz
QHRHfTt2hXJ/KXiHZ4B5MVmCiiORem2WKh6SXR5RgYGafJqYdWGLYKOioTNpp6ObqKsyrYlzTpC1
k1mxpKWDqHucc7a9g17Ejp26So3JHbqwqsWTxGxiVVe7zdfMiNHccZ/gW9/jUOXm3enm6Otv7uDt
8I7zY9P19PhU8vpW9/2z/gHkM/CcwILUECbhp7BLQzQP30U8NJFiRU8XaTCMuPFhx4YfuBWGRDiy
YMmBJwGm7LdSX0t8L+vFnDcTXk13N9flxEZn576eB2VSAmYrIy9CHU9F2abs47ZH0Azx++IFHVVk
vyL9WjpUKShIvEo1a/eKVFlOtLgqy/QKral/Zy+lEuZLrTVpdwMyAvZ0WaV8j5LmMubtjVd/h3Nt
NBS4b7C6jAYjlvzYoWHBfctU3rtwk2afBrGCfkIpW1CXiUZ3S2vUmIsfrTdjoRC7DY7ar0Go7hYC
R9nfwDWFiAAAOw==}
image create photo ::img::4d -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
ooMBb0gk3XKmoLDI1I2SyqZ09iQpg9PsqhrFar+mZ1TgBYPF1ytr2WT3cmm1alyk76rQtXyYHuJL
ZUBxfIN3SIB2iHFuM4uBVIdWiZKLO46MMn8tl496l06RnpyNnJ1bkZhQnzSloKqifTqrNkixKbOs
joaUe4K2soWuZMG3vZbGNGi/xanAzZm1yLdTz9CvZth/1dhMmtzZod9m3uJf5OVZ5+hS6uvd4e7s
8PHv9Gfz9n74+bv8U+3+ku0LCIlgE4AGWSBMqGIhQxcDH6ZwKLEExYoCLlbUKJHjQ48Mu0EmFGmQ
JEGTAVH6U8mPZT6X9mDSkxmPpjub63Ci01mOpzif34ByE0rtBNE2gUBuY0WKjsdJx7ZVyhjRl6lc
UBXJ0Tg1qjReYy7iakrshC2xupyVNZu0Kti1K1rFNeq21FW2cgvWyCuDrzW1y/qmxYsJbVescJFx
hSs4MKKJblXdbTzZ1NPJTeOmVVpU89SjRLyEjewPi1PS/H6BJvRoNY9JRzAKckFBNhUcthXCQN3S
RwgRHoILH94hRAQAOw==}
image create photo ::img::4h -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
ooMBb0gk3XKmoLDI1I2SyqZ09iQpg9PsqhrFar+mZ1TgBYPF1+tJbR3P2GQ3NZeGx9X1d/oub1Wh
a3l1SyuDfH1bSIBQg3ksjYZzQHKQjoWVdix/bWWHlS2YmYk0oYiBpTSbj6F6mDaKoKwyqKlIXZ2c
jTWur7l8k5G7uk50w6eirch+xcHHhDx7PcyWwE2mkrnXJc9F3MSMuGZTm9riRare5lKq6mbs7V/v
8Fny8+uw9lr1+ef4/Pf/zvgL2I+gvoEGpSUch3BhL4dM9kFcNrFgxSESL6bIqPEEx44l0j6CFCAS
ZMmOJzWmvLiyYsuJLyHGdDhzYc2ENw3mJLgzYM9/P/kFzTfUXtF5R+El1eJt6ZQ+Tq3ZaZkOWqxo
JBuuqiqMKyQjWlVghabsa1ayY7siM1vSrNq0v9iI5JWsGac7IcNuk3X1U623xrb6xTarFNdsgynW
TZzC8DNRHB33pfvLo15PbsUaDrTxsiG7wPBQi9MZsKfFp/dGmutGWePWfdheduhlTFQmWNzc7jZ1
9sJMu4kgOjKSs0cKxWX4+JFcxXIKvm0+B+GhuvXrHkJEAAA7}
image create photo ::img::4s -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
ujmecHgLlizDpHBkuiifNiMGSm0xBchrddvMIbFGLpfJYYWJSfJm9U1rdW9SvNvuOe2puTyz5O/i
dydlcGuEQIAdUYM0enkeZ44eUYqJMo+QKo2Cl5hHnIxnkJyde5egm6GfZqqWUoGlWWCvkbF+rZ5T
dF6wM3dedVa/GmyavcXEsLmHx8TAp7K2YlVXIzHM0oZ02NJvzttP199K4eJEpOVQ5Oh/5+tu7tjq
8MbzYvL1q/hb9/qO/VT8/nURCK4dwXwHzSVUuBBPQ3YPIUacNPFZxVsXMWZEuBFZR48fr/2FFDly
U0kgJ02m9LSSZUswL2G+DHiQJjxgNt3hNCiwmsyfFQfdU2bHG7Rc/IwqauYnnC9erchAxRXoGh9r
RGn5jHZ0oDFTq8Bq8xr1UTCxTVB+NRuWrcayi9rGDUZpbia3b+Fylbt3FtC1WfV68ytvWFG/LlWy
UwqXI9nFBTsJ5ZkHIN8vOdGp+fWxGjXK/4hmLjdrtDhnRToCotDSx4+TrimADh0bxKjbuC+FiAAA
Ow==}
image create photo ::img::5c -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
khqecCi45YoZolI3Ah6XUFoTGa3Opkmr1oTNbrXTUzhlUZaF41Kaexli0MfuKrijM+P4ude2l+Lf
KnZ8gHdsZ3qHdW09T1cjZYkskI9renceMh6VZI1InZqRYqCdgY2ETqCSo36ikaOkaquOrWlvMael
kJ6bLnmTrUCofjnEvL2oG7lmxpa7grGhw8ycyM9fRF23ntdVtdPcfL2w4HDk5t/mbuPpUOjsiu/X
7vGs9GDr9oz5VvP7zf5L+gE8Bi5aFIHS8KnjZq2dQnW4Dj6EE9FhwUVbEKq6RWliPX6a0kDeSyVx
ZMiSIElaNKmt4sKMTYp5nHVxZiGGGO8NDGhzpyif2HoCdTK0XFF4R28m/bg0k9ChGn1GfRdqKruq
T68+2ka0KSYqFBFG/KrR4DBOHLoOCsbVKTFhsbbJGbTVpaG6OZ39TNhh48lqex2pRPtXLxu6X3MV
bhsXcbIWgyHbnMRxImXGTiGKzUvricCGkl3a+dxHMGe1cxXZRXQarOvNZkNvqlQ2amzaWal6sZpu
d+58qZsSdC189A/hzmJSQC4JB3MyMH7rDoHjlfXrmkJEAAA7}
image create photo ::img::5d -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
CoOgcMArGkm33FB4bO5GQKJz+lRKqVgZdHnNektb7ncsgJ6Csu5RrTOb0CxmU96zluCq5XpYDN/Z
f3o8XIAtYYIohHg0ioUrZoiJijuNVTqNiy2YjilumpucgZg2OXdxo4yoNG50KZWXk22lkWexNa+k
JIQru4NillG0ta2UfHW6v7yZvqGPs8aaVM3Ob8tkVJ7T18fb3WWl3mSe4V7j5Fjm51Pp6k3s7Ubv
8Nzz2OD17vf48fr79P78umkLeI1YuX7SoH2RZ6TXQoRzbGVhyCzZRIgNVaHDWBGXvS+byx6O8bhx
pMSSJoV9JKNyJUtrKAt2owiQWk2CN//lzLUTWE+eP1dxDGqCJlGjQZH+VNqT6U6nOaHWUyMVXiup
A+PMQATVYLFQvZy23KpQkiCmDmGNDTt0mEWyad1eUUoyzclhRduKinuq7psTRkFNEwwU7l1lfm3e
Otz37d68Xx1/4hsMGlrJdlviwSO2rFqYUf6A0WvWiVfRnUgnkvZJRVVyDl/D5qq6JufaAG8Trcb1
x+7KcnzgvunD928XMIbPexGCgofn0KN3CBEBADs=}
image create photo ::img::5h -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
koOgcMArGgW3nGAoPDp1IyDxSYUqg9XsLLpkar8nLhMLBnNPZNOwtKa1u+mtEj1le8czPJ4mrsfH
RIAtgoJydod2gHsrioUyfV6JjU0sk5GPc5dSlnEpnJSYbp91KqOkLGeDnHmrfHOqlqyxrolwKLOy
ilabgaCSmrnAoXCLasU1jjY5jaVvPMKGxNCbT767vNa3VafX2GVlqdnfVKlL4+Cv59/l6mbp7V/s
8Fny8+Tv9vf56Pvu/fH4/hWpJ3AHwYLKEOr78sZZlYM79EwzAhGZxIk9Aj4bpaWiqE8d5jVG5EhP
pA5TIRm2KqkS10OTI5kBLCNzJs1jLL9hdOKxiLic47jZVHikJ9EURo+GgakUKdOmS6FmlGrwKVUk
VqkmlboVatemX/9xC7vPGll7msIKfQbrzdefFtdKa9N1ZyWHv+hmnSv3LjSZSWt+xLlG78lJcXXR
6VWnJ0gZj6MFU9xWcAuPKP2uvMw0MyOSv0xgBt0sMt8So017Ip0mTerCOBfD1tS68dOLcI3NttYJ
tdWGuWVLurX2LDxHxo9fSp7P9V6Fzq/KBpVEet4pPp4f9fHDugruFLT3exEivIfz6NNzCBEBADs=}
image create photo ::img::5s -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
ChqecEi65YLEpG4EzCmfy6MTSm0xM9WsS4rRepspJmtKJEfD5pNFuRZenWJ0232hF+Hpe7eH3b33
W0g2G354c2odgxxnNB5xK455aIqJMpGDjZGSeo6ZLnKdY5qeJoecHlajM3GApzGvraAjsHWrhrUl
tVybuW27mE2CgWyPwIuyZbiMx19QYrNgzVSPptLEiLzWjNrNxdxV3t/O2eJ25Vrh58nqWensfO/T
5PGW80P25l/V4PhR++P6+qDrZ0uYvIHMDvJDxa9dKIXjLkF8ookgJIsqKjaUV4fWv3wRwo9wcijt
I0WM9UwmcUePVMt1L2HGBDlzW02bN13m1LmzXk9gP30GFTpUVNFeZFjWNKX0JbRnKL8daxqIKjJZ
ujCqTHkRiVVdI1OKDJZUIFUsHlmiJUtN2VlVXR8iRZRJYlyGarbUlYs1odG9fjPy/VuwUiq8RAsb
FBWYbal+jRkLfAzIKlJllP5B7UVn692LnO/csyyHMN17zlIJPiqI9DuzUdltPvo49NDWP2738RE7
no/ctHPB6C319/CKyJN7CBEBADs=}
image create photo ::img::6c -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
mheecEi65YpBolI3Qh6X0FlTMI1aWdPMdXvKarlcb6masijNQjESm+y1mUd1+QvHuMfxZ5du49O8
dioaboFwQG9zaIRkf3oyZpCMgiORjmx1HY8elpMujJuKiZuNe6FUoJxOo1J6haoebKCkh6ankLaS
pZS4qZ54tqelRU6NOca5nbx+eL2azStNsJ61xciXyq5gZ3kx3dbahsLgV5/f4+Hn4+bp2+zqz+5D
6/F39GHw9uj5UfP7rP5W+gG8NrCdPIHTDh6kxophC4SvIA7aARHbIofQ8OnCOCnbvzSI6PpwTCYS
2EhilfQ5y/Rw1ceGLkVJ0yQy5jSbGWvOlMmSpk4qvFZ2CzqrJFBgDYchLUpom8Y9CysSpfi04Byr
BrGC1KqQaz2vKsH6FMuUbEuzZdGSVFtLqr22Vd/uUuQ2nTSpHqs5uhuXmVOegRCiOYZvMLFfkX79
9DbSDmMy2fqh6jWZFmSNlTPKYnZZZ0/AG8QdwsRBaOi0LRkvTW1SIN6QemNVqTiRdK7atJeZ5iQn
d97UsIOtGX4xaqrefQ8vJCgHLe7kctvU3ddcrfLp7lwZsY4LCAXugnCA7wIDutwQOCarX78pRAQA
Ow==}
image create photo ::img::6d -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
moPggEcskm45kjBobO5GSqZzaktKqdgWVLC8Zr9Ha3cIBm+vXhSZun6KS2lgnCgkntdz7tLZ7b2j
KWNtO4JucGNqgoM0iossW3p1iYU8jTqQLY15K5qOKpicnTqdmyeYnpGKhJpVcqiWlaqtUZKTiLGU
NFC5J7yrfZc5vq6lM8DBtHuhqKPFn2K1nFnMj0mRZdgCp9nYoNxl3t9f4eJY5OVT5+hN6utF7e5+
8WbW8+n19uz4+e/7/PL/nMALWK0ItVH96DgzttCFPxbHDCpD1izir4m6HgaSddGiFo226TwyHFaQ
EauKHGUMJIUSlkqQxEhCPDljYDKRMlzWhBkTYw2dLzs23Ihzhc1D0RQm3amUzVATR4FMS0jQSNSq
UHliTXF1qzatXrOGNTR2VlmmZ9Gm/bg2aNuSb5/FhWMKLMFoXblMzTSx69Kmy5RdLWry700pUWWO
9IlUsF2ghW+FLHEU8uKieMGKailZTd3IKXOyVCva8kzTXB+HBs04VZvKqy8zzpW4s1BHaNYMbt1S
RW7KdpE6fYVHd3C6WJj9DvOW9nF7kvPyuyIdOvXn8yIiaY6XwlwXOL5ThoF93osQFDyoX8++Q4gI
ADs=}
image create photo ::img::6h -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
moPggEcskm45kjBobO5GSqZzaktKqdgWVLC8Zr9Ha3cIBm+v3ihaWFuW3NU3mTtXs8czPJ52nnvH
Q4AtgoIzfXJAgIUriotaYl2JjXCMk5SPkmmWlymbbIZJg551naN8oaKWeZtxNJ6rqqdygWl0jW2T
OlBunLZ7uI6gdpEowa6/rbeln0TETznKy07Mz7O9J6RF2a3DZWVbat7fqFzi4+boYeno4Otm5O5Y
7fHy8PRO8/f49vpF+f3++AGsNnDKv4K6BCIUBswPtVQOa7E4WCwSskq8nMmgmOnOxYoW/z+q4Ggt
FkZWDGWM2tYxV0qIJlWslAUL5cmYExW2NLbM5UuYimpG26hz5zWZPn+qDKpjqNKlGhs+fApV4rGp
VKFOs0rUCMsdX7suNEJy7IqyZlOgTXtiLdsSbt8KiPuWLlu7afGa1TuW70K/9LIBdvdwcDqNesO2
AToHL9amXJXZjQr5seSi2ERWxXoZLFOpvTJKcYuTRWmPjTH7coq09FnVrzZ/FiubdebYtBnP7okT
MeaZpk2VvIIW+M2ka+D+1qN5OC2NydVdRf34NnVNDpVXjqg4k7WKiKTL3al9vHXiqs2iN9+6PPtu
cH+892XCR/q7OOarhXF/4IsQFHgg4AaABHYQQgQAOw==}
image create photo ::img::6s -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
mheecEi65YpBolI3Qh6X0FlTMI1aWdPMdXvKarlcb6maehLNzKN4ZVm2hWsqepyE19P0fPm70/TU
fEAbfYN4dG9dHTaKi4seUh5zKmRYkZCPNJSTkZqCnJloc5ydh5aQiaGjLaOSLk8YqG0xgXtBs7Cn
TndyTTm7m726jby0nm6kq76Froh/zcMcYFtit9LTZs/WUGTZ2krI3lHg4cfk2uPmQ+jpf+xg6+7D
8Vbw8zL19pVn4metyf6X1AEEhs9TQTnOfl1SmIyQnzQP5S2MeI8RKEcWK2HKNXGZxowN3ztG+7gx
ZMVPJEGyGairZC1TFUHZIgZOyy2GrjAWEXbSF0+ODo+x3GOnm8yDB/PlVFqO6behTjdF7TdVYFU7
V9tlNbT1YlevX2OGFTvWSaKyh86WHVENydpCSHH2lDQyqVFHKx/CS6IMHd+fLeP8k0UToM3CsV4N
ZTXYJS+1c1UmlpzqqOPJI8lGpphXslTLHjtn1rxZLmbTkEHfJYiLWZWCnFWzFowRqutWcewmTbtS
D0J1/PS5HT42t217EXez46N8Hu23an5Az0IB7R0f0tECgXE834sQFFiJHx8pRAQAOw==}
image create photo ::img::7c -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
khqecCi45YoZolI3Ah6byygLaqJKryerE8vNHkva7lUbdpVpliH5q8KoL0LrGZzcBe3sudON5zPz
bCl3f342gDOFhHptgS1pj4t7SDFphoocMh6RW16BmpWMn2iAoHuaU5+NgqRyqaiiiKyecJRwjrST
m0h0k7tVTTmlr0CSlrmDnUrCxh6ry6PPmcEdYmNPI7Wq1T2z2oTba97Qun/gdVzkl+mx5olS64bR
S/C32b1Y9Cuw7+J9p/zoXAHEJzBKvlDYjhEUU2lav3Lb7jF8GEqfLTMUzbyRVw+ex3Px+y4a88cR
YclVcUCOO6kxJUtnH/v0egnJ3shYzTpiGhUyp0lq7FYC/blTWs+hMH3eulREoc6m7izKbCqxHrGq
Rjcqo8dVJFNuEcNyEmuObMSDZlGlrYZ2LUq3AeHGlWuNbl27BjPiXdaWLF+9cB9J7MsWaNeXGMNt
GMsNcLLEd9I1LCYtGOVdkHj1hOo1KWdhiXSl8jb6F+iMpS3uc6oZ5z+ii023FIoMdlRGMmtCm0nu
sO9+rVx2rjz8lxfhiOncbs34qOPas5tvRr70uFYiJ9fghWh8e1Dr3quDD497LOGz54yQV23Lh2Py
Pn6sRwPjvdwXISiM3s9fU4gIADs=}
image create photo ::img::7d -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
koOgcMArGgW3nGAoPDp1IyBR+qzKoqegdbvCmrTcsMlLFZuRyhKYNbW2d+TlO9Ws1uFpeYv55OOz
c4B+RUxrNGSGgoWEhYktiIFqjZEyk5QqcSuWjnubNnmam5d0oqNjeZeiO6qHaXcoloyNUEqDirY1
sZ9SuJK9uYu0vEOhr7KcjzmzxW7Iyb7OalymXa7RZ0eIYdROmVvGYd52xGfiTsti5ka64aDj6Fzq
PKzx7kel3Lvbnu1m7PX+JpmRdwycFYIFsSGUhQ1NwyUPF2aZZkSir2b5TliUY1DHr2ce9oMVvObC
nop/wOBdMUlKJQ2UIGfQe8lvBsJSIWeyWKizUs2VOUUG/YiJJSyB85C2WiWUKdGiSTumJFmS4bsi
G4FQxGr0YZWsXvWFLdd1bMWyZnugTSuMbT+3AOFuASu3at2va+9W0/uELtw5ftm+Apuxks87WaXm
ZBNs41OZ5FqSs+hyasdlEmFCrsxxTWalQyMffcPz52bQE0/RNN2pJ9TVqA/H3mtZdG3Fhj5zbt0U
kOrQhW9dy513WPDRJIlb7ZMccHFp3yBrfF43UWCzjq6PzU7d7Row2r1i/sGXdxMf3fn6IF/eBoz0
bF+EoOChvv37HUJEAAA7}
image create photo ::img::7h -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
koOgcMArGgW3nGAoPDp1IyBR+qzKoqegdbvCmrTcsMlLFZuRyhIYNVQ3aW3pekZeTrNMe7zFJPZt
aXYpfX5/LIR6ey1kc26EhiuPiHSBjXKSb5GYiiyMd1+bmSqhop2BmqR8pJ+mNakyr5SuoTOxV0pN
pYmTtZhQOW2cu8KqvDRRkoOQOsbHwI+jxHDSi8/NoKw8us6O1EBW2YDYltNr3kWe4b3BeVx16rB/
10d1R6vwPaf2q+76Rvf9uADcUm/fpjAF/9EKGOYgQn9OkolJGHEZQzPtzFB8so0gRHBn/0psDOmR
WaZz47r9msUO5bCX3Na1PIdoXoqRlxyiWnirHM9otlrJ1An0p9B4Qdnwk+VTYjFfMYdCQwqVaVOL
h6pavdpxZ8aoLF0q/Qo2LL6nZ1XgVJa2mJG1g0C+/UiyZN26cO+io6vXSd6+KwFr5Cs4X+GJhA+L
U2yXcZW/jtUmjqzGxWTKpSAr/qr5W5WzvDp3Lec1jmayJjtKhGwTLbnVl4eNZot1Jom8RF2jzrUG
blLaTntyxQp86tasv8fl7pJ4YOngbk6sdV50uaAxzZc+Nw5KevY8rXNqmdfIN3jUxWHisZz6jthE
KpWxpzxtPn1VN2MzJtdZsLk7/QEW2h0P9z13GwUF9oBDgjbAoB9jL4RAgQcUVmhhByFEAAA7}
image create photo ::img::7s -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
khqecCi45YoZolI3Ah6byygLaqJKryerE8vNHkva7lUbdkm/OzI6ZVm2hdZy9ULEwNFyp72XTOPX
c0FMG35eKx42HYOJiDIeeYY0j4Auj4mSk5RgmZhmlZMtmZqRm2uioZwzVHulbTF9h3avrKitb61A
eqO4RbqXSIJskI7DKk0cxnRDtL/IYlhQI7PPXHHFqtRbgWfXd9TM0LvLsNXifMHhXY3p4evc5e5R
3cSgY+aY9e/2+fL3qrLAbvWDl6OgwIHf5hVaNkWZsTr+vEQUNnHTnYODMP475zBjx04e9MGhQreR
ESF8J0H+i5eMZSyTzkYqUinTZSBLJenhjMWvIUqbtmYS+/kqIKQksz6+RJkr4MqCvmhmdKPQIseK
trxl24qE69aqXn+FFQN27FCz6rCi9bmWXVt9bxHGpTp36py6jEjhfTlN296WfcCK/Al4T1mNdikG
9qfMYLHGUYM+uYfU6K7K5IzefQpUF8uD10417Nl0s87OlmPWIkqycMqznF/zFAo79mDFrf1aham0
Zm/dwG1f/B1cMPHTq037UVsqufI0Z2rv/ptMGPWlla5Xt66d1CrmYdEZ6X7zlg/wc338ID8FBvqx
L0JQEEW//qMQEQAAOw==}
image create photo ::img::8c -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0IrtQpGXrni7Da4sS7RQ6zyHh+YdG6xK9jJ3cjtll+P9
ZW8uf35xNlaGg2prgkxcLWiRX5Ajko9Tl3UemVmbh4qdm5xOojSThqKTip4zp42po2ClrVyJQTGJ
mpGyqm5kkiZqOYsywqSOpBt8vY6xvrx9gc5uxJ/QhGNpT5Wy2Veq1d7aoOLf0+VKzOjmcOqm7piM
4YfzxefB2PSN73e5tP6U+u17BzCewHurEOoh2K3eMlyV4HXSx+FfB2v2ZlFjZY8gR10f/w1mDJnw
Ii2KSKBZxKWSH70ixxim7IaxkDaFC5tJ3IiTzjpvO38yEpotKFFkB4kUFGkzndGJL2c6JDfsqdFb
LSntWgp1pAetJDV5/IpJY8CVJnmmPYs2mlq3TDM2vBoRIsKn0pQOPFlor1e8PnVOfZun72CQhwfJ
A5y3cL+b7Y6KYSz5WeVmii9j7qq5bMpFlNeRZcy1LDiTlBN7LmnGapOq94zRbANsz8rPfkNxs7Uv
KCywZJPVOvfbdPCstoGvfRgyHN3jb/PF1To3dt3ZfA3rnYoKJ9y2iOdQJC3dtvix5AHOSR+64Pqe
2OUZP9/ZOL762enjzxw4tND3+yn3xBwPAfIEBAUFyoFDgqbAAJ9kL4RAASwUVrhJCBEAADs=}
image create photo ::img::8d -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtiEzQrHaMF3CU5pre/dGhg/nat3eRLcNrGd
f3p0gyhsfTqGdVd7hoWJijOPkCtlgXaPRJJPSTKShy2ekyllLKGfKqaiJ6SioTuuNJWnZo08mjaM
eZeJmZi4U5a7TEW8m8DDbsjEyrE5xaiziNGUudNKXaosstlpRaxi3E2k4NZG41zBYud4tWPrTbfq
nOi+8mOwXe+9+Fb6+/Vc/P1L128eHIABDR4kWLAbw4YOy3lTGKlip4n7FhIR6EjXwB4U/1c8s9Wu
mbSRNeLN4EgHJQ2Vi1J6ejXTZCRTJ2FSe8mvE86VITsi9Klzp0yXN5Ea5akU1FBtQZM9TMosJk2P
JLFavaoRJDGLoDBGDCcWzVQnLK9WhUiuqbmoA9eihavW7Ua6R2smvKd3L1+7d80+nZsGcODCcquk
zdpNDd6v2FY9bsyUzGQ/kZ3mWdyyK7RAnGmRFZm4GGfDn+WanlyUaEk/yBa31vwadpy0PV03rcMy
Vd7Zkn/Xpo3acc6zpJEGkz2YeNVnp4czXcvnTWjkuqERMs6YXas3YEJHyZx682XKyduIR39p+3r2
28Ofhw/b/Xz6xzb/wP/xCAX++eAAoBJiMNwH4AshUODBggw22EEIEQAAOw==}
image create photo ::img::8h -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtiEzQrHaMF3CQaep+0WE66lrd0nNlU/4/Pt
SWBtent/K4Rmc1eBdYOEiCyPkItubCaShiqYljNlnJWbdZqhcStlkaSiKamqpkkypH2hNq9ys7C3
nYyFrZs1vrR0iSiSO8VPOcd5mb/MunSfy29E0cGJ1ZelxtrP0NxAVq3W0Gljp9PlXKdK6ea17Wjr
8GLy8+rvqILotvrfKfWrLDkLyGSgF3wECxoEdWZSC4DSco2K1Q0XxUOpANFgxU8iC4jZ/y5O9Oiq
GbCOyihtJJkw5UOEIx2iXPgPZkxFK2Wq1KFTFradPHFu26eRmj+fRUBGCmdEqb2kNp82jSqViNOq
yIyI47G14lAnRIsOPZqPbE2uNDH+fDl2rdq0LqiGfGSS7jiLmHzmFYvX5c2eB3OynHuSrd7CLfcC
LYuYWEavjBX/tbv4bcO0iADHrTsE7jVeYQPXBTVa2F2sVa6ihrx6amuum1+bPKH6dbTaeZhGroO7
Ethvx3pf0yqU4ZzemncnfoPb70yiCqXUbmzZ2WXecr0lN76dTPbP3cF7PpKd427KhvtKXo5+eImr
5qunnAT/sXz0+t6X94OZf7T85HEGmj9Z/u0DoBrfDWOaXqRFNI1wWN2W4GoHQihVhROihqFsh4GB
BId9vUcBiFbhQOITMGS42gshUODBizDG2EEIEQAAOw==}
image create photo ::img::8s -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0IrtQpGXrni7DU6lXOZzPf0KLUOtc2V+h3vseSqJr9vW
fmUZOxyEVoFOhTQean+MMh5ubY4dM5FpdJh7l5qCj5BpmJydiZGLXHBZnC2jpyaBgzGDbWGyiCpV
sKk5d6y7pX+lt4lLqXjCvarGfZKWvBtjXmy20dLK1WJuy9hRzdzW39jelmhE476kzumZdttq7s7M
8KDDk++zlPW466+Vp4qu/vlDNxBUPmj0CvoS+GnfpYAJG256GE+dKVoXDVocYSvZRDgd/+e54AcM
SUmCRU5q7FPsnD1DIiPaCSeOJM1jN8e4zDlTnjmPEGG2tKmKUkowO5HyUrlwoyylLmNBJZl0KkCH
GZtGVDiS4kqCErtmfbmVD1iEFZ2axXhVq1qgmdq6fUvUalUyMOGWxZm3br+Y7NoNjeMXSDnCPLMV
ThyYsdB+jllCjuyKmh7KZ3cV1gcWq5m715SIVHT3zrOkppmarSoVn+enrqFOLov2tdxtrFex5Wqy
KN3YYsPuO7g2Lu/hDGsbl9v4t03hfkDbrct8td/iyTXJAdNO+t9x270TE30u/OLexTLjxSxzPfvG
298j535Z/qb14nmu/mHfMxAK/TGBQxKAlsBwnn4+hCDCKAw2GEkIEQAAOw==}
image create photo ::img::9c -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0Irtap3dMNgZXFmWZyEUWU61exc1d6tKwt+09XZOjt/9
TFZ4JnY7hTaCaWaAf3wyei1nkpCLMZOOdZguHpp7HYibXJyKmaN5ooyjlISqp1mprVOxj6ikbJK3
q6+4g4t0k6w5wrqhRWSBfYd7aMSyyRmhzbK2rrnKYkRVlrfYV5DU3Urf0uGg5eXk59mdlczsmXLg
p/KR77uMiL31jen39L6GoPGzxypev2gEC+bj9m8Xw4P9TNHyYG4ip2DBLs5Ip+oJoI7V/yxStNYE
5EaCQSx9FGgNScuQJ4Ud80QqzbCEBzGW0tUQYEBbl7hlTEgHi0RvRKdplJJT6UimSSstjdL0ZTKX
b/Tti1fMpVCdcALJ/LrModeeCmOOUFkTFi98ztQ+3Tk3rshPTvHSmjfVzaytcjcEvuYz5kOUaxPj
jKpVpJyBBtG+gkwZ2U+4g8M2Wid5MldxVdmoCxd69F7TnDehTu159UK2RV0P9lO1cT1qI0N3LuWX
w5h5xsjeDt72YWzHbMmltHo17e2+CPUyFz2b8FDpeDj+7d0XN+K6dAXDnHj4tWLLl6M2l+qc726a
PGFVFotZ+O989Z/LW1U7v+Pw7S0EmjImhZRm2hfUyVYRggqeFJuBoyEIoToF/tCge0BQcKE4OGyo
BgzqufZCCBR0ZOKJnIQQAQA7}
image create photo ::img::9d -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtj01YbH4/LSnGI73bZklqkSWu09uQl8Wr/p
T3pTcHOAPGt8M1iFhIh4O46JLYuGe5FEkYQriy2Zkp2ecTSejzKknymcmoyIkKE0lKispTWZgUCV
uI6Yl6Kzda1Fu7e/wLSHuVc5w8Z3sixqz1Fdq5Nyx2hcqtncnNzdgt9o3uJp4TPVkEXkptKj7qnn
LH5N9MS1wbz2sPJtva7MFPVDYQtZQGX4Cib8hxDdqYUKrUHM9y6ixInY2h28WJFinxUW/zl2zDgH
pMeGOvb1STYI3gl2oFZt1EUEZieTM6fVHKjvZBWbPXMaAQrwlTaeRYWuQ5qUZROiBn06gdpmnlSd
efRZJVkya9KtW12SYarLqZKwXOOlZIhRrACqLVWONOuCLKmmcjcxPZXO0l2BbdMSNIrSoVKcV9UG
Dkr3Jdm4blfmhfY47h/BdbVWwZwZE7Wl5cTBDe2V9LjKpus4Tn15rLDPMcGMprn52bDZjC7Lul35
MFpUvNf69pfT3uiQhq+Wgvs38O7VyZEbI0zZeV/JbKsvjjrZ0PHs0ZPtmz18OjZsuCdDBOYFddfW
5tngxrr5t5n5rMHIdp/fzH7WvOBSAid+qel3H38F5oMEgNwNSAGDVvjwA4RDwYAgay+EQIEHHHbo
YQchRAAAOw==}
image create photo ::img::9h -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
loNgkEcskm45gXBpbOpGpGF04KzKoErq1MpVYaXZrtj01YbH4/LSDBS2wTLmFH5NZuVv95q92t/d
NFgncHtUhS2HhzOCbyaFj4iPfot2a4OSliyYmXWOgJ6bdCihny2MfaR8o6mBdpGbM6Q2rpqhsbat
jaVzkDSws7x/q4o1kjtQxsN4OsTAf5yXu8zLzskp0jvYlHnaQFaqzrzgaE6M3eRGp+PoTafsaO7v
YvHyXPTXn9S1YPos99F6oKFiMmnbLUvN8CEsaIqWilTrxGHKdRDXQIsNfbHah9GfQ4Ud/5X96qRx
JEdrJCuivLjS47SWLBmmLCkzTq9wxWqqFDUz5y481ARS5PFzYVCeBonwSSQzYkYuELv8exky3Uel
G61M9Vm1yNaHIm9683r1FcCV51wSPYq2X8+dS8U+Q6qWq8CEMOvCZUvH5NuYePt2TfF1bkIlYQ+v
+Br15MSkrwZLzOuiLCjJhuUutsztMWDNXjhPNhw5oNDQdg2dDjsXp01+aS/neSK6Hlnb6Arjpr3b
iSrdvaOdAB5cHJna176VBkN8jm+6yZqvVvmwF3HFr/tFRz6ZbvXDBAHp9utYqOkShWVlp1w5Nfaz
oFHvfd+d/nGa5OG3XMY46/eO0PSn3lFnzWAjYHjTjVbgOOkZFVtrTQXIHVAPBmPhZZ801xts6HFX
3Bkgargbh0d4WByJAoiIGzFIfEiVGT6Y6OJwOMzoFQwyFvdCCBR44OOPQHYQQgQAOw==}
image create photo ::img::9s -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
lhiecEi65QQaolI3Kh6byygLSj1Kr6cq0Irtap3dMNgZnEq5TGtmCh1a3Ohxqiykp+dtU7K33rXt
eht+gndbeYaEMx6Fih5xLo42j3iLMo6TkDSXh1mbmmhxm5hIno2doKUrop+Bb61vMX2qQbGAs4iu
iEVko7y7pJwqTRyzvS25g7y2ykTLljnEYlhatdJeXMjWZ9jB2nDe4N2WZ83GlEvZknUX5emmg87H
suppe5L2rPeJz9H5jZXyAD7T14+NQHmfLgWM9I4fQyCnHiL8JxHZqoYLR9Rix0xZLGDu//Do+8UR
ZC6O0EKKXBdqn6FvfLIdjMfm2kF05hJ2uDYtVRRx8CTi7KnwCtB6sEzmHEgUmq+eLLuppHmLZTGp
R4XlRPl0IUmVmShqVJrx47yaYncaFFrV4c2Ib1e6VXs1bti0+Oq6RIv3rFa7d/uCheuXr06qkPIy
RTr4b0l6QZfCXQdHcmKYdchhBoeTG+dtnj+XQ0Jqi+jKfbImVk0pWDTWpzrrdcWaK0iKX/PYU71m
4+DeZF+pMXdx9l6ZxH22fovqMF3HgAMR3Lucutbpiqtnv479cVlnj2ErbUw4pB3x46Oa54TeZDus
3GPK1ivdjebZpk9TltNe/5fS+vGRHySAATLyX4HOPfEDggQBQQGD6OAAoRswWIbgCyFQIMqGHDoS
QgQAOw==}
image create photo ::img::ac -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
urygsHTLnYzDpA1Jsiifs9FRCq2mqM0Y1srdjrbcKpYKDivHGXPXyFGL2cyyu5e7EJ3zpNSeledp
fn9QgYJnTAJ4hUNefIpBjImOO5CEkipkWl+Hlix7HZyAdZ+gMp5tpC2YWoiVqGCRqKmHsLErrbW2
m7ihu0K3vVPAdMKTusSXxscuycomv8fPxNHC0zq0b3MYatVRaWHcpd5rbhpm4OHXT+fIme3jax5W
61Me81nw9djy9fas33bt+vn7V6fPO3ICgyFMZ6hZN4fhIMqS2IkZxISWMErS6IijIo+FbkAKEvlm
lkVctEjq+cIKTrN4A6GNUulr5klSmjLdkajN2U1Xje5dDBrTYcqfMinmepmID81HTfE8haqwqLQN
O42Ks3o1q1CtVqfWDIsU56uyoI4q3VSE4iwKSl3giEsEBtq0PkKI4Me3r98XICIAADs=}
image create photo ::img::ad -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
ngOecGi65UxBorJ3JA2eyyhthIRKryuqM2jFektaAbT79Wq75LL0/Gwn1Veqew6P59Lp+nDkLvX1
SnxtfoOARGGGX4iJWItvjIdNYnmQOmF0lUJsmJmWR3OUnSybf6JTTZymM4iFqqcoj64yi7KetZG3
e5K5r7w7tL6ju8HCxDbDxinAySfLzGDIz9DSxXqxZtFSrYrZS6mN3USg11HO4uPkgeFC6Om4X+2h
uvDx8kxl9dhq7dz76P3+vq1ZN0TgQGv21AFyV46gMXPPIDKTmIziQ4fELGbEGExjR46+dDyGBMlL
ZEmSuUyKuqYy0zYBLSGliplo3LRnNknQNJQTJspKM38CTbOTEUuhsoqaUoqv1R+m9NAUgkoPyBuq
XvjpRLoQVBGuCAl9lTYmFtaqRMF2PUrtpU9qYpT9IOuCAty6du/qhKEW0IsQFDwIHky4Q4gIADs=}
image create photo ::img::ah -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
ogOecFi65U5BonI3Qg6Sy2iraXpCpVjXkfQUdLPg4tYb/IbBVHLJfJamrfB2lgqvy91Htvq+bMa5
VnxKfoGAeoI6aYhhiotzY45YdF2FkT05cX+WiZh1lZs0hJ5XoDKinqU2eaipoVt2ra5OpLEsjbS1
K425qrxDu76mkMHCxEzDxrrIySnAzFrPM87RYtRTy9YC09bbQpqaeGGorOFZo2SwUd06o+2S2Dzt
5+VY8uR98Dv26fji+7i/8un79+jMPjQC47lDKGcew4bgCt759HDinXXPMDLTmIyjMY/Ef0AGE+mL
JC+TuVDWUhmLZSuXi2jBFERx5kRwNts4zOlvHk8w8kj8NLdwaL1Af4weLWNGqSCnfKBeTAjqWyGp
3iolpVqVVFOum4IKBRv2HtYhZticRcv0xNqse6pZo6iNbFeZdqs2+zHXBYVse/8CLgIj76YXISh4
WMy4cYcQEQAAOw==}
image create photo ::img::as -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
njmecEi6BUtHotKWtCyftJHJCa2upMUY1srNTrXJbhVLDouXZcyZK+Wsx7mtQP4eji5Iap141+P3
fGaAcINrdIVQdIKITECHjFFHapA9QRqUO20bmI1zm5wzmpdob2Vznk96XXKqga2EX4tMk2yyrmCP
gWJ4uLaZvr99vVa5QrzHxTrJyk6Xf2jAoc3TwtEsy9LVp8jWKtgt3J7Dz8bdKeF94sN25o7ad6jh
5bfq8enyv+zvwuL15JHl9jVTN+4VuHbcqvVauA5gMILUtimM2GkWLoIStWCkZu1bnoX27kLeQ1Yx
Ekhe/QpSlMZsHcmLf0iynJUy4caX3zzWVNnBH7+ZJnfePMnP4LluHD/C00hLpgydHJ0V7WnUBdKJ
CbM6PdiSIVatDbm2zEIFpyhRJbOxinm2yb9rCD1YStMzrclPGMnidRjwHy29VeEayrCr3d3A7M64
qVV4MSxQSnRCPjo5smFKrSSDCqMZ0tK5leGO6oxoMelCpi+XJuwltOgtpxllVu3Zqut5t/PlZrZb
qW9UvevpbR18bZ7ggJ/FBjSKeHHQx5F7MS495JfqZG1jf7Uc9bkf211QwO4NB3kgMGivDoFDrvv3
8D+AiAAAOw==}
image create photo ::img::jc -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAD/AP//AAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
mheecEi65UpBolI3OjWXUNkTeYxaU9Ni9crVurbda1YwDkfHT4967Wk130ewdjAI0Ot4vJ1ul6v8
VF5kcX4VfId7fYhfcoCCGUh1WIZ1hheVfYxoboRTiU4EBHt3pKVZGk6cbndVAaJsaJBAqiyyAqFl
ZAUBu7uaFqm1rZ4FxXG4hb28jUmzwlTAWsbQu8DWyr7QgzHRZLTbacXZSNXcIxXYnR1FtObc0uNF
463pWmvezxy601TzQPXg2jgaFDAIunnKkPxblg0WvhXnNuxDuMweOYZwrAVk94ygOXvz/9AlW8ar
4RuLHCFWMRDAwD9+JXl560YyJphuzlQC8SRSns0vvcrRbKawI0RxOUpWkxSJZLmZMwbmImcsqSU+
Flgh/VjJ6B+pFQfpGVWJVQZfZrHEm+TmoVhFxTB19Yh2QIEBBKmC5WRwLCl3XmIKsBs3INJvfx4p
shM3aeDDcYsZ5qdTWNjFZNNwqxqD8N3Ja7+0vbyYMCaCdcTVvYsXw2Gvk2D6ZbVtsM0RpUDvraWL
21jGd88NUj2NDmvdiGMLxZRZUh9lwDy3vvC68lHOGEwv00N8WuQCyGG72Fo783aMGAaLk5ua8lc3
1ZNqR9r9sPFDhJXuvu6L0F8LxghlTf9WplT3Xi3kvQNce/Wp9oZxrDG43x+HKWhecOXsYlccpWBi
IFsIVgXVfMYwRcZcRZjWlX7JjTeNgv9VKBwQpsz0oWghVjPTgjWdyMdDhjS2441OSLXVJY2dNIo5
JSbpmnsg8gfjXzuVtxWVChJZZY7mQGjiW00hZRpUB4VWJHycdRgHhgAyRglWZGoZCJd3xGWiUg02
GRyZLIrnhJimeBDUJWmx06d1FAbI2h7H4UmcftqldOiBUmIF3GdnnbcUbQPKKYiUQXw3kYPc8aiB
p3mBGt164CjjXB6W9gGgjn6+JOBgdtExqohdOqlHb25FmeituVGnYXn//brPVJ8Om97/fa2R6lGQ
wY3lU7A4qoobq7N+NIdZyvZYK1W3isriSSc2Zm1eE6qFXWfcvmiVb+BmYguliQ6jnq41WSWXurLO
0u54zNzRWwbg1jsXSS2eqdJ0w5UYKyJwoMostljs6FQmTfU5qbAZFzmUsQwXGWBST2kzJ0ST3HRb
SO8MKg+UW1zcCUfR2JSQWjSlLBwcbW3kTsUYqVz0zP1JZHNB+vS2s6RP/6TP0g45HRbUxMiLCtVs
+PQ0kGv9pDE+SzNtC0Y6Dng10uoQEnR5EdFTtNriLtv2yomJXAbahbgiCrnD6MvbTun9efQXoUCD
E8gu6L242Rz8HcmP46ZkD1Fidai5Zd81U3453iETjoZclxD4+IltW/U24S7koYge+OWimWKrr7Kk
67AmUsicQFsGy+/3NCu8GWe4THwXsRzPRfLKW8F881A8Dz0RmBsxvRJE+TDQ9T3gwL3zMGz/vUoh
4AD8+eh/AEIEADs=}
image create photo ::img::jd -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAP8A////AP///////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
moPggEcskm65knBobOpGp6BzSoMCmdSsyqrEar8lLkkKLgvEArL5i1Z73nBPC0p2rwJDYTrP36fR
W3M5dVhJKXh+Uop5f4ZKh4JjS4VzWGp+jSl6J44uSUsmgKGTpEKde5thkSwWrHGdBJMEoat3AQWn
Rxe4W4axpLNHtWOct7lnFbi8h76lwWfDqcjLh8rGyDG7g6Wbx7olvwPPyYbl1rjZIxa83JPQriTh
QcHkYebG1O9ny+1k3siS3E1Llw/fNVVHqMkTMm7VQnq78u0zSCthkoXzENoCxzDMgAIg/1uFOpdE
5MF4sipu7OKFnMiRFKu9FKixVxROH9EkI2kvmwBl1KQJg+dK4j6S6DyFzOelJrNKRo1JxTWk3B+Q
RosNYxYV6y2qpiwswXBnwD9RHqNq6Gc2G7pOUrcqLYenFYZSGXi93GdWLs5l6+rafTNwJ5S4RG29
1dZ2sAZs174KvtU38ZacGqhmgOZTrEtyppJa5uqZMRyzbUMerWC2QOWVttRNBs26LmrbdSeuC4kY
diDOmk3jcU38o3G9qndTPstcdvDAbW9Lz204nUu/FQM/p117et/db/kyF8S6dWDh3qkT5N3bJiuA
5kM25n78eDrOX5W9dq8YTxCpw2EQXP96AH123WhzjWGQcQJONl2B0C2HXVr+mccacc4J9qA6S7mF
1jdFDbKgaxnkFB2GjoElIYJ/VQggZti4ZmJ3AlpTlWi+kaagjSVSNqNgkBkT2n5PsWLif4tZV5uM
2y0ppEXjhXgVgJ5F52N4yTQGVmtEegKVfwBCVtyS810YHyK6TagLcpIVOF1dSWVJImhIdqmVkZot
5iZuTl7AoI1QqlnYeXu+aeE6WrqII3+XARVngcWNCeddklFVoKCfeXUfboZSCaCKexVZll47YZle
Y4c6GZ4+jJI2GG9nnKqhpxZChmlO7K3GV6T19emZXkPlOFd+2sTK6bGT+inbhwDhKVj/crzd9kaq
ky0qai9bUolOY5zhp2ySiEY56q9sOrYZpeC2d62O07wVJ2HfmkTirQVxWCIpZJUGk7jYwlVPee1s
4MK8LI5yzF1hAdyao3BZ62XBYXhVFS0WotOVnaGcpQlMsBaDVFfMhoxCKpV6GzE+DmfpSFMiX0Fy
PTJZ48mBAWU8hwkPwaRLSTxlnN9r4YyjMUrAnFyTQRJJdgHRHTV7B0dFW3R0z4EiVgqIT6PCjdTB
TiSzPSfnkLPTgbAlRZivxtR1b0GD/Z7WV+u2rNcnDcyFNC0LgJE4Nscc6r439Z213s4IzkmSdzh8
5+CEL/FMT3C4wi8kLl/ikdkYux1QaCFDu8wME5eokXmwpGD9W+DFMLJIInl48wnoTOQtSB+rL9L6
4ISYzswrvMfRxcNraGE52cFPMTyzxetw/D/J17B881Q8D30ToITyw/RFVH8EBdizgUP3VPiAA/Pg
9xLC+L2nrz4GIUQAADs=}
image create photo ::img::jh -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAP8A////AAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
moPggEcskm65knBobOpGp6BzSoMCmdSsyqrEar8lLkkKLgvEArL5i1Z73nBPC0p2rwJSYTo97OeT
MoApdExuORYmeH57eXxpOUIEJQR6R3OQS1h4hwWAikpASiOZkpRLlixWp2EDnJ2smbFBo7F8mWeX
c61HBa9HcbSytYIuxCcYZ71JAZ3NzIKYwrfGiZilZDF9vMvOzr+4ttJ61GHZeqfZe9/Jz94jMTmm
4gOS5N/SuPDb293EBpPzJIG7Y07WmQvJfLVbOIiEPGEC7R0U8DDSmV0JuS305WKMNIED/7dEW7WJ
F8eNz8oJMKBKWKJcHitd5OSp3ytEIWOuCgMzZqJdOA+i5MgTxa1jPcccw5ioVyeU1ajJXJZ0EFOT
KFMiVcGkQit9qSSWbMrMpiIvGazOyllMFzRlZZ+dnVVBmVNjY8WKvWrSrldhcbX+8nqoqgu+Qi/A
lVX3btGZqAi6rdanrFO4iu0+jTyY7bG9hzAMaXy59OVRON/lM7wUJ12vQk3fDYYwMVjJqVqp4XOh
8gY/X/8WXh32koXdr/EwWi6ktyZkeufM/tSlt4bg1McgGo77juanyIMz3fT3CpTzrMneXeyFLtCv
4evqU108rPxe2JEThm/esic0n80RBv9+pJWnHXntkaZMPkGJ1BN5pmUnXnWy/RddKpZY8NR1omCB
HQY3JZaeSgMSBUtnvA1CVIOD6DXfgtApsgxdtrHDIIDVGEdWRtvB846PjcGzIo4kEqRaSoF9c5aP
v8AYYm3diXTkTXAp2dxEBzk531hRtliTkBsy2WNiWv4ygIlt2fcikD+udQSN0GF2JpoB2rfjYV0R
gtdiVdZn5Jq/dSjKBuBhNiKKfZ2mxoQeWTbbnFA6qGY+pcE2KH+N+ocHZkSuY2RT7AGxn6WZeoXZ
gn5uMZGQBmb6Xqu8BebfoeCcl12sXJJ362uaXXhHhqTiqqt1x7WH3WapNpRWqWcxx4j/c/2xmOav
w8lYrG8c5mcsl5JSW5tzoylYKWrFDoZYndQyaG6WslWYzbLctiggi6HBxam4yvj2k6+qQhaZo+Bl
EuSy+9J6CHZkafpXc+041prBb+7pF2VfNfMUqqzwq+yVxTD5mU3eFJxsR4RB8qsLZmEcMcSRyfSZ
IP3M+nAoOWIYxU4vHWOWFdtd5XKnORm01XZm3cnlUVierBPSY/LDEFYrh1MJ0ElUdBQ1Q3Gj0C5W
05N0v10vEZGKUGVUIz5UOxTQYwOWrdV8UqMjFkXzBDG2mEUnrU1BwIUrYN1TY5l120qN5tE1ef4N
eFc6l202MiMjtXi4wJR4sMYdGWTQdsLzaH35FYYIKDXi4yinFCiNGs1ULV83FBNI8rzpyCK0X5Va
EnUkbvMMyp0zuy0p9uvI8FQDY3zlHk27Rha7ebo8Fc23/nwT0QM9fQ3VS3Q9Ddlv7wTOZ/zgfRE4
+6D9+E/ggD4VPuBw/vothuD+8fTXj0EIEQAAOw==}
image create photo ::img::js -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AAAA/wD//////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
mheecEi65UpBolI3OjWXUNkTeYxaU9Ni9crVurbda1YwDkfHT4967Wk138d4fBAY2Ot1uv5+Z7pz
cEhFBARzeXh8h31YKmBOgBiCAYUDhUh0FZiZFotfjo5AclMxk3WWl3apqqqfSUB/bmSUp1psnq5F
sCyAhFu+hcClt5GCu75OVC5kvKXBjxzFK6Ojg7S5pKTBzrUducZUFpKzVQUu2sLc0GS6Gt6T1p/n
p2yksNByr1jykGvr3/fV8C0TUK6ZwXTdQCUDWKpSFUgF9yFcl8GfNEgUAcky9dCcwV7Y/95w83bR
hIEABl41hJemlzZC1pZ90lUr37tjQFzKo0UsX8ldMqedwLQTnRSajSyOuFBOAKtCBm/SUOgF6MCg
F1ZVcPkO6lSkjPiFpFcx1jegITOSXSrT6k9pbYN8nHsubhmLjagu00QRq616m8DovXtpU1AyqxJr
jZsqXNuzF/GwxVbJDgHLmCsDRsyJKOGqFz0fzuPwsulJje0e6vr5qjTPlgBzNE2odB/Ad27iwjJ4
a6mxKy2jrnx7qQWYIHv/OYcNqlzj2Poed+4brMdgF6DGls49A3KQMb8s/+1Zt+rRMrkeb80e5gg6
1KmT/Q6e/WDnd7S776HeNx3rz8QAn/9v/ilmIHz0bdVJXn8cop97a/kmHyX/QZbXZb8R6JxX+BhH
HzCsAJhTKsAkGF0ay2xIYIH2uVEaBthF+B2LLe6C3YekHaiVig2lqNwuA67XC38QUkigiFQ8iFyE
K/Yo4Y8XxaebbNDZVZ9k2CE5yFYzRrLZlxtl+GR4j7gxoXPSpRWOdx5GpWV6S665FInCXaaZfD6i
aSFv02XyH262wWTbZBtBVeFbF4KUm5okonaanX+uaWiNUfrJyZfE2akpZoReSmle/KS2po6JjcUZ
Hm8KJlmaa7GKSaqgxrXPrKauCWtkarWqJl68mWUMk3KKBGVSM3D5kp+NtXPVsIwUW5//djmSUMBz
ktwqRYlz1VEmOGztqUyAcXCF7ZA+BUTSY6AR+4wTSx4LzojCVHFSSslYlYRYKUqEDBIYbjdQdK4l
VRFwzNQ1rUb8Dpirl4P5pQ5dMRSEkbkLU4uWLYUe1CxoBMsZCz1b1vUtxWI5xh5Cyma8jQlNDaKw
KGk07HBZKse7WU7zhPKQzDM7xu9cXqgazbkBb9zzdRoPLUvO3u7Lrc9Pt5FwvNY+jQWpqU3t70jp
Gv3u1ZpoIhmqLlM9UdEjO+0EH3oo4ja/TC87MVw2sN12Io0dimJVgfwK7N8+o6GXGUIITngXhh8u
htCKW5F441A8DjkRuxkxuRK4+DD4FeU7+PAD52fAsDnoeYWAA+Co0xNCBAA7}
image create photo ::img::kc -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP//////AP8AAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
XgIgb0i8xYBColI3CuaayyitOYJKryyqBcvNPq3dcEkLFne1TpNnzfa00GlSbjqoB+qDux3Pz6fm
KnBxgGNlQXkViHcWe3aBb0dbSC5JagSXmJmXjIRqkE5Vkicafx6YnXJBn1mjGaVtr6hqsmOtGJSP
t6NBBLRygFu1tmVHuaAuvL5xoFBzkqHOzMzFxbsBvavTwmy/z5Gq1Z7XylTHT9Md4MKp1Mjjnxzg
sOHA6p1H2F7oom3tqbX+xOVbAc3VF35CqgWzp8rawEBf5P071jDYwUIMF4J7WMpEgQAF/zxRumex
GcOGG8kBs0JSIztj9s6908dqShWU3yJF6lWFI66aMmRmTEMtEz6Vb6ZUzEjv2oBTybI98mLyaEWe
1wjUgTqTIDmIHXqd4mlUE6KoNAna2mQnEiJNmipoNZpS6h9LcdtykhtX7latMn22SuqEgADDiA+d
XaRoU6KsUIkKnpXUAtxTehlnyJPJj7nJGLNgPUw6cS+9eTLbmbtJWleIb7BePnUHK6Lbfp/mQwL6
V2zLpYMz4pm6D2TAhXsiFW3ZqGW5ix5D58uV93KvbRGvvIDb+FzP09F6fcMna8TCp6WPc6pbp6Te
yyDqxWYeXffVmPxsgG9oFqn61EX3Fv91rVnkW1oQOVZSN9wxht9T+m13HVikFNKGVu0R5cyEHVWU
QWtj0HZBft8wyOFIzRyhG1bNPWSeKx7a9ZOGvGDI4hr+VTgeVSsdwpoeqUWnCxl89RfajhcdR5Z0
nDlWo3u67EjQjZKseNoe6r1Hn21nIfgHfbdktdV0Ar54oHnlyTgKmDzJAeGVeJQZJS+HJdKllIGA
qaWItnGyZIsK8kcOm1VYCWScbykSnGnPqWmJe3JcMqacjb01m2wnrgkpZE/pwV2Qdl6zKGmNeumC
nm4apQgnq+J3mSimajpIXs2x6pYfptV5TqyPVqTbpEr2+Wmw9fAaYlH5kXWpdE7g51L/pr0mEpdz
Ym1CJYzIGBspPpK2Bx079OHkUrZ4fsntXFW1oxBKhJV76rnh5jTUrkE5eiwobSKEkzzKiOSurBGt
K0s4FhLjH2XM7TtUNwyOdJe/B05JMD8SMezhrgsFPMigBL/UlFDaQMnOBvGZy67H7EYDZTorP/Pb
yQtPRM08+4Ty8j0nycwvjjLdVPK7MKurkzY1D1nwhje7s/OmFppjkolH5tmxOTC/NAzOTUdtcks+
z3g0GNAWHAuOKD5rr9WnKhhP2WC75jJQLjR2KYhXu+NNiWr9gagifHPyysMpRjzVKH3sXdzh/foL
h5Em9uO4GxgJYkYYCSU++RALXk55LeaaY2Hzz50XcR7joc+AhCQilK7E6RZQoDrlOLzuOQyWy15K
CDg8rvvuH4AQAQA7}
image create photo ::img::kd -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/wAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
DsCBICjkGY+3GHEYPDp7OSBJ+qzaokKqddsaMbXccMrbFJtdWPDZTM4WSZ643NPFTt+5LmFPCPD9
fIGCeSeEY3Z3cClvJYAWfRV7gIJ9jV5eKyNLS4ZfLkREkI5/jZUCAQOdhUpNnCegqxqhj5eScKl1
XSYFoAWxHKB5jreqJpgqebygA76NaKcacLYYuSaMpyXKvcbQzjHRp6ZZ2CzHZYpfy1oW5N/Y7jmY
48WW2UHN2OrLJAYu7//xTMGrpg1IszT60BUC+C9cJWrlEJZJpu4gMobupAnEFZFEQWYK/z8ahBOg
n7+BGYed4piJ4kiFAj7iIzkiHkZy4eKxREboHM47PtGxU4QSJztU9Ei+WvhKTb2TNwvtPKQLxTVn
sYgylJq0Wzma1RQWzWhs6rOv8I51M/TNZlGuYS/WbPiuE6axY8yuqoP3J5o5ZbuqfUaWpClLGWxp
jJch7hi60Gh1gDYtksBpjv21uwAkkoXOR79Jqll5dGam0FL5QaV6dSrQcy6E83s2U2oiq9v26aya
km9RjTtGDLYaEmzQN1MCly08E+5JfXanEmVD+iXBgkEHuiDqMJ2c1tueDrwdw8OH0CmJrjAg/OC9
Ef/I9kx/dOL1ktqzHtpSj31h9AXIWv9nl1mGSnjjleKeJd19Fsx53G2QoDRIwWaYZBoUyNluu2FX
xx6vtRYZJNI9uB4t+qXo4XAg7ldTbsvRQiFrHQbXXzm8tdjBYTMC02JnE67E2yPaBcRWg5y99uOK
LWEwXZE9RkhfZDkSoFqQSFnpx3QR3rYMjKHt1x4kWD65pXmMcYAkTUPySFVE98noGnG55YYYgW7W
xhOB05Fo5HMCUkfTJEzytJ+WkkCYoZ9Tmmdac4Ye2ptovwGHJHd/6GWMh+xxKdBkPVoqH5CQvtnp
alfMWdyoQRR6yH1ajeWii9F12qqrfyVWaXkh2ukZcbTBZxt6sTmYpbHG3YWlI5S2Ncz/i6fSB9uL
ML1pm0rMNuvsBsttWpi1kQ6lkkMSGkMmN+KV+gkhxX6V3HubdqFXX17FKwxA3+qZl11RzYUuW3Pl
KywyZuF171NNVqvvulANFJlmVj2mLlwL0RvvIk4Zcg28jeDCn8GIKQwLNyX4xDExFHrTb2SGyERy
TPcgTHBAAiWXggFeiAQSOi7XO/NiKr+lmc74SETFySw3G+tWTOkzkUfb+PyYcm5FZYJJTrsC9UtS
+zOOUja7JU/WMJks2BBo5zToUUYVRjRWJQ/8KmmfNjYYIW8rLDfD5HYMKAcn9Kz3xc7RzFh3f0NU
8hLcbNIE0kilrFF0iKvTSVD5tPL4Xoof/5Ztd3leRY4WR589xq5/pE6KDHlQUTpfxcb+XSKvr7EG
40jb7sREXeluBO69+66DFLULb4XrReRufAuOS5HE8rtr3hkF0LOBQ/Vc+IBD8NjzFML2socv/gsg
RAAAOw==}
image create photo ::img::kh -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
DsCBICjkGY+3GHEYPDp7OSBJ+qzaokKqddsaMbXccMrbFJtdWPDZTM4WSZ643NPFTt+5WYCwJ/D9
f359gHwqeYZ2d3AlQQUlBWUWfBWTe5KUhyeZaF9uUmlAjpBLAoOEp31eXiabmkpNS69EnqQBs0So
cIKadV2dt7NwHLM5qautrMglssDBpYgbhaXFvUyiVMzNkYbPMcXSls8sI0uxAqPaodMW6yPe64KX
4ivkzeLozY7e7vzd8JOL5iH6Ze5cugH65h16x3BXQGXCDN5KSALfrUV5FvorliEgPVDb/xjZw7iM
lT9xtoJQG5fHmUCCeBSu2thNw0tOIt/cdHmS20ZbQAcAhTjthM6bXzjty8SwFDB2LH2lwHPBY8mm
04hZHUMUogWh1DLSfFhBKJOuXbliABu2ZsZ3wlLO5Cp1WVmOQPaRdOuKLdSPdVWZFZaXY9FUD4UK
rYTWFztvZvGyBUhpV7EBfCbPxfnRT2SncOVamkRoIeah8qKOI6Dy8kLRpEtnZA2UceNxhaECRdna
lMNStMFirlSNnt/dcmsWPgUOdG5jxRFVUul0cPXFslGKLjv8Nj3Wp7lDzpvV927CfnF5NwQE0PGs
YKehkrwW8+L1Y4ZnjqdqzvavuEgD2P9qgmhWlQkHadAedpu50gUgtpQm4BBytJNSEBDi5wKEmk2o
CRGvcUdbhhpqwqGErbBD3VIRYshficmcaFtHa/FTI4nWDcSSKRzYNV9ccsk2VHT5YXJBLsJkFk43
zL1InmrG+dVkId/Udsx8l5w34EeTcehXktkBiYGQRLrQpZI0omZjNCPGU6YrlYFnH41N/MVKIJ4N
AqNdetr3HhwgfmfJXRC+GaNnIPr31Z2mYOchZ9Lt9xyA2sBpZG2/6fidnJP+FweQebq3py4tHlcY
mBnCt2aEiI4KXKLiZeRoge6smBt4jzpI4HOn1oQKdYBG1htAUEZ6QV6fATffqeNBVqP/oXzmGZSA
vk33pLNiPrklNJgoRq15g/YKqGSnQUvqsXvkyONo4mH0GasNJlPHdOmGleqlvWK7FFLy7miJYish
1o+qshq2FaRqfTXXY3vVGh9oC5tLsFjHuHOSwh25IHFKEFtMElwXozbOxsG29vFNHP11VEnFqvXU
WHzWhEIZvCCoK5dBDRnayIfwZBXNRfFsU1MhXpUTKSz/YpdUFw7WlkZ7wQQGSNikZaEqMCskTjqO
LGKROvGyPBuVWVMskTZdZxOL1Rzx99M6cMfw9SxpSy1E2Bgx5jZDVWFwNtfPlFNnWksWnrVJdl+E
xTVF4K3duRv4dFBB244RLTjE9Jh4fDCuMuWQb9pQTUudnZTu+Cb9CTJlaXc08nfjpa9d14aXVmI7
VK5XRHMiTEQ08hjM6Qnh8EQh3vvxpyuqfIUiIV/8GkfU8jz0RkQyPfU6SI+9GFJUvT0XVHj//ROC
fyLC+E6ULxQF6LOBQ/tc+IDD9fCjEcL8y+ev/wsgRAAAOw==}
image create photo ::img::ks -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP//////AP8AAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
XgIgb0i8xYBColI3CuaayyitOYJKryyqBcvNPq3dcEkLFne1TpNnzfa00GlSbhYY2O/4fH5+4qfg
cX5jf3oDdYeGiWWDXk5VW4KOf4iHBAGWmJeRjCuPnkcuSSWZmASmp6ebcqqrb30ZLqiWHJ2LaqxB
txqvGCqLh7hgfnNug6CboH2GwXxbjGzGub1ILstvxElfxdLSR5+EtmPaQt7Q3Mly0crhrbTla+nH
aupq1o3ujvDnuZzoY/a18k0TeKzXPmxP+NVjF6hgunwPsx0kxm0dMxMFAhSYF0oQpIlf/+LIAeir
mRWPohLK+8OPGMlJrugcbBkt4UiGOGVAUplG3hdrwK7FLBk0Ik1nFoAWDZilpCECy3YeDfK0AlBL
L0MNFWc1addd3qIq/Sq0qThFwKpSiuoVa5VUWV/FrGAKQ9Wnsy6gFfvW68Wml+x8BVbJFB67mq7C
xclsQF29X/FCTerYLVlNfst2guq4q6K7lzjjqbtM8eK/mydDHsxWA+gjeQ0y7VTZcx3BpaFg4wv7
tmDGb+zERpvWZsvcvcUK1uyLs+07lQ7to3oZqyGq1xtlMQyZt/SH1C3TjS1JO+3Hn6HnVniEb1RZ
omBu7+yVLXLXgzdwKvmGe3H1nhVyn/9s8WnlBWb1+dXaaonwxh5zLHWTG26BWZBKZJSR48xsRI3z
W3Hj5dVZgyDSZJ4vxhBGIWEZ3EccXRvydyBCiE0m4IQrllYXhC5w5ReGG4zY3QVQWcIjL6FdSElX
D/4H4DLcHalLPo915VY/3r1Ym5T/XHebJk6sdxBoT1rVGZcjfVhVmEw+SJ2KLDqHpiOHGcmabmcF
+Nl42XE4SQZ2RrcgYnfqteOJk0i2I4aG5UFaYmvRJRxqThEZVlvOWXXagKHFdcs1il4qnpnCPVro
pArJWMt7l2K44KOjhkbFnFYuKmiLS1o24Um0ssjmZRy4WCCliYL51ZUOfVKHZSgiGor/UlGtksy0
ebJD7LOtxnPOSp7o1GufPFE0kz9m+YntM6nOw60uZZhkEqjvkjFuu79gpNGnXvRZkzgzSWsTOe00
BG+P2uw7ThUEdQNWYx65qe20bSgMC2P6agtev20UtPDAfTiMccQHA1Lpn+X0VBFBu7CXDcME7/QR
Oua4i++qDTdjMLsppzsMywZ2FB8t+8lXiyodwOdzjOn2rOofssBHytEtf5PTZpqQEmkkSMfjsjdb
vbJnentE2KNIIoutzI1o48KRwCJ1mPHb+rQTkhlmaEg33UipfXcPee99Btdt+70EHAwJrtPWQYhg
uBJIXEDB4mH4oDjkV0hOgd6UlxQCCQ5wd+75ByBEAAA7}
image create photo ::img::qc -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP//////AP8AAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
khiecFi65TTE5G4kYDZzymiL6XRKr64j1IrtPoFbqLdLDY/H5aLWw25zplo1cECv2wkVQnM/Evfg
YHJPdoR4AXp9T34pFoyAihdATYQVA4aIgVxZjSeLnWGce5N1AZaXfJKeakEmqoKtVHN3l4hioZuR
rY+fkrJ0BKeisCtIuixWt1sDlYaHYDEXeMS5xtOrVUXLpnmYZYeLjeHYx6Djpb/NesJh0tdvwiqx
4b3n24eYRWrtkB7wjNAb+Cy7x62XQQvt3EAD9KbSMmAIDSoCggcivw7+slycxw2hOlcE/y0GAcjJ
VaAvAA96pAhKES2S9MZZK1EgQIFqLvVtefaNICxPJr+sqrZyULKBeTryBLcr3jNgTwhY0nbh4S+C
32QE1dTJJb5DpqiGtQQNYtaTOP/BSapBqilgbslGq3jEbFqN5MDSGal31sJS36T1tChRLbm9pGL2
7AmGqmC4hAvjJWYH8DI+feCSrBcKIcytWyHjIcVRquBJgCv5gUa6KSPRo6n+1Txor6GBE88lIjcF
9m3Sni04vi18by7QU8TeI17ZofFSxDmvy8jrsGXAZutRqmoWqbeFvI/JzgDMe4aB9kLuBj9zGnpC
A8tXVQ1ds7pmI1270PbcOVbhqb2Fnf8AEO3DXjygPTeebeYhtY1xkLGC3DHNKPfeYtfVZ9lDJNCV
T3jEdHeeY+gBSFZ/zmQnWXUhEsiNZsV9Yx50G4Zk34GGteiiOgTGllpVDUZDUYfUIAhHhF/g91CB
miGmWzd6FDhhiPe4uIeP/C3J5I/OZAajfp/kQSSRAGKAIn9VEnnflE4FZh+WYHGZVH+iibmPkcc8
FaWZVtFn2Wi6makUiE6xtKaT8qmGlI/XjXdnjoViEOGTUs0nHKMZBgqmLltUtKeWDnIJEXD+XUao
IxusCVmogdoDX4lsopqKmx6xqkF6gpraXpslWZpocfB51Ghqm+azE2epVeqcg6TEN+r/dcUq5h99
o9LJJ4SwxepCbZ8li2wTtAGEZrbR1nbZaqGeCy5ZmPlXZ7mfNbMKqeCKlEijiZ26bRHvykhsVMEd
4Yum+nZF0SVl+ctHeYX0AaRc2hoMBmG0RlOHaFe1VSSkjrA42GPoiFVeQj3OU/BdLrzkFqAmmjaC
itQNk2eYVJilpC30dSivRMls9Y8tNh/HrxM7S1TTTa8UOpEo4QTtcKc5ZLcTSkJxZUx+I21JjM7C
/hWQ1ca6Ue9ZyZBJkHEbOTxF2sUs9mEvNhPXbgZCba3Q0FNLEne+ApsMtrTvsJR31LXupVJnPj+T
myZuU703YG+zUrfS7lApDuF5lPj2idJoUb7RrnBzU9mHXP3tTzE/D7P36Ewznrg7f4O3EC1ZmlqO
GTP/ZLraV2a+rLqfT95xmFrdG8Mlr6Jddxq5C5HS7Jknbzvuuytk/d3Lx3EGGdQHtf0S3X+PRRXa
ix8F+Z2bTwT6wqvvPN1N/OB+EhJSML8XPsh///kweL//NCHAwfUGSMAPgCACADs=}
image create photo ::img::qd -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
koNgkEcslm45odLI3I0EQ+CgSZ09o9Bpdau6arPc8MlbworDZOn5nAYLPPC4p9WOxgKEvF4fCObu
b3g5PXRJX3YkeHsVBH0DgJB5gypfJpMpXkpaf3uLfkd3jJcnQi6FZUuJR4uCn2+qFo2UqUenpIiJ
nY19oZYXsicFmgWWtrequZKtj6NvzMAlwpoDxMgrT2Vjq6yPiSMXzIIm0sO1LNhZlYOKop+h737i
UtOlr+eD5NX2b9zo+46xYtCbtq9LDnJBqnHa1chdsURCRM0baM3gxHoLlXUDZM3RM3z0//Q180UC
ITVYkna5W/fEo8SSIc1dA5nQHDuAFccoeSnApL6CmCbV61jBFS9QdxrGg5bODFAXlyoVxOmtGzJB
AOWhkvp0zEiZVPntmsTOGc9spu7RgRjuGx8MkgKdPWesizNmct8pUqZXK1Jtau/Fe3XBFzYLgZgy
2vVwJp2VeQt7fcd41WJIdTE9klX4GwfCPPfGlZsZqkQMoD0jXg0tYC5/UAsJ4ryasG3UN72Kha37
3lhgq2tn2I3YF+Ov3uioFNU3ePHZnpG2LD35I9+xwxOfru2No2PB7S4X93q9b3fbga99LJqYL9yx
m/UCD9SV5D2szKb80sWwKNb203lnkf9v4fUBBVYZvKXfb9jdRp0lv/kHhXb7MbdgI3H18seDtYTS
kIELCrSYgge+lV19oMgWUDf6ibMefv6NdduG6dkVCXshHigafPEhOBxy9N33C4gUbiAEAfH1OCOQ
vBUDSSsTLkOPHkr2qAGH3SVoYDtUDuRiid+g991MmIXXEJLxbMDYFFZKNqaNarYTTifsffmRgzVi
ktyTrfiHoEr8jKBfm02mSFeW+zWkI51bysImL8ehmNyhGu4W13ru/Tcoc34FtRafN8G4V5yPQsoc
lniKpx2m/BWWH6eoVhooa7yIl6AyOsIYa2qIzpqbaTf1iFeepoyn16yVccCgqEwy2ev/ntD1ugGF
dxKrzamGlfVjXqT5WtmbQWV4yWWROQhqoDJaaxwnxtJmXmfl+hhrS3RaFmYH9HX24a5J9beuasB2
docr4KblDa72dsutdKANpq5M542BHWUmHlvURrta0WCosYhrgVEZk+LCcrsZNtpd64S8lcQXv7TO
sCg3BkRv19wy1KwRuXuEVVmlvLKhNUdTzmseWaUnymXtkw/QdsE0jUgqGXXYwNZx5rQQCjl7tRJQ
X2x0ygOPOF9TGGk9EEZRf+2kHwyN7dOkNZ+9BIIEj1vrIjItDXfTcn+BXzikUY3VyUKZUag1JtVk
b60Am7Wjz2gxfXRPMUEoIVRsj+izi1N7T0451yOjluLd9SJzc+cGX9SFjDQC1DbhW2Fx+FOnsxwd
WzvyYTpBQQYt8jkZ3pb547ujgjpgPUT6B9v8We2GG7PLIf30dWwC5Bo8YGHH9djroL313XPx/fHh
EzF+7+Uzcf7s6c9ATyI/tK9+Kj5wL78OPsR/PxX5U2D//kEJAQ6oR8ACfgAEEQAAOw==}
image create photo ::img::qh -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AP8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
koNgkEcslm45odLI3I0EQ+CgSZ09o9Bpdau6arPc8MlbworDZOn5nAYLPPC4p9WO5lajWM4yIPj9
d1Z0SV92LHlviXwEAYBlQQUlBUJHg1JKWoFjFm93i3+EQpGTS4mHd5iVXYymngF9jaFLmEOaLraU
preMgXmvfaxZtMO6XbZux28EA8cXwLLDS8lH0yTNjcyc2hVBjtHE1Z1So4Yuy9l6vnywAqTfkMUp
I7OUthXnnibpr3fu0ZHxbgmjFRAbO2v6Oj0h4W8YwHDzohU8F6zYHk6P/qnCE6MhPHsU/y/2Urhw
YKqNxi6V0mTQURdrF0wQS3gqIxaWIdUdCYZBZimaHH1+iWfw3p6dFTNklGdJ5pgxy2LF0gdooQYg
L2seghqDl9R7XpP23KoVzyYCyiz88TrVVUlfKOVB1BdrmQC2GOx6RdmIkUuIc62tbaSMLai7G6gK
yVc2q1qjdvt6q1rS4rK/Tc1KXuvXz5RXoNIhFH3BkZ7Mxh6DLR3a6OkjQSSrDriJDufBIl1LpRv7
cCdWgAfpbksSMiJu6DAWfh300O2qJGH6ffKL2eG8RxvLna5bnKLdenovfsPMO226tp+f5neRlzXx
fbKJs4pabt3uRQWvh49OEcLz1KR3m/8vnpWH0S8tyYdIK/XtUhqBfSW3B38GUkddg1ANmA4vUfXl
jHXxGagLPwDCNAiHe91jXYey8YOPTsjJp505g/WHTVGG4RXbPrQEd4pRsSmConUtAiIEcORhUplA
zhm5428R1nXkOq0luWNFKTkXY4WS7WgQLIw8416MsmHIm5JCLlYVKGGuuR+RymWJR4++eLnaY92A
xuNmWMo1yGL7KJRnNq09A8s+bvqoWXmjJXkZgmrxcuiYfLrUnFkKwRTelEEWJyaEs834FIN1htSp
Nt1Q+lyfTGJ6FI+DijiVo4gat2RtZM2XTohhMuoaTLKuqmhW8xnIqazgmajafcMylVb/TLKNB6V7
0YE1oJmVeEjNh8cxC+2zw2E7GrXRyijdshauyiqumn0FSqejfbUZa+g264KQbM3XyoaexQBMZ9fa
O2qEWLIU6WeDQcHdXiWaR2x1BWuAVourIZbwf5c6BoilI96jMAdogfmWuB07HNO4rFHGCrVxtUps
asq5a5haaY2asbMoZKKUphxL1SZLJwzlMM5CbRuzpXtIehBKuZiYq01DjTVrpmrlafNJQ98r1E/F
YUyj1TTNdCtQJnHdUy/UhXSvRwNEMvZGbDcdnUU7gZ3QN1mPGrcodC2IcUv2lF1PYHvD8542QP3C
ciX01DJX4XwXBa06dofddjt2zPVOmioR2qiOns2Q7O/muUQZJ2zrmmJGgFuRXnqBcFGzuOVC5303
QWL71R+pqeuC9dv/YULOSmvtruvb0GROR0YAYX7Txjb6BzwhjziNKQ187r5eYFgo/6Mc4IOvxvjA
r0FE9zqbHwb61qtPBfu2u88D/OXLTwP94dg/g9g/6M/EST7In/+cgIMBbsEHOBCgAY0RggSG74EQ
3EAIIgAAOw==}
image create photo ::img::qs -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAP//AAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
khiecFi65TTE5G4kYDZzymiL6XRKr64j1IrtPoFbqLdLDY/H5aLWw25zplo1kDWqNwWDAKFC6O9t
cGByd4QmQTEjeX16iylihoFPQYSPX4hHeIx+fycWjpGSVXOddpSKfJyGFy6gaph6j5eQAYp7jaqT
Ra2DiKmWWQO1fmFIunSxnU2+tKGhwbCMaxvGK1aeurCGA5LctM+20m+FKlWrYMNF21u636lto9Xh
ZeDphWLep2DvlaShh5pHgtmDFCyPvDf8VPlb1WuLujXanh2cllAOQmUOv5DD80yfp0sM/yPZKWMO
JMh0MQpKG1WyVYEABVShY9YSiEGON0nxqyjI1SwqD7O52pNSIi4u4xzxfDJTHVGifGA1UrmUGrml
qP5cWCQVGtd7/ARaVTqFW6hNGIZpyElColisWJvk6SZ1E7gyBRW1reUtaZayXutEA8dVX0GMOdw+
3MUK1oCvWdGCzIuY6F6bcOE4fiyYsGULhxEDpERg7jHNe4JBtSD5CWWMBgGC9EX22ObCWQVT/rZh
tdB4qItClaQV395TVK8Bof3XNlHVqxtVOJzct/LlmZ0jUs2au3GJrFOrdMG8n3bhT7lTv8Z6kpbS
2eNlm/7YlvptsXGJNwk6/lVockEXjf9AoPXU3lbFAKfdHfh8FZRHa6Q2WHuM6fRZgHmBF9wwrZ22
ICILudGbZOUpdB6DGaao4oqxhYeUefJpRddJHwlGY2TmKCifJsPVeOOPIQ7nYTyQ0cfikSmCGNWL
JlbzlGQiesCgaBXKxOEiQsq3opLQ+OcIVLZIKKR7iYQ3XkNMDrLjgWz2lF87jJzZZZUoZRDgnK7g
pwh3fRiFp47kcIaJP2NOh5Me3vX5UJZXTcEcPnxdIBBVpQmK6Fx/NkoHbb2BNqlEYW5V6ZJekgeW
p8iJlVyXWxHIaG1OptXpp37KZuYpafYUa1oOCpVXZ2q1imupnQjKYLCcJMcUYWnxlqv/RtXc9FZg
OOUXWbCo5EMsLoqdU5S1qHRV5FMgDnkVnGKJV2tUdt3FEKZ0jtKtGi2K6huUEG1rlVj9ZMAVs9F8
pFa8fp0LKsBL/oHpwOZ+opM1xpFqyHCmfYRLkxtlUYmRrq3TzMKFlfBSTGpmXFNJv5o2Y7l2/pIG
HQsx6N5hFZVZhIwIxSUiGOP59IXK84UoGGBu8EwgJHN0pAxuFOlcNGxKw5PSFndB+HI1VhcT7tFS
Z3JzyP6U7PA+Xcl5ksoYjXPds8RMs3RU4Jnk9c3ljsX2UbnwuN/GbKUdR3NY483FYBKqTUssMpqF
scN4k0duxXNcx5Ir5ZSlseNoqSOIXizJUNLy3YyrcSVNXEpOia5XZywDjo5NOXTglUP7X5S0Swlt
6mdIEfuzuS9hhuy9K7F7VcHTMHzxuv/OO/Krf/4D80m4RwH0XvjwPPVRWE8B8dhfFQIOtYcvvgUh
RAAAOw==}
image create photo ::img::tc -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
CiOghUcsAn9C4cXItOVGwWBzuorGrNRsCovVekncZ+6rDYPHLmlxSDQnt8t1fOdWlzTtTE/8tp8x
eYB0fHppgoOHTmd/aCeJiH4zkVVQlY0sQ5mTKpuGHZIel5SGjqGdSqE0dommp62icKVsjB4tr6qN
j4BXc3+yUKiwsYuaJmxiub1KYL6KwYWynNDRebTTtHCP2HvW2jJ4ZFKZy4GnRn6ziMvpVOjm2Z9l
wnum8vL1We/Zxq3885j/pKXbFcyfvlL0eh1r1o0bJHZ3JoHTcTCit4vXQJULSAmiRie8/0KCXFfx
ID5bqXDhOikw5TeOzzigZAlwpcuWtT6CGufN05WCKkcCYfjyCdGXcmB2lLPxnLKgZKKmkUqVX9Wr
Fa86fOjUI9JATbx+XcmM3M6yYoftBNbz18+2U9fm7Hizptx4dOeitKkXXt9RfDfcnTj2rCalh83q
pPgUZNZFDyNhhCstodfLGQsHRrNQMWGojAcuCamGcmWwFm+mtduuXz6lResyeQzw71mEXhKvXoo7
XGPDZmnH3u2zEO3JjbXlFI65p8flsDuz0xWFqKU32IcPpZ6MpzLqmwXXVv0d5q3xesEPFp8X79Hs
M923/8za8HWyiZ1xTbopTpfQv8X33FAufEQGW2oDElMggMQVJ0odB27T1DCVQEZPWP0RsqBW1STx
H4cOVQgfiM6IKByIEJK4ES9gIKEigMRQ8GI+OMwYFgwR2vhCCBS84uOPoYQQAQA7}
image create photo ::img::td -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
CoMBKRjkGY+CW65IJCKftqWwCBRCr6xRdcvFek9appX6LSelXLLZG56OrSn4Va5rp+kl51wdHbr9
cU1QTXgydlR8VYRIhIkth4smjXo7k44rdop4loUynHU5M5yXK6OdKVqepqcoq6wmqUOlo5W0NLGU
rZZGn31+uZK7PL23UpG6x3EskzttySfP0KSar6jGgrOs0cHV1nnYy8uN4Ua406LCZbFAe8xm6+3p
bKFYrur09bZf8DSnxK1H+Knq9I9bOXzogH3bRq0HwhbukF2KWExHwYUqLmZ5mG1cxo4M/1UIDKRR
XElvCfUNVLmxhqlaJ11wzCjPZc1HM0l6hLlzxkiaIVcqxDkM3JGgInNmy9dN5tEvTZ2umYqSqlUS
P69iyaoVCteuSL6CPfjUS1QwSoEyJcvzrE63Z9qeM2nUZ1puPW1SNHR3Yd5+N1sCjvn2L6a+9gaz
PKw3MN29ghWH9Oc4qUXHQ6nVJXqZoWfDkRsTBI20amegpOeatghyc56AfUWDDhs7JeFmtW3Phr3m
tie0vSsPhpX7dWttQkuIlabNNcbjWIsHzfyLlLvl1amzg17YCnbfEj9T+i78uHU1y192rkxHbGLd
kC1L3t3d+WqI5VFHw0aFfHyhdY3TX1Ru/8GnCyADFqWdbYEg6F1xiqzV4BYJ8gLVLA5GN9ZRb3CB
3YbfZBgXiLWI+CGJiPwxIomyefgDi40B4gOEMIKBQ41hwUAjiS+EQIEHQAYpZAchRAAAOw==}
image create photo ::img::th -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
CoMBKRjkGY+CW65IJCKftqWwCBRCr6xRdcvFek9appX6LSelXLLZG56OraVm3EmTD+m0dhpelTfV
K39udjN6VGSCg4QqiX2LWWiHcImULZSNhZF/c5ePKJ2bmXd3aqCeJ6Z4LVoyqYCfrnk5M6m0plE1
ta23spx9sJe5nTptYq/BpJN4yLiOoaiCnE7Ryaq9zqfO0tPU2j1SmCmqrnzWzdh84tC6cUis3jrk
X++/PPJss+1H7Fj0UPxX/P0bVkbgwHDz8u1CNK6bI2nEFLKI5vAZtovXFvqpWIqiQ0h1/2KZSHdP
hkFgvAKJNCmR0UqXAFecXJcSZk2QIUHZ0plRI7OJN3HmrDQUIcsdP3d+PIp0qVJzTJtCLWpkJtB0
9l71RIoF67k1YMG0DLvGKtl+Y88mROLVnru0lrTGkxt17tSnVeHavHs1m9CifvcGTmF2JMGnTmXq
NcwzbuO6jg/3Tfp3smRxLyurjEnzsWbBlDtfVgw4KcnMpBEraljOo8XPgjFWY8xtsInCEJPRZq2M
LuHFWY2iNeM5IHBhxZ/gLp2YlovjqolKFfulJHI1yz+JNh0ZT3bGuyXfRfZ9djVjhF5vs1M+nOtl
TslDPw+fof2lG6lkTw7aU+0Sy3GGUntoKgQYFGb8/caccNtJt8px1iFYkx36QYhag+5tUuGCzdEn
nSRc4NYIg+GtxtAoGwImm2UrgpjiULkpFeMoW7yo1j5vhDjfjbCgaEV5PM7hIwlABrmHjkYa4RGR
PyQpVY4+7OikTDhMCYUPOEhp5QshUODBl2CG2UEIEQAAOw==}
image create photo ::img::ts -format gif -data {
R0lGODlhRwBgALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAAALAAAAABHAGAAAwT/EEgZqr046817niBQCWRpnmiqrixahUErz3QdTHGt7/wt
CiOghUcsAn9C4cXItOVGwWBzuorGrNRsCovVekncZ+6rDYPHWyp6Z06qhkx4T+yWnjBG/PxcX5/1
bBl7SYJ3G4EagXxKfh5OHDp2LR6Sb5ROjx0zlH5VnVucnyWhooYuoJyToTSScqOrJmukrGiAf0NX
tq6CuUubY4mxcGJ2usO3mIy2hp/BLpW0t8uvrtK+wtXRyteZzllSUG6Rl2Wy0L+O5cxEs9+liORq
7+Op7nnMuNt3efOW5lHIsBU5pyobNU8GZRBEyI0aNG/aujVUeGgcvYroMP6SCNGfpogU/9MV/Lgx
o0iPJ1ksxBYPJUlVtOoxTOkpZr5CM6/oK5kRTMCRPhklm9NP5cqaRI/OZFeUjDynUJ9FnbqIKlSl
zxKaZDoQK8KumYJORPXkJ0Wb4XC6BLLzrMmXZGlaQgs3a0ujdCEZlQkzr9qcHZG+DWxXL8/BY11O
w3tx8d6/bhs/HEuYMTxRWh33JYpPbDWtm3vgS7usqVR3fJt4DXk3jumRckOaKhdbtjAvqTfmevWl
NuAulwtPdKx3tcC45zJX9OqLWC1uzc1uA1aUV1slLEk3NOYX4r/Wn6vD+h24kfjco+vO7Z44feXT
iDVn1xia9Xv3w4fRkQwaeTZe+/HH1ElibRgnDT8JFfjaQa5hRgdwok1RioJWucYHhBUqQkiAGWoI
BYcdJvNhVSFKVAcSJYZFCAUpqoFDi3HAsGCLL4RAASk45khJCBEAADs=}
image create photo ::img::back -format gif -data {
R0lGODlhRwBgALMAAAQCBPz+BMTCxAQC/Pz+/Nza3PwC/AAAANAB344A2hYA1AAAd9gYAI7rABYS
AAAAACH5BAEAAAUALAAAAABHAGAAAwT/sEgJqr046817nmBREWRpnmiqrixahUArz3QNTHGt7/wt
8sAg65YrDY7I5ECgbDKbySf0KJ2eRsZpVFvlerVIE5akzG6dTTOyS02Tk+IiAR4g1NFnun2u7LL3
d2ElY3wDdgMGA4F5fwGIioVrkmWOiYtxJkeHdY53kUxVc5ujhluhhp2khoNymgQGe7CGsFK1r6Kw
dbK3tWu3s7FvmFmjqaWSp8WQx23JqcarJIRhlct9k3SPi9iN2oXDb5qckW151Ht42Ofb4OSi6b1l
zNzqmvPRBNPy12Hm9vz/ysFxI01OKFnqfiVEKBCYOYVU2i0ZWO/exH4VyV0MOFHixngD/zWC/GNx
pKuCmRpuXCcSIMt0Aj0K7GappUpU3uDBYZUSWchnyz6tFAXUk6kyPNXM/HVLFy4CI5nmkgo1Y9Jw
zX5CMibU2dagR3eiVAOSWk6ANK0xEpuvlcpG6FyuFBfXnxSPJuXZ/JimJD18005lhClU78Mt7Q4W
1sRwaGPFDx/LxHh4sMvFlAWNxVpqb1l7nge7uxoJ0N6bpmHORVUXsFucNXVSOrt2duyTbVMqM+qz
3+53vUEX5eORxNRdtLhRdQosKvJgxEmL+8obNU5OYC9fVyXz0G1/ttVCSXtJ+ku5UFKDWa0etz7f
sq1YrB0S6WaNpzWKBYOZo3uDcDwWoP9+AgjACxsOLfSJRIJZp4VS+1TWBl5/1SeffqDF94RMfqQx
Djbt3fWhXHeZN5OHZxFXTSAq0lahaz1l5dtwJtBYwnDzgGJfbhDa8hxzy1EFDJDJoWaicj8K2ZSS
xz31GYxK6TgjdSfYSAKOXe34Hl/hsTjdbS1+9yKH6IV43kbt1VPifSdah2FnD/rVJoMUOWgFZxEm
hBhpkCk4nnEkIAiRYwse6d9Q/OFZJ3sE8cgZcPSlN9+LGbK1ZZo3edjaFHCxY6J34mVqlpiqwaZW
cViCRxSVcgrHKpTCLPmcc08RWdVSScISHZvbcRWWq9hVN5FXwe7q6Dcrhtalstl8Nxn/pnN1ehp7
I/4XI5xoiaZhX6PxumhD/bWaY19aAhiGgOdiNmif4EomXYOMameZhB2Zl5eF9JHE7IYmdkjJptFq
us1bmh0b6ZehctlswmVNNqxWxY5LLClZWvoakrVSReuQGlvlrYzAUvxrZ6kGZy1ZGSUb36gMJ9Rv
mdWqKfC0axqssL7bGpZtOXRmRpK8btLLRGIDRqYuuowdXejHh8L7s9DkWnwtpBXivDOj3dpM18AB
/8u1v3p46i2oX6fsYpsLl8frbxJDLLLJq0YMa3RNNocxx7PeLWusa5cMMsmsVhwyNN2pfDXLZaNm
+Nxh0zyzatJKrVSP4xFUKnuPGsrpNRfrIShquSd0LjoYnle0Yz4/CKH66j7IsfrrOviQOuy0yyA7
Ba7XrntbIeDgwe/AB99BCBEAADs=}
image create photo ::img::s -data {
R0lGODlhDwAPALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAIALAAAAAAPAA8AAwQkUMgpAr00aHy155IncmLZlWaIouo6unAsz1ZtjlVrYR+o
75MIADs=}
image create photo ::img::h -data {
R0lGODlhDwAPALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAIALAAAAAAPAA8AAwQjUIhBh5z11rwp7l8njmRpnmRYSqjFmtc7xppIx+CNezrt
0hEAOw==}
image create photo ::img::c -data {
R0lGODlhDwAPALMAANnZ2QAAAP///////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAIALAAAAAAPAA8AAwQmUMgZ6ry3apz15oL3caIFhh64rSZaiu4rz7QcB+FNmbh7
jr/UJQIAOw==}
image create photo ::img::d -data {
R0lGODlhDwAPALMAANnZ2QAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACH5BAEAAAIALAAAAAAPAA8AAwQkUMgpBr10aHy155IncmKJlWOGptVqhu6mrqdLomD75To/
WZgIADs=}
image create photo ::img::quest -data {
R0lGODlhIAAgALMAAAAAAAAA/4SEhMbGxvf/Mf//////////////////////////////////////
/////yH5BAEAAAQALAAAAAAgACAAAAS2kMhJibj41s0nHkUoDljXXaCoqqRgUkK6zqP7CnS+AiY+
D4GgUKbibXwrYEoYIIqMHmcoqGLSBlBLzlrgzgC22FZYAJKvYG3ODPLS0khd+awDX+Qieh2Dnzb7
dnE6VIAffYdldmo6bHiBFlJVej+PizRuXyUTAIxBkSGBNpuImZoVAJ9roSYAqH1YqzetrkmzGaI3
F7MyoaYvHhicoLe/sk8axcnCisnKBczNxa3I0cW+1bm/EQAAOw==}
##+##########################################################################
#
# GetBestMove -- computers AI for determining which card to play
#
# returns [list $move $draws $newSuit]
# move : which card to move, e.g. kh
# draws : how many cards were drawn from the deck
# newSuit : for an 8, which suit should be current
#
# Data Structures:
# CARD($who) : cards in players hand
# ROUND(move) : list of every play so far, each entry is
# [list who move draws suit]
#
# Possible ideas:
# o don't reverse if previous player has 1 card and played an 8
# o change suit if any previous player has 1 card and played an 8
# o play card that has most like-value cards already played
# o always play "special" card if possible
proc GetBestMove {who} {
global ROUND CARDS RULES S
set draws 0
while {1} {
foreach {all suits values eights} [GetLegalMoves $who] break
if {$all ne {}} break ;# Move available
if {$RULES(Draw1) && $draws > 0} break
set newCard [Draw $who]
if {$newCard eq {}} break ;# Empty deck
incr draws
}
if {$all eq {}} {return [list cant $draws ?]} ;# No legal move
if {[llength $all] - [llength $eights] == 1} { ;# Only 1 non-eight move
return [list [lindex $all 0] $draws ?]
}
if {$values eq {} && $suits eq {}} { ;# Only eights
# Pick suit with most points
set newSuit [lindex [SuitTally $who] 0 0]
return [list [lindex $eights 0] $draws $newSuit]
}
if {$values eq {}} { ;# Only suit match
# TODO: pick best value of the cards in this suit
set best [lindex [SortHandByScore $suits] 0]
return [list [lindex $suits 0] $draws ?] ;# Return largest value
}
if {$suits eq {}} { ;# Only value match
# TODO: pick best suit
set best [lindex $values [expr {int(rand()*[llength $values])}]]
return [list $best $draws ?]
}
# Here we have choice of both value and suit
# Always switch to a new suit (for now)
set best [lindex $values [expr {int(rand()*[llength $values])}]]
return [list $best $draws ?]
}
################################################################
DoDisplay
NewGame
return
Comments edit
uniquename 2013aug01
This GUI deserves an image to show the nice quality of the gameboard and the playing cards --- the backs of the cards as well as the faces.