Version 63 of Spider Solitaire

Updated 2005-07-30 16:33:46

Now at Version 3.4, updated July 29th 2005

MG April 27th 2004 - Ever since I started learning Tcl, I avoided the [canvas] widget like the plague; when I first started, it looked far more complicated than other things, and I just never got around to learning. But then it turned out to be the only way to do something I needed, so I learned, and sorely regret not doing so before; I've been missing a lot. So, to practice my skills with the widget a little -- and after seeing Jeff Godfrey's cardgame, Once in a Lifetime, which looked (deceptively:) easy once I read the code (reading it is always easier than writing it, alas...;) -- I decided to code a version of Microsoft XP's Spider Solitaire game. A few of the routines are taken, more or less directly, from Once in a Lifetime, as are the card images (originally from scat, and [L1 ] before that, according to Jeff's page). Although it got easier as I went on, I was kind of lost at the start, and would've been totally so if not for Jeff Godfrey's code as an example, so thanks very much :)

With nearly all the features of Microsoft's Spider Solitaire (apart from sound effects, as I couldn't be bothered finding decent .wav files, decent animation (what's there is poor), and the ability to save games (quite easily added, but for when I've not been spending 7 hours straight on it), it's quite complete. It has rules/help, but they're terrible - I'm no good with help-files at the best of times.

There's also a hidden cheat which lets you see what all the cards are (and toggles it off again). Though, given that the code's not compiled, it's not all that hidden, I guess... :)

(Apr 27th - Fix added to 'Restart Game' option.. and several others, mostly in the way suitable moves are checked for. Also added an option to turn the console on, while debugging the errors.)

Apr 28th - Fixed a bug with undoing, where a tag was being added where it shouldn't (always) have been.

Apr 28th - Edited the generateGoodMoves procedure. Previously, it wouldn't recognise moving (for example) the 7 of Hearts onto the 8 of Spades. Now, as long as there isn't an 8 of Hearts available (which is obviously a better move), it will do.

Apr 28th - Updated so that when a column has more than 12 cards face-up, the (vertical) spacing between each card in that column is smaller. That stops the problem with the last cards in a column disappearing behind the scoreboard, or blocking out the new cards to be dealt. Also fixed a bug which appeared if you clicked to deal a new row quickly, which made it try to deal more rows than there actually were.

Apr 28th - Yet another bug, this one seems to have been introduced during a previous 'fix' (or so I call them:). The procedure checkForWins has now been simplified down a lot to make it quicker; now, as long as [getTopCards $column] returns a list 13-long, there's a complete line there, and we clean it off.

Apr 30th - a few more minor bug fixes/improvements. Still not fixed the bug found by LES a couple of days back, though; hopefully that'll happen soon.

May 17th - Changed the way the Show Good Move feature works, since the old style looked a little crude, IMHO. The code for the old way's still in there; the $animatetype variable set near the start (which should be 1 for the new, 0 for the old) controls which is used. Also fixed a 'bug' in the same feature that allowed it to show multiple moves at once, thus making it totally unusable. Now it refuses to show a second, while the first is still playing (win XP's version queues them, but this was a heck of a lot easier:) The bug reported by LES mentioned previously is also fixed, now.

May 17th - Another fix; now you can only deal one row at a time, too, whereas before clicking on the new decks rapidly and repeatedly started dealing several times at once.

May 18th - fixed the bug found by KBK (see below code). Changed to version 2.0, and will now make a conscious effort to change the version number every time the code changes, since I hadn't been :P

May 21st - now when you select a new difficulty, the default button is different; if you're currently playing with 1 or 4 suits, the default button is 2 suits. If you're playing with 2 suits, the default button is 1.

June 11th - Several new fixes, mostly stopping you picking up cards when you shouldn't (like while you're dealing a new row). Also, a change to the scoring - you now get 100 points when you clear a stack/suit, the same as in MS Win XP's version. The help has also been updating w/the scoring changes. Generally less buggy, hopefully :) It also now works in Tcl/Tk 8.3, as well as 8.4, by supplying a (very crude) version of "lset" and "lsearch -all", as well as checking which order the arguments for trace should be in.

July 6th 04 - UPDATED: Some major changes to the code, hopefully completely removing every last bug (famous last words). Tested (albeit briefly) on WinXP, there appears to be absolutely no point at which you can pick up a card when you shouldn't be able to, put a card in the wrong place, etc. Just don't quote me on that :) Should still work with Tcl/Tk 8.3+ . If anyone uses this newer version and finds a bug, please let me know. :)

July 9th 04 - Changed 'Restart Game' to F5, as the F4 binding was getting confused with Alf+F4 on Windows.

July 15th - Added some animation when dealing a new row, and clearing a complete column/stack, with the code from the extremely long-titled Move an item on a Canvas Widget in a Straight Line (animated)

July 16th - Updated the canvas-animation code so that it actually works ;)

Anyways, enough rambling. Here's the code (written and tested only on Win XP Home)...

LES: Tested on Windows 98 SE. Impressive!

HJG 2005-07-29 Tweaked the logic for detecting 'game in progress', and changed the positions of extra-cards & discard-pile. But I could not find how to adjust them when the window is resized, like the score-box does.

MG The score box isn't actually a canvas item. IIRC, it's a label widget which is placed halfway across the canvas widget.

