From a8642d8a4b7b5dc05392965066234b4c05641942 Mon Sep 17 00:00:00 2001 From: Neil Toronto Date: Sun, 15 Jan 2012 20:57:02 -0700 Subject: [PATCH] Lightened icon outlines Added lambda icon, foot icon, search forward/back icons Doc fixes Stepper: icons on buttons, logo and about dialog Macro stepper: icons on buttons, logo and about dialog Please merge into release (cherry picked from commit 4a09c0458129dca9074dfb2947743dbc2ce8573c) --- collects/icons/bomb-32x32.png | Bin 2262 -> 2281 bytes collects/icons/macro-stepper-32x32.png | Bin 0 -> 2605 bytes collects/icons/stepper-32x32.png | Bin 0 -> 2549 bytes collects/images/gui.rkt | 97 +++++ collects/images/icons/arrow.rkt | 2 + collects/images/icons/control.rkt | 64 +++- collects/images/icons/file.rkt | 3 +- collects/images/icons/misc.rkt | 143 ++++++-- collects/images/icons/stickman.rkt | 31 +- collects/images/icons/style.rkt | 21 +- collects/images/logos.rkt | 345 ++++++++++++++++-- collects/images/private/logos.rkt | 290 --------------- .../images/scribblings/compile-time.scrbl | 2 + collects/images/scribblings/icons.scrbl | 83 +++-- collects/images/scribblings/logos.scrbl | 18 +- .../images/scribblings/running-stickman.gif | Bin 43705 -> 44789 bytes collects/macro-debugger/info.rkt | 1 + collects/macro-debugger/view/stepper.rkt | 62 +++- collects/stepper/drracket-button.rkt | 2 +- collects/stepper/info.rkt | 2 +- collects/stepper/private/mred-extensions.rkt | 17 +- collects/stepper/private/view-controller.rkt | 74 +++- collects/stepper/stepper-tool.rkt | 3 +- .../private/danish-string-constants.rkt | 8 +- .../private/english-string-constants.rkt | 4 +- .../private/french-string-constants.rkt | 4 +- .../private/german-string-constants.rkt | 4 +- .../private/japanese-string-constants.rkt | 8 +- .../private/korean-string-constants.rkt | 4 +- .../private/portuguese-string-constants.rkt | 8 +- .../private/russian-string-constants.rkt | 8 +- .../simplified-chinese-string-constants.rkt | 8 +- .../private/spanish-string-constants.rkt | 6 +- .../traditional-chinese-string-constants.rkt | 8 +- .../private/ukrainian-string-constants.rkt | 8 +- 35 files changed, 851 insertions(+), 487 deletions(-) create mode 100644 collects/icons/macro-stepper-32x32.png create mode 100644 collects/icons/stepper-32x32.png create mode 100644 collects/images/gui.rkt delete mode 100644 collects/images/private/logos.rkt diff --git a/collects/icons/bomb-32x32.png b/collects/icons/bomb-32x32.png index 2b491a0d17adff3b500d9f6de4c5e5bd755e2689..ba3f641e231049fd3727b9b062e206fca3acb90c 100644 GIT binary patch delta 2251 zcmV;+2sHQB5$O?-Hh-Q;L_t(og|(JzjGR>&$A9OXcP=}#yWRV4cYB#FEzqKEfkI6H z0f~xo30SJMQA0v721RHvY2<^ciG~mm0}2MC@$!jME{1|ip`k4{P(WH}?ZsMm?e2DW zr@OOrpLs9m96!uE%g}Cx5Bele-VZZ#{=fHs{^vO(05(BKGJnBS*5gJc(IU#RLXq!3 z3a|5jF7XVgx8fYQ@+Qu|^(RE>fzhq-+xsb>Ja5hR{L0HdtFc|e3L!AAmAv@uAD-Iy zKLgkV*Sozu^WaOgv@QUmfPsJQfJg3%(7pK)ZrXSU7C|mE!Gk~g0fWh=eQndHnuJoF zg-WH(cU_tjiGOS?7Ms>Vuvf#=S9Esn{pz-D`r`ncc!E36yN2du6W{?pAYsX+@agL% zk>L-xbZILZ@Mz)2n{VaC7oJ<&ohi_h9wVs~0It@_thECLtuIOk!N!A*Bk#TLx<_P3 z$HPC{wykn50CjbghcEj&ZK-pj?7-3C71q>Fw+1mUSB$o*2ghi9~{yWRj*>3`Z%j7UTO|vT`Nei3H0NiKcuu zd)KZfpM3sI2x%>%Tm@qw(h8{_gF6{#WCC8^4S#=pM$vi6YD%Rl<74B@Oiy7D95}F_ zTy6%0U|wr0Jv}|NcXW_UCW%HO2*7B~1OI3LM=a%RpsJby6ubGvl*1Etl_J-Q4{4fnsr6&4DO|gNLD90Y4A77q&XK<#!Z83m#*$^=C!qv zNG6FyA_yTc)}oX`Nl8Qq`eU(#kn)$C)_<>W0+1+1jvj?_6?`B1R{-S_SAFeHR$Tif zJZpLXy?qRwIL6|oD;PR)oIS5?r&P#tO`YNaK!Yd8IuuY^bhmam2MPbW$L`F{n{=?TiE z0+mvMWeXOuzP*{Qra0}Lo%mWaHaUqghHAA+zEEH~li~E#6cgz*r>CbWl*=_pYYD7H z1KL`o5DNI517HMi4iB+zIt$6B+QcI%IQhZ5=tPqKj!v#v*iTAWVoD(+5vHHO3GG0e@Z);D;R;LtqR# z6!opG4Jd2T)?xt%V7_GGKp(cZ6QOnO4me$eyfH+B00}4|kV2reMoEeCePnpH0j#w( z2xHLo4u$Hr*TuaMMhH=MHbK)=g!``j0-`Ano)44LFq0Ft8&YeO5FY|qi!=r)M9r0O zrrSD1*t+2vG&tZIgMS->2x~_i>2QC1F zvVaM#t&7)FU$@^ihHCBUYk0-cioQ&O*ohHH4ZwIBcI<#aLl70X#>_gPYR9LRi7*!* z0jP`D0YdRQfY$&}(Yk`xTh$tkKA7d!ai6F$u;Z`rk9R?cD1S!Enzap!ns8AAwR7EI zvxeD}&xS7CbMFlMwYAj^+3daQZ8$L?NX?9JVLDATeFC&6DN6NG@rJi*e7o5JGl%e8 z02*+ODa4if@pi5EDu7dlm)2?ab?2Fy@#N|e;Y5I%*ci z=YunIM1M4TdwQ%);y`sGo#0U~MfR7@%rQIVt5GW1hDS zK%EIt(E3n9%68w{PdP%w>H;QoL^oKj!yL?ZxW9q51mSN8uV7mf&ntLh()S;)>z(y4 z72tb8uvx+GiZLboVZ z!+{{!a75DDL+4umV;yL$^`ItFsVfECF08%U!hnV5aG|1tQ6t1|E5y^iLqmJF)r|PB Z^&fRecup*nA5;JU002ovPDHLkV1lU|KnDN- delta 2232 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 LNkvXXu0mjfoavy- literal 0 HcmV?d00001 diff --git a/collects/images/gui.rkt b/collects/images/gui.rkt new file mode 100644 index 0000000000..3ea5c95af7 --- /dev/null +++ b/collects/images/gui.rkt @@ -0,0 +1,97 @@ +#lang racket/base + +(require racket/gui racket/class string-constants) + +(provide bitmap-canvas% logo-about-dialog%) + +(define bitmap-canvas% + (class canvas% + (init parent) + (init-field bitmap) + (init [enabled #t] [vert-margin 0] [horiz-margin 0]) + + (inherit get-dc refresh min-width min-height) + + (super-new [parent parent] + [enabled enabled] + [vert-margin vert-margin] + [horiz-margin horiz-margin] + [stretchable-width #f] + [stretchable-height #f] + [style '(transparent no-focus)]) + + (min-width (send bitmap get-width)) + (min-height (send bitmap get-height)) + + (define/public (set-bitmap new-bitmap) + (set! bitmap new-bitmap) + (min-width (send bitmap get-width)) + (min-height (send bitmap get-height)) + (refresh)) + + (define/override (on-paint) + (send (get-dc) draw-bitmap bitmap 0 0)) + )) + +(define message-text% + (class text% + (init messages) + (super-new [auto-wrap #t]) + + (define writable? #t) + (define/augment (can-change-style? start len) writable?) + (define/augment (can-delete? start len) writable?) + (define/augment (can-insert? start len) writable?) + (define/augment (can-load-file? filename format) writable?) + (define/augment (can-save-file? filename format) writable?) + (define/override (can-do-edit-operation? op [recursive? #t]) + (case op + [(copy select-all) #t] + [else writable?])) + + (for ([message (in-list messages)]) + (send this insert message)) + (set! writable? #f))) + +(define message-canvas% + (class editor-canvas% + (init parent messages [horiz-margin 0] [vert-margin 0]) + (super-new [parent parent] + [editor (new message-text% [messages messages])] + [horizontal-inset 0] [vertical-inset 0] + [horiz-margin 0] [vert-margin 0] + [enabled #t] [style '(auto-vscroll auto-hscroll no-border transparent)]))) + +(define logo-about-dialog% + (class dialog% + (init label parent bitmap messages [width 640] [height 200] [enabled #t]) + (super-new [label label] + [parent parent] + [width width] + [height height] + [enabled enabled] + [spacing 10] + [border 10]) + + (define top-panel + (new horizontal-panel% [parent this] [alignment '(center top)] [spacing 20])) + + (define bitmap-canvas + (new bitmap-canvas% [parent top-panel] [bitmap bitmap])) + + (define message-canvas + (new message-canvas% [parent top-panel] [messages messages])) + + (define close-button + (new button% + [label (string-constant close)] + [parent this] + [callback (λ (_1 _2) + (when (send this can-close?) + (send this on-close) + (send this show #f)))] + [style '(border)])) + + (send close-button focus) + )) + diff --git a/collects/images/icons/arrow.rkt b/collects/images/icons/arrow.rkt index bbcdd5f3f8..e894e0fd25 100644 --- a/collects/images/icons/arrow.rkt +++ b/collects/images/icons/arrow.rkt @@ -26,6 +26,7 @@ (let ([color (->color% color)]) (draw-icon-flomap 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) (send dc set-brush color 'solid) (send dc draw-polygon (list '(0 . 9) '(15 . 9) '(14 . 0) '(31 . 15.5) @@ -37,6 +38,7 @@ ) flomap? (draw-icon-flomap 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) (send dc set-brush color 'solid) (draw-path-commands dc 0 0 '((m 0 15) diff --git a/collects/images/icons/control.rkt b/collects/images/icons/control.rkt index 36c244378a..2be8f1ccb3 100644 --- a/collects/images/icons/control.rkt +++ b/collects/images/icons/control.rkt @@ -18,14 +18,17 @@ pause-icon pause-flomap step-icon step-flomap step-back-icon step-back-flomap - continue-icon continue-flomap - continue-back-icon continue-back-flomap) + continue-forward-icon continue-forward-flomap + continue-backward-icon continue-backward-flomap + search-forward-icon search-forward-flomap + search-backward-icon search-backward-flomap) (only-doc-out (all-defined-out))) (define (flat-play-flomap color height) (draw-icon-flomap 24 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) (send dc set-brush color 'solid) (send dc draw-polygon (list (cons 0 0) (cons 4 0) (cons 23 13) (cons 23 18) @@ -45,8 +48,18 @@ [height (and/c rational? (>=/c 0)) (default-icon-height)] [material deep-flomap-material-value? (default-icon-material)] ) flomap? - (define fm (play-flomap color height material)) - (flomap-pin* 3/2 1/2 1 1/2 fm fm)) + (make-cached-flomap + [height color material] + (define fm (draw-rendered-icon-flomap + 20 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) + (send dc set-brush color 'solid) + (send dc draw-polygon (list (cons 0 0) (cons 4 0) + (cons 19 13) (cons 19 18) + (cons 4 31) (cons 0 31)))) + (/ height 32) + material)) + (flomap-hc-append fm fm))) (defproc (stop-flomap [color (or/c string? (is-a?/c color%))] [height (and/c rational? (>=/c 0)) (default-icon-height)] @@ -56,6 +69,7 @@ [height color material] (draw-rendered-icon-flomap 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) (send dc set-brush color 'solid) (send dc draw-polygon (list '(0 . 0) '(31 . 0) '(31 . 31) '(0 . 31)))) (/ height 32) @@ -69,6 +83,7 @@ [height color material] (draw-rendered-icon-flomap 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) (send dc set-brush color 'solid) (draw-ellipse/smoothed dc 0 0 32 32)) (/ height 32) @@ -82,6 +97,7 @@ [height color material] (draw-rendered-icon-flomap 8 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) (send dc set-brush color 'solid) (send dc draw-polygon (list '(0 . 0) '(7 . 0) '(7 . 31) '(0 . 31)))) (/ height 32) @@ -126,24 +142,42 @@ (make-flomap 4 (max 1 (inexact->exact (round (* 1/16 height)))) 0) (back-flomap color height material))) -(defproc (continue-flomap [color (or/c string? (is-a?/c color%))] - [height (and/c rational? (>=/c 0)) (default-icon-height)] - [material deep-flomap-material-value? (default-icon-material)] - ) flomap? +(defproc (continue-forward-flomap [color (or/c string? (is-a?/c color%))] + [height (and/c rational? (>=/c 0)) (default-icon-height)] + [material deep-flomap-material-value? (default-icon-material)] + ) flomap? (flomap-hc-append (bar-flomap color height material) (make-flomap 4 (max 1 (inexact->exact (round (* 1/16 height)))) 0) (play-flomap color height material))) -(defproc (continue-back-flomap [color (or/c string? (is-a?/c color%))] - [height (and/c rational? (>=/c 0)) (default-icon-height)] - [material deep-flomap-material-value? (default-icon-material)] - ) flomap? +(defproc (continue-backward-flomap [color (or/c string? (is-a?/c color%))] + [height (and/c rational? (>=/c 0)) (default-icon-height)] + [material deep-flomap-material-value? (default-icon-material)] + ) flomap? (flomap-hc-append (back-flomap color height material) (make-flomap 4 (max 1 (inexact->exact (round (* 1/16 height)))) 0) (bar-flomap color height material))) +(defproc (search-forward-flomap [color (or/c string? (is-a?/c color%))] + [height (and/c rational? (>=/c 0)) (default-icon-height)] + [material deep-flomap-material-value? (default-icon-material)] + ) flomap? + (flomap-hc-append + (fast-forward-flomap color height material) + (make-flomap 4 (max 1 (inexact->exact (round (* 1/16 height)))) 0) + (bar-flomap color height material))) + +(defproc (search-backward-flomap [color (or/c string? (is-a?/c color%))] + [height (and/c rational? (>=/c 0)) (default-icon-height)] + [material deep-flomap-material-value? (default-icon-material)] + ) flomap? + (flomap-hc-append + (bar-flomap color height material) + (make-flomap 4 (max 1 (inexact->exact (round (* 1/16 height)))) 0) + (rewind-flomap color height material))) + (define-icon-wrappers ([color (or/c string? (is-a?/c color%))] [height (and/c rational? (>=/c 0)) (default-icon-height)] @@ -158,5 +192,7 @@ [pause-icon pause-flomap] [step-icon step-flomap] [step-back-icon step-back-flomap] - [continue-icon continue-flomap] - [continue-back-icon continue-back-flomap]) + [continue-forward-icon continue-forward-flomap] + [continue-backward-icon continue-backward-flomap] + [search-forward-icon search-forward-flomap] + [search-backward-icon search-backward-flomap]) diff --git a/collects/images/icons/file.rkt b/collects/images/icons/file.rkt index 3af621ade2..18ca17c374 100644 --- a/collects/images/icons/file.rkt +++ b/collects/images/icons/file.rkt @@ -69,7 +69,7 @@ (send dc draw-rectangle 2.5 i 16 1))) scale)] [dfm (flomap->deep-flomap fm)] - [dfm (deep-flomap-bulge-vertical dfm (* 4 scale))]) + [dfm (deep-flomap-bulge-vertical dfm (* 2 scale))]) (deep-flomap-render-icon dfm matte-material))) (define top-indent-fm @@ -84,6 +84,7 @@ (define case-fm (draw-icon-flomap 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) (send dc set-brush color 'solid) (send dc draw-polygon (list '(0 . 3) '(3 . 0) '(28 . 0) '(31 . 3) diff --git a/collects/images/icons/misc.rkt b/collects/images/icons/misc.rkt index caee86151a..344a2288f6 100644 --- a/collects/images/icons/misc.rkt +++ b/collects/images/icons/misc.rkt @@ -16,6 +16,8 @@ octagon-icon octagon-flomap stop-sign-icon stop-sign-flomap stop-signs-icon stop-signs-flomap + foot-icon foot-flomap + lambda-icon lambda-flomap magnifying-glass-icon magnifying-glass-flomap left-magnifying-glass-icon left-magnifying-glass-flomap bomb-icon bomb-flomap @@ -30,7 +32,8 @@ (define mx 23.5) (draw-icon-flomap 32 32 (λ (dc) - (send dc set-pen (make-object pen% "black" 12 'solid 'projecting 'miter)) + (send dc set-pen (make-object pen% (icon-color->outline-color color) + 12 'solid 'projecting 'miter)) (send dc draw-line mn mn mx mx) (send dc draw-line mn mx mx mn) (send dc set-pen (make-object pen% color 10 'solid 'projecting 'miter)) @@ -41,6 +44,7 @@ (define (flat-check-flomap color height) (draw-icon-flomap 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) (send dc set-brush color 'solid) (draw-path-commands dc 0 0 '((m 0 19) @@ -54,6 +58,7 @@ (let ([start (- start)]) (draw-icon-flomap 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) (send dc set-brush color 'solid) (define dθ (/ (* 2 pi) sides)) (define θs (sequence->list (in-range start (+ start (* 2 pi)) dθ))) @@ -84,20 +89,22 @@ [height str family style weight underline? smoothing color trim? outline material] (let ([font (make-object font% size family style weight underline? smoothing #t)] [outline (if (equal? outline 'auto) (/ height 32) outline)]) + (define outline-color (icon-color->outline-color color)) + (define r (/ (send outline-color red) 255.0)) + (define g (/ (send outline-color green) 255.0)) + (define b (/ (send outline-color blue) 255.0)) (define-values (w h) (get-text-size str font)) (define ceiling-amt (inexact->exact (ceiling outline))) - (define fm - (let* ([fm (draw-flomap - w h (λ (dc) - (send dc set-font font) - (send dc set-text-foreground color) - (send dc draw-text str 0 0 #t)))] - [fm (if trim? (flomap-trim fm) fm)] - [fm (flomap-resize fm #f (- height (* 2 ceiling-amt)))] - [fm (flomap-inset fm ceiling-amt)] - [fm (if (outline . > . 0) (flomap-outlined fm outline) fm)]) - fm)) - (flomap-render-icon fm material)))) + (let* ([fm (draw-flomap + w h (λ (dc) + (send dc set-font font) + (send dc set-text-foreground color) + (send dc draw-text str 0 0 #t)))] + [fm (if trim? (flomap-trim fm) fm)] + [fm (flomap-resize fm #f (- height (* 2 ceiling-amt)))] + [fm (flomap-inset fm ceiling-amt)] + [fm (if (outline . > . 0) (flomap-outlined fm outline (list r g b)) fm)]) + (flomap-render-icon fm material))))) (defproc (recycle-flomap [color (or/c string? (is-a?/c color%))] [height (and/c rational? (>=/c 0)) (default-icon-height)] @@ -129,6 +136,79 @@ [dfm (deep-flomap-raise dfm (* -12 scale))]) (deep-flomap-render-icon dfm material)))) +(define lambda-path-commands + '((m 8.5 1.5) + (c -1.6356765828908555 0.029546719528023596 + -3.191760877876106 0.5981878749262537 + -4.720477489085545 1.1242189706194692) + (c 0.6669351268436579 0.7142825307374631 + 0.5663221427728614 0.9399074888495575 + 0.8574087929203539 0.8856493838348083) + (c 1.1139361982300886 -0.26979469970501474 + 2.7661170029498527 -0.8976661899705014 + 3.5022074713864306 0.2920653404129794) + (c 1.604836361061947 2.027318824778761 + 2.2854387162241885 4.621830343362832 + 2.528554440117994 7.151444427138643) + (c 0.3116530407079646 1.536908007079646 + -2.857777387610619 7.039676186430679 + -3.8315742017699113 9.23609637758112) + (c -1.5828472448377582 2.792818935693215 + -2.9889992117994097 5.691217406489675 + -4.772427818289086 8.366316818879056) + (c 0.42649146902654866 0.5644402784660767 + 1.0427237946902654 0.34355411445427725 + 1.6228086182890855 0.25676724483775815) + (c 0.49529097817109147 -0.07420284601769911 + 0.9905831646017699 -0.14840448377581122 + 1.4858741427728612 -0.22260672566371684) + (c 1.5973270277286136 -3.787185161061947 + 3.3219870961651914 -7.263537085545722 + 4.820870569911505 -11.091467780530973) + (c 0.6830176660766961 -1.5775599008849557 + 1.0166688849557521 -2.445292667846608 + 1.8281710631268435 -3.4783485734513273) + (c 0.9620301781710914 0.5885710348082596 + 1.2484493215339232 2.040281637758112 + 1.77328405899705 3.0419137321533922) + (c 1.5467160542772862 3.979993184660766 + 3.0867486206489674 7.962568420058997 + 4.546565437168141 11.975105472566373) + (c 0.3820927622418879 0.13305596224188793 + 0.7742605970501475 0.5306156554572271 + 1.1366913510324481 0.14744150088495575) + (c 0.9533687693215339 -0.5878412460176992 + 2.0633098572271384 -0.9560281486725664 + 2.857080825958702 -1.7685525144542773) + (c -0.2264924884955752 -1.0982469474926253 + -0.9541940106194691 -2.1254820625368733 + -1.3975098902654866 -3.181664056637168) + (c -2.8100934230088495 -5.615961562241888 + -5.519535197640117 -11.572843233038348 + -7.278479027728613 -17.620018746902655) + (c -0.6478138147492625 -1.9033066855457228 + -1.4455158560471977 -4.19687149120944 + -3.5071903339233037 -4.948212008023599) + (c -0.46965654277286134 -0.13943394171091444 + -0.9645608778761062 -0.1662308436578171 + -1.451858010619469 -0.16614886324483774))) + +(defproc (lambda-flomap [color (or/c string? (is-a?/c color%))] + [height (and/c rational? (>=/c 0)) (default-icon-height)] + [material deep-flomap-material-value? (default-icon-material)]) flomap? + (make-cached-flomap + [height color material] + (draw-rendered-icon-flomap + 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 4 'solid) + (send dc set-brush (icon-color->outline-color color) 'solid) + (draw-path-commands dc 4 0 lambda-path-commands) + (set-icon-pen dc color 2 'solid) + (send dc set-brush color 'solid) + (draw-path-commands dc 4 0 lambda-path-commands)) + (/ height 32) + material))) + (defproc (regular-polygon-flomap [sides exact-positive-integer?] [start real?] [color (or/c string? (is-a?/c color%))] @@ -167,6 +247,24 @@ (flomap-pin* 3/16 1/4 0 0 fm (flomap-pin* 3/16 1/4 0 0 fm fm))) +(defproc (foot-flomap [color (or/c string? (is-a?/c color%))] + [height (and/c rational? (>=/c 0)) (default-icon-height)] + [material deep-flomap-material-value? (default-icon-material)]) flomap? + (make-cached-flomap + [height color material] + (draw-rendered-icon-flomap + 32 32 (λ (dc) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) + (send dc set-brush color 'solid) + (draw-ellipse/smoothed dc 4 8 24 24) + (draw-ellipse/smoothed dc 0 10 5 4.5) + (draw-ellipse/smoothed dc 3 4.5 5.5 5.5) + (draw-ellipse/smoothed dc 8.75 1 6.25 6.25) + (draw-ellipse/smoothed dc 16 0 7 7) + (draw-ellipse/smoothed dc 23.5 1.5 8.5 10)) + (/ height 32) + material))) + ;; --------------------------------------------------------------------------------------------------- ;; Magnifying glass @@ -188,12 +286,8 @@ (define glass-fm (let* ([fm (draw-icon-flomap 18 18 (λ (dc) - (send dc set-pen handle-color 1 'solid) + (set-icon-pen dc (icon-color->outline-color "azure") 1 'solid) (send dc set-brush "azure" 'solid) - (draw-ellipse/smoothed dc 0 0 18 18) - (send dc set-alpha 0.5) - (send dc set-pen "black" 1 'solid) - (send dc set-brush "white" 'transparent) (draw-ellipse/smoothed dc 0 0 18 18)) scale)] [dfm (flomap->deep-flomap fm)] @@ -204,8 +298,9 @@ (define circle-fm (let* ([fm (draw-icon-flomap 28 28 (λ (dc) - (send dc set-pen "black" 3 'solid) - (send dc set-brush "black" 'solid) + (define outline-color (icon-color->outline-color frame-color)) + (send dc set-pen outline-color 3 'solid) + (send dc set-brush outline-color 'solid) (draw-ellipse/smoothed dc 1 1 26 26) (send dc set-pen frame-color 1 'solid) (send dc set-brush frame-color 'solid) @@ -228,6 +323,7 @@ (define handle-fm (let* ([fm (draw-icon-flomap 11 11 (λ (dc) + (set-icon-pen dc (icon-color->outline-color handle-color) 1 'solid) (send dc set-brush handle-color 'solid) (define p (new dc-path%)) (send p move-to 4 0) @@ -286,7 +382,7 @@ (define (bomb-cap-flomap color) (draw-icon-flomap 20 20 (λ (dc) - (send dc set-pen "black" 1 'solid) + (set-icon-pen dc (icon-color->outline-color color) 1 'solid) (send dc set-brush color 'solid) (draw-path-commands dc 0 0 '((m 1.5 11.5) (l 10 -10 2.5 2.5) @@ -306,6 +402,7 @@ (define sphere-fm (let* ([sphere-fm (draw-icon-flomap 30 30 (λ (dc) + (set-icon-pen dc (icon-color->outline-color bomb-color) 1 'solid) (send dc set-brush bomb-color 'solid) (draw-ellipse/smoothed dc 0 0 30 30)) scale)] @@ -356,7 +453,9 @@ [check-icon check-flomap] [octagon-icon octagon-flomap] [stop-sign-icon stop-sign-flomap] - [stop-signs-icon stop-signs-flomap]) + [stop-signs-icon stop-signs-flomap] + [foot-icon foot-flomap] + [lambda-icon lambda-flomap]) (define-icon-wrappers ([frame-color (or/c string? (is-a?/c color%))] diff --git a/collects/images/icons/stickman.rkt b/collects/images/icons/stickman.rkt index 69f2e48a3c..2cca41dc27 100644 --- a/collects/images/icons/stickman.rkt +++ b/collects/images/icons/stickman.rkt @@ -106,8 +106,9 @@ (define standing-right-hand-point (cons+ standing-right-elbow-point - (polar->cartesian (+ standing-right-elbow-angle standing-torso-angle standing-right-hand-angle) - lower-arm-length))) + (polar->cartesian + (+ standing-right-elbow-angle standing-torso-angle standing-right-hand-angle) + lower-arm-length))) (defproc (standing-stickman-flomap [color (or/c string? (is-a?/c color%))] [arm-color (or/c string? (is-a?/c color%))] @@ -120,7 +121,8 @@ (flomap-lt-superimpose (draw-short-rendered-icon-flomap 26 32 (λ (dc) - (send dc set-pen "black" (+ arm-width (* 2 line-width)) 'solid) + (send dc set-pen (icon-color->outline-color arm-color) + (+ arm-width (* 2 line-width)) 'solid) (send dc draw-lines (list standing-right-shoulder-point standing-right-elbow-point standing-right-hand-point)) @@ -132,17 +134,22 @@ material) (draw-short-rendered-icon-flomap 26 32 (λ (dc) - (send dc set-pen "black" (+ body-width (* 2 line-width)) 'solid) + (send dc set-pen (icon-color->outline-color color) + (+ body-width (* 2 line-width)) 'solid) (send dc draw-lines (list standing-neck-point standing-hip-point)) - (send dc set-pen "black" (+ leg-width (* 2 line-width)) 'solid) + + (send dc set-pen (icon-color->outline-color color) + (+ leg-width (* 2 line-width)) 'solid) (send dc draw-lines (list standing-hip-point standing-left-knee-point standing-left-foot-point)) (send dc draw-lines (list standing-hip-point standing-right-knee-point standing-right-foot-point)) + (send dc set-pen color body-width 'solid) (send dc draw-lines (list standing-neck-point standing-hip-point)) + (send dc set-pen color leg-width 'solid) (send dc draw-lines (list standing-hip-point standing-left-knee-point @@ -154,7 +161,8 @@ material) (draw-short-rendered-icon-flomap 26 32 (λ (dc) - (send dc set-pen "black" (+ arm-width (* 2 line-width)) 'solid) + (send dc set-pen (icon-color->outline-color arm-color) + (+ arm-width (* 2 line-width)) 'solid) (send dc draw-lines (list standing-left-shoulder-point standing-left-elbow-point standing-left-hand-point)) @@ -166,7 +174,7 @@ material) (draw-short-rendered-icon-flomap 26 32 (λ (dc) - (send dc set-pen "black" line-width 'solid) + (send dc set-pen (icon-color->outline-color head-color) line-width 'solid) (send dc set-brush head-color 'solid) (match-define (cons x y) standing-head-point) (draw-ellipse/smoothed dc (- x 3.5) (- y 3.5) 8 8)) @@ -262,7 +270,7 @@ [height t color material] (draw-rendered-icon-flomap 26 32 (λ (dc) - (send dc set-pen "black" line-width 'solid) + (send dc set-pen (icon-color->outline-color color) line-width 'solid) (send dc set-brush color 'solid) (match-define (cons x y) (running-head-point t)) (draw-ellipse/smoothed dc (- x 3.5) (- y 3.5) 8 8)) @@ -274,9 +282,10 @@ [height t body? color material] (draw-rendered-icon-flomap 26 32 (λ (dc) - (draw-running-leg dc t "black" (+ leg-width (* 2 line-width))) + (draw-running-leg dc t (icon-color->outline-color color) (+ leg-width (* 2 line-width))) (when body? - (draw-running-body dc t "black" (+ body-width (* 2 line-width))) + (draw-running-body dc t (icon-color->outline-color color) + (+ body-width (* 2 line-width))) (draw-running-body dc t color body-width)) (draw-running-leg dc t color leg-width)) (/ height 32) @@ -287,7 +296,7 @@ [height t color material] (draw-rendered-icon-flomap 26 32 (λ (dc) - (draw-running-arm dc t "black" (+ arm-width (* 2 line-width))) + (draw-running-arm dc t (icon-color->outline-color color) (+ arm-width (* 2 line-width))) (draw-running-arm dc t color arm-width)) (/ height 32) material))) diff --git a/collects/images/icons/style.rkt b/collects/images/icons/style.rkt index 35a95ca76a..94312b185a 100644 --- a/collects/images/icons/style.rkt +++ b/collects/images/icons/style.rkt @@ -74,7 +74,24 @@ draw-rendered-icon-flomap flomap-render-thin-icon draw-short-rendered-icon-flomap - define-icon-wrappers) + define-icon-wrappers + (activate-contract-out + icon-color->outline-color + set-icon-pen)) + +(defproc (set-icon-pen [dc (is-a?/c dc<%>)] + [color (or/c string? (is-a?/c color%))] + [width (>=/c 0)] + [style symbol?]) void? + (send dc set-pen (make-object pen% color width style 'projecting 'miter))) + +(defproc (icon-color->outline-color [color (or/c string? (is-a?/c color%))]) (is-a?/c color%) + (cond [(string? color) (icon-color->outline-color (send the-color-database find-color color))] + [else + (define r (send color red)) + (define g (send color green)) + (define b (send color blue)) + (make-object color% (quotient r 2) (quotient g 2) (quotient b 2))])) (define icon-lighting (deep-flomap-lighting-value @@ -103,7 +120,7 @@ (send dc set-scale scale scale) (send dc set-smoothing 'smoothed) (send dc set-origin (* 0.5 scale) (* 0.5 scale)) - (send dc set-pen (make-object pen% "black" 1 'solid 'projecting 'miter)) + (set-icon-pen dc "black" 10 'solid) (draw-proc dc)))) (define (flomap-render-icon fm material) diff --git a/collects/images/logos.rkt b/collects/images/logos.rkt index 015d0abf39..7d0d2634ab 100644 --- a/collects/images/logos.rkt +++ b/collects/images/logos.rkt @@ -1,40 +1,331 @@ #lang racket/base -(require racket/class racket/draw racket/promise +(require racket/class racket/draw racket/math racket/match racket/contract unstable/latent-contract unstable/latent-contract/defthing - (rename-in "private/logos.rkt" - [plt-logo uncached-plt-logo] - [planet-logo uncached-planet-logo]) "private/flomap.rkt" - "compile-time.rkt" - (for-syntax racket/base - (rename-in "private/logos.rkt" - [plt-logo uncached-plt-logo] - [planet-logo uncached-planet-logo]) - "private/flomap.rkt")) + "private/deep-flomap.rkt" + "private/utils.rkt" + "icons/misc.rkt" + "icons/style.rkt") (provide (activate-contract-out plt-logo plt-flomap - planet-logo planet-flomap) - (only-doc-out (all-from-out "private/logos.rkt")) + planet-logo planet-flomap + stepper-logo stepper-flomap + macro-stepper-logo macro-stepper-logo-flomap) (only-doc-out (all-defined-out))) -;; Use a delay to keep from using more memory than necessary (saves 256KB) -(define standard-plt-logo (delay (compiled-bitmap (uncached-plt-logo 256)))) +(define glass-logo-material + (deep-flomap-material-value + 'cubic-zirconia 0.7 0.6 0.4 + 0.2 0.1 1.0 + 0.2 0.1 0.1 + 0.0)) -(defproc (plt-logo [height (and/c rational? (>=/c 0)) 256]) (is-a?/c bitmap%) - (cond [(height . = . 256) (force standard-plt-logo)] - [(height . <= . 256) - (flomap->bitmap (flomap-resize (bitmap->flomap (force standard-plt-logo)) #f height))] - [else - (uncached-plt-logo height)])) +(define lambda-path-commands + '((m 97.5 10) + (c -12.267574371681416 0.22160039646017698 + -23.938206584070794 4.486409061946903 + -35.40358116814159 8.431642279646018 + 5.002013451327434 5.357118980530973 + 4.2474160707964606 7.049306166371681 + 6.430565946902655 6.642370378761062 + 8.354521486725664 -2.0234602477876105 + 20.745877522123894 -6.732496424778761 + 26.26655603539823 2.1904900530973452 + 12.036272707964603 15.204891185840708 + 17.140790371681415 34.66372757522124 + 18.964158300884954 53.635833203539825 + 2.3373978053097346 11.526810053097345 + -21.433330407079644 52.79757139823009 + -28.736806513274335 69.27072283185841 + -11.871354336283186 20.946142017699113 + -22.417494088495573 42.68413054867256 + -35.79320863716814 62.74737614159292 + 3.198686017699115 4.233302088495575 + 7.820428460176991 2.5766558584070793 + 12.171064637168142 1.925754336283186 + 3.714682336283186 -0.5565213451327433 + 7.429373734513274 -1.1130336283185842 + 11.14405607079646 -1.6695504424778762 + 11.979952707964602 -28.4038887079646 + 24.914903221238937 -54.476528141592915 + 36.156529274336286 -83.1860083539823 + 5.122632495575221 -11.831699256637167 + 7.625016637168141 -18.33969500884956 + 13.711282973451327 -26.087614300884955 + 7.215226336283186 4.414282761061947 + 9.363369911504424 15.302112283185838 + 13.299630442477875 22.814352991150443 + 11.600370407079646 29.849948884955747 + 23.150614654867255 59.71926315044247 + 34.09924077876106 89.81329104424779 + 2.8656957168141592 0.9979197168141594 + 5.806954477876106 3.9796174159292033 + 8.525185132743362 1.105811256637168 + 7.150265769911504 -4.4088093451327435 + 15.474823929203538 -7.170211115044248 + 21.428106194690265 -13.26414385840708 + -1.6986936637168142 -8.23685210619469 + -7.156455079646018 -15.941115469026549 + -10.48132417699115 -23.86248042477876 + -21.07570067256637 -42.11971171681416 + -41.39651398230088 -86.79632424778761 + -54.5885927079646 -132.15014060176992 + -4.858603610619468 -14.274800141592921 + -10.841368920353982 -31.4765361840708 + -26.303927504424777 -37.111590060176994 + -3.5224240707964602 -1.0457545628318583 + -7.2342065840707965 -1.2467313274336282 + -10.888935079646018 -1.2461164743362831))) +(define (draw-lambda dc x y w h) + (define-values (sx sy) (send dc get-scale)) + (draw-path-commands dc x y (scale-path-commands lambda-path-commands (/ w 240) (/ h 240))) + (send dc set-scale sx sy)) -(define standard-planet-logo (delay (compiled-bitmap (uncached-planet-logo 256)))) +(define blue-θ-start (* -45 (/ pi 180))) +(define blue-θ-end (* 110 (/ pi 180))) -(defproc (planet-logo [height (and/c rational? (>=/c 0)) 256]) (is-a?/c bitmap%) - (cond [(height . = . 256) (force standard-planet-logo)] - [(height . <= . 256) - (flomap->bitmap (flomap-resize (bitmap->flomap (force standard-planet-logo)) #f height))] - [else - (uncached-planet-logo height)])) +(define logo-red-color (make-object color% 255 36 32)) +(define logo-blue-color (make-object color% 32 36 255)) +(define lambda-outline-color (make-object color% 16 16 64)) +(define (lambda-pen color width) (make-object pen% color width 'solid 'projecting 'miter)) + +(define (make-arc-path x y w h start end [ccw? #t]) + (define p (new dc-path%)) + (send p arc x y w h start end ccw?) + (send p close) + p) + +(define (make-random-flomap c w h) + (build-flomap c w h (λ (k x y i) (random)))) + +(define (flomap-rough fm z-amt) + (match-define (flomap _ c w h) fm) + (fm+ fm (fm* z-amt (make-random-flomap c w h)))) + +(defproc (plt-flomap [height (and/c rational? (>=/c 0)) 256]) flomap? + (make-cached-flomap + [height] + (define scale (/ height 256)) + (define bulge-fm + (draw-icon-flomap + 256 256 (λ (dc) + (send dc set-pen logo-red-color 2 'transparent) + (send dc set-brush logo-red-color 'solid) + (send dc draw-path (make-arc-path 8 8 239 239 blue-θ-end blue-θ-start)) + (send dc set-pen logo-blue-color 2 'transparent) + (send dc set-brush logo-blue-color 'solid) + (send dc draw-path (make-arc-path 8 8 239 239 blue-θ-start blue-θ-end)) + (send dc set-pen (lambda-pen lambda-outline-color 10)) + (send dc set-brush lambda-outline-color 'solid) + (draw-lambda dc 8 8 240 240)) + scale)) + + (define (lambda-flomap color pen-width) + (draw-icon-flomap + 256 256 (λ (dc) + (send dc set-scale scale scale) + (send dc set-pen (lambda-pen color pen-width)) + (send dc set-brush color 'solid) + (draw-lambda dc 8 8 240 240)) + scale)) + + (let* ([bulge-dfm (flomap->deep-flomap bulge-fm)] + [bulge-dfm (deep-flomap-bulge-spheroid bulge-dfm (* 112 scale))] + [lambda-dfm (flomap->deep-flomap (lambda-flomap "azure" 4))] + [lambda-dfm (deep-flomap-bulge-spheroid lambda-dfm (* 112 scale))] + [lambda-dfm (deep-flomap-smooth-z lambda-dfm (* 3 scale))] + [lambda-fm (deep-flomap-render-icon lambda-dfm metal-material)] + [fm (deep-flomap-render-icon bulge-dfm glass-logo-material)] + [fm (flomap-cc-superimpose + fm + (lambda-flomap lambda-outline-color 10) + lambda-fm)] + [fm (flomap-cc-superimpose + (draw-icon-flomap + 256 256 (λ (dc) + (send dc set-pen "lightblue" 2 'solid) + (send dc set-brush "white" 'transparent) + (send dc draw-ellipse 7 7 242 242) + (send dc set-pen lambda-outline-color 4 'solid) + (send dc draw-ellipse 2 2 252 252)) + scale) + fm)]) + fm))) + +(define continents-path-commands + '((m 11.526653 18.937779) + (c 0.05278 0.724075 1.940414 1.202607 0.678885 2.296248 + 0.249172 0.918181 1.040063 1.620575 1.448285 0.308034 + 1.219485 -0.885607 3.250882 -0.938443 3.317014 -2.906655 + -1.599965 -1.033954 -4.029479 -0.431148 -5.444184 0.302373) + (M 11.53125 18.125) + (C 10.786965 18.380649 9.3917452 18.611001 9.1304904 19.245707 + 10.289001 19.269837 11.178405 18.606302 11.53125 18.125) + (M 8.1875 19.65625) + (C 7.2652998 23.370888 8.6787734 19.63772 9.9124431 20.95891 + 10.727811 21.80382 11.739516 20.92275 10.465247 20.422456 + 9.7714766 19.980166 8.3964342 19.699414 8.1875 19.65625) + (M 7.5625 21.125) + (c -0.9196331 -1.962382 -3.205955 1.390782 -4.0978229 2.41995 + -1.707808 2.289408 -2.72190385 5.078558 -2.9334271 7.9238 + 1.0237952 1.983695 5.5272247 2.76676 4.7145431 4.084262 + -0.7368064 1.151552 -0.8906555 2.601652 0.1135446 3.680893 + 2.7495495 2.364498 1.2541019 5.824595 2.5609489 6.229519 + 2.5755284 0.853846 2.7512924 -3.696022 4.1297234 -3.843434 + 0.745066 -1.051147 0.04765 -2.428466 1.056101 -3.411232) + (C 12.318556 36.222109 8.8169859 35.479018 8.6188979 33.8253 + 7.7181807 34.141675 7.0679715 33.334232 6.30372 33.30415 + 5.7220663 34.646967 3.9378253 34.122031 4.3012403 32.699798 + 3.024533 33.043038 4.3605584 31.222879 3.40625 31.28125 + 0.5 33 2.5 26.5 5.0295875 29.903027 + 5.5 30.5 6.9002733 26.371666 8.8261905 25.876953 + 9.8027554 25.533149 9.5159021 24.727855 8.5279357 25.0625 + 7.6214946 24.941384 9.6975411 24.462771 10.075856 24.483273 + 11.540792 24.233047 9.904685 23.334106 9.8601011 22.602389 + 9.0900535 22.676405 9.4028275 22.737933 9.1185443 22.100147 + 6.8948741 22.58513 7.6831847 24.739145 5.9002404 23.244912 + 4.6247757 22.264239 7.321322 21.942832 7.5625 21.125) + (m 15.15625 -0.9375) + (c -1.37421 0.06218 -2.005432 1.159129 -2.784107 1.978327 + -0.114565 1.368674 0.952693 -0.07002 1.385771 0.968032 + 0.953881 -0.129572 -0.01507 -1.993413 1.425543 -2.008859 + -0.269351 0.525838 -0.494795 1.470731 0.411144 1.15174 + -0.646943 0.90275 -1.874871 2.045333 -2.613442 0.960703 + 0.08813 0.809648 -1.042388 0.509104 -1.186702 1.40851 + -0.738698 0.338761 -1.028513 0.375271 -0.383294 1.119927 + -1.340908 -0.226887 -1.979854 2.002883 -0.346874 1.903539 + 3.128783 -3.578714 2.7333 -0.07275 3.379252 -0.61531 + -0.408321 -3.069544 0.823059 1.69915 1.30948 -0.328623 + 0.476726 0.916648 1.583858 0.757279 2.129612 1.386838 + -2.140558 2.214946 -4.171988 -1.055384 -6.363065 -0.232922 + -2.486751 0.823935 -2.418258 3.347586 -3.103635 4.864439 + 0.687061 3.597921 3.669743 1.43585 5.132502 2.724104 + -0.344691 1.08929 0.484513 1.884668 0.473244 3.022942 + -0.01352 2.068761 0.378264 6.65826 1.845318 5.542497 + 1.472489 0.175399 1.430793 -1.740909 2.30904 -2.30502 + -1.36358 -1.181833 2.025569 -1.358588 0.887958 -2.838158 + -0.499809 -1.988948 1.367195 -3.177085 1.789594 -4.928946 + 0.579613 -0.960476 -1.588234 -0.05789 -0.373062 -1.023304 + 0.927113 -0.301781 2.379761 -2.07879 0.994298 -2.428506 + -0.676988 0.933612 -1.737597 -2.080985 -0.549773 -0.651497 + 0.699549 -0.419557 1.900516 1.563553 1.759683 -0.08984 + -0.608903 -3.386912 -2.4601 -6.520148 -5.090986 -8.736865 + -0.200722 0.802307 -1.230158 0.889683 -1.228926 0.0694 + 2.155263 -0.50116 -0.789058 -0.572123 -1.208573 -0.913148) + (M 17.09375 21) + (c -1.221276 0.05745 -0.44882 1.331427 0.232503 0.449916) + (C 17.458514 21.23484 17.234278 21.104353 17.09375 21) + (m -7.5 0.125) + (c -1.2040413 0.60218 1.459244 1.052142 0.289004 0.112253) + (m 8.96875 1.5) + (c 0.38412 0.655402 -0.236077 2.74213 1.030518 1.55154 + 0.0634 -0.524592 -0.59842 -1.401743 -1.030518 -1.55154) + (m -0.21875 0.75) + (c -1.155615 0.198578 0.509999 1.388302 0.06733 0.201634) + (M 10.5 24.53125) + (c -0.117519 1.313533 1.058399 0.642504 0 0))) + +(define water-logo-material + (deep-flomap-material-value + 'cubic-zirconia 1.0 0.7 1.0 + 0.25 0.15 1.0 + 0.15 0.1 0.2 + 0.0)) + +(define logo-under-continents-color "black") +(define logo-continents-color "azure") +(define logo-water-color "lightskyblue") +(define logo-earth-outline-color logo-red-color) + +(define (continents-flomap color height) + (define scale (/ height 32)) + (draw-icon-flomap + 32 32 (λ (dc) + (send dc set-pen lambda-outline-color 3/8 'solid) + (send dc set-brush color 'solid) + (draw-path-commands dc 0 -17 continents-path-commands)) + scale)) + +(defproc (planet-flomap [height (and/c rational? (>=/c 0)) 256]) flomap? + (make-cached-flomap + [height] + (define scale (/ height 32)) + (define-values (earth-fm earth-z) + (let* ([indent-fm (continents-flomap logo-red-color height)] + [indent-dfm (flomap->deep-flomap indent-fm)] + [indent-dfm (deep-flomap-raise indent-dfm (* -1/8 scale))] + [indent-dfm (deep-flomap-smooth-z indent-dfm (* 1 scale))] + [earth-fm (draw-icon-flomap + 32 32 (λ (dc) + (send dc set-pen logo-water-color 1/2 'solid) + (send dc set-brush logo-water-color 'solid) + (draw-ellipse/smoothed dc 0.75 0.75 30.5 30.5)) + scale)] + [earth-dfm (flomap->deep-flomap earth-fm)] + [earth-dfm (deep-flomap-bulge-spheroid earth-dfm (* 16 scale))] + [earth-dfm (deep-flomap-cc-superimpose 'add earth-dfm indent-dfm)]) + (values (deep-flomap-render-icon earth-dfm water-logo-material) + (deep-flomap-z earth-dfm)))) + + (define land-fm + (let* ([land-fm (continents-flomap logo-continents-color height)] + [land-dfm (flomap->deep-flomap land-fm)] + ;[land-dfm (deep-flomap-emboss land-dfm (* 2 scale) (* 8 scale))] + [land-dfm (deep-flomap-bulge-spheroid land-dfm (* 16 scale))] + [land-dfm (deep-flomap-smooth-z land-dfm (* 1/2 scale))]) + (deep-flomap-render-icon land-dfm metal-material))) + + (flomap-cc-superimpose + (draw-icon-flomap + 32 32 (λ (dc) + (send dc set-pen "lightblue" 1/2 'solid) + (send dc set-brush "white" 'transparent) + (send dc draw-ellipse 0.5 0.5 31 31) + (send dc set-pen lambda-outline-color 1/2 'solid) + (send dc draw-ellipse -0.25 -0.25 32.5 32.5)) + scale) + earth-fm + land-fm))) + +(defproc (stepper-flomap [height (and/c rational? (>=/c 0)) 96]) flomap? + (flomap-pin* + 1/2 20/32 1/2 1/2 + (foot-flomap "forestgreen" height glass-icon-material) + (lambda-flomap light-metal-icon-color (* 5/8 height) metal-icon-material))) + +(defproc (macro-stepper-logo-flomap [height (and/c rational? (>=/c 0)) 96]) flomap? + (define outline-color (icon-color->outline-color light-metal-icon-color)) + + (define (draw-hash dc) + (send dc draw-polygon '((5 . 0) (8 . 0) (6 . 19) (3 . 19))) + (send dc draw-polygon '((13 . 0) (16 . 0) (14 . 19) (11 . 19))) + (send dc draw-polygon '((1 . 4) (1 . 7) (19 . 7) (19 . 4))) + (send dc draw-polygon '((0 . 12) (0 . 15) (18 . 15) (18 . 12)))) + + (flomap-pin* + 1/2 20/32 1/2 1/2 + (foot-flomap (make-object color% 34 42 160) height glass-icon-material) + (draw-rendered-icon-flomap + 32 32 (λ (dc) + (send dc translate 6 6) + (set-icon-pen dc outline-color 2 'solid) + (send dc set-brush outline-color 'solid) + (draw-hash dc) + (send dc set-pen "black" 1 'transparent) + (send dc set-brush light-metal-icon-color 'solid) + (draw-hash dc)) + (/ (* 3/4 height) 32) + metal-icon-material))) + +(define-icon-wrappers + ([height (and/c rational? (>=/c 0)) 256]) + [plt-logo plt-flomap]) + +(define-icon-wrappers + ([height (and/c rational? (>=/c 0)) 96]) + [planet-logo planet-flomap] + [stepper-logo stepper-flomap] + [macro-stepper-logo macro-stepper-logo-flomap]) diff --git a/collects/images/private/logos.rkt b/collects/images/private/logos.rkt deleted file mode 100644 index 4fbc7fb615..0000000000 --- a/collects/images/private/logos.rkt +++ /dev/null @@ -1,290 +0,0 @@ -#lang racket/base - -(require racket/draw racket/class racket/match racket/math racket/flonum - racket/contract unstable/latent-contract unstable/latent-contract/defthing - "flomap.rkt" - "deep-flomap.rkt" - "utils.rkt" - "../icons/style.rkt") - -(provide plt-logo planet-logo - plt-flomap planet-flomap - (only-doc-out (all-defined-out))) - -(define glass-logo-material - (deep-flomap-material-value - 'cubic-zirconia 0.7 0.6 0.4 - 0.2 0.1 1.0 - 0.2 0.1 0.1 - 0.0)) - -(define lambda-path-commands - '((m 97.5 10) - (c -12.267574371681416 0.22160039646017698 - -23.938206584070794 4.486409061946903 - -35.40358116814159 8.431642279646018 - 5.002013451327434 5.357118980530973 - 4.2474160707964606 7.049306166371681 - 6.430565946902655 6.642370378761062 - 8.354521486725664 -2.0234602477876105 - 20.745877522123894 -6.732496424778761 - 26.26655603539823 2.1904900530973452 - 12.036272707964603 15.204891185840708 - 17.140790371681415 34.66372757522124 - 18.964158300884954 53.635833203539825 - 2.3373978053097346 11.526810053097345 - -21.433330407079644 52.79757139823009 - -28.736806513274335 69.27072283185841 - -11.871354336283186 20.946142017699113 - -22.417494088495573 42.68413054867256 - -35.79320863716814 62.74737614159292 - 3.198686017699115 4.233302088495575 - 7.820428460176991 2.5766558584070793 - 12.171064637168142 1.925754336283186 - 3.714682336283186 -0.5565213451327433 - 7.429373734513274 -1.1130336283185842 - 11.14405607079646 -1.6695504424778762 - 11.979952707964602 -28.4038887079646 - 24.914903221238937 -54.476528141592915 - 36.156529274336286 -83.1860083539823 - 5.122632495575221 -11.831699256637167 - 7.625016637168141 -18.33969500884956 - 13.711282973451327 -26.087614300884955 - 7.215226336283186 4.414282761061947 - 9.363369911504424 15.302112283185838 - 13.299630442477875 22.814352991150443 - 11.600370407079646 29.849948884955747 - 23.150614654867255 59.71926315044247 - 34.09924077876106 89.81329104424779 - 2.8656957168141592 0.9979197168141594 - 5.806954477876106 3.9796174159292033 - 8.525185132743362 1.105811256637168 - 7.150265769911504 -4.4088093451327435 - 15.474823929203538 -7.170211115044248 - 21.428106194690265 -13.26414385840708 - -1.6986936637168142 -8.23685210619469 - -7.156455079646018 -15.941115469026549 - -10.48132417699115 -23.86248042477876 - -21.07570067256637 -42.11971171681416 - -41.39651398230088 -86.79632424778761 - -54.5885927079646 -132.15014060176992 - -4.858603610619468 -14.274800141592921 - -10.841368920353982 -31.4765361840708 - -26.303927504424777 -37.111590060176994 - -3.5224240707964602 -1.0457545628318583 - -7.2342065840707965 -1.2467313274336282 - -10.888935079646018 -1.2461164743362831))) - -(define (draw-lambda dc x y w h) - (define-values (sx sy) (send dc get-scale)) - (draw-path-commands dc x y (scale-path-commands lambda-path-commands (/ w 240) (/ h 240))) - (send dc set-scale sx sy)) - -(define blue-θ-start (* -45 (/ pi 180))) -(define blue-θ-end (* 110 (/ pi 180))) - -(define logo-red-color (make-object color% 255 36 32)) -(define logo-blue-color (make-object color% 32 36 255)) -(define lambda-outline-color (make-object color% 16 16 64)) -(define (lambda-pen color width) (make-object pen% color width 'solid 'projecting 'miter)) - -(define (make-arc-path x y w h start end [ccw? #t]) - (define p (new dc-path%)) - (send p arc x y w h start end ccw?) - (send p close) - p) - -(define (make-random-flomap c w h) - (build-flomap c w h (λ (k x y i) (random)))) - -(define (flomap-rough fm z-amt) - (match-define (flomap _ c w h) fm) - (fm+ fm (fm* z-amt (make-random-flomap c w h)))) - -(defproc (plt-flomap [height (and/c rational? (>=/c 0)) 256]) flomap? - (make-cached-flomap - [height] - (define scale (/ height 256)) - (define bulge-fm - (draw-icon-flomap - 256 256 (λ (dc) - (send dc set-pen logo-red-color 2 'transparent) - (send dc set-brush logo-red-color 'solid) - (send dc draw-path (make-arc-path 8 8 239 239 blue-θ-end blue-θ-start)) - (send dc set-pen logo-blue-color 2 'transparent) - (send dc set-brush logo-blue-color 'solid) - (send dc draw-path (make-arc-path 8 8 239 239 blue-θ-start blue-θ-end)) - (send dc set-pen (lambda-pen lambda-outline-color 10)) - (send dc set-brush lambda-outline-color 'solid) - (draw-lambda dc 8 8 240 240)) - scale)) - - (define (lambda-flomap color pen-width) - (draw-icon-flomap - 256 256 (λ (dc) - (send dc set-scale scale scale) - (send dc set-pen (lambda-pen color pen-width)) - (send dc set-brush color 'solid) - (draw-lambda dc 8 8 240 240)) - scale)) - - (let* ([bulge-dfm (flomap->deep-flomap bulge-fm)] - [bulge-dfm (deep-flomap-bulge-spheroid bulge-dfm (* 112 scale))] - [lambda-dfm (flomap->deep-flomap (lambda-flomap "azure" 4))] - [lambda-dfm (deep-flomap-bulge-spheroid lambda-dfm (* 112 scale))] - [lambda-dfm (deep-flomap-smooth-z lambda-dfm (* 3 scale))] - [lambda-fm (deep-flomap-render-icon lambda-dfm metal-material)] - [fm (deep-flomap-render-icon bulge-dfm glass-logo-material)] - [fm (flomap-cc-superimpose - fm - (lambda-flomap lambda-outline-color 10) - lambda-fm)] - [fm (flomap-cc-superimpose - (draw-icon-flomap - 256 256 (λ (dc) - (send dc set-pen "lightblue" 2 'solid) - (send dc set-brush "white" 'transparent) - (send dc draw-ellipse 7 7 242 242) - (send dc set-pen lambda-outline-color 4 'solid) - (send dc draw-ellipse 2 2 252 252)) - scale) - fm)]) - fm))) - -(define continents-path-commands - '((m 11.526653 18.937779) - (c 0.05278 0.724075 1.940414 1.202607 0.678885 2.296248 - 0.249172 0.918181 1.040063 1.620575 1.448285 0.308034 - 1.219485 -0.885607 3.250882 -0.938443 3.317014 -2.906655 - -1.599965 -1.033954 -4.029479 -0.431148 -5.444184 0.302373) - (M 11.53125 18.125) - (C 10.786965 18.380649 9.3917452 18.611001 9.1304904 19.245707 - 10.289001 19.269837 11.178405 18.606302 11.53125 18.125) - (M 8.1875 19.65625) - (C 7.2652998 23.370888 8.6787734 19.63772 9.9124431 20.95891 - 10.727811 21.80382 11.739516 20.92275 10.465247 20.422456 - 9.7714766 19.980166 8.3964342 19.699414 8.1875 19.65625) - (M 7.5625 21.125) - (c -0.9196331 -1.962382 -3.205955 1.390782 -4.0978229 2.41995 - -1.707808 2.289408 -2.72190385 5.078558 -2.9334271 7.9238 - 1.0237952 1.983695 5.5272247 2.76676 4.7145431 4.084262 - -0.7368064 1.151552 -0.8906555 2.601652 0.1135446 3.680893 - 2.7495495 2.364498 1.2541019 5.824595 2.5609489 6.229519 - 2.5755284 0.853846 2.7512924 -3.696022 4.1297234 -3.843434 - 0.745066 -1.051147 0.04765 -2.428466 1.056101 -3.411232) - (C 12.318556 36.222109 8.8169859 35.479018 8.6188979 33.8253 - 7.7181807 34.141675 7.0679715 33.334232 6.30372 33.30415 - 5.7220663 34.646967 3.9378253 34.122031 4.3012403 32.699798 - 3.024533 33.043038 4.3605584 31.222879 3.40625 31.28125 - 0.5 33 2.5 26.5 5.0295875 29.903027 - 5.5 30.5 6.9002733 26.371666 8.8261905 25.876953 - 9.8027554 25.533149 9.5159021 24.727855 8.5279357 25.0625 - 7.6214946 24.941384 9.6975411 24.462771 10.075856 24.483273 - 11.540792 24.233047 9.904685 23.334106 9.8601011 22.602389 - 9.0900535 22.676405 9.4028275 22.737933 9.1185443 22.100147 - 6.8948741 22.58513 7.6831847 24.739145 5.9002404 23.244912 - 4.6247757 22.264239 7.321322 21.942832 7.5625 21.125) - (m 15.15625 -0.9375) - (c -1.37421 0.06218 -2.005432 1.159129 -2.784107 1.978327 - -0.114565 1.368674 0.952693 -0.07002 1.385771 0.968032 - 0.953881 -0.129572 -0.01507 -1.993413 1.425543 -2.008859 - -0.269351 0.525838 -0.494795 1.470731 0.411144 1.15174 - -0.646943 0.90275 -1.874871 2.045333 -2.613442 0.960703 - 0.08813 0.809648 -1.042388 0.509104 -1.186702 1.40851 - -0.738698 0.338761 -1.028513 0.375271 -0.383294 1.119927 - -1.340908 -0.226887 -1.979854 2.002883 -0.346874 1.903539 - 3.128783 -3.578714 2.7333 -0.07275 3.379252 -0.61531 - -0.408321 -3.069544 0.823059 1.69915 1.30948 -0.328623 - 0.476726 0.916648 1.583858 0.757279 2.129612 1.386838 - -2.140558 2.214946 -4.171988 -1.055384 -6.363065 -0.232922 - -2.486751 0.823935 -2.418258 3.347586 -3.103635 4.864439 - 0.687061 3.597921 3.669743 1.43585 5.132502 2.724104 - -0.344691 1.08929 0.484513 1.884668 0.473244 3.022942 - -0.01352 2.068761 0.378264 6.65826 1.845318 5.542497 - 1.472489 0.175399 1.430793 -1.740909 2.30904 -2.30502 - -1.36358 -1.181833 2.025569 -1.358588 0.887958 -2.838158 - -0.499809 -1.988948 1.367195 -3.177085 1.789594 -4.928946 - 0.579613 -0.960476 -1.588234 -0.05789 -0.373062 -1.023304 - 0.927113 -0.301781 2.379761 -2.07879 0.994298 -2.428506 - -0.676988 0.933612 -1.737597 -2.080985 -0.549773 -0.651497 - 0.699549 -0.419557 1.900516 1.563553 1.759683 -0.08984 - -0.608903 -3.386912 -2.4601 -6.520148 -5.090986 -8.736865 - -0.200722 0.802307 -1.230158 0.889683 -1.228926 0.0694 - 2.155263 -0.50116 -0.789058 -0.572123 -1.208573 -0.913148) - (M 17.09375 21) - (c -1.221276 0.05745 -0.44882 1.331427 0.232503 0.449916) - (C 17.458514 21.23484 17.234278 21.104353 17.09375 21) - (m -7.5 0.125) - (c -1.2040413 0.60218 1.459244 1.052142 0.289004 0.112253) - (m 8.96875 1.5) - (c 0.38412 0.655402 -0.236077 2.74213 1.030518 1.55154 - 0.0634 -0.524592 -0.59842 -1.401743 -1.030518 -1.55154) - (m -0.21875 0.75) - (c -1.155615 0.198578 0.509999 1.388302 0.06733 0.201634) - (M 10.5 24.53125) - (c -0.117519 1.313533 1.058399 0.642504 0 0))) - -(define water-logo-material - (deep-flomap-material-value - 'cubic-zirconia 1.0 0.7 1.0 - 0.25 0.15 1.0 - 0.15 0.1 0.2 - 0.0)) - -(define logo-under-continents-color "black") -(define logo-continents-color "azure") -(define logo-water-color "lightskyblue") -(define logo-earth-outline-color logo-red-color) - -(define (continents-flomap color height) - (define scale (/ height 32)) - (draw-icon-flomap - 32 32 (λ (dc) - (send dc set-pen lambda-outline-color 3/8 'solid) - (send dc set-brush color 'solid) - (draw-path-commands dc 0 -17 continents-path-commands)) - scale)) - -(defproc (planet-flomap [height (and/c rational? (>=/c 0)) 256]) flomap? - (make-cached-flomap - [height] - (define scale (/ height 32)) - (define-values (earth-fm earth-z) - (let* ([indent-fm (continents-flomap logo-red-color height)] - [indent-dfm (flomap->deep-flomap indent-fm)] - [indent-dfm (deep-flomap-raise indent-dfm (* -1/8 scale))] - [indent-dfm (deep-flomap-smooth-z indent-dfm (* 1 scale))] - [earth-fm (draw-icon-flomap - 32 32 (λ (dc) - (send dc set-pen logo-water-color 1/2 'solid) - (send dc set-brush logo-water-color 'solid) - (draw-ellipse/smoothed dc 0.75 0.75 30.5 30.5)) - scale)] - [earth-dfm (flomap->deep-flomap earth-fm)] - [earth-dfm (deep-flomap-bulge-spheroid earth-dfm (* 16 scale))] - [earth-dfm (deep-flomap-cc-superimpose 'add earth-dfm indent-dfm)]) - (values (deep-flomap-render-icon earth-dfm water-logo-material) - (deep-flomap-z earth-dfm)))) - - (define land-fm - (let* ([land-fm (continents-flomap logo-continents-color height)] - [land-dfm (flomap->deep-flomap land-fm)] - ;[land-dfm (deep-flomap-emboss land-dfm (* 2 scale) (* 8 scale))] - [land-dfm (deep-flomap-bulge-spheroid land-dfm (* 16 scale))] - [land-dfm (deep-flomap-smooth-z land-dfm (* 1/2 scale))]) - (deep-flomap-render-icon land-dfm metal-material))) - - (flomap-cc-superimpose - (draw-icon-flomap - 32 32 (λ (dc) - (send dc set-pen "lightblue" 1/2 'solid) - (send dc set-brush "white" 'transparent) - (send dc draw-ellipse 0.5 0.5 31 31) - (send dc set-pen lambda-outline-color 1/2 'solid) - (send dc draw-ellipse -0.25 -0.25 32.5 32.5)) - scale) - earth-fm - land-fm))) - -(define plt-logo (compose flomap->bitmap plt-flomap)) -(define planet-logo (compose flomap->bitmap planet-flomap)) diff --git a/collects/images/scribblings/compile-time.scrbl b/collects/images/scribblings/compile-time.scrbl index 677b1da753..cc3c4dabb9 100644 --- a/collects/images/scribblings/compile-time.scrbl +++ b/collects/images/scribblings/compile-time.scrbl @@ -9,3 +9,5 @@ @title{Embedding Bitmaps in Compiled Files} @author{@(author+email "Neil Toronto" (author-email))} + +@defmodule[images/compile-time] diff --git a/collects/images/scribblings/icons.scrbl b/collects/images/scribblings/icons.scrbl index 383c8ee5b3..d102816c5f 100644 --- a/collects/images/scribblings/icons.scrbl +++ b/collects/images/scribblings/icons.scrbl @@ -31,6 +31,8 @@ @(define icons-eval (make-base-eval)) @interaction-eval[#:eval icons-eval (require racket/class racket/draw racket/math racket/list)] +@;==================================================================================================== + @section{What is an icon?} @margin-note*{This section describes an ideal that DrRacket and its tools are steadily approaching.} @@ -58,6 +60,8 @@ especially for new users and people with certain forms of color-blindness, and t As another example, the Check Syntax icon @(check-syntax-icon 16) connotes inspecting and passing. Note that the check mark is also the color of syntax. +@;==================================================================================================== + @section{About These Icons} The icons in this collection are designed to be composed to create new ones: they are simple, thematically consistent, and can be constructed in any size and color. @@ -80,6 +84,11 @@ See the @racket[plt-logo] and @racket[planet-logo] functions for more striking e When the rendering API is stable enough to publish, it will allow anyone who can draw a shape to turn that shape into a visually consistent icon. +As with any sort of rendering (such as @link["http://en.wikipedia.org/wiki/Scalable_Vector_Graphics"]{SVG} rendering), ray tracing takes time. +For icons, this usually happens during tool or application start up. +You can reduce the portion of start-up time taken by rendering to almost nothing by using the @racketmodname[images/compile-time] library to embed bitmaps directly into compiled modules. + +@;==================================================================================================== @section{Icon Style} @@ -139,7 +148,8 @@ It has the high refractive index of @link["http://en.wikipedia.org/wiki/Cubic_zi The ``glassy look'' cannot actually be achieved using glass. Metal reflects the most, its @link["http://en.wikipedia.org/wiki/Specular_highlight"]{specular highlight} is nearly the same color as the material (in the others, the highlight is white), -and it diffuses much more ambient light than directional. This is because, while plastic and glass mostly reflect light directly, metal mostly absorbs light and re-emits it. +and it diffuses much more ambient light than directional. +This is because, while plastic and glass mostly reflect light directly, metal mostly absorbs light and re-emits it. @examples[#:eval icons-eval (require images/icons/misc) @@ -154,6 +164,8 @@ The material used for rendering most icons and icon parts. There are exceptions; for example, the @racket[floppy-disk-icon] always renders the sliding cover in metal. } +@;==================================================================================================== + @section[#:tag "arrows"]{Arrow Icons} @defmodule[images/icons/arrow] @@ -163,6 +175,7 @@ There are exceptions; for example, the @racket[floppy-disk-icon] always renders @doc-apply[left-arrow-icon] @doc-apply[up-arrow-icon] @doc-apply[down-arrow-icon]{ +Standard directional arrows. @examples[#:eval icons-eval (list (right-arrow-icon syntax-icon-color (toolbar-icon-height)) (left-arrow-icon run-icon-color) @@ -174,6 +187,7 @@ There are exceptions; for example, the @racket[floppy-disk-icon] always renders @doc-apply[left-over-arrow-icon] @doc-apply[right-under-arrow-icon] @doc-apply[left-under-arrow-icon]{ +Standard bent arrows. @examples[#:eval icons-eval (list (right-over-arrow-icon metal-icon-color (toolbar-icon-height)) (left-over-arrow-icon dark-metal-icon-color) @@ -181,43 +195,32 @@ There are exceptions; for example, the @racket[floppy-disk-icon] always renders (left-under-arrow-icon "lightgreen" 44 glass-icon-material))] } +@;==================================================================================================== + @section[#:tag "control"]{Control Icons} @defmodule[images/icons/control] @interaction-eval[#:eval icons-eval (require images/icons/control)] -@doc-apply[play-icon] -@doc-apply[back-icon] -@doc-apply[fast-forward-icon] -@doc-apply[rewind-icon] -@doc-apply[bar-icon] -@doc-apply[stop-icon] -@doc-apply[record-icon] -@doc-apply[pause-icon] -@doc-apply[step-icon] -@doc-apply[step-back-icon] -@doc-apply[continue-icon] -@doc-apply[continue-back-icon]{ -Typical ``playback control'' icons. -For example, a colorful tape deck: -@interaction[#:eval icons-eval - (for/list ([make-icon (list rewind-icon continue-back-icon - step-back-icon back-icon - pause-icon stop-icon - play-icon step-icon - continue-icon fast-forward-icon - record-icon)] - [color (list run-icon-color halt-icon-color - syntax-icon-color metal-icon-color - dark-metal-icon-color dark-metal-icon-color - metal-icon-color syntax-icon-color - halt-icon-color run-icon-color - "red")] - [material (in-cycle (list plastic-icon-material - glass-icon-material))]) - (make-icon color 32 material))] -The remaining icon @(bar-icon "red" 16), returned by @racket[bar-icon], is used to build the others. +@doc-apply[bar-icon]{ +@examples[#:eval icons-eval (bar-icon run-icon-color 32)] +This is not a ``control'' icon @italic{per se}, but is used to make many others. } +@doc-apply[play-icon]{ @examples[#:eval icons-eval (play-icon run-icon-color 32)] } +@doc-apply[back-icon]{ @examples[#:eval icons-eval (back-icon run-icon-color 32)] } +@doc-apply[fast-forward-icon]{ @examples[#:eval icons-eval (fast-forward-icon syntax-icon-color 32)] } +@doc-apply[rewind-icon]{ @examples[#:eval icons-eval (rewind-icon syntax-icon-color 32)] } +@doc-apply[stop-icon]{ @examples[#:eval icons-eval (stop-icon halt-icon-color 32)] } +@doc-apply[record-icon]{ @examples[#:eval icons-eval (record-icon "red" 32)] } +@doc-apply[pause-icon]{ @examples[#:eval icons-eval (pause-icon halt-icon-color 32)] } +@doc-apply[step-icon]{ @examples[#:eval icons-eval (step-icon run-icon-color 32)] } +@doc-apply[step-back-icon]{ @examples[#:eval icons-eval (step-back-icon run-icon-color 32)] } +@doc-apply[continue-forward-icon]{ @examples[#:eval icons-eval (continue-forward-icon run-icon-color 32)] } +@doc-apply[continue-backward-icon]{ @examples[#:eval icons-eval (continue-backward-icon run-icon-color 32)] } +@doc-apply[search-forward-icon]{ @examples[#:eval icons-eval (search-forward-icon syntax-icon-color 32)] } +@doc-apply[search-backward-icon]{ @examples[#:eval icons-eval (search-backward-icon syntax-icon-color 32)] } + +@;==================================================================================================== @section[#:tag "file"]{File Icons} @@ -240,6 +243,8 @@ The remaining icon @(bar-icon "red" 16), returned by @racket[bar-icon], is used (make-icon syntax-icon-color color 32))] } +@;==================================================================================================== + @section[#:tag "misc"]{Miscellaneous Icons} @defmodule[images/icons/misc] @@ -316,6 +321,16 @@ Equivalent to @racket[(regular-polygon-icon 8 (/ (* 2 pi) 16) color height mater (stop-signs-icon halt-icon-color 32 plastic-icon-material)] } +@doc-apply[foot-icon]{ +@examples[#:eval icons-eval + (foot-icon "chocolate" 32 glass-icon-material)] +} + +@doc-apply[lambda-icon]{ +@examples[#:eval icons-eval + (lambda-icon light-metal-icon-color 32 metal-icon-material)] +} + @doc-apply[magnifying-glass-icon]{ @examples[#:eval icons-eval (magnifying-glass-icon light-metal-icon-color "lightblue" 32 @@ -337,6 +352,8 @@ Equivalent to @racket[(regular-polygon-icon 8 (/ (* 2 pi) 16) color height mater (left-bomb-icon metal-icon-color dark-metal-icon-color 32)] } +@;==================================================================================================== + @section[#:tag "stickman"]{Stickman Icons} @defmodule[images/icons/stickman] @@ -368,6 +385,8 @@ The stickman's joint angles are defined by continuous periodic functions, so the The cycle is modeled after the run cycle of the player's avatar in the Commodore 64 game @link["http://en.wikipedia.org/wiki/Impossible_Mission"]{Impossible Mission}. } +@;==================================================================================================== + @section[#:tag "tool"]{Tool Icons} @defmodule[images/icons/tool] diff --git a/collects/images/scribblings/logos.scrbl b/collects/images/scribblings/logos.scrbl index d3917d2b60..8701378f93 100644 --- a/collects/images/scribblings/logos.scrbl +++ b/collects/images/scribblings/logos.scrbl @@ -18,19 +18,23 @@ @doc-apply[plt-logo]{ Returns the PLT logo, rendered in tinted glass and azure metal by the ray tracer that renders icons. - @examples[#:eval logos-eval (plt-logo)] - -A 256×256 (default height) rendering is compiled into the @racketmodname[images/logos] module using @racket[compiled-bitmap], meaning that constructing the logo at that size and smaller is cheap. -In fact, constructing the logo at the default height is essentially free because it does not need to be downscaled. +The default height is the size used for DrRacket splash screen. } @doc-apply[planet-logo]{ Returns an unofficial PLaneT logo. This is used as the PLaneT icon when DrRacket downloads PLaneT packages. - @examples[#:eval logos-eval (planet-logo) (planet-logo (default-icon-height))] - -As with the @racket[plt-logo], a default-height rendering is compiled into the @racketmodname[images/logos] module for performance reasons. +} + +@doc-apply[stepper-logo]{ +An algebraic stepper logo. +@examples[#:eval logos-eval (stepper-logo)] +} + +@doc-apply[macro-stepper-logo]{ +A macro stepper logo. +@examples[#:eval logos-eval (macro-stepper-logo)] } diff --git a/collects/images/scribblings/running-stickman.gif b/collects/images/scribblings/running-stickman.gif index 79d9de52eeb7bd22649aa140242dd220d2bc0c42..3c1b9b8f1d4d513ab4cbe5871b9375a325b6972d 100644 GIT binary patch literal 44789 zcmb@tXH-*p+xGoWb{ddC5?bgflz^0kB2`QXB~$~VqJtWWPAsE{j3Vkx5(0!?bx@HB zh=4tSIyf*+5{iHz5z)am1A>Z*UZ|+xjQDJ>>t64(-m=zn-)p_!lYH4bzwg++8@wXARPP+o&AjMSLjk#>M}SemjEj_e>#;1miu@)1OfK| zrdNQgZ75k()hMC5HO$04uix&Q8KN8#e@|p?uRp*iMVsZ+)V- zFN^y&P_V-*DMh$)KS57;N{U%vV63Tvxk8r6*~NsySU% z-Bg;>_RU_k!SOQ%Y2Dz|>H57IdZx;`>CEXvU3NdJed{kC-8Z0f=6v(Pe(S7$r$e{E zg-hp~E+5%H0!q6Q&R;&MY`xU{ORZ$sUaED!c&+L181~99m$UED3UBk|_uS<7d~^N; zo!2|AsxP&7ohy0dRq}9U@n0@oJ(}x%SC2disCp9GH*llz&z*|N_1)Uvj!#GSY1@y@ zxZNDSe)2`|@tJ_Z;hR6djvc-`Ffw}k-h=)>?%!+vAUOSr-}E8j-s6#nj~|@*C-9HS zf%A*2{+jsn(d1ammjvZvl4?PA?Q81Pv&qiIofFfK)nB)~nEtExYx?xd=R;rj4}JaN z^}k*{`kFVjcx>ux`S@bf`wws5f2~{idg0T;$FGZRpTD+${i^!nQ zKmiDR1X~xnT>F+&H)MZq z=TKs&2dnjoRBivKmeXN7sZ^um`-iRCze#g-mOp8I&dc(oipZJ&vifz$HRAUPWqnPn zvuiMq?%&w`r(gP$>m**!w+LzOsxHim##Oa`>EqYe>^NFDas<(!2`u&&qx{;QjI90U z??@v{M8MO}bM{od_O|hhj=Oq4uC_$@qW%uRio4y?@-K0-j}}!s3w8lw`J>8O2|}UR z_UzGusZ)eM5Yrx~KX5XK#C`PM6Q3>(CsI+>AsviXx^a{orxfctt-qGuU-99^O+27a z8?WNKJ-iqi8nmd$+%p-1(=l#V=-BESnY;c0%|6&vwu$8%+WXgRQfm0=%*BjTI9(dC zOhbxdwm>L=D$_ZP`hJp!^QOf1d+2zjTLUNq2ll<^G6l<@Ig-mg)1x?I!g5?)kMo24 zX#;<6nHCo`*WIP>|Dx!95#5lPCNIL|)Tyms;HoA|0vhj3`aBk_jxy%zzgV@rSVqcq znADmUVB7+_8Y))>-H%>A%1G!Me4;|Z{6&KDZm?8C&X)F~$n9Pvy+!?-MLFOXR zy_bVY=eNB$cE9gDUbBs61J`CC?F5 zN`#&K9(iqmT_BI8&Tj1&W83GG-(FXZk@bx9gzwU>bu_0dEzMbF(FsSQRK2eHE8j=4 zv8Qf|877m-Z7x2A={;CVf~4Q|Qgx7su~VVqP|{=jLs>njwn!Ij9%+WyGERk^_m<_c#jB8zZQ^<<9+tI-TM%xyAw(~-rWCoM7m{|S+Aq6yaTsS%!4>8 z>^@bF@7#n09SouH#AT)3JUnGug&Ecsq?GYo7I$zr>qIu^`3mY#(7YCy1IW3Pbr92_ z0Wxhxy1W6}Md@)_T#iq44%%yLnQT)a$53raI-P)rGACyHvZSQVqlq?uvbf6*bn6nu z2)m0Wq3nWKg9Fvs-&e@7JrguZZsw$g*H2g{DiyiC5a(f{MR>NaGWg>?;|)uv&pT~G zhL9I>ZpBLU&r3+!+&_8R#pp~lXk$v4lp zGl?K#K_(^Q;M>7*c;aFj&(=>p9Frg=9TsUo>m)f950Hr>q5ngj;ZLk2tfN8&P+Dq0 zx9G&bfg@J^#v1pTUlME&wR7>sls|2cRl72lBz07aB z+@7jJf83$7+#QH9RRH7I4x(08AzV`F=3Fm1g~&mNPFETGUqSKnC#%w@#(6>lM}L-8 zxHrQV3ylZaUOZk9#|qNH$%_&@CklRbpRBiz?E)o2d5rLi(S|Po$hZw9gGgY?;%)Y4 z=LgIP!70a?^=Pf+oV>!W&}KxpC_O4|&hIkK2?45soqRI9CDK>F!&8hGz;jg+B&BCO^ zB`e>w-#I7OQyZJ_`r&YI?|jlf*}nU3MSm75iQ{=LI9fnmH|*HHTX^Cr@=6GYe%a%` zPG8V1m-g*?o`AvN-z6&<5d4u8hKprRV#!3OmNfNRws; zC==NqO9J(q>%%H<BPmM3*|l6hz7Uh1$}?CIxQLtb3EEd#>{;u~<|4~% z9R-2jGGT-_2NS-Lye49~{wZD?z?3f( zdE!jrk(c**LeI5*jLvp#No)c3!>Rv7vDGtig-*42cP>t}#vNgy-Z{wb+Zd%nbhp%y zBL`c==^}9K3W-Bc=0AIw1uC5|=M#MQ{?W>vacws2Dvkyl zG)B7YuuF3$C3YrCETuPA*XwGJT%HkI=XQVBN6&Dh>-;uknf?8uj*V8CXSqgofF}tF z?^5X%WL8{tq;>gfEDz)8pQZ|TB8xok#e3-DZ8+nq=FqY5_<-Nu#O6Clm&c*&trX>9 zHsz~aKhcZE(tTZbWdN>m2eFpq--jxVa_jz!B{^G69LUAsDJ&If_jDb0rsAgS{?{!k z1b2rX0dz<9h1W>lEv0aU?5myORvoQ4v3|tFvc5m*v^uLAb#L z&bZqr^zUP_xg!T5(+EIcN9;Dni4i7G@8$Ut<0upogshs)4Va59Ohq-!IbXxL9s&R( z4CU&#h#CA6QjsSQqEmzO(vpEA3;Oa**dH*~TAHPtvaIE!g~?FI-ZXAPNx zZl<-1frVCPb&MnBhnS;Xs^j&x^Us*;lL&vA+1ePltIX-Q^N(+!lXHDER=-^?6RBDa zjy7+LX57vr<2Y3T(S3pYwRtgBPtKf_cbij*h@b4QP%i=%Ui^79E<;L+=7`-dWtEA* zIJ8?RTkW5eA3*Usnd*gGv0*Q2PpFh6!R^3=lK;qt#{*$rV)jg%yAug69`@>^*^Y^C zt-u+qjdteBBq$4gF>Y_g`MqQ6bwgPn+Z2QgqOiyZBga2pZa&P1C&>R{U--`yfcJ$6 zBRRpWHQmr7A^-94ys#RNYPaW2jV#z5XLFk@mQkg?)7?u*hRHLbKd^ zDSiEN(%*J^qa?t0=M9=BsZMR~4=P+dqGx>C49qs~;$JeQnj`lqK8Ms~UK~lppoCWs z(j18Nm>RxV+;6#lY)c)o#|{lF;VICncW*irXXJh85r?GFkUT{96kOhEc&)mv(Ti$| zC?U-SQd+u~K?mLi;ZTXnE)qw@QXTG`4lA`}b`ph5oikDm3V~y(vSCeA{KJAXNkbTR zHY#0O8aPJ6W<>Z8pBGjaV!Rtth%084l`(#k8SkSghD^mb#i(QJB4g*eCnrm}`|d<9 zAIWU(M(I4tY2e(C8t?L$~OXiNi`WntubN@ zT^{MI?`ux+p%=Pb?XJH;f^1v#yh0YbV%P=e^MYLR9ASR<1gwr?cT{V7Q9j-EyPcbA zlKHw&bH$L))6bO#{==S{O{cfH)NvW=8T#90wef0>NoDGJwp|QIEOS)GFeYlIkD($Yq+_ZTgfr_rN6?Fx zi9KEYMAJk;wsHQP^ytchvhS|`Q5T=Qhj4gKz3*Y%s&`jC(l-OCRdHWSqm#kO)i9Ea z%0uwYH)atyo~>F%D9Dul;_$+KTxMM!8FOv4Xbc(UoF))R@>5p^4{vY`2*UfmnZ9GN z^0;CX1eq&u^X-m!rn^BA=ho9D0g@m5SF6RfCao*Up0=65^Xu;+#lsBtUF5gxxuYh0;ic)gOwDOvwMZXreHPDSUv+p;h>e# ztlrjf4T&lYEwT*85yz!e3U}3+4-zc&niv{Apf2QzxF~>|&cn=-Q1I`&rakB0OUCfD z@9PeW5lB(Sk<8$1qwT~X6moknug{5QtWcR-einqzA%r74WBdln<8r1_fK@fbpp$gu z`#8YnN>wICfLt-?Nv>?(W-V*FBeQKp9T3XwoVlw*I}u2Grc+QSLQL)(C7(=iVhjR_ zCI16;0dOF#P|kPuBIk;bNY(7!>~>YjUg{azJtBYI<-62Q&J^i-HP!<-V~L&1xT>_E z6pa`O$-!RK4kCZ&91rxVUCh2AX3c7hFV5O-@xFQg)_+ZbUyS~nE5H)`Yxpho>hwFx zmbSj~q|V@FR6#qa<6kOa>e2PWpWHg>kwWDt$!>NLsYXoEgBzFr^h-YE=gbTmZVbty zQZK*zFZiz@Z@3`}iGkjXcYT_B_{;X8)GrdTqULVCC)M)AFENkSDTmS}zq*U>+?UT_ zQW1Y#J^t6$q1=hjQ(HMz9mE!$J|tlY{s4RHLw>2)Qf|`-X}Km-sr_<-#k2pc0IB<` zhgIUR-{t-GA78C=jj!4Y1Z`PK*EfkpxG{;-y4Me`MeSWruBUMscsE3_7<@ur>uoQ43&RQ=|-iG!nRKGy*PBS6W94n>~DBvPX%ckEKzDTCjjkex&y;2?5gAzo!>o9T$ZzI6IzPB1Z zW=3q}#ort?9OK&NxJZ{vGJ1ny;nWVfnJHCx#`DsA+8e#};Ev;tFyr!_E_qr;Pz>=& zecid;6DXADU`4d|i-1#oSxlKG);H4nvK|x~5BoaKdGH8XF4);eFI8#P=n$E^X!&qv z+_<&T1@~^W)gb|oK4vtBhrB&o({HAWw9>)cZfPOI?vNNkY3zI##lECaAiPLV85kJY zw+F1)-5fQsriLN##&;_C%*LtL{fpM-JE^$4P2jzrrEP{%YSjo^L`vVFZXJ|ez(|qr zzh>@~+Ox~V664>LU1CgjX2mZj4@RlDHb36%l)I?p$S^FWp{~6wiPIf}HVsIRxZV`C zX(51nIa-P`R4!RgkIXQT!<@wLZY~RncRf@EBv!@oI&-{EJm|8_l3fb3$=w-O?E7x^ zRH=P9YXzTiWPAY$d5OOU%oUAkuxQsA5)!&1?xSIV%y)`=Xkzc5^yNu}U7jgMWTCmm z6ft*!4WI~4_LsOYuRR3e4}o%=BZigjMIlNi_ilQLn#jS$jOQG5hqbl<>2#iE@X4e5 zFH{|tf*(gL(x?`}^$37VQ_HYMKfgcP-n|^31d+#8#N!+Uc8G{ctcDht_Bifb5*DhK z{!EvmK$Tce#7RaT>+78zQsXBF5dQi!9?p_m=>Gl*iOA6{5S}XWS0N8Q1J{kN#v1J9 zKzKkzw9R)}Y=G%@Tp3dEfvZDcR@j6P#b%A;IMJaloz=|izUL=!SI?5Tvn(-VTC!cL zK%z2NmuI$1ada{V5~^fe``g7k1V|(RdfDyCz`qZgQvyj>hON~xr9=+rAy%@AvfZ3) zXM{K}8^;4If&JY<4uVEOTVyI#c#;4qNSEkwL}ez#`fBnZB5TLpcCpT_Ab3)6bE#5} z94OHHj8i?V+8r1woCL zEX;H}j#70x9@m0Ewrlf_NOxd~Oj4AdRQ75#<8e(CLfTzmF|tr~gL^e+lwEg{Ch)AZbFsN z)`?e;nmm1qE2m5v-OzU^nOdYZ(tqr-(uyjWeo9U`iDo}rc<8`l+Pme%lh;M@{3UzAgf?0llJbM`Q_C9clz(`UKyGJU#fp979g3){qi&R&-8xU zKn3;kebdRnaQ*M;ua4U3M(cvItqu*pL<|(@0zXChk#pCa*Eio|l8B0$+3Y{J%LNi- zPcDizxH!cPx$a$wMl5b}qeO+^j6#o64v><&u=bk=t0!6^gedEkj_nZDTQS~6?!Z@- z7|?uJ0A;5{b3m}NZBxLdC67L|IbFbV6A=NhMGCu|5hkn035^uk?3rm`3|Sl6im@Jp z4Tg%9jh)ZKxeMJsG2TlNfTUaVpm&Xg01 zR+HD;d8uV1I16(Yk>j~3m(692RBvlMa%IV}UUT_{7_sRy<6FulLFG_gUfih&yPcHV z_K*om!Bf;mDP;~FuuIc8(y8es7_wAitiTy?D3Yx(u?nhNZ+a{$O?V27MF1(!`VN}K zS1iIVlWA>d>rEv*NxD#bSoA(i7Eq`zN-$kOx48OUgv;1J{%Ik`_Z{Y!C`SR?Ox696sHic2QBy!ZWj(M?0Pc6T!i?%9bh2q%)7Rnj@LM0~M z%{pJ;cw{~zm)0^{UTLhJx&64*^aGNMJ!E^QB=CzU2#F4%GKkBu=YP#}Xp|A=$oRx0 zIjub)PJ{NGiPJf(jjJ*s7|oJkr^%CXYtet+DE*32pAmwqhmXI_XC|EsziRlc8?uPW zN)#jP8)XSmA-C~m8jGyCiEFeIhwj{3k)w?Y!vDY`YOIfB)<35*S>rwTbDh(Fv9J=9 zg;Hpg*z#r23@gvN+wd>!^j``OgMi~j$+!vcnL0irThz~`UjBJV?h?vVhT#l>4{4Tl zo_*-;NgKC*$M%0FT+GPLyJRG$?AM;R_x}hCj|-NmR9)o!&~5F)z_|lMxjO`i&Z ziK52ir`6_9j{M$sp$@`Tb8ya52&iBHSM#iknpEVET!T%xAi|O)1_*-D;AWexEPz$2 z>9<*&^lD))^0-pAm{kp#`w8m-o*Hm~D8nBC5){xnngQ{%YH_Z2(QKZ>XqQC^ON>`` z8TQ|ZZMAAEub?*f578K<>%^{XO5?eF@s_;eUNAUOo_3_tH7U3K8nZ+<*|}0 zD*r*CGDnPdins;Dd8+w6CB{P_Dam8;jdt$sTxVXXYt#%0I}sSi$U9-w7B)b?^^?Kf?B5>QNN(?t+ zZv~6PiOk$WG^C344$nIkH#%iUg^f|P|MR6=kI>A|GQDM zn&y@K|5vikDwqlZ?^5@u-fm z3X`IN!h8Et_;AG zN5E4{N;vzk=D@|eiF5>*e1U#XdMkdCOR{kb%B)tSix0a-Q9)ms(HG9X z)w0||n(?ee_!Xs3PyM{|ZTvf=ZYY1X)|D9r)7k(j1lGyN z#KVNe`v}D*+vB=agd;}0p@ynkW}!Iwh{DEWd+(B}td5Ih4_AF2bdBs}AqblTOvT3+ zkuGdC`H1}2n-_l3uXi%rJ$Daze$nSFmr~mds3e$S zrZF0|tDD|WuYk$yUs9IFB`ix6U_gw)L%v;YeEl-$TWW>ZBG$XRZ8h3RQ5R;D{V7TA z_E#s5uVYt}#NVxR=+|!R?7j&IvY3>%x&;U^ z(lt*kJx0zCR0$f`;aP#PQiGN)^ooF?n~GtUfZGz*~7JKElNMXc6vGh%`= zneU6Ah0OO>*LJ?2?kYh8Xl}O0a?GM)1!HfOQf%p>1F4V^)o()=o=4iu%xRA!m`VD% zCpLe?*P(E>Ne)7x4gTfoKt$szgAWgFjK`Z)Gsh;7o`L~dAndEBB@u44Q77ia7+nAW zaXiR|LefEhgumLpj<1xUh#SXoi;Fk2!76Voj7xMZP@(Tpe_sgE5Lb#hZVxm?mdbxY zQPj;7n5Mjd^K~d>UvNMo3pfp?k<0lEhLVHu^4w}-1_07tt_c`p8|+pfk$4q305^{H zh)S`wXXpDKqRNVsu-5W*8aG9n{*Lh=EEo^{kp%&}YKVYd2&Q-{ER}CV$ykoWN+8jT zn1}ya0(uq&R=liWTW1yeCRo4;oWZ*iB;mQTQfrAy5sqJElwz70Rl?Ium zsc9M0r97Mvn*}=`BHx<z#!#zWj^{MBZIK9_`7f7wSyA@&`qk&sEyjbUeh|a)sb1?t3 z)#d>e_Igbt%4FnQI@N^^e7DLgeiV?va z!YFEcz(8!t3dDyq#X7kEUr<~CqqwOeXMK?BN;)TbM2cX-=5K}aQG7t6*0lHiwl4c90p}7855i%vRSDk>S!F5a@ROIzuAnStJUaR$ z(%R_*3oS(l((TiU8^N7o||H5X+S7|Aj3!6i7lVR+8sch9kJ^x%URIT+l`!=Fqb7CXJ08+VCOg2HPV zFhGki6pif)9M5Y0KG?cQDFf&}IfElMEKbVBC9g#~DU$a7-KBXrD8xl(Jdwh&n<-OV zd%b&-_<;xT-QIZt)tBIk4A;h4u8x_igN$)8expJ$f+NJ(dM1s(Q{_B;N+U12%%B)T zf$z&q2+z(|>0f7EfA};>e=CgFL6scN^9sy7sm}jQ5?pNGVmEWT%kx5zfp; z$>lPgecCQSNZ{E<)bX7c0kV_7mMdccXO^^b`wYs2DZs{(Q}>0jf*t(U7sL!sKtX9w zIhlKE0%u~2bD6MVJr%L9^E>?$Q*G|oZ-{4#vBj9vhCe$jPF3FWSrKsut`ORm>6D{- zQi5>>Q#^yx#~Hk6=D{WTIw*jPCToQKF#(Co@Av89eaa;At@`dl?-|yyq1w@Zn$-{j zzpc^Jyib3&*I5X!V9gl`X(uzT|7zo-2N#?gW$$bu-w~fe2p`4b;-=5u z+||*TS>H#%8+mLDcq+CPc!GFA7iJ+w9AtcO{#Cw1v678|W>m|IDU1v)mylmoX#gN5 z8*9ep1aRw&3}CyQ#$w@i{wCCN@v=uGNXJGl0l;)gcOK4+%|?-S5H-D_^M8za5;IhJ zKCcH)m9F5z9TU*@^mZOC^;1ia4!)syi==ivf@|5{-P&(IRP=q3jSWzCEn22jekZ4j z62%Q&bK?6K@PWZ z#IqPXGl|9M*9UA%=PZGz5W~3r({LXNmzJ)?)qPR*ynX!BCe6;=jJSa>BPj^=jyo-t zr~zWN`r|X=?}3(F;NSe$m)TFbdRk%7MI~YYj_nxL69kkeZ_j6Ketd(}_zW||#!n2) z*$^H>R7oHGlIx8F$OF^VWm^+;L*sYHdluv^ON70rGAv^LyXkKHx77vwSs~a`9~YP@ zK~+fzh(zKO;`-Yq$=m1pjhPaBZFsh4PPkpDA>EVPXMFFc_lE~R40W65| zO`I$m8h;2tYsXIq!~XPtyI}!?@QFHe&Ut&r*iBuzp3!!#`f5w6dT$7|NY360_w0z| zW1j1Gp;6Hv=Z1Lu_4H-v{=o8?>3-+I4gYkR$-`xB+5y$bkh);Fih!{nF2ZpfW zo8QF?IAYv1tDR+HJ$S6fn4 zr1+NX=M^9F^<MPX^OpfWm*52tEI<`l^?9h2@N zg!w#25ZLpGg+RDgk0Z$q-IYmP2fkS2ifpNj@$Tt^Emhpb%rZJ!q{RBq!7|c&6xG&U zoH;EjbFz$@O%4d!cc<9%$Rn71{f@o@HZ4t|roK>mq=exgu~Oqw&YZ5DQTGyR zjy@kR2oworm;%A-XC6HbpNl+?mKYBEEEabXgBWJLlc_k`Owf==$K1c!wM0iN#ZkbEDS?9Z%%Xcu0V$YtM@K=W}Ip18eW9tXn&j#<ZmtbCkm zIIZGz9FdU=9Oo;}xm`b!!A4l#&GOivrKMdshO$EZfeo5iAjcpCj4qff$%( z*={~)vvU4knC;QvfBj8@W@Zt{Wd}{sFZNEAcfJn80U7ORM)GyLTu-(N&%&!BrFlRg zHGAwfECVYk$v-%r&d}hD)u%RDk-JN9@uhk@s(GK9sbZ_?(jWgRM49+tRm{{rV+2Ko z-p4_EC?pbpVX$MIT6b*&ot((w=rre@!0RxOpqhvhYOfQI&gP!vC+S20an!Wj`coU= zVUqcER>AeM%L??ebh-GZnId+>JB*{8CAP6FH~CfDL+%#?#9Z1cXd=YeMP1;xyX-s5DU#pqu$A{n z<-&Mdo978(UgNRU6W^rLzQ3*GL{(M%G&p5DJk}2v4oZ*B63m9$gFo24sJN)IVGLA< ztc{XpUFuHpoHCWi3Cm4RPeb^7nc+WnGmr!ok`bql3N5QcU=midS1%x(Q9Myzik)v&bn%#*e+CBGMaj57o|2#gJ_hy4@psC6EC)-H(#6h3u`&T=> z`Nk```H6EgvD7hyMl2%OeHz++Wos*Qi`n?Vx!^1)uH$#jcBp4EfK^QY4B0SGTe{PUqVylqQk+3xM8J>YF#CZ*wWsWoj z5rL(R(o_5n(6j~jioBI4Ib)<_0?b+Sm4wQLMLewH51f-)6cyU|p* z*{q7-MPGVc)YatK(aGX2zwvshLB`L%0m#hHJJ@4e&wa-p4rsecHtbAKG&c7f`3{4N zB4U2&xcqRJ%WUu81IrrYk#D5+-+QR_I^eq%U>_xvIeZ%0p;Vu>-5J4zw_%m*WkUK^ z_LVUj(7`{_!pVO|jnc_#zhwlo)^nr>WuEcUWCc?;JK%a&L{k~yMXFG{+Ntwx4oBig z&Z<#{EaAYO(5f8~ns7Ymwsd8& zxTUnT*USG9Sk&R#F2DFYh+%EW28%GkCb}_rRG^8gAN)6Q8ORZz@Q1~aye&Z>cFCk^+s>QhUuc+9-brdb@k#!LO-}w__xb1coxs5D1KN@JDeuTdVBbvJzTVtjW_OP>3n_guH1N= z@DGQXG>-10S1mnAv^jGSum*2q@kAj^U6A;*^$!40yG!+mEJ+TZEw&ou8dxngT$A#3 zH%Lhb#0b!=`YmvfhK6QyC0ixGdk@y_KRhkdT|>$D#WfSGYP$3>iq6+U2n^r0##8Dv zaaHw(i$w_#5~by?IFG;}XDcLSKun$ih%mX#ps5e{`g?^zmX>GzrQK5-~{0%Nnn&ABaphc=%41Km=jtcMAbNUDH&n{G5!!cWDbV0N!<<4 zk2Exp3uGuDwmc*YA5;BoXWm~BGlf6`Rkk?{VK3HXByvv(RHD^cF;ZW-l_S;@94Paf zb1OZs=vl_#<{(6pqZqCR{UEJ3afEJMG_M9!#Go`@fy!kzx~@*b5p+)-b5n1&P3$j- zo09lUoU(Hx&O#pbZ;zamZ^0;i%XrQToeQHWPMN-9-_|=e!Yv8Fc<|Z{*c%A@6yF7o z3-gm3HI;S%xV?E{fcYpSo#ux)MYPD>oK;|=VT-RmK)BB;4GR+>+gCTVyzUU4@2Vl= z2o`{9vg=-3a-ewkZhSD*Xqq2{aS|c}63I;_y8k`%EOwACNY%CD4^P?s_~qpl-u~Br zFn-R@jd zS2nb5{XO^^iFo=Ae>bu7v0^^DBvEN+{<*4#5u2;jG+Gbjohq`=t;NLffbP}fcJSUR4( zIF=`1g;JDUTrDv^9PV|oR5{pRRYg+F7Q;}S6NRNFyv0`yd+dbI0g3$Jx?I*@dzb>h zow8XCIfDr6NxR{56NH$MQlj2vqQ-SH{{E1n_EB24f&92>kg45+COLdL z;<3dO%HV8bXK#HF&8$o1X9wLX9$Oi=`X;cOuj87I2pDhLr{Wkx zZFLO^IlErSh*GDC<9ZlmT2URB^8DGke|ZcW8AiD@#>1Vk^lA9+@L<5+i@)PIoPI-d zW$a+LIzI8O>y^%W_--S!6|0Nyta#vR-l@FVMp-5`b>c;-aviU9TekIDo*);%+xlB1 zq*(S@9|Ej~+Kh3Y4Bcf8lt%PrTy2^qx9%(_o4TieOL;p(iq;V59u zO6j!?ufy$%nVMem^v3A43uhj~p%gfwX<2l@2{`#QNgAA49b~@SN(mKYdg&fCf>v*T z3&;D^Xn(5+b7<$=d|GamT0E7zou$4@&J+|5pSj&7zI-IjJi?9+-`qW~sl2Uu{`1~( z8Dk4a06qTrSj90dh;LnP@u(ok|M}rE5)WXO6m9d|rtZm`XEdDdY-Z~X9ldt;mv@I1 za8E8C7u3OY(e@I9--oT-)Z6YBHIS>5Kh!qD_vv+~R`(h4W7Bp~5Q z;pU=X8|CcEWpJxtF9$wEETihHk;pCbV25WuVWCrMsrx9L;+OR@LP6$7k_J1-3G*}8 z;4$uy&GXq@uj&cCD6twYL7M76C1Q%0sSeJ!^BDWYy3zA$eW5_AM->93@KpKBG=!6= z)v&0#Yr!=*5|2=!Gv&GER}-WhqgJDnER-1{4Vbo16E6yTeFaSl??p~YPLa%dSEYrk zV{n!O$PyKfviL!~YNmYDMmT=Y^rI-3(XK3Zv*P>hWC30H2GFKD)oX7=S!Od0Ng=BV z`B`O|EXeHF)U)wT5qAqw|GjLVC((4DZx`2v)~6eIZ1?QDrHjJb_7>Fv39_k}X>;@& zM4g~L>t7d(ouDMd$toXX6N%!?&npkT(Qd5lX?k|HhOeVB7w|X#p7k1b0YdR>YS6|{ z?4q4eQug6@_sXG9|IYSX@o87Q9DYOCXmhN-xwq3*kcN_PE4*_;>^$Br?FemO-?rq7 z5;fkZy@9Pf-{KGfu48q-=|ylF*b!NPD3-2WaDTR0v>$-U^$h>iSpBL|=Z>u0b0xTThK~Bsa}tn}ZiGOdwM^;OeMh zL}a!Q(q){DU%=JTH2O}7&6Y0!m2+|qyX90LftfJA#Nh@$j*K54hjpfK#}E-ikf`1qnM$X#W!UqlRTs@(_QL%&eIU$P(!2g!yrPu2&7 z%9PlP_dR!XArFl{Kzj|Xedt^_6bCEi+ITkiWbyZ;Ak*RabFW>Y3~J%!kkB!oNe|e4Y;aNZ8u%*mndBz zW7DC?hJq?5LuE^3?-iqs`FeWol1S%omYQgd-QNz3!8txI7Y>iqRF8LdH&AQh$shYa z>|?9Yig9}Qq9tCTfSa+FC*M&+8jFLNcf3q6&_++>)!RpAk`So0@z#ENZszzEI_y%& zE&Ch4NS)>cf8d}%ChTi$F{sxd?G$9aXStbm`-(yzDYy?@QpH@i7h6v4qtq-*XEw^m zgF0ZE(f?d`V_sIRf!IB4_MGjKNoKiKz9I{h{Tt;ORS~d1QeSspv5rfN7Tpqh0R8i3;3>qc{N-bKn0jZ*;EhtsAmi>I9J!kK; zch5TCv)1#=cR$Zxz+x?Uf8O`?zOL8RM-BvsGyya~{vD09zgbBjNcuOlbz>HoD|6B- zsgnCd1Cu+2c|m6e?3WkNpd|zNPas$N)ZtlR34vxys%(B&lLG=d(DZS{dro$dCutsi zLj?{5{#x9gq|kmmFWlOP%drS=Eb$6dIoCqmfJ=Uso3fR5yR_iP@@CF0sj^b`HCjT+ zgQWc@^tA5@{B&ZyUUxmV{dQFRAo)uVRnt~OGssf7?hOczBjFCYl85Y9n5=3I%vfj?Mt_1!AU0Dc8@>TmZT z!kzL!?i3KiKp*6X3H0IJ*`6Xbg!3NP({nT_Bu@zAJR1j2G1Tmyn(T9DzS1=)R=+NbUK{Bcr%%u3cng%&%Cvz|=k(EQ^QXml|$0dGuP`ydeRGHOzdim?N z?{2>R?HuiYbO$hcBJaglTv3?<6nw3t6Ww;YOe0&lFrtVP={l0Dz!%QgZ!A%OBt=-6 zAdcX<9{5;IA zb|=GO@+aH1z!V^8r};B-k!efaP@TB^Owxt459vAA4)@6m-|ypzKzi;I4J8FvU>CT) zOHTs^V8prC_-9dkE^%LUe)y|8V;(H=gCV09~q-Hau+L-BYn!z0J z4fI#wvzw2{Sx0*_+De!m0vwHr^&CvQxJ3R zo_J?}9gF2HEIsfTUMk%h!Jb!)_8^(gUz}R?QbZ}LzL=(Y+y~(tS!|HCJ`CjF;7Y6c zvgs`&V76cV^yP5H>dp2Y(4U(nlzrts<5{+VC_xy(&-^!jt8xIdyp2C zj6g9ytOl7hxOerY(_gm7y_E8}0`zXm$VBo;&9`8-d)c9*1_4twN)7tJEBaQ=MV*Dt=?4kr(13hF8bTR9O@fj;!JPkF|vE%J9AKF*6xV|Ze)n11q?7aiR(win~u zkMa|uuCPWjE4&W;k{}gaA9)eS-pza;&(2pg!pH>Lxk_o$ zCMqj>GAH?^ssTOT33h6qGDj+la<6f_v)R2!HHPo^l^i+fwQ=fTEI;G*4IJJ!bkN*q zkM|&vaBII$vxQoH9)rb(gm(4NH`jm7yQCM6csF*UHhp?9;0pz|b8XMGcR)D0PW{KLo3ATx z+v);9L?*H$g~F@X5nZQip)}P=n}ykWb2+52GT_-I#-m)gGC#quDK4 zo~O40s$w{&4XG{ZC7jng4MYlX^82eQZOZ!c!!`P%l4~7-=qN6vFNcvZeuM)I2Ide3 zCzTvWej6pZBRaUl?lDn(tH9Y_WSP##L3}kiEYr_&y(Y&xw(L;m86#d^kn6IeKFlk5jBLA-8Oz z!(|Q&k^*!`9iVM=+!jIw=#-l+j&98xEDk;>ud$BO*!gG%Xk!D7h$llOD-u7e9s%yA=7 z(i&0jqaf>HB@ zol_+*xFt(QT}yIipGp0X07dDUG>`cEIsfC@&N%uLvEAB#tC=Y(*Zo7Fr&UB&y&Ol- zWLrlTi7CbSJkfriH({G_BH9Mt$|BWeNOgY4+o8(%SLr7ER~of6`z$^Wcyl|~=Uepq z%GTH<+QogF>;$VOo^3k0%dvh#Yue0f0?yKJFHTBjXuc^qz2bCGd(_%uOq_n|0!vLi zvaJ4xy4D@`F=%;1a*+fpO^tmphm%eZi%{X*vn0@l>Y zn7lRh$*E$ZIaf9@s&G~1J0*1){?<5z$0$EG+LqVUQj2UOE@6+%uT!i#%KSyMCUA_4p@^L=6(1AiYH(hMuAxYL}=7tv<{%R9Lk-_0v^ zWVt~kj{_Ybpv;+9K`SY>N{fP7BYqa90JTNXKB*CMempXUr~d6B`%$sqlf5g$`w+Dr zPD$H)=iuY4i}4iZ#Ai*+nn3(<%V#6^XeG*O*6#B4&i<$k80ej$1+Lc~(;~cuGQVxA zu9kJ%^0YA_39b)jhfG0@6awGs;VKM43v;d^1c98oGsN?E|qS9EjYXJ6ju zt;amlPdrwhxLYveY~bYuAYfaLyi@^LQ@}4*-raPN@{1aDy1X@?0+3Wo$?sg|W4MkQQshv5ibXKPRRH*z+~TbJ*9lkP9HzO2azxKJ0^ zkZ;Kn$jp}l(uhHQH++7FPvrvUEfOV*L+#jQWgq7kWxHei)=}hwiUg=1oTcFx=fzID z-g{vqFP?`gTm-j8W(3~_snq+|8&czXin0`<$-5~f%8IKW1%iQInVl2-4ZR%q(({nS zRj)rebhPgjG}^RhY2=C6wGo0XT8N;@8 za;JRH`q5+&gCH;1-o=B=(MacURJQ)Cg8Hfu6VO>iiY!F~m)1JJ7$pTHvml@PYIBnO zNLb=GpGzmIRQ{1lk{nmHg&oZoL8uM-3IGCC9>{CHg zx2lK`hhQE=VL%wfewR#kLCfsFDrAQv5NUOVa?u~32`OAIpIk|1LjsJIl2zK75(Cpm zmA(~vBng|s?zU%aa0H<^V^pz(i`D3LLVBiNwbY8W9K1FBYj?REQR0EFl{VQrf@k)F zzP6>WE>v`$S^W<=X+X>9{2wD3j9ZbU)8AeCu<3UlvPNtpk~CUZ#?1Gdew0Fli1xor zyZYy*|7z)nO}~q=t(+*LZ3dgZbTKaSpErH&9kA(-U;T5_rwiFwY2A{~r|>mRfS(k4 z?%RVuR$YqHRbHGAXh}I|fBt^Mw}X>R>loCkL1dc$oqwPIkVAp8h9Ljv`EOzW5A)x| z$v9)NW!GLd3%~lq{Qm~b|KzU@r2_l!(rk$wjpYDN#{DNfIH>Fi<>ln6(z7semK+12+j9W9Clw?pe-*$2RHU2*_O)0g}@~e6n$4!PMXjiPEhuOe-+@ z4Pf+-{WL2TpRM3hKhWqr3)xQC-%H;^C<`BMadU>9nEV?dlQfzpxt*&t$7z-z_1r!Ie}}O`lEPFzr1L>o01Lb$-9up@!sbz z0UfOdaMJxfg_}3gni3Fyeol37- zA)ipf!nD2jeUPpPCg4S5^pJZ=Plw=;ck1spslU#P9WF(Bh*aeanVxDm^MpX~1(*xx zc(Gh)b|sY1;RfD>8ysiOxp&TATkcZwF6hp87iF(f;t8yDjvi;L8!aCHcG-pIq zBs>vd6x!uwSlS2j{pQheR7T>;xG(+XSf6YFtRSwSq~%V|nI~PA>9{ab47fWA+c&Og3p-@bl_P zQ^0tKFro9?QITDnx^SzY2|}PLb=i@K%P`k*7k4J>Xcv7)7r}lP2Dw=n2{RK3tYd~| zl5+|arit^dmV>tfv;3NUOW-!v@+M49rcZAU^Oq}JE{&;aLye3z-14@icJ$D>YQ@3&kJz)#T5kC1AzXJ^>l_X7A8(t<3|S?=>g$x4h#F72$Uw5LJT$g zA~eo)VkOXV7M_h}tz$UrV)iQEA26aroWbRWx}TqVKYC`vKq;w0CN)9&whJwd3swg? zrHi3@Xx2zAM4aFhuJW%eIZLN{+h~K-6rDfe_kcb|<_eg|=GOsFbPlcT<{S5O0aFTszOFPhhq{Pr&aIkPD-;j%}*v z+ipg26gvo6Wk;DAs>~}BZM0YoK6zBJ){7AhoL+D$>S@>A10tiC5h|W;kqX`m#r~8m zBLd4^E;jQBQ-grf8UtxT9BEbHQ}6JtYDdIK*-%g$b-VWPvZF25;FO1y>tIes?~Deu z0kBbVUf?5z?aqUy7qS<#A&7v{fvYX=@EjEdO4lLfayS_eA=e8@&Y8&sSI3;~R^W-@ zI4rRe=0wd;nG)@ENs}9yX!Flpz5Mw8LHpPBhS_H`&Hrb_-oF8i)!|=YtXwN`0q4Jg zu}%j-Ms#eDNc}4qtKkQkBAHO+K308PLa|T$Z(yvGiTd|PfC3T|66gw`@vJt*Gl0c+}^d~!0 z>#P<76}=a~diu`I%4R$W35x{xvmUPv>D4NR%_A!Ir1JRbqtvx1SS*fB9MqRp03jy_!+(K?Sh?B zt#}$K#_@ch@n8Z-FZKdJ>r}57NQ>1h0N}InhQOyn3I4bT=L+&7;CgN9`9A@zSy$U{ zgHMH$mT2!$9H0N#UqLGE?RnYLVs){7YK@6GQsqz2OIny^_W{}0GM|I$TWeKpAd)Wba3%yRx3VBEULa4!^`{z zJP^mh1M&W&!Npl%Y;rCFm)4w#PtN!Qel zAQ?t6r~WYhHhxjps}7Qx7}663suk1UM0K$zPo9wDWpW)DVh*;ZA;Q0U&6GZ2m~ zbG127N#-3HMrZGmlVY2jejM$>oHG1(5d^xQIsT=@a;$K6f3^2h9np@&@xh115F?WF zqD8X2JtGtk&ZshMxU%qexw}Q_%?dH$MXSN92$R-@(z3T`c+x#r;n+^W}z1yo={v|_dLe?YWq8XXT8<@MF0f=BY){qZuku^ooKYxs`2Hbix-(=c@(i&VM*_S z&Z3@Q#`IO@QFPX39qNzcZ5rth|Aevr!=tgky}#gp6q{K8-e}gpi%tK6X5CG(5otyT z{u<31GLbAce|AG#jOrUSLOflkZ9<$7kUZ=g@c_|ph~0)xm0a%LxO$mg^?}qnqGfeLcHqt#__+Lj zX<$t{2j{lPqWmt6ThTLnde*K@255-@IA|V@-=_s#FEIdID{}SV2VCpw%`5TnE~!R1 z?f&=yTF_lpr6TZdHuDzEu1Xf=clw5%h~GPLztfu#S{83UX^)6z2VYuVXE4W6)0;U* zCos|BgC|;}{Vp#*2!y4Hgl4$t&eHYMD#KUOgZ61O!r<)g$45PTLe2SjdN>e_SXuMH zD60DY%c!s#K$dMm_VAZix-FGn8MfJb3tBuhSnQHo=h~^8xbuMaWiRqhD%h4TCoCO% zx2`P!2BcPS(;X=GJua0iJzBzfFAO|eRtNY502c+83R~pfK?0ZSDW~_`!aEs&uz&JW ze}UI^cv@iF2S}?b0a(@9iZ3kfG3h0*rKS&r85{fy$*d7Zkyjm?7Ti};?o{Nl&qOzh zv1z#j^Z5zEJ@ZgB2Yg8Qw@$hicga3+uPpy~Gk?uu;KIyYaQ+qTO`gnP-FXw*WND?t`nDufWP+yGZ#85e6oTziVi;$>$cbn3 z9Dl*`Xa1tF+}_{hG>}dbTzfimW`n}qT}?;EwK^MrI_>pFr^wJf_&8%K`%Wz>q#kFx zaeIsX>%+naP8F8MvMl?i~YKd@BvH_;;QE3PHJoX#Wytkm|( z!fA&iGm|hdosAS}FTwsuA6b~baZ}E4B(#Q8DQ#Y9BY{vtoR(yZmy-##J&~cJ+;9W< z!pN$0qLtka+g=HKW)g)-eh_;|uTG!XB@npgkwCb8S4OJa5ef=`t+P7#2ChA5x2Vgs zNMd8S>S6jE4qCVgUFDpxHlFmAx?n;5TvA1(x-CWj#aG*#7$l5cqU8}N6MEY&ZQduF zU($@oQwP)T&SpTNl6+y0A7;^jI|zxJK9&fX3E;HhKH8^eylS1hbJBQh7N%Aea3VjK zXOc!?qpdxJRjQk6(9S1>YU@bG?;y^u-k5w+njiu!p5M z%T%-5xb?A{u;_E&ZG1HgUk2NP}Z{XX=3cCCq4+AmEnJevKp0)%8AG(5;rYW?ZK7O zF^CXOff#+m`|mQj{iBGGBsE!qT7dhVWkn~l*P(lk?VRkb(wD%63_YBgWwHlly)Smq zIH=)=bkVe^Zr0pjN}2#zCbM{}0f^3DPxx$}r!1HSH1ANUY4pz#7*_{BOas&QTslXn zTKD#N8@x^BxjG~mH3Ez$99epF+b;kW8%P3N=zS99nh-tGrSN8^cNNs!H)%sD(yrN> zNf0-hI$6E?_$_GFL=V2QM|S*l;9Uba2>=-;UT{|udG`~L+7St^esK^7?>4;z8G@;u zmwU1^o6Mho`g@~!hGg#&0c*iL_~F| z0BV(Z8%aL(<@3&ZHj!8zSMQgsJU8o&_GO8Jd*^ES-Bnb6)g z_1A%^_U6gHEg?No zSO1yJT07G~wLJ`O3YqI?lL$ZlQc3xKA1HBncq9bG`;pogU13pZm!7?(*|-&P!UQnW zY#0i2ya~;}%FP*Pz)$Rx(wmv_3%a9hQ`}rg#p_IXRzb;s;#pxvB>lmD?D{WD*FW6m zydEBd2o-ZRlW#}n>U2z2KyxeJb36W$TYccm(y-@-l{06(5<~}JHW8101IuooUK!D) znuZQg=NKQ+(~Wq`aFnR$w?^K}APn9R zei#Zt8z)ZklXz96&^A>>a>r_8BHo_otV4ASYFKl~I}}=5M6rOhn2G-}s;GARjxD0! z0l*coU)jW{rT+R|xo$sLK`Ph~wuiw=9paueeAsj$iyC5%l zLVh|}msgjSZ69@|GSaJ9WG!Z4^|E5MfM8pW;+CWi0aYHdeSyy1>e@A<<6c;7SoTKB zv|GL#W3?M`8< z-r(5f#uE&~nj~|4p`6Oe3)B3#+#DbU0p96z$A360XK26y{C^V+{lA^QTKKQ@RWvQM z`!DFLwAkFgPx=2!UwuN#rwku(l>tHJU+JsQ>{7%eOBJ0eJo@3903svM5cb2S-ZP&m zJqUKds{a_Vn(GIw`Vdo+t{?}zIo|}%4Be&yp9Ti}5Ku7ahuU2bU?Tox zPqr6`gJy@;F~s+nz>yCYci28Kp(L<5f(6Kdz11EUGAfwJl&!5f#Z-GFAzsjD6S~aNd0Axn+f7;8h8kevabM~!kMcgmPH2KNRH@WPv(pLE;D^=V<@@PI+q|%a z0LFTFGf;2%_3Ts$9lR-p2HxJ0PfpwiQ7d!qh_Kr$GO0^X4sy$xExentR8RcGc%k5q zs!DtNE=r#LV(MM1mvM?-artgGJxdTh^|NL=ffy;z+=V_A$Z(VJ@SLiP+#T84XU?Sy z24nkD4>9B13gYa7mC-QSY#u91q12gIGMwERZWIligf=-OQ(Ele=B?QZZ2ED{yCQ+0O%KJ}I)K}N zE*YxUP=ZaS#&?+cXbQ(_Ex#q=ObQ8KfGv49K$`|>aBJgU*r02~OXW6O!RtV#Gw=rR1JZ>ni1(%Bcficlp)jY{qO1FaRBjq3 z20NJOg(Aj9bg?R3n>z0(p<4wkohybpflskK3rg~y#rMn@} z4386Qsj$(p%0_HXFr?YeTY4-!%miY!i26a7YXK#%TkJ&fEjNgZ@92>p1dTseMA+%t zgRD*lsuSmqmZ`G)tQtagLP`>Z!hRP|qg8%!jG%Ig!ukyQLT?^an-Wv>!93Kq^b1!U z?teGz|D7qUY3YAOVLg+RPY*FsSO@k0LSaoz7E&URz&kYizo4*2a0EDN5B-ukl?6k( zLa0v=kG1q`D?KMOR_fr4>c@b`S~9-`_=n__fQ~-42IOFkt*9sw+%bDgzL_1;YZX8t zP>l>D`pjxcI|{&`;60G+?W~x$S&tE_lRRa-_|?jl)7NnX&G5nkAk~1Lvl>Eo?X$UT zR-kL=-ur2g&?YM)va@Q-FVCJHW2wfdLH9fSb=GU#uJMmvt~j7M_9v8;)q?*dZE2KW z&!x8|UX!aYjHL$yA-cfxG6%)+>wwqNPY=J0vt=PKYG=huyK+6&CV3Ut)r};yU%Jk( zQk>sSGVxgJwUA4FlJKPGx$@uJe2!`Wk9GHxmpK^@d0 zFyip5no|wdCe*fP&Cu^{r^lypt0jG1=SBaCVugsix2G1^BK-h^jf9+Oo7yunNTB+{ zydE!hmaLKeo|LV%QZ?Zhvoj>li1-1e%`@bk)NfnXXG2jpPy;#e=V3s`c9Y3qe|!o+ z|7pBa4SjQZ?W1`|IY%<5-CZDZ`O50Y$R?t3Feg4>ut7O@lDi~cA!XRsE86>3z7|G) z84v9I4?JhBY%{mFnm=#9XGiz#A9t`Xw1)iLA1S%xr^CR6eO(qqkNQD-doVTtFvI_j zU9Eq7^v#p!9fY}4uLwk22Q~pW0Rd6zNDtQK4;H#|rI1m4>F($)$1Ovl3fA(^h_w+9<$y&65St;qt$pujVgq^N*K zj@LjTDL9A5q9~%|0?ZDy?esPE{|Ngn-VoLKt$Bv z4j~}1D8td-H93;a!0$SqLYs7#Fd$fs_vz4^Th{JlT+>um-QVEaZGg1U{Y{V1A@uIMfzk&$Bdwm- zL{CSR&M1fA6P9nE-Unu`ujPT4$rCVO+=b?G9zi^NZT|Ie(Cyr?=L}}jP&T&j(O_w? z1!zB#H6qcJJf))uno+;}Rrs5{mlR=OpY{nvl2?7=EM`Lz9BD&gyDtji-khwU1zS`S zr}ZlA%(yhT1Dm;Z=LMLM-g+KM#V@rPKM=syIorn3r-3uBrTbHxZzH=Es0a#3B+T5f z*QGrHnRI>?URq8)Bv4a0c@X|y`N7u&u=v+ zNa!L3;l1M%P{JURQNQQ&u|R-moo2exdfeJO$F!sW2?DetJtj~iYF$Y<76K&o#{gF4 zw@{#lR#;h7OST=Q1Y%@XASes~N7LDYc!36;GLL$x9c!U9w}K=ss66`!v?ff84)v5C znCz$Lc#aq(1lTKGW`4L=25k2s0ukODYhxp?N9Y#A#AYP=#O|wR!+i-*xZ?<2{2(!qMCBaUj@!;a>z8R6X zoQpTbq%JoM#+Lee|FpZ-UZrTlZ!9_geCqw1RdM_jDLwDXWJS(TkQL^yx?WjZ_3O2d z(q+VkN$nVRskYxC&*S&H3sZCIp#0gsHx5f=5#awJmpccjB<`Ta?ANoED!M47lpD}Y zbTgF_d}EbHfVYpICla{GVC-!d+lw(Dh^;Q_uE@~86I-2NSBZ;rdcTD4wD?9l%|7sg zb+A?WXhFb}hE0HHRb5V*dDvT)$H`+e$pn^mp4qnx54`{$uJGgKlh(GQDeZ2>(w>sg zUqeNW#Go@>dj7{(j%=iC>rcAkHUAO)?i}kR(3N?3)6M_jw3h1)uBETL@gTD0y5-xt z@#``1BLI2juyyDx`Duaxx*?N#Ss9hR{->7fw9s4iCXv7$LAEZG_lK0 z0frlg7H7!B?q1!LV4zfl0#vIQR=8}(eKxs6z$Nff%;Lq3^bLGVh?9&@T9{(FZCFHU z4ulGGVF$^Ck%&~}bB=Z~j|_|5U?CB%=a^NV!V!$YiX~e#Fkv`qSw$HE;$ZLsP9>L3 ziH;YzT6(h4DT4z!IDy{m^h%7Jqs`+XD6Mp36p7RYu`9Ti+oUNjTDtHHBj9o+MmqQJ zzaEyXC_I`H<79!JEa3Gj=-#B=trzHq-s=e>4-C5k&d6n zle=!!?lJ%Qn}?3~KsZ>JI=!3INM>L_j?obxaR4)0qe|bkXMarMf1$RX8Q$%b_u}yJ zy@v_595oJOxY=JVS^Wz*NrcWZ9D7rsgEXhEZ~rA3Iz0LmRik%aeY$IZT)J+H+d;F( z1uv>!%dDIDDe+<;fXOV_A@B_ zdDqoLj5zHX;HrtDX3rM|ITeI}FBu5p;MZx^EOOb1Usuq?uqrW1i+AupU2Xd>41rfsSTtQ!H4K9aWLF_R11 zbwalHsyu?y7v)qFlI3A{U|*|mXl$}n-V{&*#_`nBe)Wk%Qc{3|aV~tmg2)=-(hg3V zCh;+(KzCwR5Ac5QHY1uGQjLVQe%iV09wNcgyEQGGCDoBEC{l0^Zs`@B@!ZEQTgAKb z9^HzlafAp^Z7_BCU=M|wu};(Ws%wdQqZke&WE%42Non55b zbIz;JejuY{6Dh{h-;h1Oi%WpUbZ};Nj&IXZ6*t-TPGhtsXDTRo1mkkgZj|i;pfU0N z#pgULM^C#FGO{<%VF2N?U`B2;Dx}?*n135TTaEjq(dEz}C|=Icq0Kv%2yw{QANZ{o zUeF`AV+CC2(4WrVtkhO2%5hh6JMiwB)ONSM0Npw{{Utp?WVQyrP{2ai-36ZWLS8h& zvDsfx;JEP=iA%YIe__D4j*rP!#ezL#@QN|xdgrfKV=X%haX9PpD?V4bCDIELhmzi% zjd04DBOCacfI75j$AF)Xv1xeV8YfS;eA~}u8Ny!%%uinr#aDmwBNcRAf%391Je60Bj|6B;RuA|N7>3x3a{ZSdTz~EQ)tLer5p)(di(!OV%ll$&i}{ zZ~vr=JmhzG=j)$T4yZ?dbaoZ92<;(&`hq!ud3JVm2p@;$h71eo9mUBWaovS1M{i_X zUlS9e5ZyV@%pHZdxfWp6l`9mJB?ZlY#0i_{3@Hdm`l5?$fhtUn!`qo~u5y$zqC>VM zs_2CVQ6!&>VbTHQ( z7GR6=hUtBgk?;7gZwJ;WW8cv80C*->s#Q9ZDrkg{LO??TX8X_!OkkZVU^-e7H;0}xOmGHZ*A3KWA|Y9W zf4#@{Zio)ROSC6v^~yWNFD_c9gQP-T%xrmrF<&tp$$6y9B|#cT{BL9n(VN^LVA4!7 z@GO2dn*;bc6lrLV5)*kyUVjO89sK}yy|iDG zN-DMUiLrs?49gvQu}!+X34I7QP&^??Ei!vcR5yi9GMew;>@@<5{{nVpafR7@;19%u z1LO3&!1|8M?r4lp;4#Z*V|>ZQRL~;BdJlGu0btjcIRyK_MicB6Tp3G21Qd6G9xDrv z&ISv3kKkE#V9f|1V&eoWPoQsr#~kLW{O9bwKhXy$u;GC2y2gTur{WWUS-v;?aba}DWqDvt{ygqwiRV0!&kbDjmX$~PNXp3%oEtH}W9m^8L6yXo#ZF)INPB_=>P49+m73JuUPqw zOon%T(hzVr;`KOPNoJ`kgRbxEdKQF3R2s_UOzn~}oU5)cv(58f$){2aB+KuLCkS^z zICD-{XMJgl5;fZa$c9hy1pbBYa|E)M!P2>EY-yv^wi6PVMzVIp9STnd^!ID`{4LV( zo+Cj=LI`RBc?1*>&)_W+7?oc$XB>qPx(W75=AbQ(Tdh8S=d#5zRenp^8>d6obyFOi zq3yaBhb{Gwwz!pLgW4P=;6A$c_+t<<1JM=UcBOPOIs^@O{2G}XIrq)$x`-|%btIZZ z!6c0ye5U1@L2OevGZ!CS#o8|T4vucYrX}NWp2kLeI-R??kE5jVg{*t(t8)ZZNF=+_ z8m})fyQ4!U>7i(81ul<(Ksc8Pp~JdF;KN8|ZYlVV(ba{6GqC6Wd4eW&}2he2x;`tI;L1L8ats4zzed9Oqf6m;}q4ar8Y@?V%=1 zlJU?iD(HKJu$*0j@V*~Ya-MFiMpxq?HgY#R2RlN&TowDd_;~0B`43OtCX=X`rhF2j z5!3m%{HUoG>+B9q;bBlf+9#V29*Q(0B}c?ONQM$8ejKqWdp~-$y^YX8jWk-YclSO;MT{rEcM7NVeXp0K0g>S?MW(O|_2Kyoa!FB==>^H|e$2vl% z?AxdE!+jB^eFl2kvnqBS?v>1sch5-IVMJ({^Ct)ve8$ zw;F|4FZ@>O_k{&`1f1Ui#Kq)T$u|abZs4AjaMpIu*?#Yn_JB|bkyilhSx>yCf<@`k^HQPWU$)~nL6(Zg<2-xtkO>uOVr zJT~W*0WNG75QBf(3YdnGR_rxc6LGk^7YI%+FLR##2Z{r~$yocK8c~f|o~> zv6sS+ITn>VvQrD3J&{oz{Fy)S%0Jr2izZJoF<@r?uzrn2F}vqB!`vtYI!T%d2@5)8 zCawS2n)%}LLIEA-m9Ss55KTx}n(c(1_Cvi3W=o^d(SfEb*fN z?czzr7PpdjkRE_waX6a_OFe2`n&BAd{)@k$&|MeP*g{;CmQH|IC(@!iw*@A|@&W>6 zksiJC&ut-w01zyG!T7*eWJJ?NbV#89wAqRBgqge<91{o@)G#{i81E)cB>mtibUdNm zv-52ks2+T-=4=*2xLJZGM^JD+^^%U@EXTVi3Wd~~yUbgKqP!#=1ZNp3iC{8-@~BwZ zIjd8($zE}KiWdh8v13NVumFOSAX3~!Bi{Ej(Qi?%mXiWHIwecIdkLn81H~vILZ_Sp zKJ;@E#RD%iFf7*0TlOMvstR-n_?$0HOveM27vnyU<$yVaR0s$ZHwF&iC-d&`)k~mc zl6hdWeL1AGNXlBvhLTU)`CHCrLkMy0ZMz{oT{Shyg?Uvn{Tk3`yCU7pLSmz+ z37q}?LKmO>u;{D=+Ocu6r{I4651%$N%jha532U2s_62!If%rG?l!7Jq64VEhPq=UP zEZ`xW*keN)-fYRt`0)WU92~~}p=y5q*iz7t<{mRYN#o>R1s{HAG{gL_6+LjWwssJax|Gl z*L)hVYj=-nKdkNfsvXX-0)*_lRx5wvxcD2zF6$}jF@Aj!FFSm)eI&~OBev>ipZ6Oo zU%*i~6c6iLAX3A7x;B`n*}w3YhOhvEFyJMCUU_^ZHR@f8*;ThK@or;9Ui3qmKhcm8 z(f6E#)0dsQG3+nPd1oW8x0?VFXG9)fCRGwqGZ=FDRw8n9bxc+t2NUQUfC)~^2@+>U|Zvk}{ zt}VZOzk%m*I@A9q(j|X2>3XPMsGz^c!?M_*S;pf~>KY27K5uxuJD}0v>5gK^2Rv*+ zd=l_khj---RR=I*-3pRWLeXUbsOvon`heZb{k1vFJu#_opOs|*>BZW<;?BK~poa#| zLMcbc$r-t`&Fu@#BOJwN1At@Md+Vdw(L+~><6o$JBPPmpIH9YJ|6Yi&>}e}x)%BU{ z-`*Wjt@!-z)I2LJJv{jj*Az+sI5$lq zf%ITk`hMO-e%=;}*ahAgEF97!?sU}Z6IE$U6a`1qpn$GTV2=R!t4zcyA61%DI0T`X zF_VsA7DH)JM#*tU2Jiz78F?{{c~IPFUc|&ki;qDE`11mC5U2%Qmz?(nJgBql?b`i$ zb0d_bH7JeTkS)oshPQ%z9tAbu7f4}pFe2lZlD+2@V!nBT0{DMbdzOh^9-;mzXI{7y z_zLGwB-bJ|I6PFloWF(JMET;Z<*#kJY2?g;ezE$ql3@aiBxqUnmVkia=rV;H5k15W z4!%%h505HQL6s^ziO`yzGW+v1Jmi_!MDZAy?ZeSQjlsyOFht!M0=v?;OyFBfdgpxZ zSQYrkKn@d5!!}th;E+qzDt~%uzJ-{*lwD>vip3P$^Ev-Vvgp4n`IX4<_$%`3l0N!i zi@6o|U&yaR8!BGJ%w=pf|7Y^6O0zT0=3x#hayxTBLQHZV9 zQC=R&!=Gr1-V$$RWoq<(`QAiEDJI7PY*a)EVO}X{Sn2cuw<+FkVytpGkMLvUQ$w1yf0mH zV&A#!Dp2eFN#O(ZdWBuyj{E7L^B~H?Yj$NmC`lmzJq_}lxA|f_xT9Z8iil3vP=X$& zJ@yKk)SDV*4`xz{wgk3r-JuqhpWeBB3m`_dG{kkDIBFPZs&P21Xmgwaso|jBIB?Rc z)cOgnubp6tD0Pzg(=L3JuG7JD3v!CN>yyBK3c`U>0jU3uwPqPAmtEZ!zVhdW%c=|c zSLb5PcF#lOiuLgI-WMR>0k~7nOK<*(dc92hIyH`$*&}E*?3I9>kl@BR?^&7c|C2e= zFQ{2C_HMW}K;KYx@dgkbgq&j7=@LhPs#O3e;u>Rpxk^2Io$?(ZdC_CSH&T!c(DN!H zgN1dzw<3ph=t=voPeRhWBsXfr-lrKzcGvBD%gjs7UA)6|(BwZ*UXNC!X7l%@x9b>N zx*q=KR$mWz*q1vF+s}OZ3mC75n+h-EZ7cjf`wsLG6i$;T$(rs{+wSMO?&EwZ+2e=` zP_xzSgtxzxh*QmcPT7vV&a4w?a1H?QO1_D_lQ+lCyrkdu>y2ehbHo-pk!=0+X7UsQ zlGp_r5)SK|7z%OKPPZGUH|*#>%&)lXd??3P2)l=7cK9Y;-_ZJYo6qPAQy|sLuJ@vSaS-F(nZzit0<$k)zL-ERb~N@TDoFQ{Smby^5H1Y?R6_ z6PbT8m=_`*pb{%pIHMwJa=catB_|iy57P6eryb)yQR5*uN#t2J2KlJ-A61SP#HOjZ zZv|v`4hMf`zM5`Bw{ag&VU$#;e(ha+?aSX3#UE=-J1BH5o#H?k#@2GWR3SqHrCTZ@ z9qPfyJAiWtIKo7d9P?OLYheyGIu0ozrVc7|uSW@VUF)1h1^{*??apCe3#mFIsJ|I4*%cIN!gK0X{7bS}0_0Y+{BHf83^_5)SH-w1R|M z$?UoW-~T!P{XWO{eiAOu{X%)%yU7a* zNk7hyqJ&h>mxcS8h=09S^IKr5k=x064|knng1fp?;k4-@3jk}nj2KYd^!lew+qr>w zjTcCLOCx+&-v_n=8PGTP30ffnu3rNd+w2!Pqc$gf+Il z)omDcPIAhl0QoJ?lO8b#?%Wed0iGX+?JX}w2kr`zOq0B);EaRBvAyH`;mjgi`jBxWzdEm*ONdW9 z_yO+PbUABeJ^R$PjezVSp4mF(5wIm9ZoOe{w0&ZS~^co|6 zcVe`4y#7}3^0M5LK0s6zKn~UUP8Lw~EB<7?A}d+aH*Bw#uRS7ECVAg(tVtN%vgV3ai1 znPZ7KVl7=nY?MQ<=5rlWT60~pG&l-dhr1*&7i`S~pw^tn+wYSDKm^64gaQtTH~S*a zq78Mbzy(9xl_lw#8vIL*eZ3Cguq9IsHlk62@qK$LIFjq7!Wls)qqQbMdq-I7%(8U(h&zx zDNd;`P*ilh-1&wsuiiWNzUKFt|KYs8&-eSB=Xrm2iY75$vqh!0Cu~eXO`hgJj)BXA zc=#v_aE#0Kf?cDqHAp|0WnVe;YQUVkb(@xh^~hr41ToSsAP!a z`mg<5O33{_btME}IDIzin7k^jpW!ZbRN0Q2OrcOY4l?vEx7mR}=|g16$=10|ycKli z*7L-IJOmsjK7fZxs{9P17Ji$=t9!k`-yq*qHXUL&-V z-6AXbC0>8?fSM`c<0UQ7Ys;KZg@fahEqlWH z@10<52Z1>;O>4BPBX1j~wiGQegzgYpd^4U>?^T#6{DJU|%h@hM!UugrCZX_ov7n{aA7V??9&ZWxJnDi<5F+b z=<#h$?>Jb<6C>L{T`%$*{;3&7W|3E&x3Xh_E8joLEqndt#q1(p${qgQ>5)iF2Tn_J z=o+4WM;!p0t$fc4v9`IDn;*aXaPpIvlU&diiOsm4IN3rLTSyUTV0sS ztk80n{iV)Y&ppz1cCt#iiS}%bbQN)_gkNzX5Jagl^Oxzf?T@yt_wrQaFXC0>DP7Gw z5?ZOwA$%GZ`^@D5Mu22Yo0D7%e#M>qP+2trfl%t3qjPsNU>vVf9PHK54f?!r(uX8T z2z)0$tP&<7G?c)nFBoOQIMBNY1q**cF1CO$M@dFgp6JGK*|QM>`IxxSq8ze5H_jB# zvx?qrkV6h3xH-BBycG|j@LQJ0>-DDG6nIsLfws5=Qo&4244GO!k9>MaaoODlGlDcA z%;Ln>Up?5|&w8YeI4SHrs_nnbe~qKX-PU-HSZ_O?buoI-(*g6w)fMkzIXPnV8v>wy zWs#@usPZ2>(^o>EZcS%988EdCgkITiVd;zY4NQYIaSl7gYt%8ToTA{&J< z+hOISOKAWB>^uJEnlA3EO)Kwy{{R4m|DwP0Zw|r+IW4=ER*hk$LH`?sC0j8T?l*&g z|2GKhSSR5UEI?<(5{#Wu1JXfLjwL_+SM-Sw9jB^dlmVzC&AgrsJ~?QUKA;-ychPl9 zCZ*scCa9X1dR`^GqDbvF?v%5CDG1;YzNZH1;2D~$x5+=;V&)ZepK;7)y+fX|OGIY_ z%tL9Q(*mjjYCE<-5zQvOFX`Dj=n^6Y-RuUBqvr8o|5bBaHqf|r`a zHj9%poiud2#xGV1YG1fppB@N&ukkATco-yT$6^rPt{;V=tF#zUjuOGpdzH4Lr+#1P zit+2aAAr)}9Qb!o8Z^WC+$4$|4tnyv(<}q4`h|fl*?bN#up@r>1);+vE*3a`*E1Yo zm<@X_*haGzH7fQWz5x-AzW1c;de9Ts_~OOWBg$3`s7w@mKMNq>3}C_bJjgy$TKI6< z7yw4)x*D9p=!SRGboSl88-dnc_6!DG&<-qENw3}b7Y;pJ5);4-bJC;EJC-QD=x$x@ zSG#?RYf%wteww1{Do|h_-Y_e$Gu(^CYtnJ}56n)_GRD?v&pIf;xIkHMf(e$tXJ89h z>q-6?H4{kz>EPu}2wQUkrwMq#dy!#%|I!?rt6`nM{aYDOf;t^G$KqyA`3s((J+-zl zpflhxOuThz4&{L}1b-{j8%dAm{!nqK^j;VZc4-(&L4f+E z1T(^f@XX29xo&r$cT`D|S%D=d!wkbicid}jUXTo&=kl@+%d5YCgh$L)`{^v#MBd5-fsojl3S_HxS$AkO&Qw>C*)}_V6u4S_w0d8I7hvwE%m^;{b|B%>36jLKURS) zJy|L-Y!mIgNJWaC7FxQt^$ZTdkOxn^{0Bf40_%605`DN|kNpTDhBj=WE@n+E@-;KD z$_wzzUzynU0%;v)10F8an-|r~er94TZ{2g}M+{W{!o+I7ANYMOxcTO~{t)ujmeiQP zeEXm6#IjuJUjLsH`&(J~Cnxsl{!DfZi1+=-PhA2Lc;kApB_5&)1K(LQG=HiX$Hgz; z&Vn80iXd-fREJ*&&jGe=FT2~-nFbME^9;ED{29i&lm*0Rc3{~L%zOw2Lt8rtR$~ti zu_7OV_{V@3o^kuCo<2ETyyX4#laSdFkh4I_!|fi=s>-x@jCOAwWay-V(3wi=k-;|e zieKmo^Y8|$vI2&C7I0ja!-M(2wF+USDtzB16oRQ4=Q{k;k6 zxY_6Ag}@ZT)q8wXi(P66%gX#>=r;75Ruy@PXEuF&W8pX}?$+xa1NlcOq3~_C0XnVs ztNXwM(_ArNCFX1fUwUR1hUGTC)U?@#n_*bv@q>Qk`4md)N*~qIPBRR9vLaXcV`4=t zm|(d#m2C87@A2PEteFOqlk_hsWMA!xUf3d{mfmH|IRP?=`%VO{cR18of7kbl(IuBi z;eefSLtD+8@6&Qdq9~kn2xl9k=52P2O9(<{@G(GW;@U6d?;gN|Cxd4h=khe?9QTpY z|3JA+M4~5_#%=tDhi+n5=(~smmRmq=*gIPrYO4fn%|ml-2z-K2+%Bn%o5FY#xVdI0 ze85V>w*t=wkjs9~>&knUCa}rKZ<_9fiL8+dYb#2u79OBvDDU#>&8v6YTn_JlId-~7 z`VlsSBM}ldbQGVv7bb66&?HSk?7+DUszj&Qt>uGqmzv2Yl}oFXTSl4MF1K2(%LRH=v#q- zNN_}>XA&oK9eKcv#fIl}PaJfYBVzNgF)xh<(M+)G)2v;WV%8!RJe7;=j6;GJC4pAa zrxbBP?3NK1BQJ+IZ^XrZOl1oeSOokOx}6d4P#Z+9jy;Wh#5wJ=zplXHY`jfo2HwF3 zQN>P+DKxIwZ7k`w&l}j9Gf^zFb?;z=i01gluCp^=$(1CCNXrekg|iq0mhBO}gya2D z{vt^{fkUwLVw&JEZAw9&gu{9Tl73{vIBK@ckBQ>q(?^b-EZM-Jl;*LgX(IouCl&@C zNs+mta<6g(1m}R~0cJ6+AR%EB`3Z)rjCMp@Ig%(BYO%v399 zwfd896|hp7>YX&)vrHnQeOhv4t2(8E-ROSeubhqk-9Qb5nG477AGENO+h?-9{2-I+@2jNQv6KDX3Y5-v%akSpXA@D;BABH&$`b3adDP=J?r zG!Ag^?k9jq0476-3Q2`ZQC9;hnvj}0Rf|qm()1=9cq>*#xNo8O#H;x1fR=7_TC;Ao-wu*sGbdu>BK~%R zCEM&aM6btptKxgWl0?h3o0o6g9Os{^vgDw~)`Tr#srsu@oEN8o5HW~OUb22KFXEup z+5@&b61RtBQ3bgmdC%^ZIUu9}N<6%NZI11}11W+d)J@skbwz5c3z-QSf{0^a%~7!Y z1UN(-+?u~&TV7yPxk~tHR4fq*Pcot^L54Ja?OAwhxl49#R(yrshFaD5YG&$jVSZs= zOr6G>i<+CyS#7uiHeUwYF6taPS{!?gy!V1b(k0HZvZI@CXzaXdms%H|a0{ef=AArs zV(Ts4oj1+TRGi**S2g$2)+D+4!QbqDY0=($&%U~*GNlb9cOasB^Uj^G+23w_rXi>9 z;`zM0EB1HT9eUs@YPZXH;CAWC#RCr+R~jx8{Sfhxd+qvF$z!(kk*lnEpX7;q`cuu^ z$Gn@jZe;y2ud3_dufN^OedcniZ)28%n*U;vyyf1t?$Tm~-_c>8`|WK<-?*2K@$WvW zIWw}dv%BNu`=zHpEUp{d@vyH~Hs#en@c7nfUe#no^;GcS)8Eg3UHyFM*~9mBuM{sY z&u+N#)A!1ppyA)h(KjQve#YJWx$WN1?e9LkZU6a8&%cL0{`Fz--|81XrHY@&M}HPg zOnv_I=kYglcmMi%>C4Z`>2F`=eqR1LcWdsa{QEyMb3Z$O{v4S5`Qqo#H?u!K&;6YJ z`SU09r`oc`5#fG3!D1IjE(rnvFz2-Vk~T&sZ;ZqCZb^>E0)v(c0P{NnNZ=>nC_kWl zb8rCAIq;RVi3&=V(ySIP|@6Jqq?BuXbndFs}C_gO9_V0}2*c`t|P%$23fDZSP(G z%C)_)073N038-x(4M(ydPu-&WoM%tP%7sQ`=E;ZRAR6YXq#@skB zqD$wr=e)ar)U7XEZ*RjyXnY{@&9J@KG@LZGj>xhM^>6k=UOTjy@dlH*+T>*%Urpcb zvSh7bMo*Fg@3RDQ#s?pXrh8y&CQNnoitb9&|FL@+#nx1!x!^wJc^*sxL5MA2@xN@7p$OD&bGvthB zja4Qt*)FZLFTr$pMtISEI*iooRF~-T)@J>0Y3EG_2G*RjE1ew!+>bXdOgJnk56b(k z+axW-e(zru74GXH7|`4CJG8syU~(Pv)7zM-&htG&9L8zlZVuyQOO{C%pwNMi-PFZFU6J)@qul8HD)Rx_DQ`hJ_X+y{npjMdN z-)Xh!oI@A4%k5g0F4YA4w3yVvd)a$AYAS2aw%D-}gW(Rm!$PtlrfGQ7JJwQirTH_%Rf|}BGKjzS#H%z;>vfk(3Zc8lId3!Dk5LehSQtH) zE=mzDC1E%cC&*|%o_|QvN>aRP*8atdx01q@YchDbTT=Z@E~J@R=r#HJW4`n?DHx)P z!46zsofBR!tk6uU15M#PXFmC0IVwo^t*$ie5(GHP0=+1g3$+|ACD;TPfq`7*dWSEJ zVxoBpZf3@{GbmDDQXuId9c?1RIvp)GzK_#GXIo8H6Iw@6e+@*yv%w*%$>}_;4HypB zTNiBvLTIPL)I`6N@1;GWxh+KoyxtV-G5}D5!oqx4{31;h&^gdiT3sOer+ZS-S%$={ zgIGjKjKiYoK+lawjVO#cQrHJW2J+^DSq@swIcri)Hf>AaAavxR9Ylh|wsuaSz&+#inB<_S_FC z*ZLY|!7Q_Uq^)&dqnxDUg|B?A>bHpu2o)Un!XwLH@!207)rSTRE z(WeB;z#I;(xMA^b0!AoYKuY|0jT0sH9L#z?c>C-1`aJDR37bP+Jb(W6MpN&l9ee*Q zB$QL*|9wE%t?j6mec9HaF87yZNt^4PgPm#4vb;I^jAyb<1znUoURN z-{h(SkXI+5l4_pq{$s%YM!Y=O0m9l7dUk{LC9ywxw>NHDJ__(;vb}6owxschng1&HCIUsUJb6eHjmgVZ6%s_Uz7Wtue&vKpfmEY!UatK>77Mrtu&odeK$WpIIebLRGHMa#df)4|6s7=kCEm=t* zLZ-sXLl!pmow(RSb8XGtMF6}fZ12XFM#m)%jyK0!Sfzq_)BJ|qHGa;Xu5A-rTwEkW)G<($`jwo=n~d+EzwHCtlAa!p@jjFrp%ITaB00n}pEEbVyI-7V|2yWa~z>Br^m!Br39{DZIBOSeRU5OBWSF z^Hs++c`;|x0^>)DdB*0jcAsx1%@wV+vWU~44}<&UhR4U|L0(~%F=3DD$Mb@R)cUQB< zcIeU(c06++9B)BL3dstck#l}7;?vcHM30U`Y5Binb#wrW2^D`7rv4asyGBd<3bq=D zY{E%l--79DXN2Ht9nT(pQMk8u)HFBmVw_FLv#!-&ua@;*+~gT@{C}$X%1{u@i2w9Q z!!8}yV3Ttcm?!{(#Fldn)h!!T0XIJ80l%og{o(QQpowDu+WYm>g=3eaOvoVkPL=l; zQxa4$J9(j99g4Xroi^6%5-oa z0oXO2-=VV5{7Y*RcAf0aBLQ@M)*u*?4(cT~#`hw}uIfxBw(SCXGf6b>s|{<;o(A%0 zL)KjcwlmBz@jmV>Z1A}b=rzfH`|HL^=yZ}EH&(tO%{m;&onEM^7}AA80N~KMw%fnh zue=zxb4f(Nj>I93H)G+PwU9896U^PywP*Y`DI-%~liKu+jvxw9#RTJh8J2gsl+-v8 z%@2w8-9;H-nJ-v&ryY=^Qql^U523^(fE#6DzR*$et<(2&eTlys(`_d zq%ZhT?)uQ{RU#=*$KXa0i#L-D2wT7Al>A(`{oz#}1F3LZ;NDNlWWeOPj^+j!Dee5A zz@o<{L!u(*EThJ$f+#`w*`txvs%+cxNEeifMKd<(?TKpbJ+;dBzhuDg&(Lv1q)f0e z-B1i_BCC2&J)dO-8Q_w76TXrEM3H_*ipndm*lV&x(mCbT)OXHYitQZLF#0O#W6{0mcd)*8a4OV3E3vFf8Xv$%)OPl zZja-{%@AB7%(6{b*1+-q%n54=G&E@lv`^o(hGbLI*b|h-aZCDpu01NPWr;^Wqp}&$ zI-)zxXh7KM_eySyt2_Ek$jJz*hx{Z1aD$ zOHzQ!fRT_#uasv522ADe$I_trib}CbG*}H}*7MHaF{R5HhRyAq{6g(;Dgku4B8^I% z!n(_(mUiJ4w6HWNWr@zyj}mLM3K%wNw;U?FZ77K;I`&muECx3JyLIB@*xWeF|1VOMq zt|=0stsF5A(?k8)7-Y7BALEAghnMFtWD{wyZ(+YAK5f6AReDHt7lnN1a*fLIc%BoK z9o`h76T!yyi0s0bG!fl@X)RX1*P+HJPEQGD7_;(w^OAMQU$1TDT}|xKY{SV~7$B80 zS4wCj?BBHsHOFUzX?<0?rS<;ie|G(G_s8E?2=$9Xl^27=|Io(&C+X$GZ( z9}aoO9@PVa@Wv4gtekqY``xthjZHT-l>fy`AKJ8G>F*(dN=Z-XKk=WW%du-(|EHvX z@<@1EdH+-nMXq&+ehF&QQX2dA-V;_Qw`E$6WWEAk6MuWHj_Z7|eW-lU6noV0f0eU%KGe0b?>qe6y@0O9V(1Kz}-AGw86cA^u)8 zBt!1LAy3XZ>}K}k@bCRcdLFl$X&UOp9uw)0=N-|ZaBSm_zj<`>7{uBl^V9ZIMl(Pv zYaH?>N&pTs;^+@}X((0<46?^yHw8~83=S_zr!N>VVQOpOCXX|?Urrs7Z&&$k_d~DI z6s3)~hOzckBpo7jKG3G~=eh2WweWl{_@YW@eQF-X*SNmnNRctU$K%7EC}p0bP0^UiawE#&ja)g_9$B@t zw6FH63f)v;8HVUd{c9JoQLLTQC-75uyEY&M%KtRxZx|Pe;)O{t6E~Qvn@#F*zSkJm z3RqIDEcP*aB?&N4W%wNMc~1u6WnpTLO#_wL7X-1+pmVzM4{GgN~05 zjHH)QXjAJJM_3O~gJ!?J$hKRUFW@$3Cj95%6O(K_yFX5{cIZTnC;%MSm*Gw}CE;j! zZGYFpx(+5mG2d{N%1!mcaX6~B#n!FHKl8KS4B{i#Omy4Dt7mhr7A+bA+p-?cKN-e^ zc^iDQ-R?$+5@IJ-febRAbR(VPZ2`MQW*HQ&ZdWuE7istH0g2&83H% z%;w6?O1VM5`&~mZF{V^jAB)1|;ymv!6W5j-n-n&pHfIuJq-hSQxZ~q7`o|QL7^acrtBveKk z9;HZy{uWe9mVqialyGGi%qc^GKcvBnGdvNMW`+#oXn;VRr^G`~F%rVS zA%~~p>%gDTs~6GdFxs$1Bu*Gf*{p>?j&=~4x;He%xzZR0laKOxnn{-4?PiIU1ct&A z^Cu9*;c0EXQw#ATTldf5KKi${w8U~hHAD_}pc3PEEL>asv?&l1fuxhDy9-tfmtoYM za*}b*w*cOFG-}`zzS_>6BFdIj~&=Ox*7fK*~`o7d5|MJ+Z}h&gQb{i zLJG+^BT?3BA~8C<+S*}rmI_%S=S;`n*AiL-m?Ml^#OmT9HX^63zB<>M2M{KskmxS= z({@Dlf;!6Rsf}MW3!2U~x=o_0H2n0f3ROP?oba}sKK<=Zn+lrP7NT3NRQA@z&d;+L zm|SA!fND_c$$Vi%g)>ehg{`LBpn#e?-WKB2kVYC1*N`WVYkbTK`r<%ac25uR2^!sH!W<%2h< zah}l=VxzIx|69@xwdwyeF7tm0`u!aJ_r28Jab0Hd27YFZ2t+_67=T*d(rSL{GGNKw zz5T=mXDXn@ztOHT0w!bMU#xO^=@}WBEdCgzWkisCKQ;IT?pSke)e0aJ20L#$llrCa z;ENmTYp$(1tp{fAyDLpL<@7DrZ|cS#Tl!0s%1$PZ-Jt&l5u)C;&*G&=tw`2(8o-1w zUrkDEed^KH>tf^j;KG3Zr6SWhl0X)*srRJlrJXw>FY40>L8X=5W!qoW#r7IPLi$I^ zwAZlGnG+PBhGb~XW&2Vy2N+5G=b&JX3b0)P3!UFBzxes|#9V6VKgaerN8Kk2#_@`# zN%qc(o~YI;V&(p~WV0_VI7p*q(2%7RJJotZ#fUBoQ-4?XE#J}+$N_n)$#e+(d`qU- z_WSR!=7v2vID$D?Je#En zkX=DGT_&t%z*MjTcST1^mZKzDQHbLezF+?Q?;nT0I60!&xK=si64i!pe=y6sD|ZTl zj;{_gkuw}f_#F8#HsZ-DlCm`BPkx-mVXddk3g(uRQ=KeCysNYS#KmGYJrx=~Ko3q> ztYrh&PpB}fbw<8foRX$JocFM!A;{7wexuZ?lmja}0^G&>%?X;H3QPfF?L#_N7sY1c zlDWMWwO6#&47x5CX(L{WLSFD{pR3b-PAdQ-^G3mp}YzLQT{oakQCwZJU#8zMTBWs2Ts}+_G~69af9*C9oNhR>+^P z`^}EljH$O||23O^8+dh%T>`81wA=(|CIp1JFXyd4b>@T{)>Xv~$0rg~`Sss1P zW=X|sbTX5P0{8=$9PB2i3~Y(XnEeNax6-wDE@4_B0?2Tp@Q%*a<@5wWNa1XS`m<`F zwevvCw^>Wop~{&+R3Q5@0a{P-m*pQW1SFUsLdA*sJD_C4INaPN4>_K=lzYl;Da_NeJVpszl-nkzKA zbLB<-Vq>+73_Y-Yz}H7basS4Zq^iZ?rL?kIFOWKZFkW4r7q_d*{p3(j+KYeN-azEYJDXm?Foqzg{%C|L;sP@UGJh+cs)J0y>A2A!Ch?D>=*K9@g}3 zFFdVNLfJ|+s5}>OaaBX``=}~NzT&OYVpjlwL1dKDaWf??Q1i6sY7QV0l|g2=rAkSP zOUq!G4BwTd$+*fV4;22TeW0(| zrd?pcb{`a6%e4)h{q_O|=#e+`*$$P#4lO3J@13ue^a-g6@zG(W@b4I*d8Scmn(tL- zhZsLT8hTPRC;Rc_928YDulsyc`ST1wPAz(Oy1_A~;?m92)I9x^!RpA1b8*d2%xW54 zx*M-?Vl7Spe({TvOXacjg$#oxeq;YKHFd|IzhDIPoby$U3R?>0AQ1EFOF16oyTg9A zE(zIZg%a?>tx+y=;3;XLs?gBF#RuO-c-2|e)b@Y2*(#WMo#P#40ia}dtWrkXT6uSf zzR`Zr@7)}9zpkvMQ)-T3pgaFv$3fLu2n zlP6K^8%pG0Ctcj}N1jh{j@PHiU2e<7;)v1_voi-AQa>xxYTyTY~DcYdp&!Es@Oxd>` z?%VJ^1_vu@7aNRf5tPb_g|E}|>HFy-pvNnq(}ikt1ybxwEkTT*f1@+Z0&0T_&(}(T zvO)P{uDoh*iWf4p+S1_Jn+CtsiZ)XFnvG`@7c9CnOajtZPM}^iraGx@YydnXs`3si zds?5F7Nbg;NH40;to&rFm83Sy)P&IKiOLw-@xTR0g!!cN&7hL*&lK~ZaG<#`VwgnX zVhB;MzyXsm;QFQ?5&&}9io%UR28+j$FQt34G--09izetoZ5(*`#3VK3oYK&!m#)=N z(s}~6Bn+2uF$Ma7A!Q33k z?wACD8O6s!G2wJOxSR6e&)?1U!1MZ*9ZT~IXkf|gWAa6>`ZWzcMM1wNeB-6A7iiE0 zNz&6{4eRgQo!y+5asQ#(+{l;caDbqcgs%UkqHF8`LAd!e^E?bW+8wr{rHFN-Tud3* zSa{?h$uzuw6LP(H{XUPgjoM=P6B7?c9#?6&hd(X3kL3(ZX{FEI8ASjsl|^6pE?4Ph zyUS6+$Wps;2?dr+TWe)#2hp+ZuNv5_+GW_ z$WXHC8_d+-id&pH2jCtf zD`!(3=UR_*u16h(O!23u0|w*$BNq@S53;|e7Kr`UX(L; zJ>|oDmpZ_EX;%8fLM1z?vCH=2b>!F01|(3wq3CnrRzjz=tg`FMmBC6IOn-2d#e!-L zpi!ZWcvRV@W{C(GQ7_$$(oyPbys|$%f__7({RC7oQuP738uPG7p6ly zNF@NZd01Deq$}lRma(HU48SYB!rMr2vM_tm_L7n|of;Pf`A$vQRFFqSby=NKy3%=5k-G@UDMcxfJ2CCW z`za-acpGSvA5WjB!~)N9efqOp9>?_~s5An@)xN>rM-F!Oi_7@@&1qb{Lj@VU!mF{ zLJ??FEo0rCIo5O8an1E5H+hVd)Q1P2*SKom1Uw(OYi1;^k_5fEdYwkLnw0BJ)c-nT zn5YIKftj1=-q=A13RLvW9}|N1^91b>*O(QczsO%I1oN5@yLevCZj&5AFI@v z^9YrX-_y+B(h)$%sI1mcoG%}!t)BI=rBW8FIvo_S;S5SP! zfLLeTG;9!Bp{h=kuSQ$io$e@|CTGNCnu|jd3V+kT3Mok0;>*+#7$!ubQXggcCOf%Q zqgoyAYqpr!n;ou%4-Z|>F51cjT3lA@$TllWOCjOBz2Eh)P&l>ve3lMP=6!WK5JiQz zMz2pXPCSJmkJ27apQhFoi*yesC3}vrJ${L9V1^Yf70g8MdBv~6Eo(@N@D`myX`6c8mc<5p`n_4*qvVQ-4zR#SyC> z)(#~Mh&T$#3FX2S@Ty!|9pVIN$ z2R{@uRqr>G389j#H8jDxeGk}<)QaL0+}$n)KkgGKtf}+ZQxU``AP(^TN1og7GLN| zLlwpg-~ERL1`@+eLC#Zt-+VTzATOA{GgIYWL-Sp`I)LiGTz%yHmxnn+i8@tQrnUaf z=>ZuKPI+GInt$whd~C0iI}MjhSNyoPWZAvxaclQf-zNbSxaa+bqk-eK>V@r=C&oF; zn&hv*ft2u#6cQiK<2J?By?4rTOp-t(gNdvn28}DVvw9fTU3We1HqCQxl%qpAaQ*3c z8VFAnZ>_sFU1#Swm=c?30!#2shc1mNA?BH~s~4{HQNJjYo*;H~A7!8~!>Zit*KPKS z8Jdm-D?J5avgC!lO(4|6m3`zM>~MnF0ToO5w>u#mcEaW(6RNFwObV6Q)D$# zWC9?0uRr^6b2plZ8;v!EKUz4Mm9f;LQ(rziO$as^L?WYJ`Re}%Oog` ze{NZj8Zt>SyQsOr$I^^OPq%J-8neiuHkBvW8awY=1*lS<;pJn$1!6qlEIae>$4sgZ zCPSz{{BOa3i!6Jhlcd5l;Fg&65L_Rr(iuC4 z^ZI>t<{5yTnWq#89o9Mr%;(&81+O&;)9uhf*hxV-;rIxtZ+`VWWyNNP$CRC$Ky>N2 z=#pu_Hjs!hOiPvR-_OYWSZIV0Ks6PRs9a#!YFiiuhQS0PcCz{3#G)g-U#2-*ljEs; zrTn?1G~8&2Yu@DuED3IG1}IEga$+n1!jGl=^PwUn{mn+b<3^K5fiOU}VDI=1LwkQf zFlD+9P<-)nbD!j~yW6+zvDW~kcd}*4O!?6Td)_q092ulVo;L%WtUUhbZQgsvZbY~0 zT&{u%i-2M@;*5xZsHMgU(_@ zR|==p#thU*HjQ6ep$hS0-mmU8GI-~y1l%W4MN63$yV7db z!v;byCU)9CH;4U5d#7G-to4fiT1psB394}+OysPtV-9|9#8A~MVK9iMGXf643{;zR zW_nd27YoJd3%Umo95t0F(kwr-`SgWT>hi2bGqt<(J-fXc&Saq1p?)ocyzxAbb^wJL zvyB=%QfuyvvOEV9wPF7I-`RA>=Sz1z%pVe1v;%C5MK#`+{7u)#BQ&%8j;^Fdd49qd}pPRnxd=wqFI19q%@& zs;%rE+M=GdK3PBf@GsxJ<(xs2wCzcENH1EwVD$UVg*wBS(HCCR-myYfc*#K^SgOUKW#WcTaEIcKf>2n33fl zOjosvw(?t4ZO){!E;SAW|I^7@KLwk<&Ey0$byiIBEF#jVWz1X$FGv@VRLq$@(eUcl#?iJ zK63qnwJ~3;3eXYJwXK3L-AAhKDVq+LfP43VQ3JZ1S4_*rIyhToSp^OB)`SslIFM z6K7is&^|E=H}=0a1Gz-Ixwv-yue2*qVsacB32idOiMt$d_?>0n5950(=IMYFA2U07 zqY$P**8a|bPW@nqBR&bvDrT!u8O(0~)}P~Wu7pRRK`3@o+{9IURJuM$ZAfL&_fAdS zuR5ZE(_!x6ODe2wVxigW&|K2+VN1m=$4;cUlste7@2SnLUZe;M+{(gM5GTut+ z^)3AGe?#b&xInT2UYiNu?pDe^kehSd;rN6S>Y*Hbv7y~ zY16Kt!()$OAtABr7F>OIRNH(RM!?H(k`9{y?kVB6;bS&n>D1)OW0!|+DlaqcLvnoGlN@)X>9)$Fp_>=}E9!qIfpb@M-XG_@ zd-(CcqW-)?Iz`TC(!K>XiF!G&;`e`h4k_S7|7NY+my64v8e9nrHJG2lUoHnrdbK@6 zHqjzE%Y9~d>`7S``JaFpT5P{KeJO0GUDLYX`krf%;1WBG6r#^vcQfYb2_2=2+iZ<7EB7g_OVE)5CoPdc;$Nz z;iGNA+oh3x^8?FD783)B;d+B9 zewH9GvNg{`%KDLI*FIrOcl>V3Gh1kg%Cp?>McT;Cq+z4BZheB-JddG|<9Y7aEdg+U zd>tk<=ei@Gn4h>Fsa%o*%PX(htEIJ;?%Js#c4TBpY)#Qst$ zj7aZnA>nWfCsq|`aK8rG_m^(_tMSr*PL2uss5`d;#eJ9S5kVVN%4>Z;-TkMo^0Muj z$l`RMnsVK6fhsBsZglDr#u%5Eu^QUWMD(cIlmhJxH5-kl=QjgUzrS+kRX-r~bNH-I zY_3QGit7 zzXTiBL$L#Rpd#Fn^PFm9NXH*o9IO7MVwO@3fc9x6E#|U*s3JDe65MnS60fc7e0|D? zCEbzWCJqP;f3=wktQ43W(gA{Ii^HqtP%|a8QQmEg>v2S{lvo2k*~B8K1w`dM_6Z-~ z2S7{Eiy9zYE>pBZBe8?aqthkUvO<;*yTG4Gs784DqB?LJUsz*?_DfX}0#b(KxaD^= z>KC-|Eu@7!KxPE9aGDs4f#8(5&kJn}%K)MGI?YK+0r7q^Tey0n-5f5ID??ij+%IN) zAjwS(nsI-$k_^w7>?^+kJW_dp1r|fwqt#XuEt&`&u#EW9MPS3E2d}3&>-&6l zoaI7#F@YHR%e_^LwHDA6M97``?8X#{ig>r%*%DyMb9tn~=iRrfgte&g>kY~kh|?^K zPjV(hd+7daA|C6V6Otfbz?U>CS6|se{m^*SP>= zgk#|t&@KM%8?jb=;6O^vqC1ND>dPhxsc_`i(?Kjfe1t*vxo`E90HpDxV-?|YeYaiI zneW4rulA2?7UkQDEC-r3HwfPVMeU;n%A*mg07q@>X$Q5(^p`2WGjBpGvy1&dV~Bp@ z53(&)-|8#xOQu0OkcR?|wfcUmt4kqV%vyPfrtnIy>^P=cVF-k8Pv71DHnoBYfXc!$ zT(#eRU*P{TfguurpOgtyp!lmhU*Ac7`=1H?lMbL)GT4DhL@rDj@7Qu*Pd(Ds3g~4W z{H`IV?dIRRv~k;iM{R*`vj>z%Z63+1Z#Lu&_FOUrj!5P-MJ~F$J-celj?&y!=WW1N z{$1%KLaCu{u5S}Q9__L`H-E{PM{Ibi``7#NH|5uDO&1{hiv2SZL3zJL!itz* zjl@X_Hgduw9m_pL2_^X_neb!}@frLY7UuYcN z-g%FUH@eQ9o*Rn1wj}dsuk{K_cm39-_MniS3ETx$dG2j`+c@rhCb7W=FgEXmXU#5O z&Q;TxUFjfDpj`bNavc4nTw+b@=G3K*_)D)jjFa83QorPEIr@={>$Nof)BW4Gk+5#g zrN*$!Ooqbqge~A=x$Yx_G5qK&ZCu=-u7@?*Hv40na*3;>Ayjph?^z85Ht_9r(phyN zM+5en%(DCU$AxTL{WVwHwU|96kb710`!<(*jYGjG{PeLZ1C(H$Hr&I?5~jFum_+U} z?0c19^=VkSucQn~*2lP&L|{f_OebsofLsoihsho|Ip(cArd(-ixoTHeUFK(VY%Tm? zj-ZtYT23st{ub0;^_V0F8Q8y5Hl}oX;H!OCLYwz=s}@Nauq07KY`if#tG^s!H?vQb zCk>g6zo4rmhs|DD37`nZAs}kfLNL}OO05*bk@bAhsKKlc?Qy*!x5IPS!f1?0WH@E%!0nl z&qs<2(H{s@2C^|&iy;-9(n#p=_eDoEQ~HFkN2bgO1GJS$rS(J~!vh`3IXpo!dswh#oAl%^y~OcQ!EF7TmYpv~O`hZN6ktuvG0KyF0Y5C=c`nIO%1wsoj%qFfVDw43CRtdg0} z_RjAHvTpZ%e|2q-33CbQI;lQ+OBuO^N+rDkZcaPaT`;}+kxuW=Ke-47Ivy0!~|YF}^2s=wAmDbLy}AVsyqvK?SYYSo%O z#;-QTe*%fa->emAXNS=PV~41b`+4EY$c?RVODH+%?z*R2M-zm*?Dnytr4!8C{yED6 zZV#NKf`#WZ_@AW2Yh_6xI@?|5_+RAqRv&)3BlAplX^ELA_jFi&@W1<9t84#yr&=&) zdVE<$o(aWDwd1L8MvsoB)$hb2{!;b(#o!Ko+U4Jy(@0Lwsy-)o0%=Z3+~`JkGc75B zNc1Ldhc~P-{g8oG2=f+|1B}p#daOi|gOX5fOxMVNxrmOt(#iMIhx6vW%XQ87NGln5 z;1Vq(d<`6_(r60xM->%V(&!XVk9;MWET#cGjm8z?p-DYA(Y5UgzvX$O&$xvC^OV?{ z<7X7gH3*OIqrGMnK#c5YNqo@h?Y`fy7f{wZ6FM7Dzt6K>Mk_vwPshiqo*Av(v=oLv z4(A;iN+h8mSmrF(8jSd0>v%o4N+WOi>T5JAC@X$8-%7T!=G@%#CcVs>^8H)wFFud- z%d;K*^w?mbxhb^t?DMhbRDjBT?cMKt{CUy+wpkU`W`4t)Kg?GB8^&oIK$Q*E3gBn& z)>qo?;NCskpKW*MV-WxYGwy2qnnbl;m!>lKJ+pN!Q?7N7V=*CbpAGB2U6a^PS$zKb z-x^3!SnLO2+pyIy%&WpLjanhOCUX-_(>3YE41wbJ-g6D)2p=(gLv zVJbb-6o~v(SHTJ;$Ey8N?q0sH;-*zvV=&H4+7R=@Y7Jkt9B_nij{%~*-|nyLgo@Rc znTTG2Fj`fRP2M7Lhp}FXq|Lm*htIgGrTl zM?ZPL;se+YqCzd7wIzK~(5y@z$gR|p&X9JDkj+f!gqp62;vdXeMOArxWg3TA(0NjC z2L6AL_vU|1o!#F5wRb|;fdD&z%)(9xqlf_+1!X57lZZiV#i1GoTbwH5P*l{N5FpGE z5fM?sAR=l-K}Bmd49ctlskN5cfK;hNMYM_*xu1*nKIi^E_c`C!ea?^PJbwVM{6Mm< zwLa_fc`qQ@qwm0|N201lMpG}pkr8mbHsGVFij*MR&qJ{Qx&SzWJH7-(1y1tQb0>t) z@70s`I^C&hn9jihG_kt#>PcHIF>ojumVDERB0H0^ zp6QLT_fvN;m;@Gms@c3eI`FXb8{GvTkUhtm2#!Kj#D*!|CK+X#B=AGNt)gjBEx)?5 zdlvEI^lrZvMLFV(SdY02H=9wIb?m(4+j@rk`OQD&yXC}ha$Lw5%0P@&jIl#=)2a^- zF#Km!GSD`#{|C$CG{Bedb*^RYlpAAls5UOjd}+rvl*)y+X~unN6B+;& zf>2H~Cb-5y!PqAu?BM|RM6*JUw^^+O6h4x4f^mR{#HbklnpnLcW0hM{DIUwGfIco^ znurdp#6RH-BuVxI5$e9+BIhBV!GE~xyRUcuep;+|I;Op}@LviG?EY0XI)^XHrlSCk z>Q%*bKnFk_%U+O81agEm6wy?y8+%{F>U??jgV`Y#7sF;gJC{bSf3K;S_3p*0<>C{? z;C`UjQ(rJweQMn^lT{w^Ct%00)VmfYdM};b@lEfRxql{lS=+5Bt*Z~bc9#9w9Vdx0 zvI-e`# zUvHc^$_A@>1u3_eW#j?FDRGZkLjLjB+pedSyieLANNpKWb~J4ToA+<EL(ei#W9RM4Qsbu3UcNIw) zyEOddZg){&u;8T!69e;MqSbTB?kaoNVK)-_Y|82&oY9*+EIiG2ZOzYnRGTFQ>oJkk zbAyRaukjwar`kuIfKaAY>mm1JMarY<(!oiTLQ60O;yIXNROfw9wl$ZG-Cd>US%;Cx zx~Ye$-sxU@ljBc&<;PVlO6g9Fe|D}ayAGzzT;jvR-VE%B)CN9+y!zIaceB@LI>u8- zP0ZZq^*6rUnCE$;|zAe3}& zWo>H#n|m(w^w{f0>)t94O{Pb2zF!x%vn3{1*Y%HNv*bnY z0rVY4-~T2gDK31L8N@}HT5we3&c`qgOsUllUvjQlHZxco$xwDB22_bVryOe9=I^BF z>I&9_!>I_MXC#exI+Vrq2Qv{1aYx93+XHYh=J9oK7)@N!!#}n`NZ43~K14DQKtpl)yRlRM`f=4KtM}}O&|_bjE%&2$H$2$(hP9$%J*GB zKU8Zj*_VZ8=o?ByrIRt#4aUQB?A=g4+*eq(jt7u*GvW^&pLv2!f_*lWjAkj92Z#$S zI(>stOpy^w#iePb(m5T_h>=UNZLitbnh7v}0)Q!@g`NlWy1TK`_8#VI?C@6^IzUB} zCkE+%1+@vXIr?J7twT*<-ovf+>=YaUTmo~-uV>2%ne`=6;G*0N%huCE*V@BveIEtd zC;==jB(03f^VwU}lC4SPm8)>HUYc@q^f!mA`t}0bwPL!>t9R`IJ+YXfT5hTnRvhz7 zq)cyhwRYY?`hxMO!u7^<>q-%lr_?Mf@(p1oe{sWV_gJP2LFex5kT3gsJQg@MQ^8gF z0lPE?zNs?eI`9WULk3sh*qKKV0Sq(lii@Wtz>Cs$dK;A~CDLdvyRUG})+KP{@Z&&lu9(#t@so451q<3Elce^&CtrP0Vl1{{C6k zv1N4jmn;>k=E+2-n;6e`h)?>bV_Mi)gurKp!KN4kt$D@EM=e6h~> zh|oGfg|f}G(Ur7W3t5OHPe+4=esVf!Z0q??=}}*&^qyYx?jPx{KP>)L6o9?^=(^5< zIlGzD*{(jDMhiesq>IVCtJ4L&vHE<+u?1i3hEuihC@km!TUj@kz=eLV^Qj)be$5^E zBbHgy&LV zB$OM|tv1~AhMs{=>f7-)lstNebEUKS077Lgy;WM_#d!XylRF)_q%CIuT$D?@t`j=$ zQ0)5IW$~_+RUH0S+0zX#nqPU^(ipT)r@B(Apx@LNI;FrUF|V?``87110{%b>4x zuQ!x1&0RK)eZm-M@>X~`CeZ~Z#R@GID901J!e{MpAkChbIjY^?&KxQv2hWVOhM;}% zy<0(oTL-tihs(0W9r@9@dV3qQ~GV1eQS;1|EL#K%^M<^;_wiZv{pO5*tXdJy~XIry{laI*mb22vv2VX&cd^}|F9hco3X8+!6q^BN?`o|uDA&tKaBg%5SAlm^~s zc}|yhr1xZ(tDmmJ!cQxE^l37|;!7i+Z-ht*m|xg@BX>uYQFn~(xoZQBEzIEgpo(Qm zQ~ABT@kZxv_SM0tvHX}i01(%KvPF6x?X@joCgvyHdiYyeRIAIt_UCRMe|7JyVPOh8 zdq>dfb}F^U?PBQjg(=#q${v0ue7Brhped}oWx##hA!kBVjnwpfB3xY#J+UsdZSJqr z;s>vV^PrNS<=ilUUUaTWjSDlW_{8sV%$?oMFt~e^yCVe+jm>qh-kzKVSA~$_<1EhH z9A-IFmf7M~etty@w=A_K%Wln>17+B$-u%wa9uuY6l{Ho<19Yr!?+zocsP+fj^oa{5oBm z)Y*5&y=V4%mbkt=(k#Hnq;t;xu-7t8Gc6shuMd9R`_*_h6R?C<^A8zBf{CXLzsJltJ(CHDOu|&bc${waA1u#s0;Aq7GRL&CGF%uJ4v>zf>WE?j59GofWeBz+M>mHTNJW z`f45LH%c?4TBI|>tAH(?kQ(ce+Usf+kk$aP3k1*^eC2?Jb7!vEx-gioNMCz@XtZ9D z^GYDyyMiaPDHH*i40VWFack5=#0+lgKa^KLVvA>GI=TR`+5%YLe-{>-5QV3x1xckm zligO?%>AUy{qV2h>wY_@HS`LJ<&I@~-!4pFH6Wk7bpb;XNds9-jZa!_=4}2_kgU?4 zPlsV#LdsT*t>fOn1&qdxt|52eUKDFyvd{To`Ti1`fz(Lqmq7y2M4(SvO!umtDvJY7 z2-2axlZ_r^SxwDoxT*SI5P~mxq%QRM!Dk&mepcUIk=~omPH+>;!3IsFg0`2W| z%JiC&q%b^HY3h@h3&bU62AD}SDOY`9^RVR>L`8%vebmV`FXSM zn#A;sP$AIkAQ|RbB$GVJInWcg{ij&Uis=8eMBQqfoS0@ey7J$%UD}K8w^+QbmoGjO zXWAXp`Y&?@?7Ba0hRyIu{j0o}U$RBrb>Qz2|Mu_wx{5aUtNK9zz)hb6{J=U?OdeRU z_qEz{795hW9d2pCR$r)8p8F@Co)3K2YgS_o%CKV_MAHPGx6O;b$RC8!U8~KF!57cm zV9{!RNy~&g!arGU7wIbNhUhy;i3HLZn(kMc&w`#V{F)F(ch8@lJ-AtNwD;m&!>#JA zz<6S}u5YsY8c1Upi}i)ejjU3we3P>)+~d#tp9jjC?H$`P$`XJIEk6JG*Lg_JC)p7Q zXx|jw_QdWHm4_;c>=QYMU1Lr>OaWA&uP}AMXDa>Fc{T+Y%orWbtKfn^d{=paP*ty= z;LAO*&MSa$H=uQJ6jrqQMxZ;dgJ=n6xy1iWo-Ha;8C$=^?kIxGtbHL;(>JV(N08Y=@);lM{7LxI#Ti3ZwRRmwu3xxnDoj! z^6}8vfq<6WPAWTPeQS;B!=xi8z3niO955zZdMh7BNLr2QeXYIjkwDB_^JKM8y4Rx- zXs$gA>M2(fGrrtwYOpQ)q*WR-y z=M6X3K~lu)91e{yHkt3)*cfryo&e3{;Ns?Z8tL*V~LauzKg5O})^OelcpDUUi))dNu^k-Q98$t#-?GFM;$P zC$)H!J5?{MTpqLn^fC4u=jtGsrLAj(`QnJvaoMdQWpK|t=ZB3YcICB|UJkuX zik#x~JKBaj9IGZ&#^oh(?;e!74AbeB@5#J%bEEj!PvtR{x3=kQ>c8xGc)PV0Fg9!H zbSUR7(9%*Pa0EHQv=mzAn4v+zhSi06?#H%2d~Z8rg8mI>MM8Za^H7^qtNPOL!rm_@ z5Ajrt>j`rse!Chl-eG~2T>d$jo%kx$;mWlOGO(g(XTIs*^u{D}`W3>DzvbbTA%?#o z8pJp^X3KorjTk9dKQR$hrB7(Z^Jz&}ziG2I<6vGTVq2$<@+o^cHa}s>=h5bwR%TyO z_M3#}S5kid4S%IQ+eK_^kIU!|6Y_~~VQig}w_Oke6jzw-?LPK<-STEgN|-;TeP3l^ z(cBWEQ0%)=s^gjpoanjDrd_IIXig~R-yyc$qk%2I5)Hx+NTo4pG$7WgaB0;7OI2n| zCEsu(75FxBbFlje9eJZMSUX^2t7)2PO4qVU##O+D%#0an$umk&?tJ`OcYg;2KB{Q8 z<4xrIQzS4?GK^rr`AEqznNAf4`-X>GyfR1_ok_Ry(ET>5Qod(05NC)fkLCocRg)+O zZ|+{hl@{e{P7q`DTFi;+1y95(Fsx=i6SVBkBVvvBO)x8x;(#;W=DN3Yv2apSV(*CK z4>|a0e(YDqLBF7hb7y!$gulU=rSpmi%iDd^Hs^I#-U>m zioTei`JQ1NB(|k>peqhP6Wdy%0-LzF- zo>DdAPF3E8YiTIm4EEqkZU3GjT^C1HaQGP0+pA=Tj^SEB_Qv_~Sa<5MuSG?csr7R9I6*R^;GgL%yWUR*>N%1Ey%ABlLLDC= z?ZE&e%64vDGc)pjYmjdD{af?io>%-6fv5Y2+d{8@xx@S)4dz_o{NDg`PSW}P5GA_m z%@pDM3-gZU%)yPH%n3br=pc?Vc%iD#NO}B?vH|Y{yl`V{cGBgJ-SicAn?sF#&Ug5E zCYdq>8_Lp(?iAFQCHx{)P9gADZ8K|#3IE;kPTNb@>> z-jf(x?XQyS6V+^B)i-1Q%iM#ig=FHNIEVN=JAa*^#g+>u>b1R}nHToCc^_}6=7BR{ zx{Hsm@gBtHf`8|9s;K&p?i`0lE`LRF* zY)ENvC~XHMaACs=?>Q)QPPB9#7`sP4jcJfWPc~+{V9JNS!oIX(UtXoN>DgCIJVvdk>uPLmn-z^@;vW}pU^;tDqR=Q zQsa7?MuhRvzEUk0cACySfuCKT^q-wp<>u! zLj_6V)b0QLRqLMu&Dq-VPU|--9?gI%!qx~?x653Sd*o81+(P|0iO>O?+eRo7#|zcKr<1d8R{#kDwX6>J-epJB{pglKugM8mXb%-r1Ez zBcyhYzpIZ!v0^vxtH|8fM;d0D#lZxd`mxIX2gke2$A|q}LMhkUFS9t&2{5nb#g{a7 zDeU|YTWl5)l-BjO1%8hUg8rrz%q&tjk7C$Ri0frB)Qupv)95Q&nI^|0v&To(AaD3;8v#SnJOWQ|fpb(IG~1gT(r>#2{Py2{{}9^tEu6UreRG192Nn zF(xEjxm(^Axvk~svo`wo-(Pq1P^4N@Ej9^0t)m{_oKoOaG(;(a=E5AmAhPYez6&s<4D1PZ)PW zI!M?)SG%tGHGIjX0@e%w=sxZWJ|TVRi!s|+f;3DDldt}5>0ue(W;2GT z|Gb?_fl;tQ!&e>abmH_)064ZF4x@Ew3 z!C`vdS-D*cPSWqgT(Hlwqd$5Sn52kNZQ`~-d#2p`u~#Nj|4kVp9f;h(2W&;GzT+|4 zg7`6sRb?CSydNlMp>`%jqkB zYzuYQc+0ggp^*@RIoldu5Tot7u3O$$tQj+2tRIDo7Ck0Z!*tYBL2e8v<16 z1@kI(Kq#eGdTrP$22kzKFWQRxR3@UU8IX!ll9?x$++T<2jnsd3;P(#SYvlQf360s2 zb)CX%eRtHQZyReDpWU#$`|n^*Y#PkDDwFp6~#Bt($@fnJ@KknD7GjxkjdRho= z0y^}*w z$vgDui$fM9Ija2zeEOnHl0koVmd>yd`kB^{x{o~w!JIx1MGYY#=XZqS4ryBh4d&0w z$CSGF#-{x(I8#Lk^<{VV=A<+{@_Ez&d;S1HYwy89i1mrNh~L!9tqOBD^IURkTGGM9 zl=Fk6s*_&o0ny+b3N)*dK@-)T_$IVT?zJ`ft`6XX_+~)GR5^G*hWD%54#r;0?%i-wFL4vj!R$^)~GK4SKKDF19_^ zF!okF?~fJzUw+$OYY0~ithu={GfT#E8d-BwbNM$k&}CR-=1!uYBjd9@+9$^s&3a%B zy7{N&aVPE0YAVOOE)KYNx1AOBWSKrK{R9PtF1D}QLa-z-vugyVI@qlGOlLQTvyIMw z7Ig|fIDg?dLoZkAzyO~}?$NqExzo-``6kOL;^gM+yGy2BGHJz>!6)659#MB)F{NtC z9u5OAHyi|av(vi$P+3x37AMw9BHR^!MO72=bYNK%kG4n=?iITh_0hacS3;CphucCu za~Lq(HWP8{9z4Xf{f2+B%|Bi{vgqw}LqGoRNnZVsD*5!e1;vOp9;s^)# z6{77g{zx-jy(N84S0coA7Vx>4bzlMpd75N1!#2-D*kOT^|4ipxvf$NdFu$_z%K2Tt zO|MYRgZL&UxODIHjX@Jog`W@KPwo}D0T4+7%NAMufM;Tz0^!!A$W8Fm(5fWC;I$zG z85u8(&8{$DDT|OG>ofOd3@P{!&JG zzx#x_UT3pqBBd5%d9k!f3|494UAjZea?7gx150SuV;b$>Cx=Qpg6#KH)`L#^3E~j| z=#+BN{1O1td*nyyd?^9B(MwVwj??!xQ8E{EA5+C_P&7-`ZS?ZoVM`rAeewB-(c|_N zx5M6c-r2j8hiq0B3(Cfn$O;kNtbP}Q(RpE z4CKIyc%qmY2|0{eh9o|Tx4t@5fTDZr1j`T#9i{ZPiD?F-M;4#uj)b64J;V4Wo|^{F zXf>xByj_v@sp=xw znhf~-%F{vB75#G_$WQ5cwy*$<@_inA*fV|#1?W|rPfdf8YdyOM0J$PDgP@$UvOCw# zxU~ri9qO1zr##ifXga4jwLg2|oBKQS_qL~Q(9@bit=x0<-hUM4olfS7p*J%3$FwCXN^-+ z8|TpzYWcC#8ch%vm%1j!b>6=2c(>CwW)GoapC}!^*e6bV;pq^KiSGyggSe^q5R=C7 zdlvWmotVSTgH!D4{s7+Po+YjvPd*Pt)0n2|XV7wPxGQLA0++UqIm@mFi5?`&nG6=~@+ zcAieX96qeP9he4`0+)0C$(^(Mf;$7j<5bn^TTj0q_8G~O?>mat4aVWha zjpbIt7t+CYN;k})g0C`>kut#U!_Mpw8vkGv;*~78K0cI(Z^0$oA}DPE9cSluK)WFa zn~g#ErW-&WlXAl~cv>Dszt?qHXd+b8h$xD6e=O5TUxcs1!E+5T>rw=4Xy%}!stnju<8+0a zJP8H*MC-08#X`hHk@FrEq;9atF2d7HWg1x$JYO~DV?T7u z#oEkfa8Dd47#)%isJi`%W0`ZBfamS6J5|=t({Toik_q58*s9*)x0E!?(FjbAjb%Di zp7WUux-0nf7b;@||L_(#O!Mj#ZOb$Uxxj)4pHp|1l4iA7?gd21d_tIRd$U46IvY=A z9h50LoVb%?S6tM_oNt&?8+5eGQ}c3FfM1 zHiMJqlU=wvsq>t*%=&D-%p>tyk$!WzDC;8otI=${wOZC?~;Ha#k zYfd2mt+QKw_!OsMl6!`)*1(0{1`+LqDTs&-pY4#0^f=F8)rZV#NLbbFo-qLhQZS&( zI&Cs^+Ld9hhvkrjQP;@ba%mv3b+*>e78==wlfPuQIz$3>>+ECxl~S-qIqT)M zmNMVS*=rQ*Rm8(jmaP+>Rq!$a{mh-$eaw%e2ziv?uPkMKk~zj|V_!*(P6CS{Nu z)53hP!DzFN!=x|LmxJ-fyKE23xp}_7jTsp*O;?Wr)N=Gf`29?qe9YQ5*Ar-w&xd?Q z*6)w&%vv_zLl<#^+@Uc!e>~LThmyGl0h1kl>2pr6<$i3>g=!1}(E;BAhEj2pdwG9L zCxmMndL#aru;W9E>76SOuK7B`St*E?Fkw9#CkT%Y*_1j0)O4X-IS|J!$Onu=To|fzdG=b zj1al+rVvBpii{0hT;^FDl4ZPU*e>Q>rWr;dgE;1m22+INft>xA`JnyMy7R^=dQ=L{ zT7CcOA51PYWgaAIjvd7=yfhGyB?}+MX1&T?h`7jGU`fS78(sJR@kl0Ez=0_Ag1xc{ znlU}8BtJKvy>$3KL#ko~VA7QR6D_E4hhi-t=_eD)iA(UeV0_bpi2BZ^LY3irjl;ym zcEVZ&=+U?Bg*F;6Pi(TgaTxP42MA9DB7G%}+RQRqqdZ)2Ef%`bdVG09=;;G(hB_yk zwcE$2a3Ll%5D32bGOg5#CU-aRQw?iK|xTHWHQxB{tb7mkKnJO^f%O`V*sBkI1}!LJ>MCI;NB0AJUe# z^ago}Z+3`iSB23Na5{nzw3U16NaX>^*IVltE555E$J}!GDFVG$?9(g1@A|WPv!Jc+ zU-;Gk@3Q^B7NL2}`I8GJuN{iNT9R^os`lfeZ#8Fz-RFwPbDSRG?2@!! z<99?N<*Id%nxR6i6Gi z39YE*wa;nKO)2NhJLRTG0|^y*Fws*54}{e69_>YUr5QTVW(UGEU!vB${Cm@E%|hU$ zw)RYhQv9P7M8yOXWS*CJ<+h%K?V-QkVS|o}kwPoOK0A+lZDGB0+|0!_0g;$y;jDX! ztxPaq`Rensd*t2lh*d|Jw)*87R1XK$97nvJg!@P+WZX6WDzaF`JzM4t><`}K!fPU$ zN+%Fd3OSlnktO5N2A5Yuz4z=u1fWh^y>8z)3!+>~c|`Tn<6=b4Uarc-Vl^(nf*GB4oE@HX_m zcb@|dvNazc`FZ|Mhtt>MGVRm8;!fJ-YGM&!A4Ei(6xZ%;bSm%BrE(0TXe52h;Pv-E z<>h`19cuXsy{3|m!dUdS(Pn9+k4sC|gYqP9NT$gZ2t;}ryU+XK!?j%hvC<|ww}Z4n z#wfoZP*VG?IE!JyrF&kG57G(g9L>z@$up z923p?(ir~%yF_XCtXHI!0xidR5;>1Wp;J%!3%5Fx3_%Y^mbIueTsWNP6qE^Eh%}q0 zmjthVRi|xB0zf`uu({(FeSgQGMVuHlqD%I1UuBq9MuQneLk4narkU@EnP9-3HpBoX zO6|dQk@#+P<+rOVZ;cWJVFuy> zv+2SSSCG!5}hqL)K z4R;>1@FcJC?lIX;tfk}e3WWe8;I%CodE$x|+C-Jp*%@0~oJ7I!V%R$9RKw>fzQQQ5 zu!rDIDP*gnwiAW%0=+r!Gw|c%Ra2T<3)9AqPc)Lim@p0hC^&KDJgIfUL*?@MJjIft zgd=t_j3rE|!DCc}k+J4k)5MFI^n7o@@z<# zFRA>5aq>fSEwVyMkQNX|88oZG_{VIg9R1Q~T*pJ1VJu!4#!wF~9k?cOXJ2d(ZJ@kzJ`Qh08LXr>2@Q_#rUi-3ceyn^ zelOhDKno3|XvP5~;2#uCGm3%{8$&@{nQYc?Zr6u0iaZ&Pc&5kWrh`lTtr9V8ei}=3 z6C#RQG5}5XDyyZzY9j@TA8)54>qp>?!DEg_+iVOlg@A!A>+igKnC@22u{T_CS@+4n1<3Xm}( z1p-afyho>AmtD438XJT=$mHZ2CY7_-B{v;nGl5o+BxHEY$%hROZyprF%e6*OdPS|G z#vALBD(&=r=Z65@jT8A8j}y4q-?6$ZS;tW^iXYQ=T%TsQAXX>R1@=*7mvuxXuT!y-FRkpbRsMlC_sZ%2c68~*lU!OV&JCX291(ul7d=eNY6ESXW8~Ib>@GE~8L3x5RM1kf0oS73j!%3V#FJyr3ns z%f)(VoQe^=8r}bMT2L~pzR(NS#rxYVInXSLY!}acDhj+|h0_BX#|&Znt$odLy5FVE zT5ZL}Dzvo$Wm(sE>mnwW5Jj>2EALZ)P`d7RN#C9wBqNp*Ad;_bamoT97$1NlP)G~= z&WO$q7xE;at4r_S5t~E>2@uMJ$Cc6YBZZkUkvftE{ec0~y-;tZA1&f$g9 zPsDwj{Ym&83%#6UQ>JZCS|0-)oOQqG6{En~f6Jw1&_;PGMVhwBg3lX^Mvr185LIlk z?64s6o!<7`#b}IB;Y_=~tZ<*RosZhu5ItWA`(1d#$!i_-iC;`j;A9e?p8Vbyvf=W) zx~*alS~&a(*#yh`UEp017_MntY7No`9N~RHOp(s<8WQIfkiz(^{3f$$$Y#1Y+U&t( zVxDImSb7YxKRzl2o6Brj;b>~5p5mU%Yo;732-V(zU!Uu};{Gz!!7M#W=cvn~&B=&S-R{dKxt5~aDr*&xdo+^0hXg}nVP)S#hBAkK2` zuYr{&HbPLn?Tu)|V!<9vNkbD$4Zn8kTPObdSXp0H@NOowdGjW)fv@%50oCfD2|k@| z_Y{FZl(M`uDZpZeBG?AgM#8B^0WjP&@_ut;Q)$cd{gZAxWx%>asPFgt$lZmv9F-I` z^H>l;S&W;U&bIi@t)8>09TN*&PQ#O~&cjOEf*BaWPqQhdBb2V%S=H?TIa;O;=q3t6rGlUU55_6ai#SFwFw z>-)ZW23%rjoHy+O<39}Vm&TA`HPJK8u{b@NSoP&CcE)liQhOUEvoCuRuu3U3TIRz9 z{?T;df*3Z-~R*}`)=$u*96OQD3-0umcLC5_FWEgxKM zcY_3)L;W@lfWoH8&R#)_0Y==N^>OGhszFi@H@W^4R%_cwQ#AlaKz)op(K*BIDyx;O0@gx zkkXrZ$H_Of5F!#?TOB;B!7-g97*JmB@p}R*qi44jXE=+otCf;NLUECj9S`YS%yRSK+ z3YjC^2Jebamh`8Itl?}wE2=85>_*RcnC17(`b=-p=X{dNQB6RjntBBahM0T`DaXPD zrHsi7EZ2)LHtrCM!6zQ{7(%3`dNeJ3$~;v#>{6M$v>!v2nmo^B3>O~OxpcwKp&@uf z#|i5(&m2Dd{sK>r zO%ziz+NvT;3lUcJh;&}LAf7_EmpqD`|3_P33(YRGLgy@d`B$HnB&%tb`k1=8$GQ3p zH_vCdNhnR3KIT+glbChfOC@}J8yNB-)gxhTKhv=qgFcZ@9-*h4Qqg(%R3W_qJB1ZKPY@K0Ixt5*Ns>GGv+*Gb@_oHcU+0~bvnz}}Z- zuhc+iV&Srxr|b^utA(^X;UTq*jgtb5SCFf(<2VCA&fwox7B1|h*Q-%5jm~7CKKwST zoB-iG=S}xlwHU7$P#xEymyF3kh~i{^F3pE%wUCnTduRF_I%7CvEv`8Z>>MXL3usn^ z(0HFes^eU$7P8_L^iYb+q$`@OTz6Eii)aQk=<<_lv_lo>j7#-evm=`^BaC3~E?Fgw ze4~HwNEhPfnD&9JU>XGCE>aS6rHnO?8q~eS*PVt%tCd*1vgZORwA9jghsFuV(;P5M|K1|;7sm;H9$=f z)_qy?)(o?^!JhGHr00-YyOcO2JJ}x>RY8)e9Fx0K18Nrp2rNo3NO@B5896mfgLTj!-E-~pbk-UHDJO01M@&C;LO$HUD zpWJLZe?LC;5weroyNABlb)_+>mdYjOYxKqJU%HDq7UXYXTljVqpPqjH7@$krR1T9f zc&yM1dO-#rK9sRgn=?Ul`Y{b<+s|_e#Wp0givA4cr7n*_E@kM2u;47Q-;r5w|nZ@jxk+VXysZo zs|-3Akd3L5)w6E61WpH3>eucrgNGemdKNsm1<)c6lngaV8)uy@8BPb%6DNbk-R?&> zpLg@9%%lMzohEB8eZJ(^nI|)xdoPV=eJ$b(Zvkcrtb#SE5Gn**S|DE2tUtS{E=f3M zQLxDk9xz(ADT|X3MGftEQv0T}<#JtI=OMX&OK`M#5ryioh|ER1pO~Q}(Sg<9FbzcAP#MIpV#Vn$Qf4Uk_7U6SeB`@9w=V0g3 zHj-LB=^F*imbBw$4t4c^FbQ>`v}?4Qk^r1pNdZg0z`lnBj30J#olcRuvuicCQ8KXA_Dyq^zS96$+Z$VDU%STdHF6Hu0v~V`PmwtPs3~rG;FK&bJ(g|uSb5A>KM~& zn}7CY;RM|p!aPF_ErLV>{Pw%bfcLdU0`PS5JshKxZn(>yuuJiovyWd67?p5!=!y9L zq`nIXPM|InYKd=Uiu}KnsQt8f%M^U$zEK(~$3*+jM3d2ICxCizHgMWL5V z#cAY%h&C~2Qfd+>qNI82iL>xfTqT}{olyWfRqUMagMR`@Em=yN-5Ag^DS^b6>dF9^ z-7-lUTVFZ~y|8@h%dA&M>k{aCcWRiSqF7*9T?tl!EZ@=>Y`Cz!*4Dv9+JK>wNaqT+ zGT-bH>>^b{Tsath7;rN;SwH|=OlBGk3=paPt*n{z;h6fMnN8jINa z%XOlJTntqgnSI|N3E+u}N(mWLMhn}2%@(1{QSQ70!NI8#fNFx>K5h+X2EoL}SgVN( z0e)X>WD{woVJsa(=$MkRt+a+@^+~GCDKvRP5sae$^{(&#E&k?%9oU8uQWQ?!GI38h zo)U8^!@ot}>K*>3(j#T;5Yr{DT<~;2b%?Jeur&h4d?3+HE1N48z;=klXnhdt_K-BX z6;4I`$=}r6B>%iYanEYo-}#$!EYxs}uI(-=Mn&X_aDF~Rs zBQ_a;(FnP44UNP0IFL1!dI27hTl4+ZU!h+}12446MhQ~y{)W@p2Lmp(9JK%`6;78L zYU4VCSDyJpPM84bjD1}?o@KWJQ&7u~_8p`^-D=BoP8+a#mF?j(&$Ll=noRsBjx$cD zsniZwaUy2DGF+K}&-`jKREL&82^mZ?5f?b0%a8)?ji=8#r2&V~_G8|()m!7X&yrnF6y9CDk^9z+-bCtcr!DxU#i7pZrxWSxjUm2GhnfJJsVOyOmX zy`Bz}Ox*h?*+Dei3R99N_SOKA)ULdwvYuxLlt8bP5@rvTR#kRt(^-B>Z`Hck&W=Jd zj3N$Duwd4f33Z;=4pacTp?=~zl&q~_=*KN}^Lx?Os;^^0Z}ZX2nYC-@OyhG^!tOT% zMlUl_^9V;K;@nu@%y1iU`{T`}qP0_R8q>HfAjUnCWEIF4dp~b1`8ntPXcd~RUty5A z=4!!c(Bn1B16I8mrY6!pbBN)CPa-gFng|+sq3p;K?bd44`Vd*c^baM$i-rPELq6Pa z59w}H(Ku!ZGZYhjIbFKO#8M5eLN%7!n|iBqN#q(o<#TB5}ukuR|< zYt<=o8beMS8_SO2Q6L-`a$*y|vv zNRy(-)vAy#US-NHB!I)%E5Zk&oQ54PFT#Zk)U1u8*Fw=WL+NqbsxdH@6K2?E3EOa< zdq~rwNdW>njyZgE(?zN^?Cn2VIl7)_pd#@h+7Gl%t`%3J%TQy5yaiCyB1uFn5H-=A z*1TI3+_Wg*=12i9{&mq(D9|2lT<&Jd0Y;e6=;&QK@4g7oYLgFD+rs#CpD3-e zkP|X6vq+*BWj#iHan*6j{?TNxJVEXLAxyE>N`kODR3Vsi74=`6k^kR7ZbmHl56I1- z4pq1BhUiaq#_*9aL-Q6SDZHTm6XwAS?8f%+wM+tpaIn^L!2pO|YQh)_>}6YBp=kIT zP4Z7tbl0PxXhIp_xo}0gV_j|}l zD3Xa|rqr!WIsgZ(Jy8}v$2;lP4_##&WJwy-1c*Cw9}bLjcQ*{ZUTgUvsde4qX-0(E zOsi2~oB++Ap0W)adfjd6qRN&{nY&ai{;MtBqf8>u#1yVvfA31$f1_IoI?!wFldYn1|-!m>BbXaT^{) zTY-_3&EdvDcb*9=Dd<-5^Q}SH+;wDc;zsD1oip`eV>X8cP3YaB?Gg$^PLPshMw9od zus!tIjdq?uiP#o2T5WZ>qTWhL_;s&x7FB(>j^fqSj-PAVaHfdP{Ve1RoOM}q8B+)& zb@)}{8vu=8<&DSO4qC0?x7!{YeBt9*%}UckIP#94gIB~%gN8zfl{7Y{QCZ|Y(#!t! zz#;*qn`rt)R@i0;R^~>YF{T?}R+PY8`Q|sjk?K)+^OBt0`?bbSsjk-09f@WGq6}v` z4ICWybE<8tM391-Y0&15YL!`A^)SX$Dl4yl7zq4&pPdeme_Q(U&7x*tIlv zf^sy-5YyCY^|eND)v~`OMzvTRAKNbHO910m`I6Ly=u|EQTTU%+Wxl<$yEKK)Rg!=a zlON!U0~90ELo|8DfkEk7OHO7jB2o4}$3T`2ZmMsWghb(=8PlPGsfnGt5zvgc<1}`R zIGYCD5xz2)nS@l!`437bPAoMDCBCAECUCX+6yAtfxa{U2_s8TR^a>z}8v%3$Whln* z8lMdB+{4G0z;wp;(>&WtAf1;&h6b#Z>tc9%_=BZcTZk&JxFa~ZkitV@M4Qg0Bl3*H zSQHJy@;s{rLIVpxIVpDGyZHdw)-vxEAV<%v=)+esHf3Icza9vjxB9zNzc( z@edxnf4#-|U&Gt%%|eic@WjeL@irMn^fm6N`TP^&Lmys$9vb!29iu60zomr&`TPxL zMLZ&2*W7)Hf6+3dDZxJtQd%gUBEdae;OWV~c$@Tp<82Dw zOb5N*&Cm)>w}QJ$53L;&72XdM8(6zQC(lJ@Zk0ZJy`Z7(-#$ z%+)tlTfmseAb5?PnYdkbzLn0>{w5(8vwZ{RzBKPmLU=iFt?7vOXii6Zl^c{qK2M1XI-v_pg{EKdl%wJQul{_^=Meb=ZxMAlq>-XROzI!^yWN7c$_QtZrU%FrL~Uw! z#1*H;WtZhxtyqd|#N#gBIhH8YnR|7aM1_7Y{1K) zV>Mi=(PBlRW2971fJnG0A_5|6f{IAJ#5=awhKm&t5Ll`fT?*(}>)0tMTI^D09=bcb zJNw$#Yxd{ae<82roF|{>`+a{Li#OK+eE9~L;wJ~^orTSVhKt`xa!P*v>{mW8~Eb6~LXHp*^Xp73^LW8hL2 zTBREQ&b_J~^;QW1!D)cV9hNzs2_ySGE4nqdM2;Y=N7=1YN28%;69Ktha|Kl;q&u@o zraLb-M=0|!;7+}#tHw|TB;*~GF=4r~Qn!%`CMQ!Z@SL)~@aD(xxq6i|ci(dz;?&@F z3r3rnZ3>_J^um!x98RV9@?xJ08B%A6BzOE^%V?*5JzS)YD6fb$k@{9d5DdWTKout-TjLt z7!a}>809l3P>A5fY3a^qK#YKu1o2KwrB!ymAFt)82(?(PUba#AKn#bZCiWJlMAM_x z-51WLx?Z%o7f3SW;gN_##;g}t3qRdVjO;f62v!5qz%lNTH@oAk(F)Q{*+hM=lj1XA zas6l$8{Qag){j8dd6n(4jL&%_&sYGwJkptWl$>H}dpUuP+wKfL9whVxu|EPqHp%x^qOJ9O{eMC!BXKa-~@hYHesh|~>xhE~4zz=_PrNpX8NWft+0 z-Oor$Mw~Kq^|DG$6(ieyL0g}WcrDq1n2IS5NLQ?S9>XeKZ!lq3#1Ble=~fs*e6J-Y zGTp9C^>YJq@OJk19tN9ioIX5J3gZY^NtE(0CHC%wHawmd8P_Ix?7uSEeR}M*UD=bI z-;U74KEXbfnNg7QE}K^VH;A*pG}f~?qxLT3gZZCSnHgY}T}Xc!&<53o(m{oOQOq8S zkMulz;`8w^ojl&{8}>l;s3yAH4^d%97L6sE$`3w1)tq>|UgTh9H|L~8ag+fCx0;c$ zE&pY3_8q(F*B#HSNl3wM(`KghfR=LT!`l0^X+55%`)~H2h!YVTrDJ<~itT^hofX6H zI8_QG+2w=_(qRwBv-~&VNi}XDgWdbZaOY=KL7c{^DBuTXeJR@x8ZrODERP8-z$f8! zVsrdN6VOluV7{5jduTz zbMl^n=!?l+Hm2rFXIz{ji;xigHG+jv534vkDsz(@KoA^bdZ6BWY?)sITMWpFKZgW= zAcY2}pz(Qk@qKp+taCfCzG2tgL!?Q*#Q!_jr@osmK#Z*Shq-cFq* zWAfU>ubdkpu*|(|QXB*~J57{#Prd&leOUnqDfU!)ETpjQZWzCtW$6q{%{XuXZO(@K zOA~YC+iNtP)+DU_sYgL%is3tip+h5Uq1CIDEl}!8n3WCrxu1~Q!NAEutU#EeCI8A& z$|WKk%()9mHosSPx>Wz{JdlE-s#H$ z08-LI9(UoOmTvRQ!O3!e7UtYMSSlKs*uPG3+a<6KjYMSx#3CDiQTerWe|!0MIO61l zgQX7}_G??yU1XeSVG0iPZoIWhKHw`5Mr58hXB75vY9D~SXRupd;AICGPFa+U(PTRQk%yC_SaV+7(orG@?VTK8pDJMDg0FL2$u z8tR;Cz*Nd%$Vcp_sHvm)Z#t(xY1*E6xGZAUWaj}xZ1$)79Y={?+u-!oUPB}Hp+3Ky zTIksf5UQ#|zxMcZ7lhvCh04&Rxl~)X=fy`?K%Em{h?Y)zkHRsWu)0Q!=KCq?s!5Tv zGI~DLLPw%?CGpPO697kylW-+s+(!1}i{JT5$j>uzGFNOzGG1R(LgOa=FAgxWQtnekCs~Su|3U~DDkonq?xE3b{B-^G| zGYdqox<&1IIYucB(D%t^2Id)`-!9w2rVhJ3&Nx^Ptd^U&nFE(Nb#(#kG3yQjCjXe1Z&@W1^CsjByqEPD77vi|5H6 z_~(5ncAM*hVEU3LDFw?)Q~PcwZd;*A_gSRzOsATv!35cEL7uaR-E`TzQ=wZw2SAX$ zJK9$|wIC)|2bk=Ro z@k|aN-$N4m0vl739|fkrGryGFKXo)fdOk}MQ|K;Ay(8=p21A~>lZ`Q7BzrGkI6h(i zadFyN1dv)(hkT?1Xisr8^zm<`(_`eKMhfA@6CK@6wc&nuIXo&7jf>7vo!~;~B(K$i=_0}OO(h19& zVDp{!(JAqv#IOq~x{s}`VjJy3C;;0`DmkV$cy${jBgRr&zSd{HNvrz>KYIbG;}Q}=R1 zZh#*uMt4k)T~2jwZIy?4OJF=>6_Gi0$NORWcg5p1Ij;;%QW(K~$=0TgxBZVniH8+r z;XPadNM<%$cn#324Z7vTG%IPpT1u5yYo4Vy#GHxcun^gLtaJL#DK%WGDzZ7}@`=vNRz7 zl4F^=19zbNHVr%pBUZ?LNntU54s!aM&IUkN8MaQhGi$HLc*UD2u~lsd(uHyM!rYmS z+g+?U>9-V(_qx0pY*EJsZrUB6*nl{d;rWQ)gF{WCf}L(noqpd#3wn%0r5YXRuBoMI zVcFGnBr-Q2$El{l3R7CU7aFvD&5Lnc(G1n@90%CsG#u#{#Rh5!R9O=aMvva*!ZyMm z7!${5UbmiMPa4Vmulcd?kDa$>uypeX;`H$h_Gy>2#v29H{4PNh8J?{tjX>m^fud%z zD#O9KZssZ6K`Za7QiF{KO%(akdlK!~!j;0~SQH0G&y73yDoD;uHtyY(6A(qWI8IxJ z;*xXhqAfx)YaQK#h7p2rIb8wX3tYcaypxVoo=sX;yJg#spIRAcD?cDY)qpgxnu5pH zXFpA_-j3aKZ!ju|hUMImhXpRJ160~t`KN9bI@*T18(pbN-WAP3EsJe!@L>8(i}fBO zYRa9cx0h@C&TU!*1-IO{SB$pjHF3*EhU%DC|6x}1{}u5ZoPQY@Uu#dE`L*8P9sU5G z9b?~EBDA6@flh7}I7;Ki#RHKg-%esMGl+MG7eQ*DFV@FVc1XZ7kkMJ`NQiiDFL2Eb zntu;mGI@NGw{w3H^6RU5KFrY%M7*eEHBafHAyDQihHZHfe($tQ_&UH)o2~G36{|0uRA5nbaD+q`z zGLaV>cPM=~LT_F=*m(At=tR?C^V&5@Y+B3xtINv$>SxSJ*AG9Jlu0^huS;mi^1+Y3 z7?_2_Yo)8!xv#!IFAfbi#rM@sMg;wI>)o2jUVkwhe41A~ZO+t#N+D_Yifh*3Z)&Ga z>)Q2U7U8>RX|MYZ_rh~7UzI9$eQ zBXs{V*0H7f%fbt()p-pie#b)lD#84F;8E6Bwmr9oTDW=yUH_aoC#~*Nw6Q=HsLG)K$6Ez{8Kl}A&IQ9qUDKX5dy^8rEx=jSjR`?V%g%31FYi{Y%p&9;;UGjvd z-@=%kK*=$3hG*;XiQQ@(n$CQr~XRfSr+suR2fXN zXFh$%@Z$W%{$Kdn^m(Q;FBwTpm_d3c%Egtiab0UEU}g*9#Mra_P!jiD1(txXmN?>hJ3n+g~25A zkPH}s#t<{>(VgH*mD^`D0l<2C0A7?3&KmUrTQ0>XYw{WKsHsLR*-xUwtqjd+Z%ReLU)LYVc(!oLOmNez~odIY2~UHGidNYYQZ<(P4Dw=9z!4-gVz z(2%y$QN{+ut4Y=QJ~of+pHz)d&EW9*GZ(RRK)NB q0dLykKnVS}dYM^MwiWK*y;Tq0`=6W}ZJu*`G&1t`db2GG7XKBrf1gtT diff --git a/collects/macro-debugger/info.rkt b/collects/macro-debugger/info.rkt index 707bf67915..8af28138a0 100644 --- a/collects/macro-debugger/info.rkt +++ b/collects/macro-debugger/info.rkt @@ -2,4 +2,5 @@ (define drracket-tools '(["tool.rkt"])) (define drracket-tool-names '("Macro Stepper")) +(define drracket-tool-icons (list '("macro-stepper-32x32.png" "icons"))) (define scribblings '(("macro-debugger.scrbl" () (tool-library)))) diff --git a/collects/macro-debugger/view/stepper.rkt b/collects/macro-debugger/view/stepper.rkt index f35c65c9f1..c9e156e2ee 100644 --- a/collects/macro-debugger/view/stepper.rkt +++ b/collects/macro-debugger/view/stepper.rkt @@ -15,10 +15,33 @@ "gui-util.rkt" "../syntax-browser/util.rkt" unstable/gui/notify + images/compile-time + images/gui + (for-syntax racket/base + images/icons/arrow images/icons/control images/logos + images/icons/style) (only-in mzscheme [#%top-interaction mz-top-interaction])) (provide macro-stepper-widget% macro-stepper-widget/process-mixin) +;; Compiled-in assets (button icons) + +(define navigate-up-icon + (compiled-bitmap (up-arrow-icon syntax-icon-color (toolbar-icon-height)))) +(define navigate-to-start-icon + (compiled-bitmap (search-backward-icon syntax-icon-color (toolbar-icon-height)))) +(define navigate-previous-icon + (compiled-bitmap (step-back-icon syntax-icon-color (toolbar-icon-height)))) +(define navigate-next-icon + (compiled-bitmap (step-icon syntax-icon-color (toolbar-icon-height)))) +(define navigate-to-end-icon + (compiled-bitmap (search-forward-icon syntax-icon-color (toolbar-icon-height)))) +(define navigate-down-icon + (compiled-bitmap (down-arrow-icon syntax-icon-color (toolbar-icon-height)))) + +(define small-logo (compiled-bitmap (macro-stepper-logo 32))) +(define large-logo (compiled-bitmap (macro-stepper-logo))) + ;; Macro Stepper ;; macro-stepper-widget% @@ -112,9 +135,14 @@ (new vertical-panel% (parent superarea) (enabled #f))) - (define supernavigator + (define top-panel (new horizontal-panel% (parent area) + (horiz-margin 5) + (stretchable-height #f))) + (define supernavigator + (new horizontal-panel% + (parent top-panel) (stretchable-height #f) (alignment '(center center)))) (define navigator @@ -130,7 +158,25 @@ (stretchable-height #f) (alignment '(left center)) (style '(deleted)))) - + + (define about-dialog + (new logo-about-dialog% + (label "About the Macro Stepper") + (parent frame) + (bitmap large-logo) + (messages '("The Macro Stepper is formalized and proved correct in\n" + "\n" + " Ryan Culpepper and Matthias Felleisen\n" + " Debugging Hygienic Macros\n" + " Science of Computer Programming, July 2010\n")))) + + (define logo-canvas + (new (class bitmap-canvas% + (super-new (parent top-panel) (bitmap small-logo)) + (define/override (on-event evt) + (when (eq? (send evt get-event-type) 'left-up) + (send about-dialog show #t)))))) + (define/i sbview sb:syntax-browser<%> (new stepper-syntax-widget% (parent area) @@ -179,22 +225,22 @@ (lambda (_) (update/preserve-view))) (define nav:up - (new button% (label "Previous term") (parent navigator) + (new button% (label (list navigate-up-icon "Previous term" 'left)) (parent navigator) (callback (lambda (b e) (navigate-up))))) (define nav:start - (new button% (label "<-- Start") (parent navigator) + (new button% (label (list navigate-to-start-icon "Start" 'left)) (parent navigator) (callback (lambda (b e) (navigate-to-start))))) (define nav:previous - (new button% (label "<- Step") (parent navigator) + (new button% (label (list navigate-previous-icon "Step" 'left)) (parent navigator) (callback (lambda (b e) (navigate-previous))))) (define nav:next - (new button% (label "Step ->") (parent navigator) + (new button% (label (list navigate-next-icon "Step" 'right)) (parent navigator) (callback (lambda (b e) (navigate-next))))) (define nav:end - (new button% (label "End -->") (parent navigator) + (new button% (label (list navigate-to-end-icon "End" 'right)) (parent navigator) (callback (lambda (b e) (navigate-to-end))))) (define nav:down - (new button% (label "Next term") (parent navigator) + (new button% (label (list navigate-down-icon "Next term" 'right)) (parent navigator) (callback (lambda (b e) (navigate-down))))) (define nav:text diff --git a/collects/stepper/drracket-button.rkt b/collects/stepper/drracket-button.rkt index 0cc450fe04..cd1866fb2d 100644 --- a/collects/stepper/drracket-button.rkt +++ b/collects/stepper/drracket-button.rkt @@ -7,5 +7,5 @@ (define stepper-drracket-button (list (string-constant stepper-button-label) - x:foot-img/horizontal + x:step-img (λ (drs-frame) (send drs-frame stepper-button-callback)))) diff --git a/collects/stepper/info.rkt b/collects/stepper/info.rkt index 81668d6d12..f56ebf5feb 100644 --- a/collects/stepper/info.rkt +++ b/collects/stepper/info.rkt @@ -4,6 +4,6 @@ (define drracket-tool-names (list "The Stepper")) -(define drracket-tool-icons (list '("foot-up.png" "icons"))) +(define drracket-tool-icons (list '("stepper-32x32.png" "icons"))) (define scribblings '(("scribblings/stepper.scrbl"))) diff --git a/collects/stepper/private/mred-extensions.rkt b/collects/stepper/private/mred-extensions.rkt index ddeb5e03c4..a547b840d5 100644 --- a/collects/stepper/private/mred-extensions.rkt +++ b/collects/stepper/private/mred-extensions.rkt @@ -5,11 +5,12 @@ (prefix-in f: framework) mzlib/pretty #;"testing-shared.rkt" - "shared.rkt") + "shared.rkt" + images/compile-time + (for-syntax images/icons/control images/icons/style)) (provide - foot-img/horizontal - foot-img/vertical + step-img stepper-canvas% stepper-text% snip? @@ -516,14 +517,8 @@ (strip-regular stx)) -;; the bitmap to use in a horizontal toolbar: -(define foot-img/horizontal (make-object bitmap% (build-path (collection-path - "icons") "foot.png") 'png/mask)) - -;; the bitmap to use in a vertical toolbar: -(define foot-img/vertical (make-object bitmap% (build-path (collection-path - "icons") "foot-up.png") 'png/mask)) - +;; the bitmap to use in a horizontal or vertical toolbar: +(define step-img (compiled-bitmap (step-icon run-icon-color (toolbar-icon-height)))) ;; testing code diff --git a/collects/stepper/private/view-controller.rkt b/collects/stepper/private/view-controller.rkt index 2a91ac4aff..8c258cccdc 100644 --- a/collects/stepper/private/view-controller.rkt +++ b/collects/stepper/private/view-controller.rkt @@ -14,7 +14,10 @@ (prefix-in x: "mred-extensions.rkt") "shared.rkt" "model-settings.rkt" - "xml-sig.rkt") + "xml-sig.rkt" + images/compile-time + images/gui + (for-syntax racket/base images/icons/control images/icons/style images/logos)) (import drracket:tool^ xml^ stepper-frame^) @@ -214,20 +217,50 @@ ;; GUI ELEMENTS: (define s-frame (make-object stepper-frame% drracket-tab)) + + (define top-panel + (new horizontal-panel% [parent (send s-frame get-area-container)] [horiz-margin 5] + ;[style '(border)] ; for layout testing only + [stretchable-width #t] + [stretchable-height #f])) + (define button-panel - (make-object horizontal-panel% (send s-frame get-area-container))) - (define (add-button name fun) - (new button% - [label name] - [parent button-panel] - [callback (lambda (_1 _2) (fun))] - [enabled #f])) - (define (add-choice-box name fun) - (new choice% [label name] - [choices (map first pulldown-choices)] - [parent button-panel] - [callback fun] - [enabled #f])) + (new horizontal-panel% [parent top-panel] [alignment '(center top)] + ;[style '(border)] ; for layout testing only + [stretchable-width #t] + [stretchable-height #f])) + + (define about-dialog + (new logo-about-dialog% + [label "About the Stepper"] + [parent s-frame] + [bitmap (compiled-bitmap (stepper-logo))] + [messages '("The Algebraic Stepper is formalized and proved correct in\n" + "\n" + " John Clements, Matthew Flatt, Matthias Felleisen\n" + " Modeling an Algebraic Stepper\n" + " European Symposium on Programming, 2001\n")])) + + (define logo-canvas + (new (class bitmap-canvas% + (super-new [parent top-panel] [bitmap (compiled-bitmap (stepper-logo 32))]) + (define/override (on-event evt) + (when (eq? (send evt get-event-type) 'left-up) + (send about-dialog show #t)))))) + + (define prev-img (compiled-bitmap (step-back-icon run-icon-color (toolbar-icon-height)))) + (define previous-button (new button% + [label (list prev-img (string-constant stepper-previous) 'left)] + [parent button-panel] + [callback (λ (_1 _2) (previous))] + [enabled #f])) + + (define next-img (compiled-bitmap (step-icon run-icon-color (toolbar-icon-height)))) + (define next-button (new button% + [label (list next-img (string-constant stepper-next) 'right)] + [parent button-panel] + [callback (λ (_1 _2) (next))] + [enabled #f])) (define pulldown-choices `((,(string-constant stepper-jump-to-beginning) ,jump-to-beginning) @@ -236,10 +269,12 @@ (,(string-constant stepper-jump-to-next-application) ,jump-to-next-application) (,(string-constant stepper-jump-to-previous-application) ,jump-to-prior-application))) - (define previous-button (add-button (string-constant stepper-previous) previous)) - (define next-button (add-button (string-constant stepper-next) next)) - (define jump-button (add-choice-box (string-constant stepper-jump) jump-to)) - + (define jump-button (new choice% + [label (string-constant stepper-jump)] + [choices (map first pulldown-choices)] + [parent button-panel] + [callback jump-to] + [enabled #f])) (define canvas (make-object x:stepper-canvas% (send s-frame get-area-container))) @@ -252,6 +287,7 @@ (new editor-canvas% [parent button-panel] [editor status-text] + [stretchable-width #f] [style '(transparent no-border no-hscroll no-vscroll)] ;; some way to get the height of a line of text? [min-width 100])) @@ -332,8 +368,6 @@ ;; CONFIGURE GUI ELEMENTS (send s-frame set-printing-proc print-current-view) - (send button-panel stretchable-width #f) - (send button-panel stretchable-height #f) (send canvas stretchable-height #t) (send (send s-frame edit-menu:get-undo-item) enable #f) (send (send s-frame edit-menu:get-redo-item) enable #f) diff --git a/collects/stepper/stepper-tool.rkt b/collects/stepper/stepper-tool.rkt index 369bb6294d..85c0b3bcb8 100644 --- a/collects/stepper/stepper-tool.rkt +++ b/collects/stepper/stepper-tool.rkt @@ -182,8 +182,7 @@ (new switchable-button% [parent stepper-button-parent-panel] [label (string-constant stepper-button-label)] - [bitmap x:foot-img/horizontal] - [alternate-bitmap x:foot-img/vertical] + [bitmap x:step-img] [callback (lambda (dont-care) (send (get-current-tab) stepper-button-callback))])) diff --git a/collects/string-constants/private/danish-string-constants.rkt b/collects/string-constants/private/danish-string-constants.rkt index 342eb03c7d..e9db75e5a3 100644 --- a/collects/string-constants/private/danish-string-constants.rkt +++ b/collects/string-constants/private/danish-string-constants.rkt @@ -1125,10 +1125,10 @@ please adhere to these guidelines: (stepper-language-level-message "Sprogniveauet er sat til \"~a\". Indtil videre virker stepperen kun for sprogniveauerne fra \"~a\" til \"~a\".") (stepper-button-label "Step") - (stepper-previous-application "|< Funktionskald") - (stepper-previous "< Step") - (stepper-next "Step >") - (stepper-next-application "Funktionskald >|") + (stepper-previous-application "Funktionskald") + (stepper-previous "Step") + (stepper-next "Step") + (stepper-next-application "Funktionskald") (stepper-jump-to-beginning "Hjem") (debug-tool-button-name "Debug") diff --git a/collects/string-constants/private/english-string-constants.rkt b/collects/string-constants/private/english-string-constants.rkt index e908cd8d94..50d7194fd5 100644 --- a/collects/string-constants/private/english-string-constants.rkt +++ b/collects/string-constants/private/english-string-constants.rkt @@ -1348,8 +1348,8 @@ please adhere to these guidelines: (stepper-language-level-message "The stepper does not work for language \"~a\".") (stepper-button-label "Step") - (stepper-previous "< Step") - (stepper-next "Step >") + (stepper-previous "Step") + (stepper-next "Step") (stepper-jump "Jump...") (stepper-jump-to-beginning "to beginning") (stepper-jump-to-end "to end") diff --git a/collects/string-constants/private/french-string-constants.rkt b/collects/string-constants/private/french-string-constants.rkt index e9a5f745d1..0f9508de1b 100644 --- a/collects/string-constants/private/french-string-constants.rkt +++ b/collects/string-constants/private/french-string-constants.rkt @@ -1348,8 +1348,8 @@ (stepper-language-level-message "Le Pas à Pas n'est pas disponible pour le langage \"~a\".") (stepper-button-label "Pas") - (stepper-previous "< Pas") - (stepper-next "Pas >") + (stepper-previous "Pas") + (stepper-next "Pas") (stepper-jump "Sauter...") (stepper-jump-to-beginning "au début") (stepper-jump-to-end "à la fin") diff --git a/collects/string-constants/private/german-string-constants.rkt b/collects/string-constants/private/german-string-constants.rkt index ba9718e301..2a78808fae 100644 --- a/collects/string-constants/private/german-string-constants.rkt +++ b/collects/string-constants/private/german-string-constants.rkt @@ -1250,8 +1250,8 @@ "Der Stepper unterstützt die Sprachebene \"~a\" nicht.") (stepper-button-label "Stepper") - (stepper-previous "< Schritt") - (stepper-next "Schritt >") + (stepper-previous "Schritt") + (stepper-next "Schritt") (stepper-jump "Springen...") (stepper-jump-to-beginning "an den Anfang") (stepper-jump-to-end "ans Ende") diff --git a/collects/string-constants/private/japanese-string-constants.rkt b/collects/string-constants/private/japanese-string-constants.rkt index 8712add4f4..881b3e5786 100644 --- a/collects/string-constants/private/japanese-string-constants.rkt +++ b/collects/string-constants/private/japanese-string-constants.rkt @@ -1240,10 +1240,10 @@ please adhere to these guidelines: (stepper-name "ステッパ") (stepper-language-level-message "ステッパは \"~a\" 言語に対しては動作しません") (stepper-button-label "ステップ") - (stepper-previous-application "|< アプリケーション") - (stepper-previous "< ステップ") - (stepper-next "ステップ >") - (stepper-next-application "アプリケーション >|") + (stepper-previous-application "アプリケーション") + (stepper-previous "ステップ") + (stepper-next "ステップ") + (stepper-next-application "アプリケーション") (stepper-jump-to-beginning "ホーム") (stepper-jump-to-end "終端まで") diff --git a/collects/string-constants/private/korean-string-constants.rkt b/collects/string-constants/private/korean-string-constants.rkt index ba06c65c25..4b58fda0ac 100644 --- a/collects/string-constants/private/korean-string-constants.rkt +++ b/collects/string-constants/private/korean-string-constants.rkt @@ -1187,8 +1187,8 @@ (stepper-language-level-message "한 단계씩 실행은 \"~a\" 언어에서 지원하지 않습니다.") (stepper-button-label "한 단계씩 실행") - (stepper-previous "< 이전단계") - (stepper-next "다음단계 >") + (stepper-previous "이전단계") + (stepper-next "다음단계") (stepper-jump "건너뛰기...") (stepper-jump-to-beginning "처음으로") (stepper-jump-to-end "끝으로") diff --git a/collects/string-constants/private/portuguese-string-constants.rkt b/collects/string-constants/private/portuguese-string-constants.rkt index e6a6a46826..ee5f1bb4f6 100644 --- a/collects/string-constants/private/portuguese-string-constants.rkt +++ b/collects/string-constants/private/portuguese-string-constants.rkt @@ -1064,11 +1064,11 @@ please adhere to these guidelines: (stepper-language-level-message "The language level is set to \"~a\". Currently, the stepper works only for the \"~a\" through the \"~a\" language levels.") (stepper-button-label "Step") - (stepper-previous-application "|< Application") - (stepper-previous "< Step") - (stepper-next "Step >") + (stepper-previous-application "Application") + (stepper-previous "Step") + (stepper-next "Step") (stepper-jump-to-beginning "Home") - (stepper-next-application "Application >|") + (stepper-next-application "Application") (dialog-back "Back") diff --git a/collects/string-constants/private/russian-string-constants.rkt b/collects/string-constants/private/russian-string-constants.rkt index 5301f5cbe8..7a815c1aa2 100644 --- a/collects/string-constants/private/russian-string-constants.rkt +++ b/collects/string-constants/private/russian-string-constants.rkt @@ -1252,10 +1252,10 @@ please adhere to these guidelines: (stepper-language-level-message "Пошаговое выполнение не работает для языка \"~a\".") (stepper-button-label "Шаг") - (stepper-previous-application "|< Программа") - (stepper-previous "< Шаг") - (stepper-next "Шаг >") - (stepper-next-application "Программа >|") + (stepper-previous-application "Программа") + (stepper-previous "Шаг") + (stepper-next "Шаг") + (stepper-next-application "Программа") (stepper-jump "Перейти...") ;; this one is changed. action? (stepper-out-of-steps "Вычисления завершены ранее, чем достигнут искомый шаг.") (stepper-no-such-step/title "Шаг не найден") diff --git a/collects/string-constants/private/simplified-chinese-string-constants.rkt b/collects/string-constants/private/simplified-chinese-string-constants.rkt index f81b9244ce..1777adae93 100644 --- a/collects/string-constants/private/simplified-chinese-string-constants.rkt +++ b/collects/string-constants/private/simplified-chinese-string-constants.rkt @@ -1145,10 +1145,10 @@ (stepper-name "单步执行器") (stepper-language-level-message "单步执行不支持语言“~a”。") (stepper-button-label "单步执行") - (stepper-previous-application "|< 调用") - (stepper-previous "< 上一步") - (stepper-next "下一步 >") - (stepper-next-application "调用 >|") + (stepper-previous-application "调用") + (stepper-previous "上一步") + (stepper-next "下一步") + (stepper-next-application "调用") (stepper-jump-to-beginning "源程序") (stepper-jump-to-end "最终运行结果") diff --git a/collects/string-constants/private/spanish-string-constants.rkt b/collects/string-constants/private/spanish-string-constants.rkt index 088117114f..5d7c953035 100644 --- a/collects/string-constants/private/spanish-string-constants.rkt +++ b/collects/string-constants/private/spanish-string-constants.rkt @@ -975,8 +975,10 @@ (stepper-language-level-message "El nivel del lenguaje es \"~a\". Actualmente el Stepper funciona para los niveles \"~a\" al \"~a\".") (stepper-button-label "Paso") - (stepper-previous-application "|< Aplicación") - (stepper-previous "< Paso") + (stepper-previous-application "Aplicación") + (stepper-previous "Paso") + (stepper-next "Paso") + (stepper-next-application "Aplicación") (stepper-jump-to-beginning "Hogar") (dialog-back "Atrás") diff --git a/collects/string-constants/private/traditional-chinese-string-constants.rkt b/collects/string-constants/private/traditional-chinese-string-constants.rkt index ebb4b2db12..a3f20d3a65 100644 --- a/collects/string-constants/private/traditional-chinese-string-constants.rkt +++ b/collects/string-constants/private/traditional-chinese-string-constants.rkt @@ -1142,10 +1142,10 @@ (stepper-name "单步执行器") (stepper-language-level-message "单步执行不支持语言“~a”。") (stepper-button-label "单步执行") - (stepper-previous-application "|< 调用") - (stepper-previous "< 上一步") - (stepper-next "下一步 >") - (stepper-next-application "调用 >|") + (stepper-previous-application "调用") + (stepper-previous "上一步") + (stepper-next "下一步") + (stepper-next-application "调用") (stepper-jump-to-beginning "源程序") (stepper-jump-to-end "最终运行结果") diff --git a/collects/string-constants/private/ukrainian-string-constants.rkt b/collects/string-constants/private/ukrainian-string-constants.rkt index 2bd2247caf..3df2ce191f 100644 --- a/collects/string-constants/private/ukrainian-string-constants.rkt +++ b/collects/string-constants/private/ukrainian-string-constants.rkt @@ -1252,10 +1252,10 @@ please adhere to these guidelines: (stepper-language-level-message "Покрокове виконання не працює для мови \"~a\".") (stepper-button-label "Крок") - (stepper-previous-application "|< Програма") - (stepper-previous "< Крок") - (stepper-next "Крок >") - (stepper-next-application "Програма >|") + (stepper-previous-application "Програма") + (stepper-previous "Крок") + (stepper-next "Крок") + (stepper-next-application "Програма") (stepper-jump "Перейти...") ;; this one is changed. action? (stepper-out-of-steps "Обчислення завершено раніше, ніж досягнуто шуканий крок.") (stepper-no-such-step/title "Крок не знайдено")