And just a quick note: Please don't comment out things if you haven't looked to make sure you know what you're doing. Someone made a change and commented out the set app(author) "Mike Griffiths" line, thus breaking the 'About' dialog. Presumably this was someone who wanted to point out that they'd made some changes to the code - there's a "credits" section in the help. Please feel free to add your name into it, but don't make unthoughtout changes elsewhere and break it for everyone. Thank you.


 # Spider Solitaire, based on the card-game shipped with Windows XP
 # Mike Griffiths, April 25th 2004
 # Some code, and the card images, taken from Jeff Godrey's
 #     "Once in a Lifetime", at http://mini.net/tcl/11193

 # History:
 # 2005-07-28 "set y 470" - to prevent collisions with long stacks of cards, 
 #            moved 'extra cards' and discard-pile to align with score-box.
 # 2005-07-29 "set data(playing) 1" - corrected Status for 'game in progress', 
 #            to allow bypassing confirmations (new game, quit program).

  set app(name)    "Mike's Spider Solitaire"
  set app(version) "3.4"
  set app(date)    "July 29th 2004"
  set app(author)  "Mike Griffiths"
  set app(email)   "[email protected]"

  set data(cheating)    0
  set data(playing)     0
  set data(suits)       1
  set data(moves)       0
  set data(clears)      0
  set data(score)     500
  set data(undo)       {}
  set data(goodmoves)  {}
  set data(newdecks)   {}
  set data(drag,bad)    0
  set data(showingmove) 0
  set animatetype       1
  set data(dealing)     1
  set data(alldeals)    0
  set data(numnewgames) 0

  for {set i 1} {$i <= 10} {incr i} {
      set data(col$i) [expr {10 + (78 * ($i - 1))}]
      set data(col$i,cards) {}
     }

  proc chkExit {} {
   global app data
   if { !$data(playing) || [tk_messageBox -icon question -title $app(name) -type yesno \
             -message "Do you really want to exit?"] == "yes" } {
        exit;
      }

  };# chkExit

  proc move {c item tox toy {time 25} {steps 1}} {

   scan [$c coords $item] "%s %s" origx origy
   set diffx [expr {abs($origx-$tox)}]
   set diffy [expr {abs($origy-$toy)}]

   if { $diffx > $diffy } {
        set stepy [expr {$steps*1}]
        if { [expr { round(ceil($diffx + $diffy))}] == "0" } {
             set stepx 0
           } else {
             set stepx [expr {$steps*(double($diffx) / $diffy)}]
           }
      } else {
        set stepx [expr {$steps*1}]
        if { [expr {round(ceil($diffx+$diffy))}] == "0" } {
             set stepy 0
           } else {
             set stepy [expr {$steps*(double($diffy) / $diffx)}]
           }
      }
   set dirx ">" ; set diry ">"
   if { $origx > $tox } {
        set stepx [expr {$stepx*-1}] ; set dirx "<"
      }
   if { $origy > $toy } {
        set stepy [expr {$stepy*-1}] ; set diry "<"
      }
   while {1} {
     scan [$c coords $item] "%s %s" nowx nowy
     if { $stepx == 0 && $stepy == 0} {return;}
     if { [expr {round(ceil($nowx-$tox))}] == 0 } {
          set stepx 0
        } elseif " [expr {$nowx+$stepx}] $dirx $tox " {
          set stepx [expr {$tox-$nowx}]
        }
     if { [expr {round(ceil($nowy-$toy))}] == 0 } {
          set stepy 0
        } elseif " [expr {$nowy+$stepy}] $diry $toy " {
          set stepy [expr {$toy-$nowy}]
        }
     $c move $item $stepx $stepy
     update idletasks
     after $time
    }

  };# move

  proc main {} {
   global app data

   menu .m -tearoff 0
   . configure -menu .m
   menu .m.file -tearoff 0
   menu .m.help -tearoff 0
   .m add cascade -label "File" -menu .m.file -underline 0
   .m add command -label "Deal!" -command {dealRow} -underline 0
   .m add cascade -label "Help" -menu .m.help -underline 0
   .m.file add command -label "New Game" -command newGame \
                       -accelerator "F2" -underline 0
   .m.file add command -label "Restart This Game" -command "newGame 1" \
                       -accelerator "F5" -underline 0
   .m.file add separator
   .m.file add command -label "Undo"          -command undoMove \
                       -accelerator "Cntrl+Z" -underline 0
   .m.file add command -label "Deal New Row"  -command dealRow \
                       -accelerator "D" -underline 0
   .m.file add command -label "Show An Available Move" \
                       -command showGoodMoves -accelerator M -underline 18
   .m.file add separator
   .m.file add command -label "Difficulty..." -command setDiff \
                       -accelerator "F3" -underline 0
   .m.file add separator
   .m.file add command -label "Exit"          -command chkExit -underline 1

   .m.help add command -label "Rules"         -command showRules -underline 0 -accelerator "F1"
   .m.help add separator
   .m.help add command -label "About..."      -command aboutSS -underline 0
   .m.help add separator
   .m.help add command -label "Show Console"  -command {console show} -underline 0

   canvas .c -bg darkgreen -borderwidth 0 -highlightthickness 0

   .c bind card <ButtonPress-3> {set ::data(belowCard) [.c find above \
      [set ::data(raiseCard) [.c find closest %x %y]]] ; .c raise $::data(raiseCard)}
   .c bind card    <ButtonRelease-3> {.c lower $::data(raiseCard) $::data(belowCard)}
   .c bind topcard <ButtonPress-1>   [list dragStart %x %y]
   .c bind topcard <B1-Motion>       [list dragging  %x %y]
   .c bind topcard <ButtonRelease-1> [list dragEnd %x %y]
   .c bind newdeck <ButtonPress-1> "dealRow"

   bind . <Control-Alt-c> cheat
   bind . <F1>            {showRules}
   bind . <F2>            {newGame}
   bind . <F3>            {setDiff}
   bind . <F5>            {newGame 1}
   bind . <KeyPress-m>    {showGoodMoves}
   bind . <Control-z>     {undoMove}
   pack .c -expand 1 -fill both
  #wm geometry . 800x550
   wm geometry . 800x600
   wm title . "$app(name) Version $app(version)"
   wm protocol . WM_DELETE_WINDOW chkExit
   catch {wm iconbitmap . -default ./16.ico}
  #catch {wm state . zoomed}
   frame .c.f -height 100 -width 200 -bg #000088880000 \
                          -highlightthickness 2 -highlightbackground black \
                          -highlightcolor black
   place .c.f   -in .c -relx .5 -rely 1 -x -100 -y -125
   label .c.f.l -text "Score: < Not Playing >\nMoves: < Not Playing>" \
                -foreground white -font [list Arial 10 bold] -bg #000088880000
   place .c.f.l -in .c.f -relx .5 -rely .5 \
         -x -[expr {[winfo reqwidth .c.f.l]/2}] -y -[expr {[winfo reqheight .c.f.l]/2}]
   bind .c.f   <ButtonPress-1> {showGoodMoves}
   bind .c.f.l <ButtonPress-1> {showGoodMoves}
   if { [package vsatisfies $::tk_version 8.4] } {
        trace add variable data(score) write setBoard
        trace add variable data(moves) write setBoard
        trace add variable data(undo)  write chkUndos
        interp alias {} lsearchall {} lsearch -all
      } else {
        trace variable data(score) w setBoard
        trace variable data(moves) w setBoard
        trace variable data(undo)  w chkUndos
        proc lset {var at with} {
                   upvar $var upd
                   set upd [lreplace $upd $at $at $with]
                  };# lset
        proc lsearchall {args} {
          set ret {}
          if { [llength $args] > 2 } {
               set op   [lindex $args 0]
               set list [lindex $args 1]
               set find [lindex $args 2]
             } else {
               set op "-glob"
               set list [lindex $args 0]
               set find [lindex $args 1]
             }
          for { set i 0 } { $i<[llength $list] } {incr i} {
                if { [lsearch $op [list [list "[lindex $list $i]"]] [list $find]] != "-1" } {
                     lappend ret $i
                   }
              }
          return $ret;
         };# lsearchall

     }
   focus -force .c

   if { [info commands console] == "" } {
        proc console {{args ""}} {
          tk_messageBox -icon info -title $app(name) \
                        -message "The Console is not available on this Operating System."
         }
      }

   for {set i 1} {$i <= 10} {incr i} {
        makeTray $i
       }
   dealRow 10 -1 0 0

  };# main

  proc aboutSS {} {
   global app

   set text "$app(name) is a version of the 'Spider Solitaire' game shipped with MS Windows XP, written in Tcl/Tk. It was last updated on $app(date), and is at version $app(version).\n\nCode by $app(author) (email: $app(email)), with some code (and card images) taken from the game 'Once in a Lifetime', by Jeff Godrey."
   tk_messageBox -icon info -title "About $app(name) Version $app(version)" \
                 -message $text

  };# aboutSS

  proc showRules {} {
   global app

   set w .rules
   if { [winfo exists $w] } {
        wm deiconify $w
        raise $w
        focus $w
        return;
      }
   toplevel $w
   wm title $w "$app(name) - Rules"
   frame $w.f
   text $w.f.t -wrap word
   scrollbar $w.f.sb
   $w.f.t  configure -yscrollcommand "$w.f.sb set"
   $w.f.sb configure -command "$w.f.t yview"
   $w.f.t tag configure head -font {{} 20 bold} -justify center
   $w.f.t tag configure sub -font {{} 16 italic} -justify center
   $w.f.t insert end "$app(name)\n" head
   $w.f.t insert end "Version $app(version) - Rules\n\n" sub

   $w.f.t insert end "$app(name)'s rules are almost identical to those of Spider Solitaire, shipped with MS Windows XP. There are ten columns of cards, made up of either 1, 2, or 4 different suits (this can be changed in File->Difficulty). The aim of the game is to remove all the cards from the ten stacks at the top in as few moves as possible.\n\nTo remove cards from the ten stacks, move the cards from one column to another until you line up a suit of cards in order from king to ace (this is a 'stack'). When you line up a complete suit, those cards are removed. You can only move a card if it has no cards below it, or the cards below it form a 'stack' (for example, you can move a 5 of Hearts only if there are no cards below it, or the card below it is the 4 of Hearts. The same applies again; there must be no cards on the 4, or it must be a 3 of Hearts, etc.) When a stack is lined up of a complete suit, it is removed from the table.\n\nYou can stack a card onto one of another suit, as long as its value is one higher (six of Spades on a seven of Hearts, etc). However, the higher card is frozen in place then, because the stack below it doesn't match suit.\n\nIf there are no moves available, click on the extra cards in the bottom-right once; this will deal a new row. You can see if there are any available moves by clicking the Score Card (the box in the bottom-center of the screen, showing the score and number of moves.). When all the cards are removed, the game has been won.\n\nSCORING:\nYou start the game with 500 points. Every time you move a card (or undo), you lose one point. Dealing a row does not cost any points. You gain 100 points for every stack you successfully clear.\n\nUNDO:\nYou can undo your last move (by selecting 'Undo' in the File menu or pressing Control+Z), as long as your last move was not dealing a new row or removing a stack.\n\nDIFFICULTUES:\nThere are three difficulties (you can change which you're using by pressing F3, or via the File menu); the difficulties are Easy (1 suit), Medium (2 suits), or Hard (4 suits).\n\nCREDITS:\nWritten by $app(author) ($app(email)), with some code by Jeff Godfrey's \"Once in a Lifetime\" card-game, which can be found at: http://mini.net/tcl/11193"

   $w.f.t configure -state disabled
   pack $w.f    -side top   -expand 1 -fill both
   pack $w.f.t  -side left  -expand 1 -fill both
   pack $w.f.sb -side right -fill y
   frame  $w.f2
   pack   $w.f2 -side top -pady 8
   button $w.f2.b -text "Close" -command "wm withdraw $w" -width 9
   pack   $w.f2.b
   wm protocol $w WM_DELETE_WINDOW "wm withdraw $w"
   focus $w.f.t

  };# showRules

  proc setBoard {args} {
   global data

   .c.f.l configure -text "Score: $data(score)\nMoves: $data(moves)"
   place .c.f.l -in .c.f -relx .5 -rely .5 \
         -x -[expr {[winfo reqwidth .c.f.l]/2}] -y -[expr {[winfo reqheight .c.f.l]/2}]

  };# setBoard

  proc makeTray {col} {
   global data

   # Make a 'tray' for each stack of cards. This is a totally invisible
   # rectangle on the canvas, just so we can tell when we're hovering over
   # an area of cards.

   set x1 $data(col$col)
   set x2 [expr $x1+[image width ::img::back]]
   .c create rectangle $x1 10 $x2 800 -outline {} -fill {} -tags "tray.$col immortal"

  };# makeTray

  proc cheat {} {
   global data

   if { !$data(cheating) } {
        foreach x [.c find withtag backcard] {
                .c itemconfigure $x -image ::img::$data(card,$x)
               }
        set data(cheating) 1
      } else {
        foreach x [.c find withtag backcard] {
                 .c itemconfigure $x -image ::img::back
               }
        set data(cheating) 0
      }

  };# cheat

  proc shuffleList { list } {

   set n [llength $list]
   for { set i 1 } { $i < $n } { incr i } {
         set j [expr { int( rand() * $n ) }]
         set temp [lindex $list $i]
         lset list $i [lindex $list $j]
         lset list $j $temp
       }
   return $list;
  };# shuffleList

  proc clearBindings {{rtag 1}} {

   # --- remove the bindings from all cards
   if { $rtag } {
        foreach id [.c find withtag topcard] {
                .c dtag $id topcard
           }
      }
   .c bind topcard <ButtonPress-1> {}
   .c bind newdeck <ButtonPress-1> {}
   .m.file entryconfigure "Deal New Row" -state disabled
   .m entryconfigure "Deal!" -state disabled

  };# clearBindings

  proc updateBindings {{clear 1}} {
   global data

   if { $clear } {
        clearBindings
      }

   # --- add bindings to only the top cards
   foreach card [getTopCards] {
          .c addtag topcard withtag $card
       }

   if { [info exists data(newdecks)] } {
         foreach x $data(newdecks) {
              .c raise $x
            }
      }
   .c bind topcard <ButtonPress-1> [list dragStart %x %y]
   .c bind newdeck <ButtonPress-1> "dealRow"
   resetDealOptions

  };# updateBindings

  proc generateGoodMoves {} {
   global data

   # Work out which cards (if any) can still be moved.

   set data(goodmoves) {}

   for {set i 1} {$i <= 10} {incr i} {
        if { [set temp [lindex [getTopCards $i] 0]] != "" } {
             lappend fullList [cardInfo $temp]
           } else {
             lappend fullList [list 0 X]
           }
       }

   for {set i 1} {$i <= 10} {incr i} {
        set top(i) [lindex [getTopCards $i] end]
        if { $top(i) == "" } {continue;}
        scan [cardInfo $top(i)] "%d %s" top(v) top(s)
        incr top(v)
        set search [lsearchall $fullList [list $top(v) $top(s)]]
        if { $search != "-1" && $search != "" } {
             foreach x $search {
                     incr x
                     lappend data(goodmoves) [list $i $x]
                    }
           } else {
             set search [lsearchall -glob $fullList [list $top(v) ?]]
             if { $search != "" && $search != "-1" } {
                  foreach x $search {
                          incr x
                          lappend data(goodmoves) [list $i $x]
                          }
                }
           }
       }

  };# generateGoodMoves

 if { $animatetype } {
  proc showGoodMoves {} {
    global data

    if { $data(goodmoves) == "" || $data(showingmove) || $data(dealing) } {
         bell -displayof .
         return;
       }
    set data(showingmove) 1
    set timer 300
    set thismove [lindex $data(goodmoves) 0]
    set data(goodmoves) [lrange $data(goodmoves) 1 end]
    lappend data(goodmoves) $thismove
    set card0 [getTopCards [lindex $thismove 0]]
    set card1 [lindex [getTopCards [lindex $thismove 1]] 0]
    set img1 [.c itemcget $card1 -image]
    foreach x $card0 {
             set img0($x) [.c itemcget $x -image]
             .c itemconfigure $x -image ::img::anim
            }
    update
    after $timer
    .c itemconfigure $card1 -image ::img::anim
    update
    after $timer
    foreach x $card0 {
            .c itemconfigure $x -image $img0($x)
           }
    update
    after $timer
    .c itemconfigure $card1 -image $img1
    update
    set data(showingmove) 0

  };# showGoodMoves (animatetype 1)

    } else {

  proc showGoodMoves {} {
    global data

    if { $data(goodmoves) == "" || $data(showingmove) || $data(dealing) } {
         bell -displayof .
         return;
       }
    set data(showingmove) 1
    set timer 75

    set thismove [lindex $data(goodmoves) 0]
    set data(goodmoves) [lrange $data(goodmoves) 1 end]
    lappend data(goodmoves) $thismove
    .c itemconfigure "tray.[lindex $thismove 0]" -fill white
    update
    after $timer
    .c itemconfigure "tray.[lindex $thismove 0]" -fill black
    update
    after $timer
    .c itemconfigure "tray.[lindex $thismove 0]" -fill white
    .c itemconfigure "tray.[lindex $thismove 1]" -fill black
    update
    after $timer
    .c itemconfigure "tray.[lindex $thismove 0]" -fill {}
    .c itemconfigure "tray.[lindex $thismove 1]" -fill white
    update
    after $timer
    .c itemconfigure "tray.[lindex $thismove 1]" -fill black
    update
    after $timer
    .c itemconfigure "tray.[lindex $thismove 1]" -fill {}
    update
    after $timer
    set data(showingmove) 0

  };# showGoodMoves (animatetype 0)
 };# animatetype

  proc checkForWins {} {
   global data app

   set work 0
   # if there're any complete sets of cards, get rid of them.
   foreach x {1 2 3 4 5 6 7 8 9 10} {
         if { [llength [getTopCards $x]] == "13" } {
              clearWinCol $x
              return 1;
            }
       }

   if { $data(clears) == "8" } {
        set ans [tk_messageBox -icon question -title $app(name) -type yesno \
                 -message "Congratulations, you won! Do you want to play again?"]
        if { $ans == "yes" } {
             clearGame
             newGame
           }
        set data(playing) 0
       }
   return 0;

  };# checkForWins

  proc clearWinCol {col} {
   global data

   # Column $col has a winning row; remove it
   set list [lrange $data(col$col,cards) end-11 end]
   set top  [lindex $data(col$col,cards) end-12]
   set data(col$col,cards) [lrange $data(col$col,cards) 0 end-13]
   set data(undo) {}
   set x [expr {25+(12*$data(clears))}]
  #set y 420
   set y [expr {[winfo y .c.f]+0}]  ;# 420 --> 470

   foreach i [revList $list] {
           #.c coords $i $x $y
           move .c $i $x $y 1 15
           .c raise $i
           update
           after 18
          }
   .c dtag $top topcard
   #.c coords $top $x $y
   move .c $top $x $y 1 15
   foreach i $list {
            .c delete $i
           }
   set last [lindex [getTopCards $col] 0]
   if { $last != "" } {
        .c itemconfigure $last -image ::img::$data(card,$last)
        .c dtag $last backcard
      }
   incr data(clears)
   putCol $col 0
   after 10
   incr data(score) 100

  };# clearWinCol

  proc whereIs {id} {
   global data

   foreach x {1 2 3 4 5 6 7 8 9 10} {
              if { [lsearch $data(col$x,cards) $id] != "-1" } {
                   return $x;
                 }
             }

  };# whereIs

  proc putCol {col {bind 1}} {
   global data

   set i [llength $data(col$col,cards)]
   foreach x $data(col$col,cards) {
           .c coords $x $data(col$col) [colHeight $col $i]
           .c raise $x
           incr i -1
         }
   if { $bind } {
        generateGoodMoves
        updateBindings
      }

  };# putCol

  proc putCard {card col {undo 0}} {
   global data

   if { $undo != "1" && $undo != "0" } {
        info default [info level 0] undo undo
      }
   set x [whereIs [lindex $card 0]]
   set num [llength $card]
   set data(col$x,cards) [lrange $data(col$x,cards) 0 end-$num]
   set last [lindex $data(col$x,cards) end]
   if { !$undo } {
        if { $last != "" && [lsearch [.c gettags $last] backcard] != "-1" } {
             set bws 1
           } else {
             set bws 0
           }
        lappend data(undo) [list $card $x $bws]
      }
   if { $last != ""} {
        .c itemconfigure $last -image ::img::$data(card,$last)
        .c dtag $last backcard
      }
   foreach x $card {
            lappend data(col$col,cards) $x
           }
   incr data(moves)
   putCol $col
   if { !$undo } {
        while { [checkForWins] } {
                continue;
              }
      }
   generateGoodMoves
   updateBindings

  };# putCard

  proc revList {list} {

   set ret {}
   foreach x $list {
      set ret [linsert $ret 0 $x]
     }
   return $ret;

  };# revList

  proc getTopCards {{cols "1 2 3 4 5 6 7 8 9 10"}} {
   global data

   set ret {}
   foreach x $cols {
         set list [set data(col$x,cards)]
         if { [llength $list] > 0 } {
              lappend ret [lindex $list end]
              while { 1 } {
                     set end [cardInfo [lindex $list end]]
                     set endm [cardInfo [lindex $list end-1]]
                     if { [lsearch [.c gettags [lindex $list end-1]] "backcard"] != "-1" } {
                          set hidden 1
                        } else {
                          set hidden 0
                        }
                     if { [lindex $end 1] == [lindex $endm 1] && \
                          [expr [lindex $end 0]+1] == [lindex $endm 0] && !$hidden } {
                          set list [lrange $list 0 end-1]
                          lappend ret [lindex $list end]
                        } else {
                          break;
                        }
                    }
            }
         }
   return $ret;

  };# getTopCards

  proc setDiff {} {
   global app data

   set def [lindex {-> 1 0 -> 1} $data(suits)]
   set ans [tk_dialog .suits $app(name) \
                      "How many suits do you want to play with?" \
                      question $def {1 Suit} {2 Suits} {4 Suits} Cancel]
   if { $ans == "-1" || $ans == "3" } {
        return;
      }
   clearGame
   set data(suits) [lindex "1 2 4" $ans]
   newGame

  };# setDiff

  proc clearGame {} {
   global data

   set delList [setdiff [.c find all] [.c find withtag immortal]]
   foreach x $delList {
             .c delete $x
            }
   for {set i 0} {$i<=10} {incr i} {
        set data(col$i,cards) {}
       }
   set data(playing)   0
   set data(moves)     0
   set data(score)   500
   set data(undo)     {}
   set data(clears)    0
   set data(cheating)  0
   set data(newdecks) {}

  };# clearGame

  proc newGame {{restart 0}} {
   global data app

   if { $data(playing) } {
        if { $restart } {
             set msg "Restart game?"
           } else {
             set msg "Start a new game?"
           }
        set ans [tk_messageBox -icon question -title $app(name) \
                       -message $msg -type yesno]
        if { $ans == "no" } {return;}
      }

   clearGame
  #set data(playing) 1
   if { !$restart } {
        set data(allcards) {}
        set list [list {} {h h h h h h h h} {h h h h s s s s} {} {h h s s c c d d}]
        foreach i [lindex $list $data(suits)] {
                 foreach x {a 2 3 4 5 6 7 8 9 t j q k} {
                         lappend data(allcards) "$x$i"
                        }
                }
        set data(deck) [shuffleList $data(allcards)]
        set data(rdeck) $data(deck)
      } else {
        set data(deck) $data(rdeck)
      }

   set data(dealing) 1
   set numnewgames [incr data(numnewgames)]
   set moves {{dealRow 10 -1 0 0} {dealRow 10 0 0 0} {dealRow 10 0 0 0} {dealRow 10 0 0 0} {dealRow 10 0 0 0} {dealRow 4 0 0 0} {dealRow 10 1 0 0} {addDecks 5}}
   foreach x $moves {
            if { $numnewgames == $data(numnewgames) } {
                 eval $x;
               } else {
                 return;
               }
           }
   set data(dealing) 0

  };# newGame

  proc addDecks {num} {
   global data

   set data(newdecks) {}
   set x 720
   set y [expr {[winfo y .c.f] -0}]   ;# 420 --> 470
   for {set i 1} {$i <= $num} {incr i} {
        set x [expr {$x-12}]
        set id [.c create image $x $y -image ::img::back -tags newdeck -anchor nw]
        lappend data(newdecks) $id
        update idletasks
        after 95
       }
   resetDealOptions

  };# addDecks

  proc dealRow {{num 10} {show 1} {clear 1} {remove 1}} {
   global data app

   set thisdealtime [incr data(alldeals)]
   set data(dealtime) $thisdealtime

   clearBindings
   if { $show != "-1" && [llength $data(deck)] == "0" } {
        updateBindings 0
        return;
      }

   if { $clear } {
       set inplay 0
       for {set i 1} {$i<=10} {incr i} {
           incr inplay [llength $data(col$i,cards)]
           }
       if { $inplay >= 10 } {
            for {set i 1} {$i<=10} {incr i} {
                 if { [getTopCards $i] == "" } {
                      tk_messageBox -icon error -title $app(name) \
                           -message "You can't deal a new row while there are empty columns."
                      updateBindings 0
                      return;
                    }
                }
          }
      }

   set speed 40
   if { $show == "-1" } {
        # we're showing the markers...
        for {set i 1} {$i <= $num} {incr i} {
             if { $thisdealtime != $data(dealtime) } {
                  updateBindings 0
                  return;
                }
             .c create image $data(col$i) 10 -image ::img::marker \
                                  -anchor nw -tags [list marker col$i immortal]
            }
        updateBindings 0
        return;
      } else {
        for {set i 1} {$i <= $num} {incr i} {
             if { $thisdealtime != $data(dealtime) } {
                  updateBindings 0
                  return;
                }
             set card [lindex $data(deck) 0]
             set data(deck) [lrange $data(deck) 1 end]
             if { $show == "0" } {
                  set img ::img::back
                  set tags [list card backcard]
                } else {
                  set img ::img::$card
                  set tags [list card]
                }
             set y [colHeight $i]
             set decks [lindex $data(newdecks) end]
             if { $decks == "" } {
                  set sx $data(col$i) ; set sy $y
                } else {
                  scan [.c coords [lindex $data(newdecks) end]] "%s %s" sx sy
                }
             set id [.c create image $sx $sy \
                         -image $img -anchor nw -tags $tags]
             set data(card,$id) $card
             lappend data(col$i,cards) $id
             move .c $id $data(col$i) $y 1 15
             putCol $i 0
             update
             if { $i != $num } {
                  after $speed
                }
            }
      }
   if { $remove } {
        set img [lindex $data(newdecks) end]
        set data(newdecks) [lrange $data(newdecks) 0 end-1]
        .c delete $img
      }
   set data(undo) {}
   while { [checkForWins] } {
            continue;
         }

   generateGoodMoves
   resetDealOptions
   updateBindings

  };# dealRow

  proc resetDealOptions {} {
   global data

   if { $data(newdecks) == "" } {
        bind . <KeyPress-d> {}
        set state disabled
      } else {
        bind . <KeyPress-d> {dealRow}
        set state normal
      }
   .m      entryconfigure "Deal!" -state $state
   .m.file entryconfigure "Deal New Row" -state $state

  };# resetDealOptions

  proc chkUndos {args} {
   global data

   if { [llength $data(undo)] } {
        .m.file entryconfigure "Undo" -state normal
      } else {
        .m.file entryconfigure "Undo" -state disabled
      }

  };# chkUndos

  proc undoMove {} {
   global data

   if { [llength $data(undo)] } {
        set do [lindex $data(undo) end]
        set data(undo) [lrange $data(undo) 0 end-1]
        set col [lindex $do 1]
        set coltop [getTopCards $col]
        if { [lindex $do 2] == "1" } {
             .c itemconfigure $coltop -image ::img::back
             .c addtag backcard withtag $coltop
           }
        .c dtag $coltop topcard
        putCard [lindex $do 0] $col 1
      } else {
        bell -displayof .
      }

  };# undoMove

  proc colHeight {col {num 0}} {
   global data

   set pad 10 ; set ext0 10 ; set ext1 25
   set all [setdiff $data(col$col,cards) [.c find withtag backcard]]
   if { [llength $all] > 12 } {
        set ext1 [expr {$ext1-(([llength $all]-12)*1)}]
      }

   foreach x [lrange $data(col$col,cards) 0 end-$num] {
             if { [lsearch [.c gettags $x] "backcard"] != "-1" } {
                  incr pad $ext0
                } else {
                  incr pad $ext1
                }
            }

   return $pad;

  };# colHeight

  proc cardInfo {card} {
   global data

   if { $card == "" } {return;}
   if { [string is integer -strict $card] } {
        set card $data(card,$card)
      }
   foreach {value suit} [split $card ""] {break}
   if {$value == "t"} {set value 10}
   if {$value == "j"} {set value 11}
   if {$value == "q"} {set value 12}
   if {$value == "k"} {set value 13}
   if {$value == "a"} {set value  1}
   return [list $value $suit];

  };# cardInfo

  proc dragStart {x y} {
   global data

   clearBindings 0
   set id [.c find closest $x $y]
   set data(drag,topcard) $id
   set col [whereIs $id]
   if { $col == "" || $data(drag,bad) } {
        set data(drag,bad) 1
        return;
      }
   set data(drag,homecol) $col
   if { [getTopCards $col] != $id } {
        set cardList [lrange $data(col$col,cards) [lsearch $data(col$col,cards) $id] end]
      } else {
        set cardList $id
      }
   set data(drag,allcards) $cardList
   set data(drag,orgCoords) [.c coords $id]
   set data(drag,xLoc) $x
   set data(drag,yLoc) $y
   foreach i $cardList {
            .c raise $i
           }

  };# dragStart

  proc dragging {x y} {
   global data

   if { $data(drag,bad) } {
        return;
      }

   if { ![info exists data(drag,allcards)] } {
        set data(drag,bad) 1
        return;
      }

   set cards $data(drag,allcards)
   foreach id $cards {
            .c move $id [expr {$x - $data(drag,xLoc)}] [expr {$y - $data(drag,yLoc)}]
           }
   set data(drag,xLoc) $x
   set data(drag,yLoc) $y

  };# dragging

  proc dragEnd {x y} {
   global data
   set data(playing) 1
   if { $data(drag,bad) || ![info exists data(drag,allcards)] } {
        catch {putCol $data(drag,homecol)}
        set data(drag,bad) 0
        updateBindings
        return;
      }
   set ids $data(drag,allcards)
   set topInfo [cardInfo [lindex $ids 0]]
   set bb1 [.c bbox [lindex $ids 0]]
   set bb2 [.c bbox [lindex $ids end]]
   if { [catch {eval .c find overlapping [lindex $bb1 0] [lindex $bb1 1] [lindex $bb2 2] [lindex $bb2 3]} tagList] } {
        putCol $data(drag,homecol)
        updateBindings
        return;
      }

   foreach x $tagList {
      if { [.c type $x] == "rectangle" } {
           lappend trays $x
         } elseif { [.c type $x] == "image" } {
           lappend cards $x
         }
     }

   if { [setdiff $cards $ids] == "" || ![info exists trays] } {
        putCol $data(drag,homecol)
        updateBindings
        return;
        # we only have the card(s) we're moving, and the tray
      }

   set 2nd {}
   foreach x $trays {
            set x [string range [file extension [lindex [.c gettags $x] 0]] 1 end]
            set top [cardInfo [lindex [getTopCards $x] 0]]
            set topC [getTopCards $x]
            if {       [lindex $top 0] == [expr [lindex $topInfo 0]+1] || $topC == "" } {
                 if { ([lindex $top 1] ==       [lindex $topInfo 1])   || $topC == "" } {
                      # Same suit (or blank column). Put it here.
                      putCard $ids $x
                      incr data(score) -1
                      # Refresh spacing on the original column
                      putCol $data(drag,homecol)
                      updateBindings
                      return;
                    } else {
                      # Another suit. This is second-best.
                      lappend 2nd $x
                    }
               }
           }
   if { [llength $2nd] > 0 } {
        # OK, since there's none of the same suit, stick 'em in the first
        # available slot w/another suit. Then refresh original column's spacing
        putCard $ids [lindex $2nd 0]
        incr data(score) -1
        putCol $data(drag,homecol)
      } else {
        # Bad move. Put them back.
        putCol $data(drag,homecol)
      }

   updateBindings

  };# dragEnd

  proc setinter {arg1 arg2} {

   set list ""
   foreach x $arg1 {
           if { [lsearch -exact $arg2 $x] != "-1" } {
                lappend list $x
              }
          }
   return [lsort -unique $list];

  };# setinter

  proc setdiff {arg1 arg2} {

   set list ""
   foreach x $arg1 {
            if { [lsearch -exact $arg2 $x] == "-1" } {
                 lappend list $x
               }
           }
   return [lsort -unique $list];

  };# setdiff

 namespace eval ::img {}

 image create photo ::img::2d -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXAMPsTLtCjNP6acuWvwt6bBmg8JghvozIpvLGbCKVseNAmhwtr8Iq
      1tLzRU84Lja8pJXHwXB5tvY6tdA3K87WPXd4+XGv1ufXRvfDJyhFNLjSd0ZnB4fn+LOmE/flcm
      mZg6mluWk2SbkI93WhmGdaU3ijKuqqCgj7xzo7Z2sqi6tXu0vom9gLvDo8JVzccozMo7xcoutM
      Ah39MU3dYX29ka2d1Z38rcIdHtJMjjEenv693t2u/X4dTz0fXe98v5yPvF/cP/wPWEBfA3cVxH
      XQVsJZC2E1dPUwlrluocqd2+BnYcVAbnISklKh6SCkSHYKfrpTyaKURhyBDGTJEd1EMogseUMi
      6OOMgDmDYYEJMqXKJkBpQjIplJEZlzOV6iQhhqmqp0ZlutpI8ubFURoigtrWFBkbr4HSgAlb7B
      PZlqHW+txarQJcDhMMSLiLN+9dAwUAADs=}
 image create photo ::img::2h -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXAMPsTLtCjNP6acuWvwt6bBmg8JghvozIpvLGbCKVMV3uV52OlgMr
      rvvtHnu+KCgMDo+30OUKDV9zryc4Wo79vu164dPLlxX0B8inJRVoNkOWJrZn57SVQ6cCGZmnNn
      Mn5WKpSXkItUkjyMk2aiWFQdSneolR6ooHK6tKWPuKW3ur68fWa/sLnDtMXDx7jJw8KLysw+vM
      0xzNAk1NYn39ka3dwd298Q2eND0OIm5ugZ6+bt4+/g4e3z2vXX99T50fve/cv/wvWcBjA4sVHH
      YQWMJeC3U1xPVwV7l03iZSdHQhYpBYfhoLYWyIkcWohbHqxAlhcUerSicPojJhqaAnmFWuDAz0
      SFTGlI8MKduYKNSRRCUX8TRJFCmdf0QVcRh5lGZSmm7URS1x5+WHMkACqsmUc6cqOqCkkqO4oW
      THTyGtoi3S1u3bqm3kzhW19Cq1lWtN3T1X4S+HCQYkGD6M2LCBAgA7}
 image create photo ::img::2c -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXwsayGzLyfdL6iPcfnQH6hhihJUFMFnlLpjIpRPakz1rTB6vueEaU
      7bl7OVUNLbMcQyu3ilsWPJ6mkNRhdyaBxuslCd899tbnF4cX1JZDSBSFmEhX8wcoBmnleHR0Zw
      jpkJYph/nAIqgHyln1CRpCeYp6xWq35/maOPsqWyuJa6a7y7tW6JsbDDu8CFzccoxMu4xz2/yj
      DA3yPM1Rba2Bnb3EnexNJg1+OO5VPnhOsg2+7t3O/Z4dbz0/XQ9935y/vI/cX/xvWMBgA30V5H
      VQV0I9sdKJaXjuEZWFziBgOjVqUKhKambEXbPIERaXVLTonPHoRWKjlIyM+QnH5x8hlA9biswD
      UxtNdTiJMaQUSdivoBobHVST7M3RL6JOToKT0dyqkAz31VlI1FI3h1OfpotEEQuwsK3COFRDVs
      7VnezYuqvAdcMEAzPr2r07twAAOw==}
 image create photo ::img::2s -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXwsayGzLyfdL6iPcfnQH6hhihJUFMFnlLpjIpRPqcT6C0d60ypcac
      4nncimc27avccpjDsPRD2SVHoFScpH6Ls+76tAZPwge4R5WFwkdk9aViM4KGJdbm5cKzOESpJg
      cWxvbIaAlXmbkJeRZSQ3pZ2Jf6GcTaehhLCjsbU2vrlxu6y9ubOPirK1xKXGycF4wcqLz80+zc
      gRv9B01dfT2cXTK9jerNbQ3evU2ebX6NTq0eze7svgyPLG9MT2wvjP+r38u/658LoC2BswjGMg
      hsFbhqChdycjTG4ZtvWgxNKkPQ4sU2YPoWiTLXwJSqLxBBhcuCTxChhlMQ7cE2UgIwOnNmJoRA
      J9TET5L87eRpCWDIWxEp6nSHqWjFkUtSiXvGUqIRhJDwULUD6GoykUbHodGaDOXTcmPPVXAojY
      KgtWzbTgBQAAA7}

 image create photo ::img::3d -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbWAMcDS9OuIMf1ft7wO+MJQbfLb4jsFHHBpDNTzD2noZFRymtSl9fs
      cWvVfFnYqa85VuXSyHNZvWYLo7JaXM7jeu/aod7Op5O01LcSWJgXxoR4wmcW9mZ49wgUCWfpZx
      W3hzenuSYkCHYlmkV1Qcd4ukO4Sunq+gfbpjj7JGubmDu6e1vb6wnshCusQlyM8ovMcrxMpOzc
      Ax1d0mwXOx3aGUyFmdkN+urk6DtFPpxNFliedLjdki55Tms+yT5ujw7urbv/XmNNnSpupwYSpA
      YPoY14CjcEbIiKIUQMDydWhHixYUaFhxsRdqT2MVpIZyN39SlpqxRKDgZNlFkp5h+ITVUK1tlB
      EyapmzRySmyUT+AXnYvCAdKi85Apij9JuGsp7YlSfVKDXhpDdB7Ql01dGpXUxQLRSjI74BlbyQ
      sHtC+08aw5MabKrsvSsMWn4S6SI0PpAqMJN+5OUXqxCa5W4bCHCQYkOH4M2bGBAgA7}
 image create photo ::img::3h -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbWAMcDS9OuIMf1ft7wO+MJQbfLb4jsFHHBpDNTzD2noZFRypJdj8jl
      NSvNNYVe4Eo8Q3etzK8KDV9vtW+4WD4fm+z3YbnGh0XGhhTINfhkqLfj86MDZufkokV3FidpFU
      mj9jR5uVmJCcQJeCg6GgpIZRGVusqz9PiKh7E4y0h4O/Wn65fbm8QLjDu8+1sMe4xcI7ys0uyM
      ohz9PE0tfZ2cTZwo68qddNfn66RGqh2uaMsCfaK+3mJtqUg79F5vbxgsP8+3PxXoVLdz5KgQLG
      jwG6JXsjrx4wFv4TZ2DyduaGdRA8aMmRg2cmRV8SNIkdhIkvD4ESVHlRlZWnS5bBHMYg2rmKwV
      aiaJiDvH6fxQ092lnx0E1eFEdMPBnkhDCl0KVAedpDg1PWXShCoqqxIL6cMHUR3YHfeeHtJatg
      QptGL3NOHCNsy4nhy0YpVqlO5Fp2q9BQUx127ChoJXmSoMUCZfZ0fgLka29jFNn5InIu4l4qaH
      CQYkeP4M2rOBAgA7}
 image create photo ::img::3c -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqZWw8axGzLyfdIujfce/xr5hh0gkIgMYhbJZm3JvCWcys0xp6BenzNb
      UyfksmDfMHnsTfKiMrY6PJzKt214T2LHHacqPL1l50bil1eXIQhCSGSU1Zc1gihlBpnyZ7UTVC
      iZ6dCl6bMDgcZXxnlGZZgZUvOJipJH6qoHaylbUmubmlu6y9uLhPuLJQzcSux4HGecfLvMnOj8
      /BMtzRE8inrtGFvsdLpIjRV5F/46PqvV6KtM2f5WHNHNLgEOjlc/H68MX8mqDf1GiMB/ANOVG+
      ZN3btqXRg2dAgIYkSJCCk2s/gK40WNhQU5TvP4gSAxbmI4khS5Sw6rCyht6WsZUqG5TiUDeqIJ
      85JAVcPmsDw4TeW5IjJzQrknjpE9ekkDAbXmBxAtfg/k2VtJEl3CrE2hbJXZFMxXroMm/Rzbco
      tRqGTLQs2WM01NjG7W5lIKcq5dV6HOejyz16C6wMII/xKR1woFQowbO54AoAAAOw==}
 image create photo ::img::3s -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqZWw8axGzLyfdIujfce/xr5hh0gkIgMYhbJZm3JxAmdz81RlaBWNVeU
      gqqbdkmwZjjacpintSwrkhy/JUh5Gk605yR6L3fGxyYl6IYVmMeG5vU1YjN09mW4E9Tn1+YIKF
      gn9CCjuEmJqXUTFrI1SkpYiQpitMr6own7KDvb82pbgpvbWssL+IsYTDvss1vM5Yusq7zc6+zZ
      LDV6zCwdDRa55lQWdy0pSrzZCYqIJ057bvxNdoh+675uTvc+yHhZbcXePnlZzp3vGcBC3qABM5
      gGYUKFexg2dMgMYkSJAinGsvgh4DKNfLMInqLokSOqFI3E7PtFTqQ+j3vKqFyZyuXJjG44seyF
      5qWNktoW8dAZr2UGoHxmJJunbtA4CP/WJVW6tBu4RDNxhvNZ6CWUTw+3aN0asMvXrVCPaqk6VN
      HYNQTXAkyLUQlcjDtM0sXkFmmpuBzyshLBlwuFQIQLG15goAAAOw==}

 image create photo ::img::4d -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbaMLDy7GJwPOdnbd24DvzwfL+gUVO7CWDHZsalXBadRygxypnKtKiR
      9MrtMXNYFe8yzvpmRNZZ3AGz5GavrYwGh+P6+gsvRmeit8fx5kGYBpJYiGS3yNgYmNiVUcg4SF
      mZd9l3Qug3uQf66bkp+Ne2glpipaoGmBkL4rqGqDiHu/mluyFJ8mv4OEsFdBZc3PKYzHzI7OT8
      XLUsDU1dPY2dHK2dw90t8w2uPN4kXr6LrnOuTnvdHgpP8y7fSl/vjh9+r9/B3o/hH0ALAgcWBH
      iwX0J9C/E1rPdQXkR4E9tVVHcRXcZyphvHdQT3sVtIbSOxlax2UlrKZyub8QM4pWWQMg2RIQJm
      K8RLWDqIiRqT8NWqnL6uENxpyehQoUlVFSQlS2lRLE9NlYA6NSDSn0xvYX3xZGukX2PTQfrq1W
      q+UqzOSr2jq2rbD2h5OVpKNCqxXkHzsu2VZ8NCnzhHeao5M63Tre3GRJFJJgZVxuqEQmaD5/KW
      uJTR8e2sEDTDCgNJTDAgIbXq1akNFAAAOw==}
 image create photo ::img::4h -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbaMLDy7GJwPOdnbd24DvzwfL+gUVO7CWDHZsalXBadRygxevFlsSBt
      jwuyXotXqfdTLpd428zYfOa83yT21z2md/J64QjPtMUXtzFItPZnw2VI+MIYGJaI9jjl+Ihoct
      nFiCI5aUiiWZeoBAbX95m386fVyKfyuvqFOtsYqiZ7ans6c9jCqioHKWOKWVtsE1TZqYhMlcPm
      /EzjuTRNZXeNXa3tlN1dxQ1u9D0OVG4OLZ6uzu697s6CHq8yT898fw6fb8xP7d8OoAx7AjkQLI
      hkH8INBxdeaOgwhMKIDydSlHhxVMZIvRv9dPQA0WHIhSMRlix4UmBKgCv9teT3Ml/MezPp1Yx3
      013Oa5V2PgPj04kvCymXrTAq6MxJabeQxio59Oiupxab7UpVjCqsYJm4JoVDtKquqFhxCTJTsS
      uoTWs1lhDlAa7HppziUupXNtaeu1+fWKSE9Nggqwnf8t0rd1hauqXMFkrjWHFYtY2vWmViVivl
      vnQ5C44StEkg0GLvYYYU+kjU1EYIsVYm+TUQyRg/GixNsoLtJxQk+P4N3LeBAgA7}
 image create photo ::img::4c -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqaay8YsfCXyrdKhjfcgvfAJOzCbboh08Y5IodLh4cWkudGuQVRMtS1r
      hlljdIPVDdiCrZJPR65ZrHajvOHz1R6Vz9XXPsmYQvVDNxhRCLH31SZhx4gXpijoSBgpUaKzhu
      aYx3hJmKlpdEf5ojUCmgcJGIkW6mkF+4jx9MAhyDcTW1t6+ypbGgrV5OQl2ju8xYvctEi6LPP7
      fBMtnVz9TH1dpo2cze35Pewd/jFOnnU+ZJ4OzN6z7g4ZP+08D25vjd+ln8u/78+mHsA3AxMVHH
      Twj8CEmhiWW8gQ3jyJ8Si6s8gOYzqNpuc4kvMYDuQ3kdxIajOpbpFDP7MgXgzEEiW9XeZQ+aJk
      aAc0eL1yZlviSiGsoA1XNZxjTM+bpJL0RJvEyVIdTC6D5bS1aeqnqqMQZenUEifXrmmi7lLIB1
      BVtSzR5jp2qJ7ScWWRKg3WLg7cr3ePKnrb1+wZJjUDPzxGcyyrnXKFyfRBy2/CQEUUb5Tz+F3T
      lbcy4yBsmZ/nbhVWvqAwKbXq1RMAFAAAOw==}
 image create photo ::img::4s -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqaay8YsfCXyrdKhjfcgvfAJOzCbboh08Y5IodLhGfWkM+mDyDzxWlRM
      1hKMhXPdWtnLqI5RZ8XmqoXGX1sznBSZlyTnt4TNlvfzt9fnx/fB95Vx1KdoaEc4yNiomGiJ17
      W24zaSFhXkuYkVWcdpBWbK4RaSukjp+nmIo1oYO3orgzt5utukS5Ui+tukU0tMW3aMDMzsnPrs
      /Bp9M00tBnldna2N3V3M/U0mPmRNnnnuY54Oyp7svg3fLF9FX28/jq+nb8vf788L4CWBAQmuCi
      dwHT+F+hjic2gPIj2J8ijCs+gOIzuNn+k4nvNIDqQ0YwgvkjQobIcZgnAg+hp0rGVJOjMPQpIZ
      CNWpTEpiURpjLo0oVlg69VJGVCVPSTaZuoK1VFBRp2DoFEIECmvBS1KzQgB09StMsehyNjArK5
      LVOGfZplUL1e0yr8uYuExKZq7dmmj40pwahqLfN3RZiUT2xMrgb8KKLO625jAxvJJ/qaoMzo/B
      dptXVejMiMKj0aRLTwBQAAA7}

 image create photo ::img::5d -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbCAMcDS9euHNe6es/7zxu9fMAiqCczKjXI5PLpysBARF01uJl6clZt
      S+j1Zp0sHKt3EUtx1xK7fQSzOW81tY61mOn4Ux3uEUXyZ9dBCMgh+HFYqMGIyCSUtkVocngiyM
      X3pvKXN6Tp2Gc5WtIUurbXOZfHaUi2ooopJzsGOdgYlwZrCHQbKAn6NBwS/EI8rIicbLwM1eys
      pBxtNE0NZH29k61tA92tww3+NV79XU6O/iOuTsJutfxOgyp9vlNrPuy6JO9XWtSP1L58Si7VK8
      joIEJPCheyamiEIcSIDydSpAfQ3r1ctOs03ovnsd2HgCIjlfR2kgbJlBZWsnSZEuZJmSVpirTZ
      Dqc6neh4lvMZ7QrQZaFk/hqESxNMjP5uuXKJTyDHpyFT8XJT0SoXkhKxDtR6geu/O19TYQhoMO
      lYDEKrgqpEFq47t2/Lvuqqq2nWuFHrnqVb9+qitftW2uXbKAwRqIK95lIcFvCuo5QgNTLqa3Ai
      yeAKc+6saqgzL6KJLv6szTPLTWRKX3NNTcRqFBQk2L6N27aBAgA7}
 image create photo ::img::5h -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbWAMcDS9OuIMf1ft4wD1T5ZsEiaCgzKjPI5HJ5y/ykuleV5MRdSVHM
      9JKbhbE5bfY4soKJ1nKYzXmbz57h2vuWe/J69Lr8x7e1IQjoFwg3V/hRSNfR1dE4qCH59QEZ2U
      i2WIIZpwkiiZJmVkrFZ8LZmZbkiHryOto2Rkmr0ier6DibCLt7GFvbe2vZQ4pLGDS8ijf5BNTl
      /MwDuTy943mtlK1dxN0NTQr+9D1eU27Ogp4uJM4etP7OLO/tTn9uf6+er9++lPULn5IxtuDxYy
      EHGbaDKypZa8GQmKh6RhwaiReq0sWIzxIFbePoS5XBfx4/PglG8WTBjdMMQQFJQ9rIaw/D9aMG
      8yYHjDqZ5OzpE+g+oRCJ+jOaCymXn0Z5EnUqFCq9XlLfDaqazmXVmiVq9pEqs2uxZrSguuy47J
      VThZt2qWWKMqPCVlUwimRUspmpEDkn4r1bpy+ov3kPyR38ye8lmBb3aCQLZ13jTIq/Mn5MGfGX
      L5IJrhRG1+VmNvE8B4Qs5uxYC3avnD7FxtUyrOMsK4XNmenN3Lc/XaANznZvXaR1RzUOVMTwRx
      QkOH8O3bmBAgA7}
 image create photo ::img::5c -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqZWw8axGzLyfdI0zpf62AuCfgqhMUMsHo87TFOTuEVZzxeQs5gpVb9L
      1Zrl2sTe67cWzo3V5TR0jYL7rugz2O5xx8Wj6HSY4oeHRAcYYQixR1hYd9gh8ffRpAdpV8mIVU
      hZmcdJMrnVFtiI2Ec6V4ZWs/gCNgcEO+gU+5CJGXcLeAfzFqnmi9ootyRDFKJK3PMEnCzFyNys
      FT0tO12ca81Tnd2CzX39vbQdHkweNG4u6Z2uyI6D7r4B/5s8/2qvXj+sva6lp9yPyr53AQVCIy
      gukMKCnxg2dATQyKVzDtVBoijREz8mukX6hELIEZYrIfge6mv2L2I8ZytZtpT2UmBMmTPJ1GRz
      s11OXTsb9vT5c+SsoEJT9fSDbNVOR/ZSPlyWSKlBZ5iYOpxC61WrpKsEGb1nyukspJt8bZv4SO
      Opr6Wi2pIwFhQuuGkvjn3zy21dvfnoCQr4lyvPbgctWgo1j1deaIoTD+zktIsVgx+fMjaD2V/T
      ymyH+qPaKRPRxhXNrSlpOjNRz1KPni4djvTqtLOxVKjthMKl3bx7TwBQAAA7}
 image create photo ::img::5s -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqYhw8ay28i2So/3jusuDwTlFMGiZkg0Kn8YJkd3g7akF+fR2qOifFBs
      NclahLnfTm0q7lnOV3bpoV6DM5EtfGuHkCRac/8psRf49tc26MdHeLTB5/WVKEhn1VgoBykklf
      aYEPIyxyg2AhNp+ZnE5djE2elZKVmq2RaV6oEUq7o6lnti+6k0Wybq+hv3SGzktHu8Q7vMPOxs
      0xw9A009dv07nV3MDbTtrRj+bT2OuVyOTaxcBJ7lzpuex84DL+hGjqzXLv9xWd+v1iGAQSgVDA
      joHzByCqUhBEVEmK9q/GiU4neMXj5ttBMJmnv2EWRIhyNJloxh76QclepYxnPZDeY5meJozrTp
      7yE3ZSnD8dRJLYWwMjjvpLwVT6NRhBrtIBoF7tRFTBZbSdK0DYbEprBEtUo2J2ujnA1/Emp4dW
      CVK2fVGqpD6t4+snNvUq379E5cufgE6sXFBN5fvhPZ2OtL+M+PxQGRzvND9AXKnsYgg5pRLycg
      nF27AA2K9fNOz5zZruRsWDS6UZJLW3bNqAJsOhQo2b6NewKAAgA7}

 image create photo ::img::6d -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbYAA/sTLtWDNO6asf7f+rJgESQEFdMZo5IpVJ4yXWGQCpvdKNKN75f
      9xrVWl9NGm5Mgma5Z7Sp7fYwv2E4C75NY7P0evuOF7QHgtdHWBi3YfOBmHfYWLIokAh5UqlHRh
      m4UijoF9fJuRmJZcd2ZvbnOal66ihqaFTaelr1isl3m5HIObMY6wQkyRusI1lcfIzspLyc1OxM
      BB39M01tPHhdZK3Nwt0NBr6dLY5dLk1+7p2uHt5LRNzxrQGsUi/H7oGqs7/6RmsPoCxLowiaIm
      VQIIlQCEtccogIRb5dDx9FxLXw4j+GzwM3KrTYD2PGgwlDdvR4j9FHeRM5mISlCx+geCPXzaDp
      0FfLdid52vSpE2hQoS12EtUw7+iFpEpDGG1qgalSqUepErUqFGu5MVrB0cGKcyHIpU8phtUXk9
      U+qi8D1jMllaTbMmabMOWIkm6mLXcL5n2bJ2lFkCu5Pm10FjFOwRoh4pX5N+0Uv7ms9JXrWODB
      uCsJu9nCt+ynHW1ZhSE705am01FFvyjCCzSVrtQ2u97aj7bX2bfVfdEdLSRwZ3qHlzMuTgRUIx
      QkOH8O3bmBAgA7}
 image create photo ::img::6h -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbYAA/sTLtWDNO6asf7f+rJgESQEFdMZo5IpVJ4yWWaAiqIajWObsNq
      l4vEST9iWRm19Ua/ZfPZ0/aKS1Duqx2H49/a9dy/56MXKNgH+CVHiKihWPhhQ9a4OCVJl3alSN
      KIZrKJScgJJscY2FkaGuYIxleyx7PlSvqnkhcEi8cxu6KLips7NqMamig8BTRpeVfstAM5yvx0
      eQPt5EzNbH0drX2dzU3k/f0TLq5DXj5zjt4ivd7c7l4DH8+iTk9if/84/zuWNdjln4d8xNwIlO
      WD1b5WZ2r1S8WrQz5JyA6dMvQpE0BQ6fj4UfLUgWIyTZU2XlzIkGMklRgzxlp5EmVKXyRfdqRF
      c2ZEmaZ2ugQ2EueymkCDCt0xlCetY/L0vXNqziNUpVOHVbV1lV3WV1uxdjX6daDUsBYIdjWrbx
      FaeqrWutPldtqPiqsKxU1aM6Qvtz6JIou11mFPgYDHflT4UxjEIWZZwhQ8yq7hujn1OhY72Kbl
      mJj9cj58mcPEkpsdw50s0qTNWqNBPmTpr0vrxXjjOIx9gWDDvsoS8sJddvIqQIOJU1qTWzhbPn
      HRMVcOdUzzt9KhxztN1njy7FS5YxDhfcMEAxLKmz9f3kABADs=}
 image create photo ::img::6c -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqaYwsayay3yrdIJzp/62AuCfjCh8QUMMY7M34XG2c2gvqSzY2Nlc9Yu
      dsndory1pKbRAlef6nO7hOYipV96mAo3k3Z8fDTVp/fhVwcxJDHmJihhp4i4pyemxOjBSOiWIW
      kpOPd4mFnUOTIaWjg6eYlZNqkECvSaOldTxvlF6/BXm6c7CPuwITnWmHcbx8RDFMJ63IM3zHzj
      HAu9Rk09bR3Nm42Dza21/R3jLV5dLkR+DqmOHs5O/I7sHt87NZ87fu+aLgoOHnwIYL00Aiu9WU
      ew1C6FCBPq65cmDKtnwABZ1JeOUq8I14kWcjRlqGFATxU1fvIYMhdJg1X4oApngxTFihKVLQs4
      66bImvkesunJj81MlvS0FTV6NF9SpUsjNpXz1FzUnVOJVj15dWBWnau2cm111SWdoN8+kn0JdF
      HIs19blsQFVljOobJs2rkYNyMMmdNiooX4E+UvkIOLgRK2ct9Hw0gQL377+KveyJDhUt040Vug
      trb+nS34t+sdupVrGSNrzDGhK3FbMhxJkfXn15BmyvYpVBuv215P4z6nhi071l5vCi9b6jg3hc
      rjNX8nojgwCpuqW78+AUABADs=}
 image create photo ::img::6s -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqaYwsayay3yrdIJzp/62AuCfjCh8QUMMY7M34XGSd6kuaSzs5tCfdYu
      tsiytbw16nM5FnPPamSj+l6zt+UHCiInScyb/f0eoSfxJ+jnsUcXZcaHyOc2KJiR9Rh4iFgC1a
      YEM4L2xbk5+UEEVgd0Kvp5akpop+gIGOPiqqHJlYqJGscU5NQJyxtGhRuMs0VcPAOc3JPILOT8
      3LwsrVzNG31trW2UzT32DU0dnjvTvJ1m7P0ljFy43jcu6XlbWl5vO+pQhU+vTxspV6V/eO69A6
      gKoSWBkBIWHCKvEcGB+hhSjGcIosVOyqG8Lflljx3DGqwgzioZMJ0WebVYUlLmbiE5HvBmVrSp
      BWdOnbJc8kTyU1hQcEPzFE15VGNSpEtFNq0z7ymbqE9T/DpTdZ+SdjUxOnPVdZ7PlrDAsiyiax
      xalKYm1fzYcRlcf23eXrKUcSrQgw9fNXzRcqNCsX9l8t2Ft+/Nw/78DlbUL5/jxoYFh42LrO5Y
      xIBCtr0C5/JLyGWwtlMHDLToJ+cMg16qeiy3Xatnq6lN7rVUt7Jti8J9zR5wnCKkRqHQKLny5R
      MAFAAAOw==}

 image create photo ::img::7d -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbWAMcDS9OuIMf1ft7w9eMJPzdMcIjcFIGzpBOzxDWf1OixMxVme6PM
      daPTfkvLsVfGy7W6TE/OXHpvQeU5U86Swzl1rD7/h8IGohdmUrinEcWBmKjR6HhR5leo0ihotF
      e5sknGpgYWaClK4oIXCgqY6vnyRhn5scoqJXtmxwmr+IkWm3RLN2hI9TTpOyw5+CRMnOzLW9U8
      dMpM1Zm0mEaKhF1z6cStivgdveN9TV6uPQROY72Nnl67Dh+fu3ZMi8+ehh9Cj2WMxT5U0uxB+f
      foWTuFsw65WijPw8A7D0dNK4WQYsRY3eokZqTV0Y24hhxHxoFEsmTIVxeJfAS5UWRLlyfcnZzp
      0SLDmhVTkoj5cycwVQV/5cwT8F6/fhOX2njpVEXTqFKhUvV5VcjUrBi5jvN6Duw7sfPIarVqNs
      NWs1vWihXmFkdSlsiIijF6ai1QQkJbgdqK82bfvC9tBg2caqphvoHz1RXcmJHJR2ozonRojibk
      nodX6uIZmWXfVgdBc9687Exp06kxjyb9mHW21qpjgy7Kt3K7uX50pz3p+zfHz8KHBy8eqo0/5K
      KbxM1KmHlV6T0qUKdDQYL27dy1GygAADs=}
 image create photo ::img::7h -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbWAMcDS9OuIMf1ft7w9eMJPzdMcIjcFIGzpBOzxDWf1OgxI2NeP9mX
      DjXCTo05aZdbzo2JYeZGPYOj0+rScuuF1z16Oem+ltf31TFY9tfm9WZIyMHY6BHl+Bgo9miXOD
      dIcolp0qnZB6ZlpmH4uTlqFge5eojqpypquqcSK6s32QqLhyj4Slt5suv722s0JFz8S3N2hgSo
      HMr6LGTVXHfLI4kNap25Qymtws0inlS+cg4NHs7olK7+jt7uPktPdY+fXwtfLwTMHxVSA0P8S1
      bQQryEQxaSOVKND6GIkQ5a0tGvEB2K/xwcuvqhLViWkB0tapmn0VvFEutSomTDktI0fSs5yZSo
      soPHjyRF0qxp8xSInDpNPswV8yfQpBmHIlU1rGlQjkt5jcN5DKa5rEltGHWE0CvDsTvHsihrlt
      zXtC3Wsu3h9q0nuQLp7rPbMC7eonvz9v32d5gGtHshEbYL7PCLsC4JKSYGq3GXwwGjEptFuOfM
      RX7QKsVaeeSXskKnhsR4ZCdRn09BqH4pWfPgry11weZrOlXs1m6g0L65m+QWj7U535aSgXg2qU
      dRV0bu2yo1yM2n98JDeiL1iycnzQ4c8zt4NEr0Iq6k+C3EKenZxmqf9r358Qbpn61gHwUFCfz7
      +wTnb0ABADs=}
 image create photo ::img::7c -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqZWw8axGzLyfdL6iPcfjQH6hhnhi0dMXoxG5ZCJ9CRuUxYUtJgprNEa
      1qaChbvNIjh3RpG7GzE6OzaT4K1tfTyaVr/51H7OJiXBB6Gm8XckEbikuHi4htjoWKNYIkSXON
      ghaQkJpUdZFrTVhyjISOk1ysMqasaaiJbp9krlehpKy2jayfs1m+ZkuxuSKuzziXwrk4yDSbSs
      9ax8rEstbN0TLb0dp6Tn1w34rXn91HiexGmuXMne7pcLPSn9Ejt/fO8kXssxre+tji9C9PwVbB
      MM0L8fBx8tFPRwU8NXdt5UNMRlIEON6BLxpOJIDNxEVb0KbTQ5rmQEiOUYqnFnEKZLlSgRysSl
      sljEWTovznxpzxifoCBHMePX705GpDyV5nvK9KksqfmiUk15dd/IrBi5qtvq9VdYfGPTlX13du
      OjtEDlsIXYE4lVqStJ4ok6ra7VohID6d1apVXDwADD9UH1Mt5OeaUu+ey2LmbLZ5DR9Z38eGJk
      my2FIqaZjeKDrr0+bhPpWaxAvD4Rur3Ld1Xr10eWxt4126hu2EhDf65tmxu9K/WOFiT+VvXv5A
      ZdM8e5+/la4Haly94z96qb7Gy5pxVhHQUFSeTLm58AoAAAOw==}
 image create photo ::img::7s -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqZWw8axGzLyfdL6iPcfjQH6hhnhi0dMXoxG5ZCJ9ERl01y1WcSitL8p
      95igKljCL6xlU5WrQYfabc12IttHvCRha/LbOoTEh6e3lzcIJiG4t1FoWBMIsnZV2PXY1RZ2GT
      aSNrcQ4ogJiXS2hMkzJupyGip66MnBSvbV6YpKGGuFC7hK6uSz8znre1faiDJ8lGW8uzzTjKb7
      +5xrmyT81vs0zQxHdC1I571N+ScuXonznYqofc4u7Z6y+Qrv/nJoPV6HrF4kVa3ImTN9lwRC65
      dJH8Js4ADuwsapIb1Efhh2stNHYrd/4OEearR4q5zHdR1hTRpJruSik624qQz50qTGYBNXjpnn
      UGbDe6C48cypE1o6hMkOEgSl8CiyjEv5KW3aEqovolJRVjV3VQnVrLS4YvVaD2yPrVljkb1q9i
      lUeTVKif2oKmk0lybPUJ0L7mKab6h4LeuLLyEwl5uQNrKBMy2ra4xSiiwmhzBGvTElwQVZ7J2l
      y0CVPd4sOSLljaBD4/UMEgrEmiQ7q15NFHPbyKvFnH4t9MZtNlvVfirt9i1F2sL/BS3elRBy40
      WbL4cJ5GzTXtLfVhcr4rkaCoy6e/8+AUABADs=}

 image create photo ::img::8d -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXAMPsTLtCjNP6acuWvwt6eoNXUYjcEI3JJsZ2yzmnRNyRcw1meaPf
      FaiJCcWtbpS5se7UqqU3bd2e4vJPVYqhg036egfKltHHMohiBtK3h5hoWJJIRvKoyAF10/Gogl
      kCOOlFR6jHZQQpGLpSuNn1CRd4Gtem+oqFN9Oa6kkb1pm5O2Rmm5bkB8I5PLVTaXx6fFHZROrk
      jASMJK0lG304bdpkrYOa5F3L2K29JlnupBlufr2ars7NfvwOP0UtJH6urKN/GQmQhT9WY3r9af
      cBH59cJAbmweZKISWEs+ottGiHIiuI/xc5ZuyIMSG5hhofrot00pejlCJZTgTpsaW8jzChrQx5
      cM7MmzFz6pQo0ybNnwYXCR36syA/JSX/IQpYhlmUpTMcRixatSkooFnv7QxitSZWWPHA5dMqlq
      uoZyOroSWqlmzZnv3ewh0r1+tRsHZ5URXYN9OzDGGlosxS+IUwo0AST1XqYVXiuJcYjpJSGOdh
      y1Mx2zXLE1+gsKA3KyRl1WXktoIIo5X0F/at0HQrfn2ZdmvMVqRvB2X4LnPt33WANA5M2bYf41
      cc7006C02IwD8WVx5N3fBGxNm1P5Tu2Pv3NxbCiyd/pnz388HXs6dl/rxK+dEq0K9GQYL+/fz1
      GwIoAAA7}
 image create photo ::img::8h -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXAMPsTLtCjNP6acuWvwt6eoNXUYjcEI3JJsZ2yzmnRNwRI40CQdks
      afm7hnNWcaesjaFGYabRmlZ7ykV6CRzF0u3zPfrLFrfl93dG6DUUGJdxiKjRKAcC1Qf5AbmVaF
      LJ1bim2cl56Dmm9Uj46cfDRhb5VliSqjr26tqK6ii5uscBN9Or4hK7YbtCfBfIdyZkJls7RaVY
      +uw0eTMNfZ1tUa3dxN2N9M0biTsOVM4hbsqKrsdunB5tCJds/g6voe4OOs//oV/rFCV/mUhcYs
      bo0jFYCgeKAnRLmMNdCxk+tESwoEWK/wYFVozYbhjHjyARhgqpRF5HfCdN/lO5cgdLjcWW1YAJ
      LgjAnCx28gSG8+cMn8NsDg1KSSamUSp+FUOZ8qnTki2QrqPVEuoTq/vqYZSYqyRWkRfDbgRrD2
      0Hnwe/Zox31mNauTQnqu1Kdy1XQXcD9s3AFo3Xq2oGw40raGXhqXXdurr1mKlQIUQnm7Wscy9m
      LPk0b5Z2oTJmp6I5B3E5K1JpUjrwxVrNOOJcOaUNZ0X42jPfpW4Zv9vmuWxvrIuvEN003HbUuM
      rxNge8t63dkY1nUydMl3T0hv3KJguM3Hq9c8a30xvrnK8eNyE0C46NPfH6NsBPdJm5L3L6+p8V
      iylZ/RN5oek2mYD89dcHewDy9B2BBXqxIIIR9icCgj1RIEGGGm6YoQEFAAA7}
 image create photo ::img::8c -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXwsayGzLyfdL6iPff/uL5hhqghUZM1jAwpXPX5CRwU5ZxKVXMtC3h
      NdOw2lRXJHNMRqO86nM01yYh30WuuJqGj6Z4ED/V5yckGCEnsVY3WCOhmHhoCGa3+NjBaFap+G
      bZGMlYYkYHsyeJyTfJmRW0iHXkwhPoUfV6GTv7sAGbhirYettJ+0ka3OvgNAQVsmrsc5m7vJX4
      TAQsPb1bzXxdq00YQ739/SMMqTtOaF7bRRe8zlvuLN4ufhcOzo17HzS6v8YPj98PgqFCwwZSyu
      KJ3DmCpQ6mM8gQoUNMAfecgphMHsB+/0d6cUymrKA6KvVSqSspMV8kbM9Qsuzy0pjLmIhOqnR0
      U9Udkjl1susYshvIf3UqZkTnBtBFkfEm/or4cKFAe1PdSfXVECpFdlWphmHa7Y9KsUGt6pn5VI
      xNtMSIbjzrFp/GrXDZnmJrd27Tnqx08fTGl2ZUwdkIj1xpWE/RxGFD2mVJMC/SvTjHPI67TW6x
      vkJtffSs6o/PhUfjilqqD1S+TXu7hlptqTVW1K24an3atSxnr3E0z57HkexP4WBtb/mnqefXd8
      CW4+191SSr53pTNmcz2ihgeGUCYy7lNTtje2fGK/xiXjr69IunB47p/D18SY/Z108vgn0LCpv6
      +wb/PwEABQAAOw==}
 image create photo ::img::8s -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXwsayGzLyfdL6iPff/uL5hhqghUZM1jAwpXPX7AhvU5VxKUWyErGr
      lqmYhVvCa6axtVnL6rNjjc5No+AHCiK/R0iSquebtQfSd1fSB1gnYejnV0P4d7joxhgJ+Tg4Nx
      YUNtLGYdNJB7mpecQVYoo4ycN6ytcat+HapfoD65nYuDhb6IjrhAMUCpykxUvcY1yLTMbsvOwc
      rMvnM41Ja/2anZV2rActu130q10qKRe7Sz76nW5r11sO/453Lv+GKfiqrv9ZeX1vnr9LtvjVC6
      Ro3z1U60ilCGWOm7ojqcSNuRUPjjRx/OG6gRv40U00ZCFHrjEJrCRKe+hU5kqDbSOtbxR9lasZ
      UWI+LhC95erk66PQfyD7sdtpdBzBo/SSrnLa0aC7ovgUBmz4c6rOqz7DCQTYLqclrFFbdh171p
      9Hjl5dYiHDduDMLtXErFTi9u5WvXpE8tUI5m+hYaYEcy0MN29Qqqfyps2HsEnIixVvorKZNYhB
      hqKU8gxahc7QpZ6T8hqdMPJBJuOkVmX8mmnT2LA770VLu+1X2bNt1wYkOi7ox09zxnKpFSkiL8
      IrNneo0ww6mdHZzKiL27pheYG3F0T81rta8IpNMhefXTP6yN3X53GfowJ8PhQO2b+Pf4GBAgA7}

 image create photo ::img::9d -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXAMPsTLtCjNP6acuWvwt6eoNXUYjcEI3JJmb5OzqbRJx0c91lUSNj
      jhMThltdDTBj1X55ZcwYbd2a4vJhO22m1z/6vfL+BkfH0sc21+eHhchVghjI55h4YfPT4ahyWU
      L56KZH6MkYxSka9zkYepqHZ7qm2ZWqesYqqeECqyom6+qla5ZE+9cJPEWGRnxMeaycrEzM3Oz0
      TDIMQv3UdmgN1gsi7bE6A757ckteaph9jgk63shuXm6XHv+92A6ZOR15j/+uX8ivnzh39Dh4U1
      RwD8CAArndcFjQILZ/EFsJctjhoKWK/wO9sNBoaWPCGSBXLExSEp6/ICkJ2kPS0mXEjxODnIRZ
      U81MmuHqdXxBMic+nxhHdRMqsqhSo/JUMr1B9GmweRZlVm1qVeq2ndeo/kzK1ULKSMPIMty6su
      HXWkhjrQV7NWPbi2/R1u3qFKNaFTFJaaNbzKRegjwJ/QoKrVnfxOgYT1nsGEsGyJGF4TV5WOCk
      uQhz+Tm1+G5UuEf6hkUYFzRnXqLppl4T82ZWjpervZzNNMvYfbjjsvXq2666o3m1ov7ZKnZa2/
      HAmR6+ruOo0MEp1uEG2ThzuLXJZRYuhXJkIEDEOyYffnVlOEzEql/f/uFm+NFhv6f/MJB5/PP5
      7w4Q4V8NFEhAYIEGEmhAAQA7}
 image create photo ::img::9h -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXAMPsTLtCjNP6acuWvwt6eoNXUYjcEI3JJmb5OzqbRJzUCMyVtLcY
      b4T1YqxFMslsLtkywK7VzeWQy2nQGjuezz/6PWn9ltcXtzEYaAcW1aZoeFXYuNhx1wEZyVaplg
      gCedaIosnnuSn6l+glJqhnYvjFCKfRpxLbCneYinriRzsLS5jrW8poe+m4gktbazkmVPx5OzV1
      dwwtNNlMvTOJHQ26ze29rU2JCixHPj3UPZ5T54E2nL71Dk/M3h7fyemOGZxPaq4PkbyAAP/hG0
      XwUUJJ6gry2scq0yqDDlVJnPgwVMYP/+LW3UP4kWNDiOU0lmTIYhgXQvQEplw07xi6finrnbp3
      jWaQSjlbjDTGr9pPWUGDdAS6sMZQd70iLptxFKJNi3hYRHU4VeVJlES16hKm7OBAnGS/6gRp1i
      vVsyQzyqTI1d/GYkk5XAW7MetasW0HmXQqcixghXCVLMW7t2lhDXeT0WkZ5ibkDI2TWUb7eKbh
      X1k0Kw6DDNw30dAqkw59uiblw6kBrm79EpdpNsz+ApldlYbmWbhr6S7Hm/WtsH2bBe8asngkez
      5MD1Y+TfKFynX1Tn4tODHhvHZZ87TNnbH3otv91nsyvjritHEaf4feDp37mJ4d22eyOftl2/vB
      ojnnLMVWqYCW1XTCwRYFfiEciGBnBiL4i4K9peagBROepsuFGLbHIITdeWhUBSBCRYEEJp6Ioo
      kGFAAAOw==}
 image create photo ::img::9c -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXwsayGzLyfdL6iPff/uL5hhqghUZM1oJMpXIH6yRwUxbSxolaFdus
      MNPYalHfYNnMbWFz3zF4zXaTrlVpWowkx2ujOmgKmPdzZhcxJ6H3Vibht8Eo6KVIxzhIeSjZ9l
      iJeInhBtN35wHKBxl5FBrq6cLTOMqKSmgX6+BoSib71wpRJKoi12no5AMVwjc8JOiKfKN8y6wG
      Lf0s3UNdSHV9+usbp92rBqwr/hrefUg+y51eeD6Ilzv+/bYXGK94vKyOziv/kOivX6xVlnSVeC
      REC8KD99AIC1NKmEGGgCI6hJIi1bx5/8eMdaTlp8quhqti6LPohaQtePjsYepCpCAxlfwkWqMZ
      8F8ynJtsZmPp0NgYdtvW9Wo1EB9MikeSEjza9GOnmkJFDeWikea3ha9klqspMCWniTlrdR37jm
      LYdjqnosu3MaNcnByDmnSX1tvJs3uLqu0rFjC4dXj51l1ijifBw4jDZVOMqhozxpLdVnZM7/Ld
      M5QlV6zTeVo/xkTZHjVLWXBXWzo5inQ6LmrIVI3jfi4cNOvLkmDbBg77SSVXtsB9bdVk2LfUyH
      /N9nRO9q1LptMZAr0ulrde0nB2M98OGSLUweDhmTofHjdf4tqNNnsmPrTnhPQ1LzVin02Txvmt
      fxuXX018kNl3VX87GUhMBQjOQAFCDj4I4QQAFAAAOw==}
 image create photo ::img::9s -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbXwsayGzLyfdL6iPff/uL5hhqghUZM1oJMpXIH8whvUxXS1kngtCwk
      xvtVzMSt6hF8jlqxuak681g31mF0LV6KtFESksScBcjx59eXJ1j0h5hmCAIGqLh41/hTxVVHuR
      F5iGkJM8I2+Dlplxj0NnnEWOjCQ1bIiFq3VVoZ+wqHK1cbeHvp5AMEKglMN1uc5PWL3MPL3Eyc
      FTwWs1wWrYmda83H7ah9qnso+71LLuVgPJ6+PsfXDcEaz9nOXqlH/02Ivl8uj/9iW6Ze/+al6W
      TQVsEQpISosTFMnCh4qlL5CldR4sQu/2jwbKsGLpwnj7E4JhtIJeS9hNCIbBriDB7AljAVuVQZ
      SExEbyZvtlp1kyPPoRoVXstZiqdRfa6ArsyoNFc9hqGy6WyYb+VMqyiz1SPJdStBpmIFlvX6ta
      qos2gLutNqz1/aqAjPbZRZdK3apV+F5r3bhi5SnDGt0sK5pNo0kM9qemocTBliyGeoOpwMGU9h
      s2O8aUYsmN9gMptJO+XX1KJII2RBYUWdYqfkX4VfjgZ7R6rbuGFZVgwzd29d3mNbv4VNvDjc47
      eFt90duuE5XJt9VZdu58116X49dyT8F7byJkdTLgq1PWCz5eQplyGf3n3i+fHds65P+T7mzGzw
      5xanvp98pgjoUgUENkNBJAouyOAEABQAADs=}

 image create photo ::img::td -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbCMFgwzNa1S8+zzaPjG6MBe8QPLhgbFpeao1LIjIZ+uSRUunQKr5lk
      0avSWsGYHdEcpiJlZDa6pmuDxGxNnHu6yz1iXVe/9wEYuOEEhDfIkuhjMogn6MhI4vgGSVnich
      F4mReJ+ePWsagySpIZx1HaCHhyhLqh50EY26r2Cusn+qiZW+vWizsLbLdrBHorKnsnewN62KNa
      lClzxio1/eXJhA1NSdjinB3dw12yaQ3brLg7/gy+gly2HFzcUa4cz1upPzwXbjmP2J52HO6lQm
      dHF61PqwgedJjB4B9Ok7wxNKcNI0QM/xIFBuy00NQ/fB8bljRG6qTJfShTsgRZr+BIEC9dsuiY
      bMk3ezOx+MTpM0vPoFGAEiU39Ki0pEqRwmGyU+a6qDRjSnVpFSBVjkwn9luZlSvMfBVD+hv7ta
      rZlmURtl3LU2NGrW7jyoVLEm+hrvzIUnuo0u7dtC83ikU7kHBgwSsBF07Lh+9Ex4q3HoancLHl
      yzrnEjE6WO9NyaEhq5NiWFBE0qU3C+ScJ2+9nbdAyxNW0x3lJLZ/4c6b2Uxv0bgr57Kd2qvf2q
      ST39Z8BTTF1sXIGPW2FfvFt4t3m16NOKzyfrmEIK/LvdIy86xF022zZc0UeN/VPoqvpHeoaonr
      sDl/qpMu/vHGWlN/DGiBfgbyguB8C67ToIIP4vffg/T5UaGFWNXhoIZCebhNBSCSQ4EEJp6Ioo
      kGFAAAOw==}
 image create photo ::img::th -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbCMFgwzNa1S8+zzaPjG6MBe8QPLhgbFpeao1LIjIZ+uSRUunQKr0Co
      zvSV7XziZ1L81XE5amSYpLWe2+43u921e+JlNF398UdXEvcmiOdxCAhHJXelqKcBOQbiAjK5lo
      F5ZvRDMvkJSVYCeilK6LlDeaEIdnhyVLUmyEpp+KcSi6i5i9e7O0q7sZin+rsajHvHuYmBPFqc
      6cxbympjWbzSnOWJxrJdhC1jUx3eTVROJI7+GrXOPij13nH7CFzPWXmeCHhv50tMHymAAVcNii
      cwVLp84DoNTCcJE6qHp+hJZESxFT+I/xzmDau4sR3GjMoCgXToSpjCkiNTAlsZsKXLZzCl7dkH
      k1wkmSdo9rSJ8luRfLBwYjk6BalSDB6XcnO6tGmgodeMmiKqwmfCrDszspD6MSZJrEHHAg37cm
      tNsRZV8gzptq1ItSY11p1bFi7eiBw3gPVjd9nJDn+jxeU7uKNVaicZXqQr11hBe/3SKp5Zh7Jm
      WVqbLEZca7Pm0GQvSzms7rO2vT0Km2VbNUrfT56ZNEyZwfXVxHc56dbEOPCL3lB+h3b2uEvkMM
      azAeZsq6sw4wgJRmc7XXVwfKRJi00zRrdwvd9lXXA9G/l4wtqfIyRv2fTu9ep5117LEm3gMEIK
      32FGbBdAFviXnH4ibYHEgO0dFJ930HkhhxLoVdbVdtEgV0Z/7fnRHUUd1pJhEs1BBeIQGpKoU4
      gKolgDghJuyCKGJooIY4zPvWjjai4mleNTPYZTwY88TGCABEYeiaSRBhQAADs=}
 image create photo ::img::tc -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbh+Lrs3MIpQ+eoPbqyDuT4erygcTN8WX7HYzLZjD6LQmYNVlsStdUE
      bcGacjWNME4lVpLPaPaO676Ur4qsut617rz2kvev1xUz+OYnQSKBBWLFJ5eoiPRomAHmmPjxCN
      nBVKl16ZE5idHpeRPDifp3qrmJdfM66uNJiWe5NFsYEcm6GtjYVjoX+2tZOxyIyfNAR2wko9ps
      GB3EiJxMhC2lOX0N0WTd9knNayYOBN6qGGprVv4Dhv1uXHgiTKh8zN3K7NtPKlovTrBd8xCRA1
      VwD7pIAbPpo+VwoSOFyxYdAthNF0Jz/wilXUz3MZlHjSBJihwZYpVBaAmrNLxFaCXMh7Rm0Lxm
      82DJLy1PRvnpEqjQmkOLqjEqVCJEpWtursmp02LUoNJmKuWDj55UU//y9FCJcWNIgiY7rhzbFC
      3VjN7Elt030sHZigZfApo6625Ad3jJtguXsGuvvhMBTzss0CI/dbJiDu7TUB7LX4IVl8vXFhdk
      HevGOZHkjPBWui+Jfo4oml2spD1xZhujrbLbM0yLsbJnO+2c2qqXIr7dlilWzQOHWWU86FlfeG
      B7q4wH6Z/Ezl4zN4fNljRZ69LxUt+uvdlVtbrlhnX9anl6x5YN8+SGB0pkp7714JBPkffjp0rw
      x0NNvR9RsBw133v9wEHFFZwhk4Z+SBU2oIMP3rEFgRPu1V+CF2IYIYAX3qfhhgqNIaGIDJnoTA
      UockZBJi6+COMEABQAADs=}
 image create photo ::img::ts -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbh+Lrs3MIpQ+eoPbqyDuT4erygcTN8WX7HYzLZjD6LHZjOWlsStVVm
      DXuacpEK2oIlVmoaaJxqWs483g76OI6J7Oa7PYQkAebh1aUHEtgHGCgot1jixbjImOeo2CgoKX
      cp8Yh1RllGhBcDmhASY2qp9XkRx/PDirq0OklGG3sp5LZGqMrHm1qKi1o7+Lrrx9Ykc6MWxukE
      FkxnaMQ0nfxnXUwNHdTbhrhtttmMfDoD/oHtSpvbFg6OLQzfPU9MNnzIDXy+r5yo069/dQISHF
      hImypF1Yw1XMfvlkJd4vYJ9EYRo7GL/w/7ddTFsQcxbjhE3bN1cZYsgipHQUynjiHMeBEz1mwU
      JedGnTxx9vzpDKjOmDbNuOwE8ybFmSnRHc1nwx1ShqZMxiw5curBiVA/otyK0CPXLiHDlhsLsq
      y/rgUXgl0rFqDFbPpswk1Ll+jZk2TtEdInV+szvoSfzv2yqSU7vV9bnD11TqnPb5UoR6sIhDFV
      rxClSe6MVialZRotbRlzuW1eKvbiQjLMR/O7uEvtptLcbuWtUoqv7WKMFdm04LhiAa+sshXyVZ
      NBc5ZoFlPNTA5L431bd+9dXqsNa8/OvfvNjq5Yq5UctqT5sjT/FoHSOmmvNLJBXZH3fn2Ybztv
      6DEX+gwX8AGYhRIDEhiggf8hOJd/qDGYjRr1QbjSgRTmMOGFQlSgIYYUSAJiiCJOAEABADs=}

 image create photo ::img::jd -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP////8AAP8A////AP///////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5vyw30AN+4vNU27q+6Xe9HJAU1tKJSdBQkl9BO
      8xmtTodV6HVj6XolI9mTegIFbDUneq12Ns3h8nhYNrOTeLS7Pvvw/XI8dGFDVG17H2lScUKGbx
      xngpI0f0g8i0yVUo8aX5UEggSQjJkFmp0OpmZ8oJKinaQ7m6qrAaa0HkGtoVyxalgMuLm3ticN
      JQ20k5clsbuvyMJ8xcTGLckny4LNmRq7NK/BdUHUxaOdyto9p1yB29HW0sTSXLjfNdDsqN68yM
      nCJeZNq1fnHrhe3fgd7DSggMNjkAS2K2Nuwz1o3EIEUYTK/xTEiOXMeKzzDqHGP1hKNGwSTCIq
      YwJu4eJoclUcgAEFesxli1ifXL78rBwmrpiNgQN64twUlCdOpT0jUWrA44HGpE2lDN0EQV1SYy
      OJ6kN2c9qZYw8mQVD1MSDWhFdpYft6zQK8ljKKjeXUMYIpunUj+DMXlW6BtycJjXzwF0IzmFSL
      iquhNyskvWdTZa6Q9OvDnAySHt5Lui5go6HPdlZ9NmCqh5XhwnncWPPXhrgP6x4a1d/D0ZYnxt
      s8OfXq4/F2aiYd5iWx07VZI/cNGyxim5lCi8Zm27h0a9Gq75Tth+z2h9Az584NPvmt64DKUh65
      svt3rHUXx05cSk453P+MbTZdYKgBR14uK81HlW75qccaWVGxNR5/Jynz32hp1cYeWpOJBh9Pik
      mFWX2+0aAhcRGe4Rpz/SHxX1e2mOigNXNRYiCFdvxlo1VpxZggjM+hwxdZLZ4H420+hhWMYSLe
      iF1ckWA22G6pYegAgEGuGFxfrn12DXJnKRejlTp6yCKU23GoEmtVZmjkOhM+uYp+Yq4JZprJMK
      ngmTlCBZl1u2GIZ5VBXrPlXX5CiNxqYQbYoQOHnsFWS0ouKiBmbYaVkZyALBbel/c5qF+ag0W6
      UnWguRXoem1eSRgsB85CqWZ2horkqASaWpuXsDHKGaabxRlff3sWRddjj/WoX57/fApFX2+YDs
      ajq8vux6lTFEVVlLRgUAtRjM0iKM01y6oFaWTTCAtii1xN6hUYUjg57FXspEUZVfPJ9JS6TMUa
      EXqbZqOXR/t+2K9GiYAEG7bz7Dvkwx5wFGGy4zTMErgdpATxDMz4dko5T3HHMTB7cXARSC8R5N
      NlSiH2TDvNKdSPazWB/Ie2EJ1MJMIy85APLumGRBBYYkiyDxOWaCNkzS4draUAOkPsVRJScth0
      wBO+7PRsXgnJIdEr+xEnTRtDPQlGj5TDibVOHDyb2a5cJpJVc4eLSc8DYPRSF9lFmnHHkExNiS
      8dl90IID0YQoXB5/yiiOGy8KRHHm3goQ9JTYmvUzIKoVV+xxpo1CuEJVsD4snpdpHudhZKGFI6
      60S4vjPsRcg+JO0r2D4W7iroznvsNM3+OwyACz+8ErcfH0MGyiOPAerQR0+BAgkAADs=}
 image create photo ::img::jh -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP////8AAP8A////AAAA/////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5vyw30AN+4vNU27q+6Xe9HJAU1tKJSdBQkl9BO
      8xmtTodV6HVj6XolI9mTegIFkjWn08ZGl1Fvc3k8lDU457YavXbOaQQbBGkacR9iPHUDZQEFcX
      k7MzstiYGDPIVhb5hci4UFjp2JozSUo2uJJZphniWgb1+mpKeGHk1SDq6hn429u1xIs7Sra5ZP
      J2y8XI7MvYUnf8KYtbiobUnIas+8zaEt0BqX0gOB1HjIs6rgrozdzh0GguOBqkzopCW5jbu+/Y
      fh8zLZEyCOR7lW+2C5+yUl2Cx69UIgSlUC4atl/X61MKBD/xgeYtYUtXu0EJodD/g+DhSC5YxJ
      WAxK2vpAUaVEQ1gq1trnKOOjW6iACbzJylBCd+9sony2aB1RJq0wvnJH6FkuWzWcyikq5dVRBo
      kaTL2IlRFIM1GXgWqWh1TCpPnAml0pMa1VB17d8tTYae7Tuj/Z7F0LgbDXoVYjboXK6IGNmGsj
      Sz7ctLE6xYfM9UXk4DHkyT3vXX2A2ZbmQouorOnsR8K1zggznc6nqYHqUrb36M5quw7p2UDVhr
      5d2SWE4rfv+F0scWxP4rZhVYZuuXQ1JszGgsWC25Nx6t5oAx8fcx9y7nKbcm9K+Nz4MGrZ5x2i
      HuyMzxdfvqdrfDIkJP+5BTMYWYnRZYZs5bk2CX0ThHfVX8zpQs1/d6x2CEMVQpgZOAnF9U0e0j
      XlITQOZhjhhnh449WHcYknloo/7XfTN+xIaFlbJj2TX4nBbWMPjc68tQ2OtOWzI4cunYUiRjay
      qJx+RzLFUGa1ceiNPiCK8qFyKw5A4ImmkTThMZxd+NxhBm5o5QQMMijBmaEpGWaK/lExnRADgr
      WijHIAKZl9k3yHJ096htZjkTPS+Rx6Lqk3A3IrfkklE+Kx85+ASX63HmQvTmkafEVu92h0m126
      GqeSfkqpOoBiKtdxsI0q1qG0jrjJecnk2pqog5o4qUT1MILbdoIpeN6odqkKLGn/HqbRqX+UxB
      pXstcty6pVnoGmbbTMJpnmTL425tWe+BFWLB7UngOqtxENRixv5DbBLpgN6WRiL4T2Bu9eO6XL
      BXCoTWhYYOy9Jem8vx5I5Jzy+jSVUf76uKxxSABrS0kHR4zogUNVhYshSLUnhV051dpBTUpx04
      8OyqXlsckscaISlz6lKOytVcEcksxPSuXPJ/y0khLMBZ1iHTvuqHUzQaSUAzDT0tAjcM0Sjriz
      s08XPQpEO8lU42X30AKw1k3LJp7XHakRtjUb/zMOJzki/fPXyfxhTA+1vk2IUV5XzayGM+mNTS
      xKByxnQ/jg8640CgUdB89PVwI11vRJIqDNXoY7tPfTqEAkDmp96CF6WhV21AOZoMJxzR65ouHv
      rcFI3GcstFcghLJZLKGa7LkXsXvbvf/w+6HBrzD8bMWrcHzyRMjMO/MvOA889EUQT30MGVyvxA
      UK1O799xQokAAAOw==}
 image create photo ::img::jc -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP////8AAAD/AP//AAD//////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5vyzlwbcsbbe8rnp+8IMqnIQqPHaMRyVQCmdDi
      8xetOn+WrBYyknmf01lgMBiTx2Y0uVxmdYFf6odxrqfZ7HBpqU/CHzltHg1ndA5lhoM6M29YU2
      lJBARma5WWRBFJjSKUj5NbepmMnH1ii5JLJQUBq6uKgKMhPg0zBbZgqKWsu66vSpt7tFK3WKu0
      x627psHMRcCwqsS1xy0Myb3BFM6kzsfD2EXYj9d/WSWNE9Hg1mDTyVLmpVTp1uLv2+G85Rbn3P
      S29pQ1U6Vv34mDOuRJWYgQnjh2IApKE1YuBzABBgIYqDXx/1aBc8II1nPSR+GeZcXgtDKmaCUX
      eL+4cQKo8haaGWWMGTvYr8vFOTTL4Tl0JuhJRDJlmYS4Jw8lRGsiuIpaEtycpT2bqrGFCM0fgg
      LIFBhwMoc0pW9oqKETtVk1YgMAkn1A8+eghVrZcIXDsC5XW9lYnY24lOnapzje7gwrN3DdpBHB
      5h2zt9qJnHXFknE8+OqbiU4rIbwsmIYlzlYV+VR2mPLYansAZo67mW5n1aRsGiIUtQ2aZLTick
      VduEtQCMJzrpXtdyxg26n9GLfJDPEu5TuDy+UtOLqY6eKKJO/enflU2ng83pY+kxgY6yOzU2Mr
      +jHa9ix5usZsnrkXsf9jFbXed/jp1xRVr+20SlxgWNKVfYSBB9tle9EkSAlIBcIVUuTZlURd+o
      nWoTc4iQYShJ4VqN9+u1TT1nvjgdQhZEDpRkhlfHUS24I4OoAibrKAiKGJ8yhmjIn6/chekO6Z
      sZcYF/52S3Ig7eidHEzu5CAYCTbAI30cnjgglhFZCOAZZvXnX4wrKklglk8VQoFLvBVi0Yz3wb
      mhk7WpuRKPr+GDZ4QFyincWIHpoxxi1Q2aIpw0/PVReRb+xqJUY+IFqXbD+XjdQXjI6dVIxakY
      HHrqGIXQeIb45kqpm7Zwmo8LVidiHuGwROMgx8mKanljnHTja07lk9WjZdpIYaf/I5V1YCG4ig
      RrsvIJIKk6DfXDYrFlTVtjtYfO1SQ8Q0J700t5JvsIhX0mNOp43Hbj4TRXrSEtUVBRxW2L85Kp
      yFwImdnVHRQ5CmRkJKzY4oKPIPKYwUsibEpitvHrh0cqhTSQsxKjJIZuD/HkUq5WhZGKReRq64
      VN9/AaUotfZXvyNoCM9gU5WORjT5OZzCyjOQS13JM+aVrWM1Zb6CyQoLqSbHPNSGuh9DpmmUzd
      zyr7lKgoQfM7X8n2QePze6NtrM+rRsNcNNkUaz1xVURfhUqa68yC1dtK4Cw3AY6MfXffJGkxSY
      kXEiqLH9BI4eDiZcxd4rptc+JLKF0NXHlXVXNECcvYV1FOsB11ZAhkHBzPwUKoauTRm+ia4EW6
      UqDEzo+m/lYhxBW2NxGKSbm7gHvvt+8O/BG/D3+DxqUbHwPyPitfQ/POx5BB9MRjIPv12FOgQA
      IAOw==}
 image create photo ::img::js -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP////8AAP//AAAA/wD//////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5vyzlwbcsbbe8rnp+8IMqnIQqPHaMRyVQCmdDi
      8xetOn+WrBYyknmfYPAgMCiTyeO02dzrAr+5IoEgRp/XdvZnOnNLdSUldAN0OWMMh4gNeh4Ne3
      5/UycBg4WGZZiZmXyRnJxJn32UZJadFY1cfSJLqpSlRUl0sqOoEaohRHxhjSVvs7OgE3Grkj6+
      r4GTk7+0praBxFg4y6RTBY3MpVmw0b0P3K6Se9lvWtC4yra7w9ijwN4W5yAtwsfrLdfu+s4S8n
      vpXKgREtcrHzlTyb6FotIrIaxRA2/lyEYHIDhH/lBxMBDA/4CoSsXAzNE3Z2SwR93+tDIpUZAs
      imEwttS4Cl6xDodgIsMFiecuB9cEbKo4K1yKhVK6JLW5aFO4lxWP9pwHjcYWYUpTUk2X8Co9bz
      W1PnJklZxZrjKTTP2XKBnTbZN6HeIlttGhMfBKaNqrCS0mjGn/uTnzVRmhMgQQKz4cd1IiM6OQ
      NiSW0yKagYkzU/oLtimDkqwY4qpcqHG1zHMws2kMeSSgeZIbFLVZCfHmw6vpyS5ZMbZvZsp6k9
      WtzO3uBztBdQEu+3Nj48aR8ybq203RyuHQEjf91EHUurFcC43s3Ovn6dSrr+pthijoGCOFD1KP
      rsWY9BD56r+P/jMj2P+DtXceaObp450da6GSGHmR9RbVT8H1lxhn4M0wIWb9FTdNLw6W5xxkCS
      aBGXIMXjXdh21VOFGD/e2nH3nUDcAhffPcdyBLPfCGYnkhzsDiiQXKR8aMyflo3Y29daVdhOWR
      FtpSuLino0LQPdcgie+gs5x0ZDk0HEA8Ojebin8ASZxei8miWIlEBkZTfechghdrqpWkWmGCRI
      YXmRy6BplftmWmWm70VDQXn00+ZiVuEza6ppWKPDlZfX9wRpaLe1l2F40o+TgXd1dFR1iP7JxE
      1lkHWfUVosSAGipaGSkXVqsFbvcQqdyQMKA7hjqVihe4xjoOdTFiokEBqsbBKV3/ur5EEiKydi
      KsaFQFM018vBrVkrYhGTmrj7ro+Is2xixY2kYdectTXlUNh22WpW5GSzkOTboVlb8ehOwbFtqo
      pEKxvdVPnswIkA+9clgCZrI1bSHHs9VCufBwSjlM8D7MusTvW1BWu83DBXcQlBz+xjRNwAJ/A/
      I+eFqoMLjqRnyKhRA35AkYasXcacrthFyqxrkC+C3H1sYzUcnB3uwmmpjuSfK84K6z7kl7/JkI
      YWccDTVC9u48UxFrpJHH2BO9vBQcQ3cRtth4/OX0hmcjDGetdJ/8ZhVIXIF3EzfvzffdfvOgd+
      BBDE74DYFJeriuiUu2eA2KPx5DBpIfcYECB3VnXrcCCQAAOw==}

 image create photo ::img::qd -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP////8AAP//AP8A/////////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5vqw00Dd94eQp1n/+snW02ABpHsiGveGx6ksyl
      c7qBbpTUppWYnW6lOot4DEEKo8NTgMButwO0nVpH2MXM3LzcXV/DB3OBbHYgURyEH1A9THt8g3
      FVagx1IjVPeESWGnZrb36QJZthlB+LHYhPqJqcjgyAOocOpBwFiwWHmB1pVZ51caglgH4dtYsD
      t6IiMlenvG6uci0OwsMbxbZVuUuGrH2+r5Lhv7PGpqHKdtfI5yXPcMvJwdSU5cbsIDLXNMiNk3
      9z2TbV8JepXjx8Z8w1GvQuFKcqA6sJ0FdjHbBYGijya1en/w+kZQ0EjktXzmIudQE7uXp171QP
      ghmxBQwBT1O8BqAabpL2TdisbVhaptLVDCJLHUf3rIR5JajQUxdn/nMWkmowpswuoUMi8gHHPr
      IoyYpalCZZh7/ChOvEcK3ESIjOwkv0L1DVnSClvZ3UB9dWZR/d3oU7Cp4flQ61JQIkNqReCQ6Z
      sh2EV3Eqgl7Xqg3XjhPMw5ah+mksLbFdxwyhcpw7FB1YUo4db1bTNi5ouXI9+hP8WMZovXB9h4
      71bvTrCTu9afYM0KwZn8Vr021L2ndp3Eigu6JTOyzOYWNFlf5r9rCwImFbmb+tUk5i8giVn+dx
      GIIn9K/BBnqKUdnxhv/o1cfXbvh1JBYs7sGXSGS+wMFDZ/RN5hF9npRxEF1mjPVKgPTstt47YJ
      mWoHPKmDYhfif45M4/ykGGHToP+PKghxHUQABjIF4XxnDZ2CUjivUM0AaOKQrolYKX2eegP0Ky
      EeQwRRBpGo+V+ZijkBFJ0FeURrKmWokTyDePOyg+CN2USBalYwMNRsfmdqChR6QDVLKj5SMR8g
      EnPfRJ2RxCXEXm0CCUadfdllfV9xOGYEY2IIF86adhhET2lSYuAD1Kh5sSVlgkpy/ShOAm+nU2
      5p1bvqkTiaJytllnmibJEJHC1Omqo7TthpeSA+rmZX+ivrrTprDR6eKHi7bWKmj/xCFWxnK+/W
      ers7ZRltmUy3U0GKNmwRYiqZxlJltmpV5K2FeUgXsdcr2ZGio+gyoXS4jbzgbcVOYeFKu6O+7a
      bGRp5dtSvUaO4qlaSIFjawoCrhajtdOw9O6CHhiiLjjp4pUxvvxFEigHNl18pp21duVXVh6XCL
      IPvKyEY79XdQXSytzIRYtMsL4UbF3pkrRPysFOVFLLf0iclzz+WBtTD/zYvDTO5oFiJ1qRwlbQ
      Kk4HmYZHUhOiRhzeWC0008OWqLUl9XUNlYobW1MR0PACVQ7Rv4SLdNgPNVXzxxT9THRxjwlU9S
      yIWPzrTH0fc4pudIEdad5OwaLy034fIilGeNHpGVDIZQd9NT70JsNi1XnLDTfFNPsXm1Gd9nx1
      Gk4T5d+BgTguYYJKwP6xC7edw6IjSoMBxuG7kmG8BXkMf1YXLuTOyPLMq+B859H/ML3k1VuPxv
      PZA3E98d2jMDf24d9gDvnlHwF++jFkwL4RFyhw/Pz0i6FAAgA7}
 image create photo ::img::qh -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP////8AAP//AP8A/////////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5vqw00Dd94eQp1n/+snW02ABpHsiGveGx6ksyl
      c7qBbpTUppWYnW6lOot4DEEKo8NdqHXaNQaEeFyNon++aRG7xH8TAnNXNAUbBTVVZkQ9THYcDj
      pVDHByZzWEhj58emqLiCCAbRpqkn9/ij6LNo0dMhyHmk+gdGwBNIFLqbmwn6t5dwQDqw6Tlbmd
      q47InqyAwQ1hYbamxrrKomeXvqzAzm20b3AnmNSDu3cnqIeNDNyjjtFq48aE5rG4qfXN4ct9z4
      XkA+hZg0QtHzdTot6FoUOOXj1mAuRZMmjLTat+/k514ndO/6M2UQcR3rmW8d4rjvY0ctT351sV
      hA9cZVK4hiEWO/rYuXkpsoyikZs6REnoCJgskSXmtIow41MiPdtOtJTFbmrPmFCDZo1EIGkDOV
      NBwXoUCRLRmkiSlSoS9gEwAVP5ASoF8+kannO6znVACa6EojXcab0bpuXapH2JldzV7NbAiyPn
      gs0bp0gtSt4SZuZrKtRgXl+/hgXLd08VGpJDe0arZzJpi6plJUPdV0dnu6CpivVWumU/1FgRr+
      aFxLXShddKyahFO5DbnZ/PKddJS7PsNrQDlwhm9mGy4sZD1Voue3uwg84gLcV9DpThZzlBis8O
      XDzRx4+N+66KGpp5lv/pmQYdazWNRgtd3SxHX3/+NMjeE+F5Y5gzSklyHhwMjsUdfmYYFhc75x
      lVVUsXdgONhelFByFpJjaT02htARfNIhxuolOGRxlFl4fM7YMdjTWuQUlgEs51nj7hWIjZj8Ah
      1VFrKG44Yn3chPMHMfv1mNqDzKQiXpV7pXalUrcxpxuXjnhJS31VlVaRj5JIdguBvBB5opLjpU
      bKmN+QCVlKd42HyI/AXJmgUklmGR6anjTIRg+Gwrbndbr5piIr96l32ZvcnSjNgYteqtBOvNUQ
      aR8wVVSYTnGJukx1pHBqkaVxohoqnUCpt6GpZvaz3zWrsvonRFnp1saQ/dlW3iP/I04WpFN7RT
      JMgMq29WVpiwEKLa3IXkSdscnp92xkVHX7zrdychbbsN9BdWxY6mkCqlE8UCKud2UVWxlSOIlm
      GWn1HuWgq2f1yG8Eei0Z7Y49MXofZbNI21WSCAds6VnEbVWdtO5UuqQpF2P8JGE1keVVm7EljJ
      PD3jHiU2H8vrcPTU21S7JMUbwc7cN4YirIUOyitBFJy13F20ErqwTsVh4BTZYyRs7siS7dOfUz
      PhwP1yDST0SUCyFBnyXR0Mgx9pKqmBYUtiZjL+IQchGDhPY7aj+mQds9OJSn1qcl2XU6qtiNt9
      tJscnbjE4SVQ4mS98FkA9Rw/fNZcOO+/fji2lUZnKaiSs+VL6OY85IZQHOUl7XuGg7ki5Uu2ei
      vF6RPPTaxQTkdSZyvq5p0LWnYbciDo3Dk4t7iGfNGYI0bnUKcopIatVAKeG7GWRUPwYX2K/dhQ
      vSu7x9E90r/30O4UM//g3la38+CekPtD77WKv/vgizuz9/DPbfv4IJ+h9xgQLWC6AAxaCABAAA
      Ow==}
 image create photo ::img::qc -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP//////AP8AAAD//////////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5vqz1wbZcnTt98Ksu4nnD0ywWHSE9xA0w6lzOj
      Mwk9Tqk5YNHC7UKIWeNvQC6bCQxCad2SxsBRZthMRwfUbR2p8XErwzsnAXQMA3Z4cU19DkpwUX
      wzM2aDBIdskX4cER2Zmn6QWXWHeFKQiztMjpxZTGeWa6shm5qqeqmShXZ3jzp3nb2fqqhiA5Sj
      bIBof4JtWsKMkSVllQ1qsNdppRbRsqx8rNJk1HeItzjKj9u/iRJsxeRp1qVyvukV1yDNm4XF47
      v4oNBQA0YB3yKC387pqsRNCbWBNJiBcpTnBz1yM9DpqRZP/2I0U+usCCgQoAAtetbOiUk3Slum
      kE1MYYsX5V0pm77g2WskQhHPaqQIGCqGs584ePWI1Oqjg2EWoZWIGjtaYpxGnzCzZosg1FClqE
      cdPHxq52Q3MHfKREwrSpA0X8pyDmx4sOcgomTAcdxac1A9cl/n2SUySSoyQYF7qdWSbeNSh1/R
      LK4I1a1fm8U4hXv3mFNkank5I4Z4t18hfeHyDO75edwksQ6kum4w2eJqWVL7zX5dGrOdd2qxGf
      wDJrdff3RqGzsNjVFWwn65CqUA3N9Yt5du54ue/F3U2My9PtSgK2JnTXhxlkZKm3vgfgLGpnpu
      N+9pzEYf+JbsPXDz8/9M6GIccKa1V51kd/0j0Era9TGbfrIBZyB/D6jhD13EsRZfPP7x44t6lF
      ymG2ALDheLhhumBJpUEOonVkbkQXOWXZExs2F7gdUYWoKI7CJfgw5hFNeGO6pVI2gvtlEjfd2k
      EWOM7bUIXl4MxWiNRtspBVeOFOYHIoVA+Wchk/k8wlB5PEp4H4L2gacTkJplpGCCumEW3YcSGt
      cYnCdV6B+V00WZS4L30cYZn/MFKORx3xUK1Hqx7QggJlxZ+ZWdhHrFDyHRTZodMwItFOidEGga
      gWGIUroFc40amtyjA/p0oizCQeodfm0WxuFlfnkKyKZRrogTmq+1hmVdtHq4UXT//ImWGDN4kT
      jXjN0E58adhiFmiGWuSksmU9/oQk9tVZFmWW7BpQrQZ4jxGsZCE21GqK8BHtIugmyAdYY+m4qr
      rjZzbVnhNJGFBUF59M4qV1xdfUdUVOiccOG3PLHWUcOkPrytxP5SHKcnAdnbHsiHXtiQTLKaBb
      ImVv0npxH+NkSSSXIoxQss4YrskZzkIfwRt3H0tJNESob6Sw7WlUX0Wlp2UW5SKEMJj30INdM0
      Fy8zGI1Vv3G7D0xVz1KVM6lwna43qqV8C9aKao00UGdfJAbYvHyDVcdumd0rN8PQDbLaOaF2Y1
      qnmWNL0LT+LdOst4wyydov+W0P4DFxHA8hcD9/IjlCQntzo8Nx74R4massTpxFhxBo7eRh2Fz6
      HhVJnEZ3VFtRBek12Jj37LRnZnvrdnkhvNO/j36FEIwZfzwPyYu0PPNzK/987tE7Pz31NVt/fQ
      xfaL+9C31/f4Xa4ttgQvlIXKDA8Oy3z4UCCQAAOw==}
 image create photo ::img::qs -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP////8AAP//AAD//////////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5vqz1wbZcnTt98Ksu4nnD0ywWHSE9xA0w6lzOj
      Mwk9Tqk5YNHC7UKIWeNP1CqXBIMAgUFor1ngKDM7UzrOrXRbvf9IOX92UTt0HWZjem59hk1McY
      NadYwnhQF6bG+TjWdkgQ11an+UUpSJfKJfgI+MoJlynpaJbmISqp2GuKGAAzqjDAOXp5ARjrdz
      pCWuJbyfzcCXmVySIVp3UbNMzMVnwMLDtZzUYYShrpbhpM+6vRXhIGW1mNHA6Krq4xbufr5flO
      bM43Z1w9cuEKsJeP5ZUYKm2zc8NAwCCgPxIUR4YtI01NhL/5I1iXM4FAhQYCK2cx+z5RloxyBI
      OcdUfVqmQ1mDNSfuTZxpSxyYk8xw4mRT7o1OFC8X7jt5U2g5TDyVaqC37V1SX5AUPZgVIY2UgV
      SvXl2GlaiiPUOjPNMz1RQ9sUSSER2FtuiWZ3JzgAW46p3cAXscnA2sY21enG1ncPTZKRQwxGZP
      +cKbl8+bLAQWWwXjGDAEraMM/20KmWjffZ0Jy4NnuNvQrbBPtzTqGePlWLw2dvYadR1jcaFiBY
      aKA++94KmYKNvH+fLjm89xN9y6Zq2n5YIaI34s9LnxmTcJXdPMXHtowGsye6bHe2d1jV3hmi/F
      /dTbXzDDCyZmDPjlZf/14QfeR0SZMhR2rMyHx1rWbTJJemhxJduDlFzkBQVnmdafVcEtyOCHII
      b4GWIbovZfMxjpoCKKvoDm4EScWZYWiyumyOJ+L4bUyXANhOjjjxXOJR81Qrl4IUJBplWiHVrN
      oiRwIkL05GZkHGgfcsMMgkZT6iQUVXnA4agfRVuudEobXQo54S7ExILlMby49hyaXlW2ZjYkEq
      Rkj7qpV+R9U4L5Dna4meIAewP5CR18gWZHJCqf9YioVxAKpp6aSxpi06GuSafbmIK91WiCj4oJ
      26R1rmZppznCVKqlQ13SFkvyvMYGq0O+U1tCw2VyHA512XrpqDCSUWdYwdE2EF3/g1Ena66o7X
      VNTsvWlJ5dOP6X6USuvafBe7SG16ytpVS4bTHSzsEbdcJytYU+jvq1AVUHURdZkXdY1qpUuCCF
      G1TX6meUP4SdO80xTfwCaG9pcdTMTsVSg5odeP0iBiRbJlOwBiOVpKPEHXHykXWL3SgyORXxK1
      NE7GRRsU8lnxjPWF6o5VBMQcQc5Mxx1VzcWz1Ri5lqPJPRMkJ/3TxNTmIE/A2ZIEsDrLcX1xHz
      xjuoXIw0kaWZoma6kJLwWE9/FNh7+X4CtrZVaX0w0hrPwpIhdSpnroP7QmqNcpXCx60o2n7pNr
      xZ811gJSr2SwtPeU+saYbaBDEKQyejbLQfU0xGiNLOgldCi6vyklBrgXhI/hLUVXB45OpIVwP6
      FUK4PjjsLsi+L+0r2J4U7ix8Pjvv/up4O/CipzI88TH6jvwTuy8fQwbOD3GBAqxXb30ECiQAAD
      s=}

 image create photo ::img::kd -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP////8AAP//AP8A/wAA/////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5vO8yDQNdwDsu03etA1smnmQWPqRbRiGyKlDen
      FARlTq+bqhU7rRKzlrA4MvJ+S6gAYU1Qr93seHzooVOHVqZ9g+O4G20Mb3JsdA0aSiE8RlF7Pn
      1ZNzeBf4VZbYgDjh2LNY0dkpwSk4BKf5mbfqlZHAWSBaIUkoZvqGWriBuukgOwrKIlZCW1D7eg
      nLq8vX7BrCfCang2aE92P7mPyn2HQ89o3t10ntSKdLvLudqhAgZ13+/dmPDGAuczvnjqOJvg88
      OYxaoV4YWtnjJ8VOZ5Q1SrhCZ69tCZO4goQDt3/Raecoir/5mGc77IGbwRsmKLbgrJRbMlkM+W
      PeuYBTOU0tDJhy35IAO1RdWHjO844SxX5gMkmapQAhXaMVHCmfQKAl3oZ+idouCcNtvzTKm/qk
      2bbg36zVGiqT+t/gyLVmSdMWCjXqVaUR4YCA3/hQtI9AnZmYIqBCMmSN6psEWpPZgRmAFjbs/e
      nCQsWe5PMJqiPdYcYPOYyW7fYu18I1rXNowzE1pNCYLlt7OiBdr8uKbi1g5eC6VReBBp0x39oM
      5cUXdV1YVKBb4rgaFm4lpFP9E05wFAgHBWR3Y8PHfOO8khUwokGe/2NwO6Rwf2JLxN4PBLGyaP
      Wr3xS+ptjm/AayV83P+HfPcTar+ZAhyApTjnQHqdEXhfXQRostlM5JE2y3UO1NdgZ4hVk16EBZ
      7WmHkKzkCgawLWkdoamU1gl4ITfCihWtIpwluLEaoWD1f7LSghixw+CBh/ajw2XwQ9zrQiiB3a
      WOSTrWGnjWmUKPljIEJyCCKTCQ5pXmMmpbZSirFYl+F2/Y2IZZjUvbjWLYxtWaFzpSk3InOWkJ
      lUnG36h+AfB56UYWV6MsfnctkRcuaIgBRCI3tEOUbdmILBGGVyjGUZTpzB3dVdG9WVpimJtnVF
      m46z1TkqXqzJ4dhvWAYWW2iQJoTdZ5Jqyd+kHNJUKIST3UoYYJulWowpWerFUJX/gHpppncm0e
      pTNQFtpJcwl2iVVZZWfeZXTetN6+RlS3nkE03bNkkFjW2dhIy27tL15nRm2VaQuXeg9CtHGPkT
      IFLHuLNvkO+mVCNPR7l1VLiRdIWuwVCFFtO91+Cb1o7OGOzwHhGVNNE9YJSB00ZobWKAEhGBjE
      3HxdG77MPl7pQyOtQo03I53DRU8mXZ2EwNyxb3i3GpHlykTw8f08xwOtO0vHNZ4uhD8UtijTPM
      XrlR5W4yvIQEU61r5WwYGdHZMbPX3MZjl4WeNdfKKwDPO66ygwFSJ7YDVYxGFI00NfLahZSXY3
      8e6L13D33T82+igfdorU4C57GPWAO22jioRnkm9oUebOHq+QQcMDI5F1hEETTpSPywNOowmL46
      6yuIfjPsQDDBOe21I450p7iDwPfuvV/xevAumEB8Exco8PnyzEegQAIAOw==}
 image create photo ::img::kh -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP////8AAP//AP8A/////////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5vO8yDQNdwDsu03etA1smnmQWPqRbRiGyKlDen
      FARlTq+bqhU7rRKzlrA4MvJ+SyxCgMBet9lqOHzooVOHViadVtgUfg1qDIJrgYN2HYh1J1FReD
      d9f1ElcpVzbUNKHIqJjD2OPjc1onqkNJWZbYllnJuhpqIaFKKphFmsZa+wgHcSarKZuD6Rerq7
      OK0nymiUqctPnkagkscDfQ8lDmjKg4SFzCE8pszUsNfZ3Nzb6Jiy7tDGPUPlpud0dsv5qu+tYA
      L0M85pADjpGbh1z8gc/KClIIddt+65SijrRjB4RSYtHOfu/54mhNvI9AP2cIuiWBGfdMw2IEDL
      lx8ZIsJxy8OPTfli5ithqoGwcCBoYlsIMpNLi+/CjSSK06USgzslomvpY2nMOjIftHyKUFMLj0
      evdsrVlCpLqlyD+cS5VRtGoCR5epzxVJ2bi05bevtJBd02tMDoHuI2h5lLNW0F8ZXJBrBTw4Lj
      dNtXEfGDX2+pEKDx1GzgrYJQ3dvs1JtVq4LXPs7EeXJhWaS3DsB0ukxbBmjphoyMquPL2+0yM2
      7Amafno3rlfP3sYAblO2U2zyaeWzduN3OOh6XuvPYT542x4d6aTTTz5rP1eg83u017t2O2oz+F
      WWl094bcbqgWwXlysf843YeYcvXZEAY649GnmHB1ZGdIgYkgBcZ4pM0BoD9PZEcgJz4Vl85hCu
      oHHTQamgYBgk59SBx2Ky62CHYmrlWeckaNB+OK61EB2mXKgWEZZspYQltYLkYInJAJ/eiVaPl5
      NqJSiWV3GzDmARMBjTkyFKVlJ16nTQXhWVhkU9idcttX8ohViBzJQbgIKyymd2YWEjIk2XWv2U
      diYxbFh9smccDRZpaLuCddf8d0kl9pz8l0Hy1anVmBlW606aSjGYJ4pmBU0njWV80JeumbGfZp
      4z1t4qeMh6lJ5+ZYGR5KXVowIqZbRdUldmFcSg1JF2CUiMbpqrlpRaii4eVVX63/hBT3V402jj
      nhIS8tW+tgnNJp1CnHAmosaYBaeOetq+bzXrc+rgjuNmIOtp1vORn0ZC+FwMSPKqCepy2v6FLq
      paKGGUZsZzImNa9MqUUEFkhTKbQKg0bK5ZNEO63EUsFYQeyKca2tJC8/+tH0sJ5KIYdUxROGZN
      MWNe0HK5R5pbgOUyntp1HLoQSokgRFNVVzPCOjlA1ZJuM1c1IGQVQTR7sKPFRUG898TB/uEHSN
      VUjjyzDSaBAEiTsQNY3XXcvZBeoyXvMBNixD7+wNbV1NrE3aX0czSpq5fNOMxzQ/Uo0RjxCDDN
      ZtFzJBX/Gw3S84gQAJKc+Jj7M4InfBxiYscn43QgoamgNOuM7dMGtJ5tb8g5Ldr7QNl53uEuL6
      WmoPdNMjNvOKeIOoXPLGG0tFzYQep/kpPAUlfdE0FzkU1DvyMACyPPMrKA+9E9IMPj0Sv1t/vQ
      6d13D89iF0rzr4TnxP/gomnN/EBQoM7/77ESiQAAA7}
 image create photo ::img::kc -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP//////AP8AAAD//////////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5v65QNbNtyPd88e9KaVm+IEuaIyJGxlmx+lj+n
      dAONTp1LINXC7UaUv2xwFRiYy2fzAK1WW6ngYNT4FHbKjTVDj2a/4SI5gid/D08EiImKiHl/gC
      GDNDJ3EHUUiY4lmoGZj3KGHl6OO5CdYxxflCCEpHABBKZan6ihrWOZhJKhJbBxn3Zzgrq3OjO5
      hbyxwKRhFr+srJq5d8m+0JvQztObt9K7r8rZhuIU3qfd2669nJKV5BPm3N7pt+ul7ePP0jvTTP
      Py9cLJ2XeOSbMwswYeGxbQl4YCAQrQqlXIILB/3AjZW2XF/x9AfN9WYSMobWMdJT4WEtvHCpYM
      k7VQFkH3b5JGTNXYBUrRr+Y2BgQG4ATnUCSnixr7uXwVVCijnPd2WpoAC5NLRUwT6YHKUeYWpn
      1Y6Vm0CKjTp0mLPkFFNmwjoGXNOl3TUCckOQQE5N1b4gyhNXwY7cn6FAhRuyIbkMXkdzCfRoro
      6jocFdJSvZj5wmoM+PGZoEN1wFQVaOliTGWW6lktt7Cx0aiUmc5MO4/Lzm0I0wX6UmBpxVgV8+
      YTGHho0b5L+d3b8QHrNmtAS+adFvGT3K6bMWJNvSnacbC3gGncCyw+PHjcRH5HuetRd98ZDwZH
      uDwdWe5LCbb4zLEfRP9C7dacHflxJEFsXXhnnywEnqTTQQ4UFgRqEQIYjT7WUbRMXxQa19F+/A
      yUIWmG3WTGUlwgmEplBjbHoVN+AJZKFWAl595BvAR322Co5ciejYccmBpjacz3WnmqbTUiW+Tk
      eCJ16EXnkohg5aZWKPZN+eJmuXHXyit67aEki0GCVJ9wRkYH5Zm8XXlHljKcxWWXZtWgWWbCuc
      lkOxN6N5+XQcF1Wp5LUmHfSwBy6UCRYoJ5Z16EkonlNRzK5xx6jZ52GZCTanFmYKrhQcMZtDGH
      UKET9jOXUMZR+FgfbU0k6ZvHRHaVpvONKqVHH5G4in1yVoWasFU5sxaq1WR1omn/CBH1E6+7IO
      usVloStFCzPOlp6E1oWVvTSDNJe+iUOhjmCkMkcEorNirRcy4l0A4YmxLlAXLtV79QdKwn+JUp
      77XBnGpQQuyS1GCnyKg0TD/GgMSSO7K5e+8jx3Tx8DgRfzRxQReX82O/CIeUzhwdw9PsJCCvm7
      C1g0AIT0bMZLyyOHwGPNlFGKa8Z0UKU8PzwfKK95vGDTuoIq/qqjiVsfDakvS7WIJ4oIZI11yM
      V6GAqulooNBizNVSZZ0GcW+Jqm+0G+rMbxDQueH22JJlS2UzYIhiN9MlingFFvztLUXffifBTy
      yBk3HhwYXDIAbiiaeUjdqNp1vMEZHzXTkWDhlcTsQFCtzt+ecUKJAAADs=}
 image create photo ::img::ks -format gif -data {
      R0lGODlhRwBgAMIAAH//1AAAAP//////AP8AAAD//////////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQS+jNu/9gKI7CFZBoqqrM6r5v65QNbNtyPd88e9KaVm+IEuaIyJGxlmx+lj+n
      dAONTp1LINXC7UaUv2yQNSibz2i0lbP2iLXtsTs9CNTv9nxcHsr5T3FMHQx4dQQBh4mIe3wgfz
      QybjsciokEl5iYjFp9myWDEG6ZhxOdnkJ9bBKgD46BdadrslulVJ+Ajp+DsGCqVmEWtritM216
      vUGTwBXCt4CPc6iuya3OXGPDbM270k/PX9/Bt+O22NGxkKHhzOO45eRsvCJ/xOmRoe26kObc6E
      DPcnYsi5INoDlj8jpxKBCggDZJxu61yyLt2LxfFSFmzLfH/x3BhNPmpShIjmBJKiC9KSGhI4wz
      jsl4WVQo0lRClzihyJwZMpU3Q7Ba6hpmiJCMQyklrWSlR0/QekajpksKamlMp0ZJFYJQVKYmqq
      qWMrj0oCsiUg7wNPXaAOyWlYjKRF17lsCZsou8fu2m9OIAsmmjGroUtAzZwkcD++tj96/RrUjP
      pjkstS7lxY4I4537NIJZQGir0ezzV2seM1hNXq2MFDXfqvMMB0ach08YWGwLy0XGWO5pO3LN5i
      uBO/Fu4JifaG5L1+i7PJEbAPbD21Hpx8CDOzdJN+ioST0zO2b+tLgE87X0hVduV3B2rHR8dxYE
      XuXFRbOZN+X6mLa+5P9uYAMfHu2NNR16vlVRnTdVJIieJoREpt0xLl1k1TO6peYZZ/vhByBTtO
      DVXnzFoWbedQsGSI1+7p0XHXbSOZYiU9/BWBt3JZqoh2Yz+pLOdNDVZhttv7VFVo8o1UFcUTQU
      dxBxeb2nlmxIBuFakE0695+VHD7V2Ie+3HVIllLZNuBWkoEZogNjZtUhfxymdaSFflnWJlaEoU
      GZhEU2NiadnXiJIXN5GnkZega6lQwYgx3pZmdn7BUnlWqutgiZ8EGwZ4eANWJfoHUN+iJ5O6am
      1kOjufIUpjudFydflWZ5JyyRTfSPnDyhup4kOwVFzVDAWlpTqj8NipOtHn3DUpX3WZaTTUAwef
      LOrqAoCW1Hw2EkyLTbvqaKtYtCES2sr1nBkENv1RmgO/8Ml05ATADzEieqGjMUKiTZMwxUq3i7
      BbjbqJevF9aoEwvA/AicbRcFE3Owvao9ORAzE79RL4PKSkSQOBvT9/C6LekAzzUCV/TxIApL7M
      sqnspyMmwabatvt8zKvLKmmUQkmqd9ETvIKN9VEjPIj/jLMxuVLMInVTYX/K7R6lX7WyFpBJIL
      JxY/YR2JXEv7nLz0YuzF2OKEC/YVWMTrNdoxZM32EAKt/XYRBkE990hg2333feGEvfcKxQj1d9
      qDY5FB4URcoADZjDfOhQIJAAA7}

 image create photo ::img::ad -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbZwMay5WLwjJ+1NfT5D9oJejegUbPz+Y5M2uiiLDaNteVQOs1VicQs
      9ckNe38uKw87ZqW40G5atnZfzW+VsP7FT+9ovf3Z1udXksQ22AIYRncYlKjIqOMoBkkIOLdI2S
      Ekl9moIdi5cReKYkkaeapmmkoyyurh+soRK4u0Wjt7i2u769kLq/vrJKwZDASqZZzDeUSLM8nk
      LKOIHCPNQo05c72SXY3Y5K1trdwtPg7OdN5cjp0d3W5ODZ81T19veI//TZ7G309MVLxa3AgOlF
      UQ4cFXCRkuZNUQ4sNUESlOPFUR40VSZRkPoenohxlIPNBCbCT5aFgveyZ/sRxZpyTMmHRmxuQV
      EGdODDbDyTHUU91PN0GFvihS9Ii3C0mVplSJy4qZpk6vZKBqJMrVkyg/cqXplVgfrEoF7tx6lm
      eFtBMMSHgLN+5bAwUAADs=}
 image create photo ::img::ah -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP////8AACH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbawMZyOL7zfbrYwOP+p7vwYL+iJijo9YxMWkZJbBaDy2RUiqMOh9if
      bgvuZmvW51XMcm2FXHRM3bZW3SokfUq+G+36MRsW15dTs7YmOGgBZnhYAqd4xujhqBjZSPZYab
      mzmAmUJ9ep+RQqStryaVqaioK66umKCKsqK9lKe2R7i8Gnu5vb6wTMwStMLLPI6WdESen1u4KJ
      6WMM/Sit/GN9fUOtot2M7fMdNv1cPY7HND7HbX5uvef+Tp4ute3cRR8vFrjP39XtVkBaA2UVhH
      XQVcJVC1M1NPWQVMRQEztVzHTxDqSMYm76ceTH6SOWayKbaLNQUh28YLROspRVqE1KlYCqzLxz
      k05ONztnIJMp79DPJT19nrEZVOjKl7C2FTXKxlcvKBmeQmVn1ejGpJH6MW25IavPsFwZlnVYQV
      hVChLaun3b1kABADs=}
 image create photo ::img::ac -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbayMaym8HyfdJXgvekbuH5hhxgCkgkGkfIpE9HazpvUMY0GXVch9ma
      bUuFKXZC8ExcHpvPa7O0/fwG3/DSslxvyRf52J3e19HFAxjoNfdgaIeWqAjiEuH4aEMYUiiJhC
      f5kXm5afkZFso2yuJZeoiqcqo615oj9+rB2kqraouKW6q7GMvl+6v5u9Uwxctp5XQ8m4wFHCcc
      Z3xE/WxqfR05rCSxTObcvR0sIT7OZBnth50dhOjs5l20fpaOE+94r5hvuB/Y3/cvT8A6A+EUbH
      NwTUJ4srzEWthDGER159LM0wfBlSxtVxP1NOqoBx0ojQ3RLSmJ6CRKPhhAUnxxcWPMVy5RWIQ0
      E+BNNCVVjpRZjCRQNUJpUvpScxWTPTn5LU21shNKd1BXbkja4mrTXFt3VZh6lUK3sWTLPjBQAA
      A7}
 image create photo ::img::as -format gif -data {
      R0lGODlhRwBgAKEAAH//1AAAAP///////yH5BAEAAAAALAAAAABHAGAAAAL/BIKpy+0PYzBH2I
      uz3rz7L0wBSJamiZzquqbZyMZyCGP1jJfuleQ+uLP0fsRNMBUsFo+jpPK3i96ePumCuoQ9sFDt
      1MllIYc0cPg0tk7PKjO7un535VRnnI7+uvHA25XfUtMA2OY1SKhjyICYKOSQcwfH00QDuTeTRI
      apUKcXibKodBnDyZn1VFr2GSja46qJM5qXRjvXRfsq23fblNur6wEc7BuiarxpWUtsSrrap9xr
      zMwqU/paDC1s49xhPVZW6c2toT2ZDb4MS1Iu7Ut5JV4YiPuLq1oLOn+fi02fllfoHzx099Cp6z
      bOXMFvDKPBA6bNnTSC4n7lA1XPkUCD3y68NcLI0d5DfgeNJOTYLkJKcOtOkhQJ02JJci7xLcRW
      UKPFlrP2jQw5aOaLmvUWbYHAchfGou6MBhW6LaBORSGnary41FPHrbD+8AyI9OrUR1hnkc3pc9
      pXMaHMZWoLsJNXIuxazrXV6hDdk4m27GVkCXAsvoKHFrZr+DAQmooR9pvU2OShunL8Un5jmTAf
      vZcrT+vsWU/kYIxHlzX9ATQj1XIFDWGNiowp2LETV0Kd1jXusX4005ESdXc40cK/BS9uxzcedb
      S5xGmO5bnywtB/VxDOYYIBCdy7e+duoAAAOw==}

 image create photo ::img::back -format gif -data {
      R0lGODlhRwBgAMIAAH//1P///wAA/8DAwP//AP8A/////////yH5BAEAAAAALAAAAABHAGAAAA
      P/CBDc/jDKSWtQy+rNd+5gKI5kaZ6oJaxsKwxuDMftTK/2Xd1u3vM1nk83cTVktOHxhzQynJJW
      gDANNFlKKvWKi1W3LEqYICgIwMGukWxGY9/r8tm6Egumc/KW3s1Z8Vpzd0F+d3qAdHYMBVWMd4
      w2kQGOk41/kHAvlY+WiUWGeYJ8L6RhoIF7hFKniHWfoG2jaqVSbIJMtGNyaHZ1WrK5wYZVXMJf
      o711g7iRXstptErPrlFGXKPSuNPZUhN+jpmc0OLhm+XgOGKF4cra2M7uQXbNs6bA9MbTs/S9Pl
      nE2oz9KmYjGT5dsa5k2XWv3Ks+qxAd2pbrz6GJ73wk27ep/xIVSpg4grTE6SC1CD8KSRSlyt5F
      lm80PjQJ6xa0hQmZdasW7J+begIBjqM1L5O0hvucIY12EkLFofqeshv0ztQbCt+q1kFXkWvWce
      bSPWwHFupSitagoIyocOqftkCpqnU6Rig7n2eDuumFJ+dNL7Z+Mo3jV9HLVDEjHn6b2GUoMIo8
      dgwZbTLJSvgGWP745M6nlYjjWnzMuCxoTzz72pxaiyEQnDaTHStGYzYQvcjGljYKZDdctjvXro
      rHY4kOs168SfG6HNgLzZCGkKsXVlORdaJ7dz5OvEvRpNacKxMvV6eafgGHoSk4cJbtoQVnug2c
      yJfrZaoFH9wIQ+ViB///NbAYRTLxZNRmlnHCmTiSjUTTRpWNtCCCIylo2YNj9acYaQByKCBpBM
      71wF+E3ZIIfe3kt5Qfr/gDmFDswViXfrh8NxhwtUVlz28zqDNcdsVtl2N3pGDVHFhcYbEIA9JV
      95WSY0WFXW1CwgNkcHTtaN5x5N2oZRgPvcfaGnbdgBeWI9rn15hqrkabimBWcxpaG6Li21Nzei
      Zng5cEkBmFff4pYSWorTVnRnW2gqhjdjaVZk00iobilgjFFmZ78L0Y6Xx2bXRnZkrxGCqaDlhZ
      DnJEchNnBE9Sx1wYr26l1XTWRTGlqtShWtZVn4Aanqi/btlji+mJCdSZAcVn4IPek5LY2prgOV
      pqS+MNuGi1IF4rrXEHDupgt31OSJkSGeJpLbVUndvYqll62eamsMFLqnEukrmppGX2xG6avuLI
      W3YrwuGjVVee6hadFBkJ66xOHnkOw15BeNasZBlc8LZVfvqvv9EeJeK0vuRbby0iF4upnsLBSe
      m7AZfIy2fqQsSoouiO1ijKdC0prp/gWvitSOESivGJ2dbMCkZG58lXsxtXKq/LfMh28rGa5oXs
      0FDQZkyVwmwtC4RJCHFbXGzOy23Yr90mHVQfp+D223DHLffcE3xAN90Y3I03AAkAADs=}

  image create photo ::img::marker -format gif -data {
      R0lGODlhRgBfAOdJAPv7+/T09O3t7ebm5tnZ2dXV1czMzMnExMXFxby8vLuwsLOzs6ysrKSkpJ
      ycnJaWloqKioWFhfsAAPUAAOwAAOUAANwAANQAAMsAAMQAAKRDQ6goKLwAALUAAKQZGawAAKMA
      AJ0wMJsAAJQAAI0KCo0BAYQAAH19fXV0dHJvb29tbW5kZGRkZGhfX2RZWWRVVWJISFlZWV5QUF
      FRUV5MTFlCQk5OTkJCQnsAAHQAAG0AAGcKCmMCAlg9PVY9PVUxMVMsLFQiIlMcHFUTE1sKCl0E
      BFYMDFcAAEsKCgBAAD4+PjA4MDcoKCQyJC8vLz8AADIMDBwjHBEmEQA4AAAxAA8kDwAjAAocCg
      AcAAYNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      ABLLrCH5BAEBAEkALAAAAABGAF8AAAj+AJMksXKlyQ0bMxIqXMiwocOHECPOsHGjSRUsApNkUd
      EgQYECBEKKHEmypMmTKFMS+JiAQQQnVKyoKCAgQAAAOHPq3Mmzp8+fQHHaDCCAgIMrVRoICMq0
      qVOnAQwoaZLg5tOrWK8WoGjAatavYHkSSEggrNmzY2cUOMv2a9qybeM6LUDWq9y7Pd/i3ZuXLN
      +/OfUC/kt3BgG7g+UKTox3MWPFfh/fLXxYMmTDli/DzczWcd4ToEOLPmEg64LRqDf7pIyY540n
      JkbInl1CB5PWQAlAwTG7t4knN5h67lkASQcLFJInr3DBxImrL0ZYqKCcQoUKH5CsDTq8ZwQTFi
      b+SBg/fkKGIqWbMtBxQTx5CRMsmIjQtDvPAD8+UHBfngKIH7jtJIAQHVDw3ngUfABgU6w1hQAP
      GPBXnnz0BYVCCRVIOMEEGPBwgFP29XRheAeaR4RqPD0YoYYWlJDCUyHyJEAQBZbonw8BAgCEfg
      dKQEEHQeQoVmROLcCehPBZgMMDPkEAnoYTXKDDAlrVdZULI2T43oYcnCiWERkYuGUFIriAVYw9
      CTAEB2K+RyYNPNEAQgU9UsDBEAOcSeRTDuDQXokX5NCATg3k8OeWgQ6qJ2ZZ1TBnjxPcmScAA7
      LZYwUg1PBVg2cSEWaJZL6A0wpZIklBBl5mheZPTpJI3ob+GOCgAAI5rLilfBCAtepP+bX5agYe
      bPDpgQn+ENauPhlQhK2vWocckubxkN6mVoI1Yo/wIZlkCSiYhaxPAdDoK7bk/Rikt3t+lYAOEZ
      K7JQY6JIBWul+5IIKW7k5QwQhmnsVpWGpa6q6dQyw1L6NnFXoopIm29W1QMPCIbYIwxPVwbiTQ
      CWkFJKAY1r9mJTDCuOTtK6/D9H4Vbo3YTgCkkDCmnNW15MbHLcoIh6Xihvl2OO3H1YbVq7v9gQ
      BEZzI/9Z2rREtA4cEeX0UAERzw3LSPqEYdc86NPlrihtpiqinQhsH8U58L92fBBfi+egEODhyb
      dFADrGl1uRyEoEH+Bxq/R/Ckqs4N1Av3fg0vAgTsMKybIojqluA+GZk2fBW4iNPS0EpJZVYgNz
      VggaZ2IIRVAew47gQ/CmGw1JDzpIJ0DE+p084aVv7iolr/tPOl/PKUAoaQdogA7leVLrHfkspI
      4OkJAmG2Tp0DdUIJTJf3dtw9MWCoti0+t3XuPBVQRAZhZwoUDYWXeN529bWOUw8gnG4i+3mByT
      wIPnzv1AM4VJ/kfEzhn//is6S5BO0nAzBC1eqkoOcNrUQcMALgctM69PXtVR36UFOUxaySiQBO
      woGc9iZns249hWaIygEDQsg1GQ2BZX4T3fNyEoDl1Ul0q1vNAXnCAhNg4DrsQLxOBmSHlQXwIA
      NBBCIGTMAC7swtAVoogglMUAIqUhEHRZgBWGJwhClW8YsmKIIWTuaTGC3gAWhMoxofkMOrDGCN
      cNxcGd3HmaBEr47EwyO6WqhH1vGxjwYsGyAf98dBOrGQhvzJxRJ5x0Qqko6OBMAiDTnJQTYykk
      NCJCZ1UklAjsUG4NtkTuhigwLMMJJjcQICTulIAtigCgtooyh3EoAC3AALESgL6QBwk13qxJdx
      QQwweSmABUSBCktwgAFAkhKQMJMkzlyJNKNJzWlaMyTRNMlHFhADKySBCldQgkTGSc5ySoQiUf
      BmQAAAOw==}

  image create photo ::img::anim -data {
      R0lGODlhRwBgAJEAANnZ2QAAgP///////yH5BAEAAAAALAAAAABHAGAAAAJ4
      BBgfU5fbPxCY8TF1uf0PAeNj6nL7wygnrfbirDfv/oOhOJKleaKpurKt+8Kx
      PNO1feO5vvO9/wODwiGxaDwik8ols+l8QqPSKbVqvWKz2i236/2Cw+IxuWw+
      o9PqNbvtfsPj8jm9/iWA8TF1uf0PgRkfU5fbPxCgADs=}

 main
 newGame

if 0 {

Stefan Vogel 27 Apr 04 Cool game. I'm astonished every time what can be done in a few lines of Tcl.

Eric Amundsen 27 Apr 04 The game can be played with 1 of 3 diffictulties. The easiest (default) is 1 suit, check the menus for higher difficulties and therefore more suits. Nice game!!

MG Apr 28th 2004 - What Eric said :) Glad you like the game, I'm hoping to add Freecell and Hearts, soon; I think I've become addicted to card-games on Tcl/Tk's [canvas] widget now :) Although, to be honest, after a year of playing with Tcl and downloading the code from this Wiki, I've stopped being astonished, or even slightly suprised, at all the things Tcl can do (and how easily it does them).

LES - bug: the D key binding invokes dealRows instead of dealRow.

MG - Could've sworn I'd fixed that before. Definitely done it this time, though :) Thanks :)

LES - bug: press F2 to start a new game. As soon as the cards begin to be laid out, press F3 and select any option. Even "Cancel" will do. Just watch.

MG - I don't see the bug when I click 'Cancel', but I do for everything else. Right now, I have no idea what to do about it, but it's been a long day; I'll try and fix it tomorrow. Thanks for pointing it out :)

KBK - bug (2004-05-06): If I have, say, the ten of Spades stacked atop the Knave of Hearts, the program will allow you to move them both. Normally, the rules for Spider allow you to move a stack of multiple cards only when they're all of a single suit.

MG - It certainly doesn't do that all of the time (and you're quite right, shouldn't do it at all). I'll have to have a dig through the code for that one.

MG May 17th - Fixed the latest bug that LES reported, finally. Will get to work on KBK's later tonight :) Update OK, I thought I'd addressed this problem before, and looking at the code I really can't see how that could still happen. Is it possible you weren't using the most up-to-date version when you had that problem, KBK? If not, something's probably seriously wrong somewhere. . .

KBK copied the code off this page again and tried it in "4 Suits" mode. No trouble moving a stack of cards of different suits as long as the numbers are in sequence. It's not supposed to allow that.

MG May 18th - Ah, that's why I hadn't seen the error; I'm not good enough to play with 4 suits ;) It's been fixed, now, by adding a couple more calls to the 'clearBindings' proc.

BMA May 21st - Seems to work fine under Mac OS X 2.8 ""Jaguar" and Daniel Steffen's Wish. MG - Great! Good to hear I've finally managed to write something that works cross-platform ;) Thanks :)

DKF July 7: Candidate for tclapps?

MG July 7th - *checks the tclapps page* If you (or whoever manages/maintains it) wants to add this, please feel free to do so.

LV We've had problems in the past with accusations about adding code. It just works out better if a) the auther adds a EULA and if the author contacts a sf.net project leader and works with them to contribute a piece of code.

MG Feb 18 2005 - Sorry to have taken so long to get back to this, since your comment, LV. Would that be a sf.net project leader for tcllib, and do you happen to know who the best person would be?

HZe Mar 6 2005 - Great Game! The only thing: I don't like the last card on each of the 8 stacks (the white card with the red X), I prefer to use a light green solid card. So, I've just replaced the ::img::marker definition by this one:

  image create photo ::img::marker -format gif -data {
          R0lGODlhRwBgAKECAABkAACIAP///////ywAAAAARwBgAAACXIyPqcvtD6Oc
          tNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofEovGITCqXzKbz
          CY1Kp9Sq9YrNarfcrvcLDovH5LL5jE6r1+y2+w2Py+f0uv2OFxUAADs=
        }

MG March 6 2005 - Glad you like it :) Yeah, I never liked that red X too much, either, but I never got around to changing it. Looking at your replacement one just made me think - you could also use something like this, which is slightly smaller (in terms of file-size) and lets you change the color by just editing the script.

  image create photo ::img::marker -width 71 -height 96
  ::img::marker put #0000cccc0000 -to 0 0 70 95

Jesse June 12 2005 - Hi, cool game, I have been playing it a few times a day for about a month on Puppy Linux... took me a while to notice that it has a bug in it that can let you cheat a bit. The bug is where you want to move card X but you click your mouse 1 pixel above that card, the mouse grabs the card Y (card beneath X) and the ones down the screen from it, and you can move the cards to a position valid for card Y to land in. i.e. you can move stack of { 8h , Kh } onto 9h so you have stack of 9h 8h Kh. Happy bug fixing :)

MG June 12 2005 - Hey Jesse, thanks for your comments. I'd noticed the bug before in passing (that sometimes it picked up a card too many), but had realised exactly what it was or how easily replicatable it was - I'll have to look into reworking the bindings when I get the time, to fix a few other things which are slightly clumsy. Thanks for pointing it out :)

HJG 2005-07-25 Small change, so the game does not start maximized. I also noticed that the final score is updated just after you press the ok-button.

MG 2005 July 26 - That is indeed a bug, and one I've been meaning to fix for a while. IIRC, it's just because of where the code which updates the score is placed in relation to the code which checks for the game being won. There are several bugs still in need of fixing (like the one Jesse mentioned before), and really it needs a re-write to just get them all out. One of those projects for when I get a few hours to spare, unless someone beats me to it...

HJG I also noticed that proc generateGoodMoves does not consider moving cards into empty columns, or splitting a stack in order to get a complete suit.

MG Moving cards into empty columns is left out deliberately, because you can always move cards from any column into any empty column, and I considered it unnecessary to have it point it out (it would also make checking all the available moves take a lot longer). As for breaking apart a "working" stack, to put it onto another for a complete suit... With a little more code that could be done, but I think that takes it into "playing the game for you", instead of hints, so I never did it.


[ Category Games | Category Application | Tcl/Tk Games ] }