ggthemes/0000755000176200001440000000000014561541612012062 5ustar liggesusersggthemes/NAMESPACE0000644000176200001440000001130014561061663013277 0ustar liggesusers# Generated by roxygen2: do not edit by hand export(GeomRangeFrame) export(GeomTufteboxplot) export(StatFivenumber) export(bank_slopes) export(calc_pal) export(calc_shape_pal) export(canva_pal) export(circlefill_shape_pal) export(cleveland_shape_pal) export(colorblind_pal) export(economist_pal) export(excel_new_pal) export(excel_pal) export(extended_range_breaks) export(extended_range_breaks_) export(few_pal) export(few_shape_pal) export(fivethirtyeight_pal) export(gdocs_pal) export(geom_rangeframe) export(geom_tufteboxplot) export(hc_pal) export(palette_pander) export(ptol_pal) export(scale_color_calc) export(scale_color_canva) export(scale_color_colorblind) export(scale_color_continuous_tableau) export(scale_color_economist) export(scale_color_excel) export(scale_color_excel_new) export(scale_color_few) export(scale_color_fivethirtyeight) export(scale_color_gdocs) export(scale_color_gradient2_tableau) export(scale_color_gradient_tableau) export(scale_color_hc) export(scale_color_pander) export(scale_color_ptol) export(scale_color_solarized) export(scale_color_stata) export(scale_color_tableau) export(scale_color_wsj) export(scale_colour_calc) export(scale_colour_canva) export(scale_colour_colorblind) export(scale_colour_economist) export(scale_colour_excel) export(scale_colour_excel_new) export(scale_colour_few) export(scale_colour_fivethirtyeight) export(scale_colour_gdocs) export(scale_colour_gradient2_tableau) export(scale_colour_gradient_tableau) export(scale_colour_hc) export(scale_colour_pander) export(scale_colour_ptol) export(scale_colour_solarized) export(scale_colour_stata) export(scale_colour_tableau) export(scale_colour_wsj) export(scale_fill_calc) export(scale_fill_canva) export(scale_fill_colorblind) export(scale_fill_continuous_tableau) export(scale_fill_economist) export(scale_fill_excel) export(scale_fill_excel_new) export(scale_fill_few) export(scale_fill_fivethirtyeight) export(scale_fill_gdocs) export(scale_fill_gradient2_tableau) export(scale_fill_gradient_tableau) export(scale_fill_hc) export(scale_fill_pander) export(scale_fill_ptol) export(scale_fill_solarized) export(scale_fill_stata) export(scale_fill_tableau) export(scale_fill_wsj) export(scale_linetype_stata) export(scale_shape_calc) export(scale_shape_circlefill) export(scale_shape_cleveland) export(scale_shape_few) export(scale_shape_stata) export(scale_shape_tableau) export(scale_shape_tremmel) export(show_linetypes) export(show_shapes) export(smart_digits) export(smart_digits_format) export(solarized_pal) export(stat_fivenumber) export(stata_linetype_pal) export(stata_pal) export(stata_shape_pal) export(tableau_color_pal) export(tableau_div_gradient_pal) export(tableau_gradient_pal) export(tableau_seq_gradient_pal) export(tableau_shape_pal) export(theme_base) export(theme_calc) export(theme_clean) export(theme_economist) export(theme_economist_white) export(theme_excel) export(theme_excel_new) export(theme_few) export(theme_fivethirtyeight) export(theme_foundation) export(theme_gdocs) export(theme_hc) export(theme_igray) export(theme_map) export(theme_pander) export(theme_par) export(theme_solarized) export(theme_solarized_2) export(theme_solid) export(theme_stata) export(theme_tufte) export(theme_wsj) export(tremmel_shape_pal) export(wsj_pal) importFrom(ggplot2,"%+replace%") importFrom(ggplot2,Geom) importFrom(ggplot2,GeomBoxplot) importFrom(ggplot2,GeomPoint) importFrom(ggplot2,GeomSegment) importFrom(ggplot2,aes) importFrom(ggplot2,continuous_scale) importFrom(ggplot2,discrete_scale) importFrom(ggplot2,draw_key_path) importFrom(ggplot2,draw_key_pointrange) importFrom(ggplot2,element_blank) importFrom(ggplot2,element_line) importFrom(ggplot2,element_rect) importFrom(ggplot2,element_text) importFrom(ggplot2,ggplot) importFrom(ggplot2,ggproto) importFrom(ggplot2,ggproto_parent) importFrom(ggplot2,layer) importFrom(ggplot2,margin) importFrom(ggplot2,rel) importFrom(ggplot2,remove_missing) importFrom(ggplot2,resolution) importFrom(ggplot2,theme) importFrom(ggplot2,theme_bw) importFrom(ggplot2,theme_gray) importFrom(ggplot2,theme_grey) importFrom(graphics,abline) importFrom(graphics,axis) importFrom(graphics,par) importFrom(graphics,plot) importFrom(graphics,points) importFrom(graphics,text) importFrom(grid,gList) importFrom(grid,gTree) importFrom(grid,gpar) importFrom(grid,grobName) importFrom(grid,grobTree) importFrom(grid,segmentsGrob) importFrom(grid,unit) importFrom(lifecycle,deprecate_soft) importFrom(methods,as) importFrom(methods,hasArg) importFrom(purrr,map) importFrom(purrr,map_dfr) importFrom(scales,alpha) importFrom(scales,div_gradient_pal) importFrom(scales,manual_pal) importFrom(scales,seq_gradient_pal) importFrom(stringr,str_c) importFrom(stringr,str_replace) importFrom(tibble,as_tibble) importFrom(tibble,deframe) ggthemes/data/0000755000176200001440000000000014561250635012775 5ustar liggesusersggthemes/data/ggthemes_data.rda0000644000176200001440000003131714561250635016266 0ustar liggesusersBZh91AY&SY#5P{_P~8=} eq$}} `Yv*E!{R}^2: *jhkAHs:s|Ƿn{{:=M{U{W o{Bxw(B >uЁѡ4Ɉie4diѐ4hѣ@4 4 lMA "L44H4 fz@hbdFLɠ @4""hhL%=O6i6 42@@h"R"44Q@z 4hhiF=FA ѣ@hhhѠD"h ➀&ySț҇=56D44`D 1 ` B-Pi FQ@];U(]z^HBAL9z"SȨ^TBJ@jZ@QT* TTkYR!Y4Pb#Kh(D/3.N156C^fovڊQ^#GU:ѓt@1_miQ1FꎏaR1/]0U1K2yhxX.B sV>5y#ω>x {JNxlC%X@>Ðm >m\ 7o/$xq`a;,Ϡ)-<K, ^nG-3Lߎf*8 u.m5E6)f$뚾zw:EfFI.݉XXQY<^yc~fAȿ(9T]6[ݒ5g-ڲD\hZ]__vSO}* CD LBQ>{xx Ruވh,pZ>vE khxݟ5ݒk1"սO..6@.N:l+UP{ߗG2B(DiPR+ܖt43?>}MgxbbOK9"TxXǖUj]tXRtZa]wKdÓ0B o7P d`+!;b؆s@^0¤oPSHIA9Zt-w,ivg^-G7St=ưPT{s$Kl}{.<20m r=F|ƴ1y9|)lnIfcqOeڦZKWW✞I>'V?契=_x|l?1" ["gw ǂmp@v3u&7]2sL׽lc+ 7Xqqam=@,j*5jxpY׼EEn;w^n>F*4Vq8a Bi~lˡl7h6OoԟFBlm;PCV90 %5gJʆf1`| 7*m!E Y(UMfs.W ږiׅ{^~1U&B-Б~{}CޤZHf@ Ekm Tꂒv(bXl+S^J[E"E[jPU,mȱ&Qb@~W~n 1AmZj ^ŕ"k kwHBal5^bQ.d=EJjFJDy[j7 n%2E_M )Sk.G?Q:9kr@``Lأ͛SRt2 !xFrCNU=EO Śy 9Tȗ!p=,:^D`Z_ !I76,Ǚ&VԷZ1sS:n6E`mvvrCt]LVʭ${( ;Dg>XGЎ>:/\dATv笠[^à -|!-z{ؔ>E pEn*.RRJ\XFuӬyzLJX iUk-釀 A4Zݻddr$? ȋQ%m됤] W,&hwY,x*$R\K M0Q"zr洞F.@c,-y(sq1\μq)TpfãσR5`ptرHլq^qGsH$wC#!]6a*ٔ(fv6.*鷚3*uyAޞU;"{z KP_!}ϣ]{kA^ƓRYEnHsф5:o\w{_'ꂷJQqNaLxA "uמ`%Iumo>hY_h/Kao'm:P^uY335~w\^]EZCڃ-MZ{iPlTZe+*q57^67.x9Ap!v\B`ۧNFG-9[iz|I+X.R[џ TVhhs$·zh;m|e{9rm)|@cU۔oS~ԧ5ނXcϋDG2ape|Z)yz&fN,wl ~I>nAUizO0M{lbC"l:Kmk6bH9\,UdXEp x]q QAJ) ׵դ~n(=tJtsnzeS{nObs{MG}.N! E7W׊ƒZ&Z_ !%(p gM[џ/];_JR^1¼T&MH)] RƣjLIߥԱ(xn5RTBԳ H+ġ %h D!DsY/WD 8U@5,"օUXgH,z&z’1 m E5) b" /$Q"b) $*)X |! ("/ȣA)@(HU3AM-hlp'b[ʿ /,kZ+ZoqNzDz$hv >^0eoݿ48`E!*񓙢-RM6D i<`vyJ((\}fm$pҽ焥ze@3h(cWo"J Չ7Ŧaf =sϠ OS@=OlҶl?6Fl0\ rhSHb72+6F #7Mp.ID@@]ڬզpV 13d: `O]oie,i_8F!ߙYԺNr?=DīxHdd;8$Œopq;'xmb`aJL:sPQYΉBqa"T@|eIxH/(yok)( /'A {qӛĝNBS =jo /l"{Pg*3 `l3 >-Z>2`8kJg&ĀIRFԾc5Ꝩs6==&72$\c4 i=ҥ*GXX7!q@ >1uB{踁A>4%Mh2a8u16 e?/0^;X8nѮ6$TMw6a/S% bdg[aLQwY83R꘴|ǘ @9la DtrB88xґNiC1by8+q~bGɏ{eWz0z+nzFcǙ+25Ԯp4Y\f|衒$'OcUfq P8CoUh+UA[Q; ^oҡykS؛ Q2FE^ kAIwRvVvBT:0VD3Z[y5ߖ=Q,uK0=+DS[˪lpR<LLh" 0Ҝ{DT'R c;;+d_/~ NrL T"P!p86+Voa R=\ʮe!ӚI_0EXLƶǷ>zL*W ٠Ϳ5aax}qؑNYLx0lN0cڧ3EcdޘtCzK$զw)E$rGJ@}]r* 0H KpfdJmklmkKĻdad; 㝊wG Qo-l okDZ*G-bcM R`'~"Tnu3M+0cRUH^nh L !6a)ϘD\@T/'eƚ֊)AcЎFPGʽ Ν-,{[;c 8r֪95.S$W9aBǤ  IMeQX)NYi*=8"%p61V~\KZuH +j /۹e'ƥjq1Mɬ`I=p)2 XI k$U qp5U8 no`rj~Z tb=]@S;n2Jy z@0I kVP$#0eö́qqi R׮l$65w1SBHvjVV^H}AnS4HZ!I 7XU"]s; { t= Z ?[f\R,+Ep"EeOYZ1E[(sЧ;:~!4q~ۨفs<%.}-S T6_Xۑ 6/PwChyͅ3[bX[RB}GqG%zu1Yn'u+el9jPjI%-cNyO  Fܖ؉c J2Πه1Gtc5)a:TD5͚pŸ$3y;ZB4b)8YG>E.HP4+beŠ*Ԃ]߮|yꆠ1g(OE@ydLV`-^*{1MS/J PF!1X#bs A7 f!uG8Mb{Pu*2|1Fo)̪ƍs^Kr q9FspO:+}ab@K87Bi }" 0egImqYqٙ7s \FGᷮ~~/9{>E Tڞ /q VAx;0}Roq بtKˁxŃg0( q0m\#|LR*ώa,oUt(r5qabϥ&/c818cH'c-]P2И5a3PB&8iTTesgL c9o. C'>ٮfU582a9ktpnxVmOp"X$77h0 1ey c~۠о ly)J\(֍jNT\66mfpQzS%AGv}:$6P!p׈ROS,iC$R5i|71ٶtE40Hʽd,"Ѭ])bL} QpHol00:9@G$ר"ב(RFus> hXm_L`ζdȁ.xX,Z0:9Êf8gjmceJ LN6ͬ4dFmU0v>_ NvܶmDp,4۩M?a](,`A0`ښEaqdC$7|ޑM76r`G-yb@J opzAѝ BH,I1p0L172CCMn8izhy*>GwvgȮ]?3MojZ싪p]%'S "lv{⹄Ιϋlf!B+sXP{-*Fٔ$ ,k@Bx'x\%d#ʋAMR$('PZ)R=2sW۶qP~2sZf`0mUp?&QE!INH%[*@KSGŻ)M'>Nq/uqt][gx!I$[8*{] # Sny$fm!"!X` 6p&.U@ JɎD!n;v~cRn:zm%0a ĸ渹 m$_.9p4(`X0DI8iwqDt@lmIO/v' 7ɼVB,. @@5{7Y%]H=w܋r{6Sm7)S!!V Sca?5>bkgH./cdKgLpt+zܹnֵ / z­7\&*)% 1(\L@nK8z| 7@&s| .j$SHuZ ZZ1L{[3ePϚT<0C>Ja!M^Al & XBMJFɮb̘U97|Y("^oDkV fD>h5әI=<@ů&b^&1z4C绋0f0>|}3%WD1? (5׸ v-QK=6w*LA Pv+ZkǑ(DD:ֿffR[9ll9qjQeqP^kkI[""}VB%q,\gtibU{SΓI/Len-Smr$gAC1! kjlV"Ιa#[C͹3 Et-bոaDC'A`UDndl0jW86r.w40Pƭj[CKT\3bw"fwv Hf[S$[jt=Zvo#e{:«2bǦ*k"aA,! E.m/ bn8QSB\'3a{N3h‰Fw j#&O>2 6tE 9nM᜚vývL2 ήZb3SǓ"v a ƾ?0fg>݃cÏLAG&JM:#8QĬ. D: -d@^.t \6+eeVgM{y;^T.Qq+I_ӷ?%!MJФP$PԢR2 a.^O68>5!kX%\ P8:cu|ˆec=ӵ0`ГUx] w2{8pH[S/hۿ^ELmss\e&$$NV!H'PLa;E E kXaUtT!Вaisݠ&`ڒ@㞼8˟Q3k/ gL:$HK!r +n7GD#3xG  RɅ,ZZ V(5s,-IBS .A0cf9Se5cE|d 2q\+2rb&@Φ0 ͬv @@. ٖu) ]ȱܿNفưBZVr"5qz8ONn7{~GO~@0Bۦ}XN~"vS5w&V9f\SLCs{msX!"`Q')!I&Ҡ!;>3hI77`j| \Xȫo/tATbl%5b%l)Eܷk<{uJP:t趱D'dhr>+᫪n(W6xT8#X0$b B$12'Pͳ_SSU"0*ЄƃxehSFHMUm!T%.!cD&d8 ZPb tI$i1  e@!3FH KՖ#KU8Sro$:co\A"5,½\Je.syfr$]mͲ!aa$Pb)h˫xPS@gAvhE @Zf7_-G6D "BF) E#fW#$D$dR1H<#1m`1m`z2J89ipfg%'6I"H)"F Ɏ̚#2!ܠvyrldc@˸!o^aϜA;9˳C$o+Bp[s}D`4H̅@ y{B) aB}̝ݫO&4ޡ' h V4(Bb05 Zv pv:$PRdujnHDHm 83:,xB H_ĊT~:QGD8vRi66_ :,! Lb# |1 n(*8:~`Uzt ++SjB,B hլ,T?yY(m"ŪʄHE00_5|~Y]oّ͓[GAEr]S7 N@?;)$[sߔHˍpy&09r("B"e(#zވ&ӾVlhxFp.^͟uVGKo;:.K{3+Wګ?jJZǛy;Ki]޷u3v7C< ෦4 X6t5ww:"+àH fggthemes/data/canva_palettes.rda0000644000176200001440000001107514561020226016451 0ustar liggesusersuZkqe$IqII8Y~w)Yv Ʉd[O qR??7șٝ# Hq]]uԩ˿}|>'o|8=>=gHv!9rWYuD5 5- >-4RstH"M+%^ ˻f )sH;˅l:dݩ3ʨP^jV,.zY-.E^oe0R5lHcZpAH'I ݑ4NӶ](d=Kژ R5]L |tՎ)%Spk:8AҔ,eBy ?S&z9iJ`Ga#1WƎ:bNT;XJ;X¶hg"J1"i r Z$*dAp!axQ IE` @mpE 'l$1,>jZUHVnkv1 ɅN*ug!gk8}G 7kHLGBHHԬTub"gњgFjTH1Yth@el\b6GB42BPo-AR*(^vDK\Dn}ZdffNFb3Vǰ4d 93P$pO1kNqQ:pkb SfUR.L>w5f͗` Mpfvmr}B:PI2⭁)|A%oxdDzwHA§]X46%g N0G$aB)E۸ #@4pX%[;NT,u> Gu!ũ `dcTS1fmHV^$t!x]˧}T"&_BND%MSTDKMa"1`g  `PI8-.x2PR^2iE ڻVv# D'qUt]#L\de N AY"rc>f Mh:eޢJ[N@So.Cu:q=@!U;u-x"IZԨHJ'r=$4>dڸ0i΁H^.Au4Z`eLڙ<:† #zRdJ6'щ> ICu:ZmnuE%!<(=93ftD"gt!t9hDGcL)ȇӖRw ӄ?:|q&1 yAa[< LAul,Czxp*b3q1J-ڴOKKJDelyN /,kQ o"#DfIh>HY7f>* S4nT;cif~ vOLUFR|^&6|j;vR Z OCamϢӶ:  NYe pޅ>  IgI\BƕTo[|p D$":0ELuEH`L! I!Gp<y护⌆)!&I:GU\k(7E\,!L Umwب"fXPbAeI234(\tCC O3 | 'W30 ,Α1tr{ѥVcKQ o4;gff1'H%ITeRekp[L00*:c >x߄>ot\SN.uIaY# I0uYRpZ޴] Ca6xdYa֝t2h껝sdlUZ# DU̵ρt-ǩr4bb&SE¶ @T+94t&-)EKcQl{fg4o/?8%>j )e$G)S9'2pYA@N-z+7Fɔ#i3my&dE~E:-* iϑ1k@:y2OJGA&'EںAh%NG32_К](V-4uADG2,&BS6_t0~QBh|S[M{TGKcN2EFIa}{,4,F2ZWFdKZc>p^GPZ(Z./ld RNj,P1b&#Y)bGx=W˘2y&%*yH+yz%B6Dfv,@$LQ^<\jx 3:n>ڳxN@V$9s10DGK6/뽙YNZ"Җ 9QH0d~Z\dOK^"˯D6 u+ޝTJWfŽn9H: 9k $gU&S<8{й 5f:q!f~c Z؊t~ aaf~ TKes?X@730Qy\wBA!l:B'f$ic!MH32wVt|YɅMMB^n-Ȏќ/㟖!aγ q5P[n~ZثOy'yܮ]ùyهsojT>!8ǧ^-U=fNu! >ۻq`_=/!pa/7e0NAKE^i cÐҷ'IR6Z/7bQ8g5ëwio\Xv=lǃv|A! >H,}Bu:-3覾թN]_-u=_ISIGp2$YkF7}Zι#/}So?wqZM_CN`ݏIX"pI9(ѯ8T}Ҥ@)VPުĽJPhݿ:Ǟ m'1?:ozF/bl o#]#qwO+qJzٓ|cbJxRF>cF?x {ie/^mw(? 9OLB:; A ߋG(6ggthemes/man/0000755000176200001440000000000014561275337012645 5ustar liggesusersggthemes/man/scale_few.Rd0000644000176200001440000000720114561050522015047 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/few.R \name{scale_colour_few} \alias{scale_colour_few} \alias{scale_color_few} \alias{scale_fill_few} \title{Color scales from Few's "Practical Rules for Using Color in Charts"} \usage{ scale_colour_few(palette = "Medium", ...) scale_color_few(palette = "Medium", ...) scale_fill_few(palette = "Light", ...) } \arguments{ \item{palette}{One of \Sexpr[results=rd]{names(ggthemes:::rd_optlist(ggthemes::ggthemes_data$few$colors))}} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{few_pal}()}. } \seealso{ Other colour few: \code{\link{few_pal}()} } \concept{colour few} ggthemes/man/hc_pal.Rd0000644000176200001440000000110614561301051014337 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hc.R \name{hc_pal} \alias{hc_pal} \title{Highcharts color palette (discrete)} \usage{ hc_pal(palette = "default") } \arguments{ \item{palette}{\code{character} The name of the Highcharts theme to use. One of \code{"default"}, or \code{"darkunica"}.} } \description{ The Highcharts uses many different color palettes in its plots. This collects a few of them. } \section{Palettes}{ The following palettes are defined: } \seealso{ Other colour hc: \code{\link{scale_colour_hc}()} } \concept{colour hc} ggthemes/man/theme_clean.Rd0000644000176200001440000000153214561020227015363 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/clean.R \name{theme_clean} \alias{theme_clean} \title{Clean ggplot theme} \usage{ theme_clean(base_size = 12, base_family = "sans") } \arguments{ \item{base_size}{Base font size.} \item{base_family}{Base font family.} } \description{ Clean ggplot theme with no panel background, black axis lines and grey fill colour for chart elements. } \examples{ library("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + facet_wrap(~am) + geom_smooth(method = "lm", se = FALSE) + theme_clean() p } \seealso{ Other themes: \code{\link{theme_base}()}, \code{\link{theme_foundation}()}, \code{\link{theme_igray}()}, \code{\link{theme_par}()}, \code{\link{theme_solid}()} } \author{ Konrad Zdeb \email{name.surname@me.com} } \concept{themes} ggthemes/man/theme_calc.Rd0000644000176200001440000000131614561301535015207 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/calc.R \name{theme_calc} \alias{theme_calc} \title{Theme Calc} \usage{ theme_calc(base_size = 10, base_family = "sans") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme similar to the default settings of LibreOffice Calc charts. } \examples{ library("ggplot2") ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + theme_calc() + scale_color_calc() \dontrun{ ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) + theme_calc() + scale_shape_calc() } } \concept{themes calc} ggthemes/man/theme_solarized.Rd0000644000176200001440000000272514561020227016302 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/solarized.R \name{theme_solarized} \alias{theme_solarized} \alias{theme_solarized_2} \title{ggplot color themes based on the Solarized palette} \usage{ theme_solarized(base_size = 12, base_family = "", light = TRUE) theme_solarized_2(base_size = 12, base_family = "", light = TRUE) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{light}{\code{logical}. Light or dark theme?} } \description{ See \url{https://ethanschoonover.com/solarized/} for a description of the Solarized palette. } \details{ Plots made with this theme integrate seamlessly with the Solarized Beamer color theme. \url{https://github.com/jrnold/beamercolorthemesolarized}. There are two variations: \code{theme_solarized} is similar to to \code{\link[ggplot2]{theme_bw}()}, while \code{theme_solarized_2()} is similar to \code{\link[ggplot2]{theme_gray}()}. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) # Light version with different main accent colors for (accent in names(ggthemes::ggthemes_data[["solarized"]][["accents"]])) { print(p + theme_solarized() + scale_colour_solarized(accent)) } # Dark version p + theme_solarized(light = FALSE) + scale_colour_solarized("blue") # Alternative theme p + theme_solarized_2(light = FALSE) + scale_colour_solarized("blue") } \concept{themes solarized} ggthemes/man/tremmel_shape_pal.Rd0000644000176200001440000000306114561050522016600 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{tremmel_shape_pal} \alias{tremmel_shape_pal} \title{Shape palette from Tremmel (1995) (discrete)} \usage{ tremmel_shape_pal(overlap = FALSE, alt = FALSE) } \arguments{ \item{overlap}{use an empty circle instead of a solid circle when \code{n == 2}.} \item{alt}{If \code{TRUE}, then when \code{n == 3}, use a solid circle, plus sign and empty triangle. Otherwise use a solid circle, empty circle, and empty triangle.} } \description{ Based on experiments Tremmel (1995) suggests the following shape palettes: } \details{ If two symbols, then use a solid circle and plus sign. If three symbols, then use a solid circle, empty circle, and an empty triangle. However, that set of symbols does not satisfy the requirement that each symbol should differ from the other symbols in the same feature dimension. A set of three symbols that satisfies this is a circle (curvature), plus sign (number of terminators), triangle (line orientation). This palette supports up to three values. If more than three groups of data, then separate the groups into different plots. } \references{ Tremmel, Lothar, (1995) "The Visual Separability of Plotting Symbols in Scatterplots" Journal of Computational and Graphical Statistics, \url{https://www.jstor.org/stable/1390760} } \seealso{ Other shapes: \code{\link{circlefill_shape_pal}()}, \code{\link{cleveland_shape_pal}()}, \code{\link{scale_shape_circlefill}()}, \code{\link{scale_shape_cleveland}()}, \code{\link{scale_shape_tremmel}()} } \concept{shapes} ggthemes/man/excel_pal.Rd0000644000176200001440000000144314561020227015054 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{excel_pal} \alias{excel_pal} \title{Excel 97 ugly color palettes (discrete)} \usage{ excel_pal(line = TRUE) } \arguments{ \item{line}{If \code{TRUE}, use the palette for lines and points. Otherwise, use the palette for area.} } \description{ The color palettes used in Microsoft Excel 97 (and up until Excel 2007). Use this for that classic ugly look and feel. For ironic purposes only. 3D bars and pies not included. Please never use this color palette. } \examples{ library("scales") show_col(excel_pal()(7)) show_col(excel_pal(line = FALSE)(7)) } \seealso{ Other colour excel: \code{\link{excel_new_pal}()}, \code{\link{scale_colour_excel_new}()}, \code{\link{scale_fill_excel}()} } \concept{colour excel} ggthemes/man/stata_linetype_pal.Rd0000644000176200001440000000071514561020227017002 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{stata_linetype_pal} \alias{stata_linetype_pal} \title{Stata linetype palette (discrete)} \usage{ stata_linetype_pal() } \description{ Linetype palette based on the linepattern scheme in Stata. This palette supports up to 15 values. } \seealso{ \code{\link{scale_linetype_stata}()} Other linetype stata: \code{\link{scale_linetype_stata}()} } \concept{linetype stata} ggthemes/man/theme_wsj.Rd0000644000176200001440000000211314561020227015100 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wsj.R \name{theme_wsj} \alias{theme_wsj} \title{Wall Street Journal theme} \usage{ theme_wsj( base_size = 12, color = "brown", base_family = "sans", title_family = "mono" ) } \arguments{ \item{base_size}{base font size, given in pts.} \item{color}{The background color of plot. One of \code{'brown', 'gray', 'green', 'blue'}.} \item{base_family}{base font family} \item{title_family}{Plot title font family.} } \description{ Theme based on the plots in \emph{The Wall Street Journal}. } \details{ This theme should be used with \code{\link{scale_color_wsj}()}. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + ggtitle("Diamond Prices") p + scale_colour_wsj("colors6", "") + theme_wsj() # Use a gray background instead p + scale_colour_wsj("colors6", "") + theme_wsj(color = "gray") } \references{ \url{https://twitter.com/WSJGraphics} \url{https://pinterest.com/wsjgraphics/wsj-graphics/} } \concept{themes wsj} ggthemes/man/excel_new_pal.Rd0000644000176200001440000000155614561020227015732 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{excel_new_pal} \alias{excel_new_pal} \title{Excel (current versions) color palettes (discrete)} \usage{ excel_new_pal(theme = "Office Theme") } \arguments{ \item{theme}{The name of the Office theme or color theme (not to be confused with ggplot2 themes) from which to derive the color palette. Available themes include: \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$excel$themes))}} } \description{ Color palettes used by current versions of Microsoft Office and Excel. } \examples{ library("scales") for (i in names(ggthemes::ggthemes_data$excel$palettes)) { show_col(excel_new_pal(theme = i))(6) } } \seealso{ Other colour excel: \code{\link{excel_pal}()}, \code{\link{scale_colour_excel_new}()}, \code{\link{scale_fill_excel}()} } \concept{colour excel} ggthemes/man/bank_slopes.Rd0000644000176200001440000000663714561020227015432 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/banking.R \name{bank_slopes} \alias{bank_slopes} \title{Bank Slopes to 45 degrees} \usage{ bank_slopes(x, y, cull = FALSE, weight = NULL, method = c("ms", "as"), ...) } \arguments{ \item{x}{x values} \item{y}{y values} \item{cull}{\code{logical}. Remove all slopes of 0 or \code{Inf}.} \item{weight}{No longer used, but kept for backwards compatibility.} \item{method}{One of 'ms' (Median Absolute Slope) or 'as' (Average Absolute Slope). Other options are no longer supported, and will use 'ms' instead with a warning.} \item{...}{No longer used, but kept for backwards compatibility.} } \value{ \code{numeric} The aspect ratio (x , y). } \description{ Calculate the optimal aspect ratio of a line graph by banking the slopes to 45 degrees as suggested by W.S. Cleveland. This maximizes the ability to visually differentiate differences in slope. This function will calculate the optimal aspect ratio for a line plot using any of the methods described in Herr and Argwala (2006). In their review of the methods they suggest using median absolute slope banking ('ms'), which produces aspect ratios which are generally the median of the various methods provided here. } \section{Methods}{ As written, all of these methods calculate the aspect ratio (x /y), but \code{bank_slopes} will return (y / x) to be compatible with \code{link[ggplot2]{coord_fixed()}}. \strong{Median Absolute Slopes Banking} Let the aspect ratio be \eqn{\alpha = \frac{w}{h}}{alpha = w / h} then the median absolute slop banking is the \eqn{\alpha}{alpha} such that, \deqn{ median \left| \frac{s_i}{\alpha} \right| = 1 }{ median |s_i / alpha| } Let \eqn{R_z = z_{max} - z_{min}}{R_z = z_max - z_min} for \eqn{z = x, y}, and \eqn{M = median \| s_i \|}{M = median | s_i |}. Then, \deqn{ \alpha = M \frac{R_x}{R_y} }{ alpha = M R_x / R_y } \strong{Average Absolute Slope Banking} Let the aspect ratio be \eqn{\alpha = \frac{w}{h}}{alpha = w/h}. then the mean absolute slope banking is the \eqn{\alpha}{alpha} such that, \deqn{ mean \left| \frac{s_i}{\alpha} \right| = 1 }{ mean |s_i / alpha| = 1 } Heer and Agrawala (2006) and Cleveland discuss several other methods including average (weighted) orientation, and global and local orientation resolution. These are no longer implemented in this function. In general, either the median or average absolute slopes will produce reasonable results without requiring optimization. } \examples{ library("ggplot2") # Use the classic sunspot data from Cleveland's original paper x <- seq_along(sunspot.year) y <- as.numeric(sunspot.year) # Without banking m <- ggplot(data.frame(x = x, y = y), aes(x = x, y = y)) + geom_line() m ## Using the default method, Median Absolute Slope ratio <- bank_slopes(x, y) m + coord_fixed(ratio = ratio) ## Using culling ## Average Absolute Slope bank_slopes(x, y, method = "as") } \references{ Cleveland, W. S., M. E. McGill, and R. McGill. The Shape Parameter of a Two-Variable Graph. Journal of the American Statistical Association, 83:289-300, 1988 Heer, Jeffrey and Maneesh Agrawala, 2006. 'Multi-Scale Banking to 45' IEEE Transactions On Visualization And Computer Graphics. Cleveland, W. S. 1993. 'A Model for Studying Display Methods of Statistical Graphs.' Journal of Computational and Statistical Graphics. Cleveland, W. S. 1994. The Elements of Graphing Data, Revised Edition. } \seealso{ \code{\link[lattice]{banking}()} } ggthemes/man/scale_shape_tableau.Rd0000644000176200001440000000624014561277522017100 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{scale_shape_tableau} \alias{scale_shape_tableau} \title{Tableau shape scales} \usage{ scale_shape_tableau(palette = "default", ...) } \arguments{ \item{palette}{Palette name.} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{tableau_shape_pal}()} for details. } \examples{ \dontrun{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) p + scale_shape_tableau() } } \seealso{ Other shape tableau: \code{\link{tableau_shape_pal}()} } \concept{shape tableau} ggthemes/man/scale_shape_calc.Rd0000644000176200001440000000571414561050522016357 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/calc.R \name{scale_shape_calc} \alias{scale_shape_calc} \title{Calc shape scale} \usage{ scale_shape_calc(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{calc_shape_pal}()} for details. } \seealso{ \code{\link{theme_calc}()} for examples. Other shapes calc: \code{\link{calc_shape_pal}()} } \concept{shapes calc} ggthemes/man/theme_solid.Rd0000644000176200001440000000167314561020227015421 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/theme-solid.R \name{theme_solid} \alias{theme_solid} \title{Theme with nothing other than a background color} \usage{ theme_solid(base_size = 12, base_family = "", fill = NA) } \arguments{ \item{base_size}{Base font size.} \item{base_family}{Ignored, kept for consistency with \code{\link{theme}()}.} \item{fill}{Background color of the plot.} } \description{ Theme that removes all non-geom elements (lines, text, etc), This theme is when only the geometric objects are desired. } \examples{ library("ggplot2") ggplot(mtcars, aes(wt, mpg)) + geom_point() + theme_solid(fill = "white") ggplot(mtcars, aes(wt, mpg)) + geom_point(color = "white") + theme_solid(fill = "black") } \seealso{ Other themes: \code{\link{theme_base}()}, \code{\link{theme_clean}()}, \code{\link{theme_foundation}()}, \code{\link{theme_igray}()}, \code{\link{theme_par}()} } \concept{themes} ggthemes/man/tableau_shape_pal.Rd0000644000176200001440000000200214561020227016541 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{tableau_shape_pal} \alias{tableau_shape_pal} \title{Tableau Shape Palettes (discrete)} \usage{ tableau_shape_pal(palette = c("default", "filled", "proportions")) } \arguments{ \item{palette}{Palette name.} } \description{ Shape palettes used by \href{https://www.tableau.com/}{Tableau}. } \details{ Not all shape palettes in Tableau are supported. Additionally, these palettes are not exact, and use the best unicode character for the shape palette. Since these palettes use unicode characters, their look may depend on the font being used, and not all characters may be available. Shape palettes in Tableau are used to expose images for use a markers in charts, and thus are sometimes groupings of closely related symbols. } \examples{ \dontrun{ # need to set a font containing these values show_shapes(tableau_shape_pal()(5)) } } \seealso{ Other shape tableau: \code{\link{scale_shape_tableau}()} } \concept{shape tableau} ggthemes/man/theme_economist.Rd0000644000176200001440000000523614561275150016315 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/economist.R \name{theme_economist} \alias{theme_economist} \alias{theme_economist_white} \title{ggplot color theme based on the Economist} \usage{ theme_economist( base_size = 10, base_family = "sans", horizontal = TRUE, dkpanel = FALSE ) theme_economist_white( base_size = 11, base_family = "sans", gray_bg = TRUE, horizontal = TRUE ) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{horizontal}{\code{logical} Horizontal axis lines?} \item{dkpanel}{\code{logical} Darker background for panel region?} \item{gray_bg}{\code{logical} If \code{TRUE}, use gray background, else use white background.} } \value{ An object of class \code{\link[ggplot2]{theme}()}. } \description{ A theme that approximates the style of \emph{The Economist}. } \details{ \code{theme_economist} implements the standard bluish-gray background theme in the print \emph{The Economist} and \href{https://www.economist.com/}{economist.com}. \code{theme_economist_white} implements a variant with a while panel and light gray (or white) background often used by \emph{The Economist} blog \href{https://www.economist.com/blogs/graphicdetail}{Graphic Detail}. Use \code{\link{scale_color_economist}()} with this theme. The x axis should be displayed on the right hand side. \emph{The Economist} uses "ITC Officina Sans" as its font for graphs. If you have access to this font, you can use it with the \pkg{extrafont} package. "Verdana" is a good substitute. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + # Economist puts x-axis labels on the right-hand side scale_y_continuous(position = "right") ## Standard p + theme_economist() + scale_colour_economist() # Change axis lines to vertical p + theme_economist(horizontal = FALSE) + scale_colour_economist() + coord_flip() ## White panel/light gray background p + theme_economist_white() + scale_colour_economist() ## All white variant p + theme_economist_white(gray_bg = FALSE) + scale_colour_economist() \dontrun{ ## The Economist uses ITC Officina Sans library("extrafont") p + theme_economist(base_family="ITC Officina Sans") + scale_colour_economist() ## Verdana is a widely available substitute p + theme_economist(base_family="Verdana") + scale_colour_economist() } } \references{ \itemize{ \item \href{https://www.economist.com/}{The Economist} \item \href{https://spiekermann.com/en/itc-officina-display/}{Spiekerblog, "ITC Officina Display", January 1, 2007.} } } \concept{themes economist} ggthemes/man/calc_pal.Rd0000644000176200001440000000062214561020227014654 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/calc.R \name{calc_pal} \alias{calc_pal} \title{Calc color palette (discrete)} \usage{ calc_pal() } \description{ Color palettes from LibreOffice Calc. This palette has 12 values. } \examples{ library("scales") show_col(calc_pal()(12)) } \seealso{ Other colour calc: \code{\link{scale_fill_calc}()} } \concept{colour calc} ggthemes/man/scale_shape_stata.Rd0000644000176200001440000000604714561272771016605 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{scale_shape_stata} \alias{scale_shape_stata} \title{Stata shape scale} \usage{ scale_shape_stata(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{stata_shape_pal}()} for details. } \examples{ \dontrun{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) p + theme_stata() + scale_shape_stata() } } \concept{shape stata} ggthemes/man/theme_excel_new.Rd0000644000176200001440000000145214561020227016253 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{theme_excel_new} \alias{theme_excel_new} \title{ggplot theme similar to current Excel plot defaults} \usage{ theme_excel_new(base_size = 9, base_family = "sans") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \value{ An object of class \code{\link[ggplot2]{theme}()}. } \description{ Theme for ggplot2 that is similar to the default style of charts in current versions of Microsoft Excel. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel_new() + scale_colour_excel_new() } \seealso{ Other themes excel: \code{\link{theme_excel}()} } \concept{themes excel} ggthemes/man/scale_linetype_stata.Rd0000644000176200001440000000650314561050522017317 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{scale_linetype_stata} \alias{scale_linetype_stata} \title{Stata linetype palette (discrete)} \usage{ scale_linetype_stata(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{stata_linetype_pal}()} for details. } \examples{ require("ggplot2") if (require("tidyr") && require("dplyr")) { rescale01 <- function(x) { (x - min(x)) / diff(range(x)) } gather(economics, variable, value, -date) \%>\% group_by(variable) \%>\% mutate(value = rescale01(value)) \%>\% ggplot(aes(x = date, y = value, linetype = variable)) + geom_line() + scale_linetype_stata() } } \seealso{ Other linetype stata: \code{\link{stata_linetype_pal}()} } \concept{linetype stata} ggthemes/man/ggthemes-package.Rd0000644000176200001440000000247114561266444016333 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ggthemes-package.R \docType{package} \name{ggthemes-package} \alias{ggthemes} \alias{ggthemes-package} \title{ggthemes: Extra Themes, Scales and Geoms for 'ggplot2'} \description{ Some extra themes, geoms, and scales for 'ggplot2'. Provides 'ggplot2' themes and scales that replicate the look of plots by Edward Tufte, Stephen Few, 'Fivethirtyeight', 'The Economist', 'Stata', 'Excel', and 'The Wall Street Journal', among others. Provides 'geoms' for Tufte's box plot and range frame. } \seealso{ Useful links: \itemize{ \item \url{https://jrnold.github.io/ggthemes/} \item \url{https://github.com/jrnold/ggthemes} \item Report bugs at \url{https://github.com/jrnold/ggthemes/issues} } } \author{ \strong{Maintainer}: Jeffrey B. Arnold \email{jeffrey.arnold@gmail.com} () Other contributors: \itemize{ \item Gergely Daroczi [contributor] \item Bo Werth [contributor] \item Brian Weitzner [contributor] \item Joshua Kunst [contributor] \item Baptise Auguie [contributor] \item Bob Rudis [contributor] \item Hadley Wickham (Code from the ggplot2 package.) [contributor] \item Justin Talbot (Code from the labeling package) [contributor] \item Joshua London [contributor] } } \keyword{internal} ggthemes/man/theme_map.Rd0000644000176200001440000000136314561020227015060 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/theme-map.R \name{theme_map} \alias{theme_map} \title{Clean theme for maps} \usage{ theme_map(base_size = 9, base_family = "") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ A clean theme that is good for displaying maps from \code{\link[ggplot2]{geom_map}()}. } \examples{ library("maps") library("ggplot2") us <- fortify(map_data("state"), region = "region") gg <- ggplot() + geom_map(data = us, map = us, aes(x = long, y = lat, map_id = region, group = group), fill = "white", color = "black", size = 0.25) + coord_map("albers", lat0 = 39, lat1 = 45) + theme_map() gg } ggthemes/man/fivethirtyeight_pal.Rd0000644000176200001440000000101114561020227017161 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fivethirtyeight.R \name{fivethirtyeight_pal} \alias{fivethirtyeight_pal} \title{FiveThirtyEight color palette} \usage{ fivethirtyeight_pal() } \description{ The standard three-color FiveThirtyEight palette for line plots comprises blue, red, and green. } \examples{ library("scales") show_col(fivethirtyeight_pal()(3)) } \seealso{ Other colour fivethirtyeight: \code{\link{scale_colour_fivethirtyeight}()} } \concept{colour fivethirtyeight} ggthemes/man/theme_par.Rd0000644000176200001440000000331614561020227015065 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/base.R \name{theme_par} \alias{theme_par} \title{Theme which uses the current \sQuote{base} graphics parameter values from \code{\link[graphics]{par}()}. Not all \code{par()} parameters, are supported, and not all are relevant to \pkg{ggplot2} themes.} \usage{ theme_par(base_size = par()$ps, base_family = par()$family) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Currently this theme uses the values of the parameters: \code{"code"}, "\code{"ps"}", \code{"code"} \code{"family"}, \code{"fg"}, \code{"bg"}, \code{"adj"}, \code{"font"}, \code{"cex.axis"}, \code{"cex.lab"}, \code{"cex.main"}, \code{"cex.sub"}, \code{"col.axis"}, \code{"col.lab"}, \code{"col.main"}, \code{"col.sub"}, \code{"font"}, \code{"font.axis"}, \code{"font.lab"}, \code{"font.main"}, \code{"font.sub"}, \code{"las"}, \code{"lend"}, \code{"lheight"}, \code{"lty"}, \code{"mar"}, \code{"ps"}, \code{"tcl"}, \code{"tck"}, \code{"xaxt"}, \code{"yaxt"}. } \details{ This theme does not translate the base graphics perfectly, so the graphs produced by it will not be identical to those produced by base graphics, most notably in the spacing of the margins. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_par() # theme changes with respect to values of par par(font = 2, col.lab = "red", fg = "white", bg = "black") p + theme_par() } \seealso{ Other themes: \code{\link{theme_base}()}, \code{\link{theme_clean}()}, \code{\link{theme_foundation}()}, \code{\link{theme_igray}()}, \code{\link{theme_solid}()} } \concept{themes} ggthemes/man/canva_pal.Rd0000644000176200001440000000260214561020227015042 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/canva.R \name{canva_pal} \alias{canva_pal} \title{Canva.com color palettes} \usage{ canva_pal(palette = "Fresh and bright") } \arguments{ \item{palette}{Palette name. See the names of \code{\link{canva_palettes}()} for valid names.} } \value{ A function that takes a single value, the number of colors to use. } \description{ 150+ color palettes from canva.com. See \code{\link{canva_palettes}()}. } \examples{ require("ggplot2") require("tibble") if (require("purrr") && require("scales") && require("dplyr")) { canva_df <- map2_df( canva_palettes, names(canva_palettes), ~ tibble( colors = .x, .id = seq_along(colors), palette = .y ) ) ggplot(canva_df, aes( y = palette, x = .id, fill = colors )) + geom_raster() + scale_fill_identity(guide = FALSE) + theme_minimal() + theme(panel.grid = element_blank(), axis.text.x = element_blank()) + labs(x = "", y = "") show_col(canva_pal("Fresh and bright")(4)) show_col(canva_pal("Cool blues")(4)) show_col(canva_pal("Modern and crisp")(4)) } } ggthemes/man/scale_ptol.Rd0000644000176200001440000000750214561050522015250 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ptol.R \name{scale_colour_ptol} \alias{scale_colour_ptol} \alias{scale_color_ptol} \alias{scale_fill_ptol} \title{Color Scales from Paul Tol's "Colour Schemes} \usage{ scale_colour_ptol(...) scale_color_ptol(...) scale_fill_ptol(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{ptol_pal}()}. These palettes support up to 12 values. } \examples{ library("ggplot2") p2 <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + geom_smooth(method = "lm", se = FALSE) + scale_color_ptol("cyl") + theme_minimal() + ggtitle("Cars") ggplot(diamonds, aes(x = clarity, fill = cut)) + geom_bar() + scale_fill_ptol() + theme_minimal() } \seealso{ Other colour ptol: \code{\link{ptol_pal}()} } \concept{colour ptol} ggthemes/man/scale_pander.Rd0000644000176200001440000000715614561050522015550 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pander.R \name{scale_color_pander} \alias{scale_color_pander} \alias{scale_colour_pander} \alias{scale_fill_pander} \title{Color scale from the pander package} \usage{ scale_color_pander(...) scale_colour_pander(...) scale_fill_pander(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ The \pkg{pander} ships with a default colorblind and printer-friendly color palette borrowed from \verb{https://jfly.iam.u-tokyo.ac.jp/color/}. } \seealso{ \code{\link{theme_pander}()} Other colour pander: \code{\link{palette_pander}()} } \concept{colour pander} ggthemes/man/geom_tufteboxplot.Rd0000644000176200001440000001402414561061663016676 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/geom-tufteboxplot.R \docType{data} \name{geom_tufteboxplot} \alias{geom_tufteboxplot} \alias{GeomTufteboxplot} \title{Tufte's Box Plot} \usage{ geom_tufteboxplot( mapping = NULL, data = NULL, stat = "fivenumber", position = "dodge", outlier.colour = "black", outlier.shape = 19, outlier.size = 1.5, outlier.stroke = 0.5, voffset = 0.01, hoffset = 0.005, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, median.type = "point", whisker.type = "line", ... ) } \arguments{ \item{mapping}{Set of aesthetic mappings created by \code{\link[ggplot2:aes]{aes()}}. If specified and \code{inherit.aes = TRUE} (the default), it is combined with the default mapping at the top level of the plot. You must supply \code{mapping} if there is no plot mapping.} \item{data}{The data to be displayed in this layer. There are three options: If \code{NULL}, the default, the data is inherited from the plot data as specified in the call to \code{\link[ggplot2:ggplot]{ggplot()}}. A \code{data.frame}, or other object, will override the plot data. All objects will be fortified to produce a data frame. See \code{\link[ggplot2:fortify]{fortify()}} for which variables will be created. A \code{function} will be called with a single argument, the plot data. The return value must be a \code{data.frame}, and will be used as the layer data. A \code{function} can be created from a \code{formula} (e.g. \code{~ head(.x, 10)}).} \item{stat}{The statistical transformation to use on the data for this layer, as a string. The default (\code{stat = 'fivenumber'}) calls \code{\link{stat_fivenumber}} and produces whiskers that extend from the interquartile range to the extremes of the data; specifying \code{\link{stat_boxplot}} will produce a more traditional boxplot with whiskers extending to the most extreme points that are < 1.5 IQR away from the hinges (i.e., the first and third quartiles).} \item{position}{Position adjustment, either as a string naming the adjustment (e.g. \code{"jitter"} to use \code{position_jitter}), or the result of a call to a position adjustment function. Use the latter if you need to change the settings of the adjustment.} \item{outlier.colour}{colour for outlying points} \item{outlier.shape}{shape of outlying points} \item{outlier.size}{size of outlying points} \item{outlier.stroke}{stroke for outlying points} \item{voffset}{controls the size of the gap in the line representing the median when \code{median.type = 'line'}. This is a fraction of the range of \code{y}.} \item{hoffset}{controls how much the interquartile line is offset from the whiskers when \code{median.type = 'line'}. This is a fraction of the range of \code{x}.} \item{na.rm}{If \code{FALSE}, the default, missing values are removed with a warning. If \code{TRUE}, missing values are silently removed.} \item{show.legend}{logical. Should this layer be included in the legends? \code{NA}, the default, includes if any aesthetics are mapped. \code{FALSE} never includes, and \code{TRUE} always includes. It can also be a named logical vector to finely select the aesthetics to display.} \item{inherit.aes}{If \code{FALSE}, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn't inherit behaviour from the default plot specification, e.g. \code{\link[ggplot2:borders]{borders()}}.} \item{median.type}{If \code{'point'}, then the median is represented by a point, and the interquartile range by a gap in the line. If \code{median.type='line'}, then the interquartile range is represented by a line, possibly offset, and the median by a gap in the line.} \item{whisker.type}{If \code{'line'}, then whiskers are represented by lines. If \code{'point'}, then whiskers are represented by points at \code{ymin} and \code{ymax}.} \item{...}{Other arguments passed on to \code{\link[ggplot2:layer]{layer()}}. These are often aesthetics, used to set an aesthetic to a fixed value, like \code{colour = "red"} or \code{size = 3}. They may also be parameters to the paired geom/stat.} } \description{ Edward Tufte's revisions of the box plot as described in \emph{The Visual Display of Quantitative Information}. This functions provides several box plot variants: \itemize{ \item{A point indicating the median, a gap indicating the interquartile range, and lines for whiskers.} \item{An offset line indicating the interquartile range and a gap indicating the median.} \item{A line indicating the interquartile range, a gap indicating the median, and points indicating the minimum and maximum values} \item{A wide line indicating the interquartile range, a gap indicating the median, and lines indicating the minimum and maximum.} } } \section{Aesthetics}{ \itemize{ \item x [required] \item y [required] \item colour \item size \item linetype \item shape \item fill \item alpha } } \examples{ library("ggplot2") p <- ggplot(mtcars, aes(factor(cyl), mpg)) # with a point for the median and lines for whiskers p + geom_tufteboxplot() # with a line for the interquartile range and points for whiskers p + geom_tufteboxplot(median.type = "line", whisker.type = "point", hoffset = 0) # with a wide line for the interquartile range and lines for whiskers p + geom_tufteboxplot(median.type = "line", hoffset = 0, width = 3) # with an offset line for the interquartile range and lines for whiskers p + geom_tufteboxplot(median.type = "line") # combined with theme_tufte p + geom_tufteboxplot() + theme_tufte() + theme(axis.ticks.x = element_blank()) # traditional boxplot with whiskers only out to 1.5 IQR, outlier points p + geom_tufteboxplot(stat="boxplot", outlier.shape = 5) } \references{ Tufte, Edward R. (2001) The Visual Display of Quantitative Information, Chapter 6. McGill, R., Tukey, J. W. and Larsen, W. A. (1978) Variations of box plots. The American Statistician 32, 12-16. } \seealso{ \code{\link{geom_boxplot}()} Other geom tufte: \code{\link{geom_rangeframe}()} } \concept{geom tufte} \keyword{datasets} ggthemes/man/tableau_color_pal.Rd0000644000176200001440000000442114561277522016602 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{tableau_color_pal} \alias{tableau_color_pal} \title{Tableau Color Palettes (discrete)} \usage{ tableau_color_pal( palette = "Tableau 10", type = c("regular", "ordered-sequential", "ordered-diverging"), direction = 1 ) } \arguments{ \item{palette}{Palette name. See Details for available palettes.} \item{type}{Type of palette. One of \code{"regular"}, \code{"ordered-diverging"}, or \code{"ordered-sequential"}.} \item{direction}{If 1, the default, then use the original order of colors. If -1, then reverse the order.} } \description{ Color palettes used in \href{https://www.tableau.com/}{Tableau}. } \details{ Tableau provides three types of color palettes: \code{"regular"} (discrete, qualitative categories), \code{"ordered-sequential"}, and \code{"ordered-diverging"}. \describe{ \item{\code{"regular"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["regular"]]))}} \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} } } \examples{ library("scales") palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["regular"]] for (palname in names(palettes)) { pal <- tableau_color_pal(palname) max_n <- attr(pal, "max_n") show_col(pal(max_n)) title(main = palname) } } \references{ \url{http://vis.stanford.edu/color-names/analyzer/} Maureen Stone, 'Designing Colors for Data' (slides), at the International Symposium on Computational Aesthetics in Graphics, Visualization, and Imaging, Banff, AB, Canada, June 22, 2007. Heer, Jeffrey and Maureen Stone, 2012 'Color Naming Models for Color Selection, Image Editing and Palette Design', ACM Human Factors in Computing Systems (CHI) \url{http://vis.stanford.edu/files/2012-ColorNameModels-CHI.pdf}. } \seealso{ Other colour tableau: \code{\link{scale_colour_gradient2_tableau}()}, \code{\link{scale_colour_gradient_tableau}()}, \code{\link{scale_colour_tableau}()}, \code{\link{tableau_gradient_pal}()} } \concept{colour tableau} ggthemes/man/colorblind.Rd0000644000176200001440000001005614561050522015250 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/colorblind.R \name{colorblind_pal} \alias{colorblind_pal} \alias{scale_colour_colorblind} \alias{scale_color_colorblind} \alias{scale_fill_colorblind} \title{Colorblind Color Palette (Discrete) and Scales} \usage{ colorblind_pal() scale_colour_colorblind(...) scale_color_colorblind(...) scale_fill_colorblind(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ An eight-color colorblind safe qualitative discrete palette. } \examples{ library("ggplot2") library("scales") show_col(colorblind_pal()(8)) p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_igray() + scale_colour_colorblind() } \references{ Chang, W. "\href{http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/#a-colorblind-friendly-palette}{Cookbook for R}" \verb{https://jfly.iam.u-tokyo.ac.jp/color} } \seealso{ The \pkg{dichromat} package, \code{\link[scales]{dichromat_pal}()}, and \code{\link{scale_color_tableau}()} for other colorblind palettes. } \concept{colour} ggthemes/man/scale_wsj.Rd0000644000176200001440000000737414561050522015104 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wsj.R \name{scale_colour_wsj} \alias{scale_colour_wsj} \alias{scale_color_wsj} \alias{scale_fill_wsj} \title{Wall Street Journal color and fill scales} \usage{ scale_colour_wsj(palette = "colors6", ...) scale_color_wsj(palette = "colors6", ...) scale_fill_wsj(palette = "colors6", ...) } \arguments{ \item{palette}{\code{character} The color palette to use: . \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$wsj$palettes))}} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Colour and fill scales which use the palettes in \code{\link{wsj_pal}()}. These scales should be used with \code{\link{theme_wsj}()}. } \seealso{ Other colour wsj: \code{\link{wsj_pal}()} } \concept{colour wsj} ggthemes/man/scale_excel.Rd0000644000176200001440000000755714561050522015404 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{scale_fill_excel} \alias{scale_fill_excel} \alias{scale_colour_excel} \alias{scale_color_excel} \title{Excel 97 ugly color scales} \usage{ scale_fill_excel(...) scale_colour_excel(...) scale_color_excel(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ The classic "ugly" color scales from Excel 97. } \examples{ library("ggplot2") # Line and scatter plot colors p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel() + scale_colour_excel() # Bar plot (area/fill) colors ggplot(mpg, aes(x = class, fill = drv)) + geom_bar() + scale_fill_excel() + theme_excel() } \seealso{ Other colour excel: \code{\link{excel_new_pal}()}, \code{\link{excel_pal}()}, \code{\link{scale_colour_excel_new}()} } \concept{colour excel} ggthemes/man/scale_stata.Rd0000644000176200001440000000707714561050522015415 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{scale_colour_stata} \alias{scale_colour_stata} \alias{scale_fill_stata} \alias{scale_color_stata} \title{Stata color scales} \usage{ scale_colour_stata(scheme = "s2color", ...) scale_fill_stata(scheme = "s2color", ...) scale_color_stata(scheme = "s2color", ...) } \arguments{ \item{scheme}{\code{character}. One of \code{"s2color"}, \code{"s1rcolor"}, \code{"s1color"}, or \code{"mono"}.} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{stata_pal}()} for details. } \concept{colour stata} ggthemes/man/scale_shape_circlefill.Rd0000644000176200001440000000622714561061663017575 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{scale_shape_circlefill} \alias{scale_shape_circlefill} \title{Filled Circle Shape palette (discrete)} \usage{ scale_shape_circlefill(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ `r lifecycle::badge("deprecated")` } \seealso{ \code{\link{circlefill_shape_pal}()} for a description of the palette. Other shapes: \code{\link{circlefill_shape_pal}()}, \code{\link{cleveland_shape_pal}()}, \code{\link{scale_shape_cleveland}()}, \code{\link{scale_shape_tremmel}()}, \code{\link{tremmel_shape_pal}()} } \concept{shapes} ggthemes/man/macros/0000755000176200001440000000000014561020227014113 5ustar liggesusersggthemes/man/macros/funclink.Rd0000644000176200001440000000006014561020227016207 0ustar liggesusers\newcommand{\funclink}{\code{\link[=#1]{#1()}}} ggthemes/man/range_breaks.Rd0000644000176200001440000000336714561020227015552 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/scales.R \name{extended_range_breaks_} \alias{extended_range_breaks_} \alias{extended_range_breaks} \title{Pretty axis breaks inclusive of extreme values} \usage{ extended_range_breaks_( dmin, dmax, n = 5, Q = c(1, 5, 2, 2.5, 4, 3), w = c(0.25, 0.2, 0.5, 0.05) ) extended_range_breaks(n = 5, ...) } \arguments{ \item{dmin}{minimum of the data range} \item{dmax}{maximum of the data range} \item{n}{desired number of breaks} \item{Q}{set of nice numbers} \item{w}{weights applied to the four optimization components (simplicity, coverage, density, and legibility)} \item{...}{other arguments passed to \code{extended_range_breaks_()}} } \value{ For \code{extended_range_breaks}, the vector of axis label locations. For \code{scales_extended_range_breaks}, a function which takes a single argument, a vector of data, and returns the vector of axis label locations. A function which returns breaks given a vector. } \description{ This function returns pretty axis breaks that always include the extreme values of the data. This works by calling the extended Wilkinson algorithm (Talbot et. al, 2010), constrained to solutions interior to the data range. Then, the minimum and maximum labels are moved to the minimum and maximum of the data range. } \details{ \code{extended_range_breaks} implements the algorithm and returns the break values. \code{scales_extended_range_breaks} uses the conventions of the \pkg{scales} package, and returns a function. } \references{ Talbot, J., Lin, S., Hanrahan, P. (2010) An Extension of Wilkinson's Algorithm for Positioning Tick Labels on Axes, InfoVis 2010. } \author{ Justin Talbot \email{jtalbot@stanford.edu}, Jeffrey B. Arnold, Baptiste Auguie } ggthemes/man/smart_digits.Rd0000644000176200001440000000145614561020227015615 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/scales.R \name{smart_digits} \alias{smart_digits} \alias{smart_digits_format} \title{Format numbers with automatic number of digits} \usage{ smart_digits(x, ...) smart_digits_format(x, ...) } \arguments{ \item{x}{A numeric vector to format} \item{...}{Parameters passed to \code{\link{format}()}} } \value{ A character vector. \code{smart_digits_format()} returns a function with a single argument \code{x}, a numeric vector, that returns a character vector. } \description{ Format numbers with automatic number of digits } \references{ Josh O'Brien, \url{https://stackoverflow.com/questions/23169938/select-accuracy-to-display-additional-axis-breaks/23171858#23171858}. } \author{ Josh O'Brien, Baptise Auguie, Jeffrey B. Arnold } ggthemes/man/solarized_pal.Rd0000644000176200001440000000155714561020227015756 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/solarized.R \name{solarized_pal} \alias{solarized_pal} \title{Solarized color palette (discrete)} \usage{ solarized_pal(accent = "blue") } \arguments{ \item{accent}{\code{character} Starting color.} } \description{ Qualitative color palate based on the Ethan Schoonover's Solarized palette, \url{https://ethanschoonover.com/solarized/}. This palette supports up to seven values. } \note{ For a given starting color and number of colors in the palette, the other colors are the combination of colors that maximizes the total Euclidean distance between colors in L*a*b space. } \examples{ library("scales") show_col(solarized_pal()(2)) show_col(solarized_pal()(3)) show_col(solarized_pal("red")(4)) } \seealso{ Other solarized colour: \code{\link{scale_fill_solarized}()} } \concept{solarized colour} ggthemes/man/circlefill_shape_pal.Rd0000644000176200001440000000210014561051016017233 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{circlefill_shape_pal} \alias{circlefill_shape_pal} \title{Filled Circle Shape palette (discrete)} \usage{ circlefill_shape_pal() } \description{ `r lifecycle::badge("deprecated")` This function was deprecated because unicode glyphs used for the circles vary in size, making them unusable for plotting. Shape palette with circles varying by amount of fill. This uses the set of 3 circle fill values in Lewandowsky and Spence (1989): solid, hollow, half-filled, with two additional fill amounts: three-quarters, and one-quarter. This palette supports up to five values. } \references{ Lewandowsky, Stephan and Ian Spence (1989) "Discriminating Strata in Scatterplots", Journal of the American Statistical Association, \url{https://www.jstor.org/stable/2289649} } \seealso{ Other shapes: \code{\link{cleveland_shape_pal}()}, \code{\link{scale_shape_circlefill}()}, \code{\link{scale_shape_cleveland}()}, \code{\link{scale_shape_tremmel}()}, \code{\link{tremmel_shape_pal}()} } \concept{shapes} ggthemes/man/theme_hc.Rd0000644000176200001440000000402014561276746014711 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hc.R \name{theme_hc} \alias{theme_hc} \title{Highcharts Theme} \usage{ theme_hc( base_size = 12, base_family = "sans", style = c("default", "darkunica"), bgcolor = NULL ) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{style}{The Highcharts theme to use \code{'default'}, \code{'darkunica'}.} \item{bgcolor}{Deprecated} } \description{ Theme based on \href{https://www.highcharts.com/}{Highcharts} plots. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_hc() + scale_colour_hc() p + theme_hc(bgcolor = "darkunica") + scale_colour_hc("darkunica") dtemp <- data.frame(months = factor(rep(substr(month.name, 1, 3), 4), levels = substr(month.name, 1, 3)), city = rep(c("Tokyo", "New York", "Berlin", "London"), each = 12), temp = c(7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6, -0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5, -0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0, 3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8)) ggplot(dtemp, aes(x = months, y = temp, group = city, color = city)) + geom_line() + geom_point(size = 1.1) + ggtitle("Monthly Average Temperature") + theme_hc() + scale_colour_hc() ggplot(dtemp, aes(x = months, y = temp, group = city, color = city)) + geom_line() + geom_point(size = 1.1) + ggtitle("Monthly Average Temperature") + theme_hc(bgcolor = "darkunica") + scale_fill_hc("darkunica") } \references{ \url{https://www.highcharts.com/demo/highcharts/line-chart} } \concept{themes hc} ggthemes/man/ggthemes_data.Rd0000644000176200001440000000062414561020227015714 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ggthemes_data.R \docType{data} \name{ggthemes_data} \alias{ggthemes_data} \title{Palette and theme data} \format{ A \code{list} object. } \usage{ ggthemes_data } \description{ The \code{ggthemes} environment contains various values used in themes and palettes. This is undocumented and subject to change. } \keyword{datasets} ggthemes/man/wsj_pal.Rd0000644000176200001440000000231214561300577014564 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wsj.R \name{wsj_pal} \alias{wsj_pal} \title{Wall Street Journal color palette (discrete)} \usage{ wsj_pal(palette = "colors6") } \arguments{ \item{palette}{\code{character} The color palette to use: . \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$wsj$palettes))}} } \description{ The Wall Street Journal uses many different color palettes in its plots. This collects a few of them, but is by no means exhaustive. Collections of these plots can be found on the WSJ Graphics \href{https://twitter.com/WSJGraphics}{Twitter} feed and \href{https://pinterest.com/wsjgraphics/wsj-graphics/}{Pinterest}. } \section{Palettes}{ The following palettes are defined, \describe{ \item{rgby}{Red/Green/Blue/Yellow theme.} \item{red_green}{Green/red two-color scale for good/bad.} \item{green_black}{Black-green 4-color scale for 'Very negative', 'Somewhat negative', 'somewhat positive', 'very positive'.} \item{dem_rep}{Democrat/Republican/Undecided blue/red/gray scale.} \item{colors6}{Red, blue, gold, green, orange, and black palette.} } } \seealso{ Other colour wsj: \code{\link{scale_colour_wsj}()} } \concept{colour wsj} ggthemes/man/tableau_gradient_pal.Rd0000644000176200001440000000327514561277522017267 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{tableau_gradient_pal} \alias{tableau_gradient_pal} \alias{tableau_seq_gradient_pal} \alias{tableau_div_gradient_pal} \title{Tableau colour gradient palettes (continuous)} \usage{ tableau_gradient_pal(palette = "Blue", type = "ordered-sequential") tableau_seq_gradient_pal(palette = "Blue", ...) tableau_div_gradient_pal(palette = "Orange-Blue Diverging", ...) } \arguments{ \item{palette}{Palette name. \describe{ \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} }} \item{type}{Palette type, either \code{"ordered-sequential"} or \code{"ordered-diverging"}.} \item{...}{Arguments passed to \code{tableau_gradient_pal}.} } \description{ Gradient color palettes using the diverging and sequential continous color palettes in Tableau. See \funclink{tableau_color_pal} for discrete color palettes. } \examples{ library("scales") x <- seq(0, 1, length = 25) r <- sqrt(outer(x ^ 2, x ^ 2, "+")) palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-sequential"]] for (palname in names(palettes)) { col <- tableau_seq_gradient_pal(palname)(seq(0, 1, length = 12)) image(r, col = col) title(main = palname) } } \seealso{ Other colour tableau: \code{\link{scale_colour_gradient2_tableau}()}, \code{\link{scale_colour_gradient_tableau}()}, \code{\link{scale_colour_tableau}()}, \code{\link{tableau_color_pal}()} } \concept{colour tableau} ggthemes/man/show_shapes.Rd0000644000176200001440000000126714561020227015447 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/show.R \name{show_shapes} \alias{show_shapes} \title{Show shapes} \usage{ show_shapes(shapes, labels = TRUE) } \arguments{ \item{shapes}{A numeric or character vector of shapes. See \code{\link[graphics]{par}()}.} \item{labels}{Include the plotting character value of the symbol.} } \value{ This function called for the side effect of creating a plot. It returns \code{shapes}. } \description{ A quick and dirty way to show shapes. } \examples{ library("scales") show_shapes(shape_pal()(5)) show_shapes(shape_pal()(3), labels = TRUE) } \seealso{ \code{\link[scales]{show_col}()}, \code{\link{show_linetypes}()} } ggthemes/man/theme_foundation.Rd0000644000176200001440000000243014561020227016445 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/theme-foundation.R \name{theme_foundation} \alias{theme_foundation} \title{Foundation Theme} \usage{ theme_foundation(base_size = 12, base_family = "") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ This theme is designed to be a foundation from which to build new themes, and not meant to be used directly. \code{theme_foundation()} is a complete theme with only minimal number of elements defined. It is easier to create new themes by extending this one rather than \code{\link[ggplot2]{theme_gray}()} or \code{\link[ggplot2]{theme_bw}()}, because those themes define elements deep in the hierarchy. } \details{ This theme takes \code{\link[ggplot2]{theme_gray}()} and sets all \code{colour} and \code{fill} values to \code{NULL}, except for the top-level elements (\code{line}, \code{rect}, and \code{title}), which have \code{colour = "black"}, and \code{fill = "white"}. This leaves the spacing and-non colour defaults of the default \pkg{ggplot2} themes in place. } \seealso{ Other themes: \code{\link{theme_base}()}, \code{\link{theme_clean}()}, \code{\link{theme_igray}()}, \code{\link{theme_par}()}, \code{\link{theme_solid}()} } \concept{themes} ggthemes/man/geom_rangeframe.Rd0000644000176200001440000000743314561050522016244 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/geom-rangeframe.R \docType{data} \name{geom_rangeframe} \alias{geom_rangeframe} \alias{GeomRangeFrame} \title{Range Frames} \usage{ geom_rangeframe( mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., sides = "bl", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE ) } \arguments{ \item{mapping}{Set of aesthetic mappings created by \code{\link[ggplot2:aes]{aes()}}. If specified and \code{inherit.aes = TRUE} (the default), it is combined with the default mapping at the top level of the plot. You must supply \code{mapping} if there is no plot mapping.} \item{data}{The data to be displayed in this layer. There are three options: If \code{NULL}, the default, the data is inherited from the plot data as specified in the call to \code{\link[ggplot2:ggplot]{ggplot()}}. A \code{data.frame}, or other object, will override the plot data. All objects will be fortified to produce a data frame. See \code{\link[ggplot2:fortify]{fortify()}} for which variables will be created. A \code{function} will be called with a single argument, the plot data. The return value must be a \code{data.frame}, and will be used as the layer data. A \code{function} can be created from a \code{formula} (e.g. \code{~ head(.x, 10)}).} \item{stat}{The statistical transformation to use on the data for this layer, either as a \code{ggproto} \code{Geom} subclass or as a string naming the stat stripped of the \code{stat_} prefix (e.g. \code{"count"} rather than \code{"stat_count"})} \item{position}{Position adjustment, either as a string naming the adjustment (e.g. \code{"jitter"} to use \code{position_jitter}), or the result of a call to a position adjustment function. Use the latter if you need to change the settings of the adjustment.} \item{...}{Other arguments passed on to \code{\link[ggplot2:layer]{layer()}}. These are often aesthetics, used to set an aesthetic to a fixed value, like \code{colour = "red"} or \code{size = 3}. They may also be parameters to the paired geom/stat.} \item{sides}{A string that controls which sides of the plot the frames appear on. It can be set to a string containing any of \code{'trbl'}, for top, right, bottom, and left.} \item{na.rm}{If \code{FALSE}, the default, missing values are removed with a warning. If \code{TRUE}, missing values are silently removed.} \item{show.legend}{logical. Should this layer be included in the legends? \code{NA}, the default, includes if any aesthetics are mapped. \code{FALSE} never includes, and \code{TRUE} always includes. It can also be a named logical vector to finely select the aesthetics to display.} \item{inherit.aes}{If \code{FALSE}, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn't inherit behaviour from the default plot specification, e.g. \code{\link[ggplot2:borders]{borders()}}.} } \description{ Axis lines which extend to the maximum and minimum of the plotted data. } \details{ This should be used with `coord_cartesian(clip="off")` in order to correctly draw the lines. } \section{Aesthetics}{ \itemize{ \item colour \item size \item linetype \item alpha } } \examples{ library("ggplot2") ggplot(mtcars, aes(wt, mpg)) + geom_point() + geom_rangeframe() + coord_cartesian(clip="off") + theme_tufte() # In the example above, # `coord_cartesian(clip="off")`` ensures that the full width of the line is drawn. # if you know a better way to fix this, # please open an issue or PR on github https://github.com/jrnold/ggthemes/issue } \references{ Tufte, Edward R. (2001) The Visual Display of Quantitative Information, Chapter 6. } \seealso{ Other geom tufte: \code{\link{geom_tufteboxplot}()} } \concept{geom tufte} \keyword{datasets} ggthemes/man/stata_shape_pal.Rd0000644000176200001440000000064014561020227016246 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{stata_shape_pal} \alias{stata_shape_pal} \title{Stata shape palette (discrete)} \usage{ stata_shape_pal() } \description{ Shape palette based on the symbol palette in Stata used in scheme s2mono. This palette supports up to 10 values. } \seealso{ See \code{\link{scale_shape_stata}()} for examples. } \concept{shapes stata} ggthemes/man/scale_calc.Rd0000644000176200001440000000676114561050522015202 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/calc.R \name{scale_fill_calc} \alias{scale_fill_calc} \alias{scale_colour_calc} \alias{scale_color_calc} \title{LibreOffice Calc color scales} \usage{ scale_fill_calc(...) scale_colour_calc(...) scale_color_calc(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Color scales from LibreOffice Calc. } \seealso{ See \code{\link{theme_calc}()} for examples. Other colour calc: \code{\link{calc_pal}()} } \concept{colour calc} ggthemes/man/solarized_rebase.Rd0000644000176200001440000000103114561020227016426 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/solarized.R \name{solarized_rebase} \alias{solarized_rebase} \title{Base colors for Solarized light and dark themes} \usage{ solarized_rebase(light = TRUE) } \arguments{ \item{light}{\code{logical} Light theme? Creates the base colors for a light or dark solarized theme. See \url{https://ethanschoonover.com/solarized/}. This function is a port of the CSS style example.} } \description{ Base colors for Solarized light and dark themes } \keyword{internal} ggthemes/man/scale_color_tableau.Rd0000644000176200001440000000353714561020227017110 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{scale_colour_tableau} \alias{scale_colour_tableau} \alias{scale_fill_tableau} \alias{scale_color_tableau} \title{Tableau color scales (discrete)} \usage{ scale_colour_tableau( palette = "Tableau 10", type = "regular", direction = 1, ... ) scale_fill_tableau( palette = "Tableau 10", type = "regular", direction = 1, ... ) scale_color_tableau( palette = "Tableau 10", type = "regular", direction = 1, ... ) } \arguments{ \item{palette}{Palette name. See \funclink{tableau_color_pal} for available palettes.} \item{type}{Palette type. One of \code{"regular"}, \code{"sequential"}, or \code{"diverging"}. See \funclink{tableau_color_pal}.} \item{direction}{If 1, the default, then use the original order of colors. If -1, then reverse the order.} \item{...}{Other arguments passed on to \funclink{discrete_scale}.} } \description{ Categorical (qualitative) color scales used in Tableau. Use the function \funclink{scale_colour_gradient_tableau} for the sequential and \funclink{scale_colour_gradient2_tableau} for the diverging continuous color scales from Tableu. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + theme_igray() palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["regular"]] for (palette in head(names(palettes), 3L)) { print(p + scale_colour_tableau(palette) + ggtitle(palette)) } # the order of colour can be reversed p + scale_color_tableau(direction = -1) } \seealso{ \code{\link{tableau_color_pal}()} for references. Other colour tableau: \code{\link{scale_colour_gradient2_tableau}()}, \code{\link{scale_colour_gradient_tableau}()}, \code{\link{tableau_color_pal}()}, \code{\link{tableau_gradient_pal}()} } \concept{colour tableau} ggthemes/man/scale_colour_canva.Rd0000644000176200001440000000127114561020227016741 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/canva.R \name{scale_colour_canva} \alias{scale_colour_canva} \alias{scale_color_canva} \alias{scale_fill_canva} \title{Discrete color scale using canva.com color palettes} \usage{ scale_colour_canva(..., palette = "Fresh and bright") scale_color_canva(..., palette = "Fresh and bright") scale_fill_canva(..., palette = "Fresh and bright") } \arguments{ \item{...}{Arguments passed to \code{\link{discrete_scale}()}.} \item{palette}{Palette name. See the names of \code{\link{canva_palettes}()} for valid names.} } \description{ Color scale for canva.com color palettes described in \code{\link{canva_palettes}()}. } ggthemes/man/ptol_pal.Rd0000644000176200001440000000153214561020227014731 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ptol.R \name{ptol_pal} \alias{ptol_pal} \title{Color Palettes from Paul Tol's "Colour Schemes"} \usage{ ptol_pal() } \description{ Qualitative color palettes from Paul Tol, \href{https://personal.sron.nl/~pault/}{"Colour Schemes"}. } \details{ Incorporation of the palette into an R package was originally inspired by Peter Carl's [Paul Tol 21 Gun Salute](https://tradeblotter.wordpress.com/2013/02/28/the-paul-tol-21-color-salute/) } \examples{ library("scales") show_col(ptol_pal()(6)) show_col(ptol_pal()(4)) show_col(ptol_pal()(12)) } \references{ Paul Tol. 2012. "Colour Schemes." SRON Technical Note, SRON/EPS/TN/09-002. \url{https://personal.sron.nl/~pault/data/colourschemes.pdf} } \seealso{ Other colour ptol: \code{\link{scale_colour_ptol}()} } \concept{colour ptol} ggthemes/man/few_pal.Rd0000644000176200001440000000247614561020227014544 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/few.R \name{few_pal} \alias{few_pal} \title{Color Palettes Few "Show Me the Numbers"} \usage{ few_pal(palette = "Medium") } \arguments{ \item{palette}{One of \Sexpr[results=rd]{names(ggthemes:::rd_optlist(ggthemes::ggthemes_data$few$colors))}} } \description{ Qualitative color palettes from Stephen Few (2012) \emph{Show Me the Numbers}. There are three palettes: Light, Medium, and Dark. Each palette comprises nine colors: gray, blue, orange, green, pink, brown, purple, yellow, red. For \code{n = 1}, gray is used. For \code{n > 1}, the eight non-gray colors are used. } \details{ Use the light palette for filled areas, such as bar charts. Use the medium palette for points and lines. Use the dark palette for highlighting specific points or for small and thin lines and points. } \examples{ library("scales") show_col(few_pal()(7)) show_col(few_pal("Dark")(7)) show_col(few_pal("Light")(7)) } \references{ Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}. 2nd edition. Analytics Press. \href{https://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf}{"Practical Rules for Using Color in Charts"}. } \seealso{ Other colour few: \code{\link{scale_colour_few}()} } \concept{colour few} ggthemes/man/stat_fivenumber.Rd0000644000176200001440000000643514561050522016324 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stat-fivenumber.R \docType{data} \name{stat_fivenumber} \alias{stat_fivenumber} \alias{StatFivenumber} \title{Calculate components of a five-number summary} \usage{ stat_fivenumber( mapping = NULL, data = NULL, geom = "boxplot", probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = FALSE, position = "identity", show.legend = NA, inherit.aes = TRUE, ... ) } \arguments{ \item{mapping}{Set of aesthetic mappings created by \code{\link[ggplot2:aes]{aes()}}. If specified and \code{inherit.aes = TRUE} (the default), it is combined with the default mapping at the top level of the plot. You must supply \code{mapping} if there is no plot mapping.} \item{data}{The data to be displayed in this layer. There are three options: If \code{NULL}, the default, the data is inherited from the plot data as specified in the call to \code{\link[ggplot2:ggplot]{ggplot()}}. A \code{data.frame}, or other object, will override the plot data. All objects will be fortified to produce a data frame. See \code{\link[ggplot2:fortify]{fortify()}} for which variables will be created. A \code{function} will be called with a single argument, the plot data. The return value must be a \code{data.frame}, and will be used as the layer data. A \code{function} can be created from a \code{formula} (e.g. \code{~ head(.x, 10)}).} \item{geom}{The geometric object to use to display the data, either as a \code{ggproto} \code{Geom} subclass or as a string naming the geom stripped of the \code{geom_} prefix (e.g. \code{"point"} rather than \code{"geom_point"})} \item{probs}{Quantiles to use for the five number summary.} \item{na.rm}{If \code{FALSE} (the default), removes missing values with a warning. If \code{TRUE} silently removes missing values.} \item{position}{Position adjustment, either as a string naming the adjustment (e.g. \code{"jitter"} to use \code{position_jitter}), or the result of a call to a position adjustment function. Use the latter if you need to change the settings of the adjustment.} \item{show.legend}{logical. Should this layer be included in the legends? \code{NA}, the default, includes if any aesthetics are mapped. \code{FALSE} never includes, and \code{TRUE} always includes. It can also be a named logical vector to finely select the aesthetics to display.} \item{inherit.aes}{If \code{FALSE}, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn't inherit behaviour from the default plot specification, e.g. \code{\link[ggplot2:borders]{borders()}}.} \item{...}{Other arguments passed on to \code{\link[ggplot2:layer]{layer()}}. These are often aesthetics, used to set an aesthetic to a fixed value, like \code{colour = "red"} or \code{size = 3}. They may also be parameters to the paired geom/stat.} } \value{ A data frame with additional columns: \item{width}{width of boxplot} \item{min}{minimum} \item{lower}{lower hinge, 25\% quantile} \item{middle}{median, 50\% quantile} \item{upper}{upper hinge, 75\% quantile} \item{max}{maximum} } \description{ The five number summary of a sample is the minimum, first quartile, median, third quartile, and maximum. } \seealso{ \code{\link[ggplot2]{stat_boxplot}()} } \keyword{datasets} ggthemes/man/economist_pal.Rd0000644000176200001440000000117514561020227015756 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/economist.R \name{economist_pal} \alias{economist_pal} \title{Economist color palette (discrete)} \usage{ economist_pal(fill = TRUE) } \arguments{ \item{fill}{Use the fill palette.} } \description{ The hues in the palette are blues, grays, and greens. Red is not included in these palettes and should be used to indicate important data. } \examples{ library("scales") show_col(economist_pal()(6)) ## fill palette show_col(economist_pal(fill = TRUE)(6)) } \seealso{ Other colour economist: \code{\link{scale_colour_economist}()} } \concept{colour economist} ggthemes/man/few_shape_pal.Rd0000644000176200001440000000076114561020227015717 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/few.R \name{few_shape_pal} \alias{few_shape_pal} \title{Shape palette from "Show Me the Numbers" (discrete)} \usage{ few_shape_pal() } \description{ Shape palette from Stephen Few's, "Show Me the Numbers". The shape palette consists of five shapes: circle, square, triangle, plus, times. } \references{ Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}, Analytics Press, p. 208. } ggthemes/man/scale_colour_gradient2_tableau.Rd0000644000176200001440000000431014561277522021236 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{scale_colour_gradient2_tableau} \alias{scale_colour_gradient2_tableau} \alias{scale_fill_gradient2_tableau} \alias{scale_color_gradient2_tableau} \title{Tableau diverging colour scales (continuous)} \usage{ scale_colour_gradient2_tableau( palette = "Orange-Blue Diverging", ..., na.value = "grey50", guide = "colourbar" ) scale_fill_gradient2_tableau( palette = "Orange-Blue Diverging", ..., na.value = "grey50", guide = "colourbar" ) scale_color_gradient2_tableau( palette = "Orange-Blue Diverging", ..., na.value = "grey50", guide = "colourbar" ) } \arguments{ \item{palette}{Palette name. \describe{ \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} }} \item{...}{Arguments passed to \code{tableau_gradient_pal}.} \item{na.value}{Colour to use for missing values} \item{guide}{Type of legend. Use \code{'colourbar'} for continuous colour bar, or \code{'legend'} for discrete colour legend.} } \description{ Continuous color scales using the diverging color scales in Tableau. See \funclink{scale_colour_tableau} for Tabaleau discrete color scales, and \funclink{scale_colour_gradient_tableau} for sequential color scales. } \examples{ library("ggplot2") df <- data.frame( x = runif(100), y = runif(100), z1 = rnorm(100), z2 = abs(rnorm(100)) ) p <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z2)) palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-diverging"]] for (palette in head(names(palettes))) { print(p + scale_colour_gradient2_tableau(palette) + ggtitle(palette)) } # If you need to reverse a palette, use a transformation p + scale_colour_gradient2_tableau(trans = "reverse") } \seealso{ Other colour tableau: \code{\link{scale_colour_gradient_tableau}()}, \code{\link{scale_colour_tableau}()}, \code{\link{tableau_color_pal}()}, \code{\link{tableau_gradient_pal}()} } \concept{colour tableau} ggthemes/man/gdocs_pal.Rd0000644000176200001440000000064114561277521015065 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gdocs.R \name{gdocs_pal} \alias{gdocs_pal} \title{Google Docs color palette (discrete)} \usage{ gdocs_pal() } \description{ Color palettes from Google Docs. This palette includes 20 colors. } \examples{ library("scales") show_col(gdocs_pal()(24)) } \seealso{ Other colour gdocs: \code{\link{scale_fill_gdocs}()} } \concept{colour gdocs} ggthemes/man/scale_gdocs.Rd0000644000176200001440000000676314561050522015401 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gdocs.R \name{scale_fill_gdocs} \alias{scale_fill_gdocs} \alias{scale_colour_gdocs} \alias{scale_color_gdocs} \title{Google Docs color scales} \usage{ scale_fill_gdocs(...) scale_colour_gdocs(...) scale_color_gdocs(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Color scales from Google Docs. } \seealso{ See \code{\link{theme_gdocs}()} for examples. Other colour gdocs: \code{\link{gdocs_pal}()} } \concept{colour gdocs} ggthemes/man/scale_economist.Rd0000644000176200001440000000707114561050522016273 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/economist.R \name{scale_colour_economist} \alias{scale_colour_economist} \alias{scale_color_economist} \alias{scale_fill_economist} \title{Economist color scales} \usage{ scale_colour_economist(...) scale_color_economist(...) scale_fill_economist(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Color scales using the colors in the Economist graphics. } \seealso{ \code{\link{theme_economist}()} for examples. Other colour economist: \code{\link{economist_pal}()} } \concept{colour economist} ggthemes/man/canva_palettes.Rd0000644000176200001440000000405114561020227016107 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/canva.R \docType{data} \name{canva_palettes} \alias{canva_palettes} \title{150 Color Palettes from Canva} \format{ A named \code{list} of character vector. The names are the palette names. The values of the character vectors are hex colors, e.g. \code{"#f98866"}. } \usage{ canva_palettes } \description{ 150 four-color palettes by the \href{https://www.canva.com/learn/}{canva.com} design school. These palettes were derived from photos and "impactful websites". } \examples{ require("ggplot2") require("tibble") if (require("purrr") && require("scales") && require("dplyr")) { canva_df <- map2_df( canva_palettes, names(canva_palettes), ~ tibble( colors = .x, .id = seq_along(colors), palette = .y ) ) ggplot(canva_df, aes( y = palette, x = .id, fill = colors )) + geom_raster() + scale_fill_identity(guide = FALSE) + theme_minimal() + theme(panel.grid = element_blank(), axis.text.x = element_blank()) + labs(x = "", y = "") show_col(canva_pal("Fresh and bright")(4)) show_col(canva_pal("Cool blues")(4)) show_col(canva_pal("Modern and crisp")(4)) } } \references{ \itemize{ \item{Janie Kliever, \href{https://www.canva.com/learn/100-color-combinations/}{100 Brilliant Color Combinations and How to Apply Them to Your Designs}, \emph{Canva.com}, June 20, 2015.} \item{Mary Stribley, \href{https://www.canva.com/learn/website-color-schemes/}{Website Color Schemes: The Palettes of 50 Visually Impactful Websites to Inspire You}, \emph{Canva.com}, January 26, 2016.} \item{Schwabish, Jonathan. \href{https://policyviz.com/2017/01/12/150-color-palettes-for-excel/}{150+ Color Palettes for Excel}, \emph{PolicyViz}, January 12, 2017.} } } \keyword{datasets} ggthemes/man/scale_excel_new.Rd0000644000176200001440000001014014561050522016233 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{scale_colour_excel_new} \alias{scale_colour_excel_new} \alias{scale_color_excel_new} \alias{scale_fill_excel_new} \title{Excel (current versions) color scales} \usage{ scale_colour_excel_new(theme = "Office Theme", ...) scale_color_excel_new(theme = "Office Theme", ...) scale_fill_excel_new(theme = "Office Theme", ...) } \arguments{ \item{theme}{The name of the Office theme or color theme (not to be confused with ggplot2 themes) from which to derive the color palette. Available themes include: \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$excel$themes))}} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Discrete color scales used in current versions of Microsoft Office and Excel. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel_new() + scale_colour_excel_new() } \seealso{ Other colour excel: \code{\link{excel_new_pal}()}, \code{\link{excel_pal}()}, \code{\link{scale_fill_excel}()} } \concept{colour excel} ggthemes/man/theme_base.Rd0000644000176200001440000000147214561020227015216 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/base.R \name{theme_base} \alias{theme_base} \title{Theme Base} \usage{ theme_base(base_size = 16, base_family = "") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme similar to the default settings of the \sQuote{base} R graphics. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_base() # Change values of par par(fg = "blue", bg = "gray", col.lab = "red", font.lab = 3) p + theme_base() } \seealso{ Other themes: \code{\link{theme_clean}()}, \code{\link{theme_foundation}()}, \code{\link{theme_igray}()}, \code{\link{theme_par}()}, \code{\link{theme_solid}()} } \concept{themes} ggthemes/man/scale_solarized.Rd0000644000176200001440000000747014561050522016272 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/solarized.R \name{scale_fill_solarized} \alias{scale_fill_solarized} \alias{scale_colour_solarized} \alias{scale_color_solarized} \title{Solarized color scales} \usage{ scale_fill_solarized(accent = "blue", ...) scale_colour_solarized(accent = "blue", ...) scale_color_solarized(accent = "blue", ...) } \arguments{ \item{accent}{\code{character} Starting color.} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ See \code{\link{solarized_pal}()} for details. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_solarized() + scale_colour_solarized() } \seealso{ Other solarized colour: \code{\link{solarized_pal}()} } \concept{colour scales} \concept{solarized colour} ggthemes/man/scale_shape_tremmel.Rd0000644000176200001440000000716614561050522017125 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{scale_shape_tremmel} \alias{scale_shape_tremmel} \title{Shape scales from Tremmel (1995)} \usage{ scale_shape_tremmel(overlap = FALSE, alt = TRUE, ...) } \arguments{ \item{overlap}{use an empty circle instead of a solid circle when \code{n == 2}.} \item{alt}{If \code{TRUE}, then when \code{n == 3}, use a solid circle, plus sign and empty triangle. Otherwise use a solid circle, empty circle, and empty triangle.} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Shape scales from Tremmel (1995) } \examples{ library("ggplot2") p <- ggplot(mtcars, aes(x = mpg, y = hp, shape = factor(cyl))) + geom_point() p + scale_shape_tremmel() p + scale_shape_tremmel(alt = TRUE) p + scale_shape_tremmel(overlap = TRUE) } \seealso{ \code{\link{tremmel_shape_pal}()} for a description of the palette. Other shapes: \code{\link{circlefill_shape_pal}()}, \code{\link{cleveland_shape_pal}()}, \code{\link{scale_shape_circlefill}()}, \code{\link{scale_shape_cleveland}()}, \code{\link{tremmel_shape_pal}()} } \concept{shapes} ggthemes/man/theme_fivethirtyeight.Rd0000644000176200001440000000131514561274747017540 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fivethirtyeight.R \name{theme_fivethirtyeight} \alias{theme_fivethirtyeight} \title{Theme inspired by FiveThirtyEight plots} \usage{ theme_fivethirtyeight(base_size = 12, base_family = "sans") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme inspired by the plots from FiveThirtyEight.com. } \examples{ library("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + facet_wrap(~am) + geom_smooth(method = "lm", se = FALSE) + scale_color_fivethirtyeight() + theme_fivethirtyeight() p } \concept{themes fivethirtyeight} ggthemes/man/show_linetypes.Rd0000644000176200001440000000130414561020227016170 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/show.R \name{show_linetypes} \alias{show_linetypes} \title{Show linetypes} \usage{ show_linetypes(linetypes, labels = TRUE) } \arguments{ \item{linetypes}{A character vector of linetypes. See \code{\link{par}()}.} \item{labels}{Label each line with its linetype (lty) value.} } \value{ This function called for the side effect of creating a plot. It returns \code{linetypes}. } \description{ A quick and dirty way to show linetypes. } \examples{ library("scales") show_linetypes(linetype_pal()(3)) show_linetypes(linetype_pal()(3), labels = TRUE) } \seealso{ \code{\link[scales]{show_col}()}, \code{\link{show_linetypes}()} } ggthemes/man/cleveland_shape_pal.Rd0000644000176200001440000000410714561277521017104 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{cleveland_shape_pal} \alias{cleveland_shape_pal} \title{Shape palette from Cleveland "Elements of Graphing Data" (discrete).} \usage{ cleveland_shape_pal(overlap = TRUE) } \arguments{ \item{overlap}{\code{logical} Use the scale for overlapping points?} } \description{ Shape palettes for overlapping and non-overlapping points. } \note{ In the \emph{Elements of Graphing Data}, W.S. Cleveland suggests two shape palettes for scatter plots: one for overlapping data and another for non-overlapping data. The symbols for overlapping data relies on pattern discrimination, while the symbols for non-overlapping data vary the amount of fill. This palette attempts to create these palettes. However, I found that these were hard to replicate. Using the R shapes and unicode fonts: the symbols can vary in size, they are dependent of the fonts used, and there does not exist a unicode symbol for a circle with a vertical line. If someone can improve this palette, please let me know. Following Tremmel (1995), I replace the circle with a vertical line with an encircled plus sign. The palette \code{cleveland_shape_pal()} supports up to five values. } \examples{ ### (discrete). \dontrun{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) + theme_bw() # overlapping symbol palette p + scale_shape_cleveland() # non-overlapping symbol palette p + scale_shape_cleveland(overlap = FALSE) } } \references{ Cleveland WS. \emph{The Elements of Graphing Data}. Revised Edition. Hobart Press, Summit, NJ, 1994, pp. 154-164, 234-239. Tremmel, Lothar, (1995) "The Visual Separability of Plotting Symbols in Scatterplots", \emph{Journal of Computational and Graphical Statistics}, \url{https://www.jstor.org/stable/1390760} } \seealso{ Other shapes: \code{\link{circlefill_shape_pal}()}, \code{\link{scale_shape_circlefill}()}, \code{\link{scale_shape_cleveland}()}, \code{\link{scale_shape_tremmel}()}, \code{\link{tremmel_shape_pal}()} } \concept{shapes} ggthemes/man/palette_pander.Rd0000644000176200001440000000133114561020227016103 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pander.R \name{palette_pander} \alias{palette_pander} \title{Color palette from the pander package} \usage{ palette_pander(n, random_order = FALSE) } \arguments{ \item{n}{number of colors. This palette supports up to eight colors.} \item{random_order}{if the palette should be reordered randomly before rendering each plot to get colorful images} } \description{ The \pkg{pander} ships with a default colorblind and printer-friendly color palette borrowed from \verb{https://jfly.iam.u-tokyo.ac.jp/color/}. } \examples{ \dontrun{ palette_pander(TRUE) } } \seealso{ Other colour pander: \code{\link{scale_color_pander}()} } \concept{colour pander} ggthemes/man/scale_shape_few.Rd0000644000176200001440000000125314561020227016227 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/few.R \name{scale_shape_few} \alias{scale_shape_few} \title{Scales for shapes from "Show Me the Numbers"} \usage{ scale_shape_few(...) } \arguments{ \item{...}{Common \code{\link[ggplot2]{discrete_scale}()} parameters.} } \description{ \code{scale_shape_few()} maps discrete variables to up to five easily discernible shapes. It is based on the shape palette suggested in Few (2012). } \references{ Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}, Analytics Press, p. 208. } \seealso{ \code{\link{scale_shape_few}()} for the shape palette that this scale uses. } ggthemes/man/theme_igray.Rd0000644000176200001440000000236114561020227015415 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/igray.R \name{theme_igray} \alias{theme_igray} \title{Inverse gray theme} \usage{ theme_igray(base_size = 12, base_family = "") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme with white panel and gray background. } \section{Details}{ This theme inverts the colors in the \code{\link[ggplot2]{theme_gray}()}, a white panel and a light gray area around it. This keeps a white background for the color scales like \code{\link[ggplot2]{theme_bw}()}. But by using a gray background, the plot is closer to the typographical color of the document, which is the motivation for using a gray panel in \code{\link[ggplot2]{theme_gray}()}. This is similar to the style of plots in Stata and Tableau. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_igray() } \seealso{ \code{\link[ggplot2]{theme_gray}()}, \code{\link[ggplot2]{theme_bw}()} Other themes: \code{\link{theme_base}()}, \code{\link{theme_clean}()}, \code{\link{theme_foundation}()}, \code{\link{theme_par}()}, \code{\link{theme_solid}()} } \concept{themes} ggthemes/man/stata_pal.Rd0000644000176200001440000000131714561020227015070 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{stata_pal} \alias{stata_pal} \title{Stata color palettes (discrete)} \usage{ stata_pal(scheme = "s2color") } \arguments{ \item{scheme}{\code{character}. One of \code{"s2color"}, \code{"s1rcolor"}, \code{"s1color"}, or \code{"mono"}.} } \description{ Stata color palettes. See Stata documentation for a description of the schemes, \url{https://www.stata.com/help.cgi?schemes}. } \details{ All these palettes support up to 15 values. } \examples{ library("scales") show_col(stata_pal("s2color")(15)) show_col(stata_pal("s1rcolor")(15)) show_col(stata_pal("s1color")(15)) show_col(stata_pal("mono")(15)) } \concept{stata colour} ggthemes/man/calc_shape_pal.Rd0000644000176200001440000000067014561301535016043 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/calc.R \name{calc_shape_pal} \alias{calc_shape_pal} \title{Calc shape palette (discrete)} \usage{ calc_shape_pal() } \description{ Shape palette based on the shapes used in LibreOffice Calc. } \examples{ \dontrun{ library("ggplot2") show_shapes(calc_shape_pal()(13)) } } \seealso{ Other shapes calc: \code{\link{scale_shape_calc}()} } \concept{shapes calc} ggthemes/man/scale_shape_cleveland.Rd0000644000176200001440000000662314561050522017412 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/shapes.R \name{scale_shape_cleveland} \alias{scale_shape_cleveland} \title{Shape scales from Cleveland "Elements of Graphing Data"} \usage{ scale_shape_cleveland(overlap = TRUE, ...) } \arguments{ \item{overlap}{\code{logical} Use the scale for overlapping points?} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{na.value}}{If \code{na.translate = TRUE}, what aesthetic value should the missing values be displayed as? Does not apply to position scales where \code{NA} is always placed at the far right.} \item{\code{aesthetics}}{The names of the aesthetics that this scale works with.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Shape scales from Cleveland "Elements of Graphing Data" } \references{ Cleveland WS. The Elements of Graphing Data. Revised Edition. Hobart Press, Summit, NJ, 1994, pp. 154-164, 234-239. } \seealso{ \code{\link{cleveland_shape_pal}()} for a description of the palette. Other shapes: \code{\link{circlefill_shape_pal}()}, \code{\link{cleveland_shape_pal}()}, \code{\link{scale_shape_circlefill}()}, \code{\link{scale_shape_tremmel}()}, \code{\link{tremmel_shape_pal}()} } \concept{shapes} ggthemes/man/theme_pander.Rd0000644000176200001440000000357014561020227015556 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pander.R \name{theme_pander} \alias{theme_pander} \title{A ggplot theme originated from the pander package} \usage{ theme_pander( base_size = 12, base_family = "sans", nomargin = TRUE, ff = NULL, fc = "black", fs = NULL, gM = TRUE, gm = TRUE, gc = "grey", gl = "dashed", boxes = FALSE, bc = "white", pc = "transparent", lp = "right", axis = 1 ) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{nomargin}{suppress the white space around the plot (boolean)} \item{ff}{font family, like \code{sans}. Deprecated: use \code{base_family} instead.} \item{fc}{font color (name or hexa code)} \item{fs}{font size (integer). Deprecated: use \code{base_size} instead.} \item{gM}{major grid (boolean)} \item{gm}{minor grid (boolean)} \item{gc}{grid color (name or hexa code)} \item{gl}{grid line type (\code{lty})} \item{boxes}{to render a border around the plot or not} \item{bc}{background color (name or hexa code)} \item{pc}{panel background color (name or hexa code)} \item{lp}{legend position} \item{axis}{axis angle as defined in \code{par(les)}} } \description{ The \pkg{pander} ships with a default theme when the 'unify plots' option is enabled via \code{panderOptions}, which is now also available outside of \pkg{pander} internals, like \code{evals}, \code{eval.msgs} or \code{Pandoc.brew}. } \examples{ require("ggplot2") if (require("pander")) { p <- ggplot(mtcars, aes(x = mpg, y = wt)) + geom_point() p + theme_pander() panderOptions("graph.grid.color", "red") p + theme_pander() p <- ggplot(mtcars, aes(wt, mpg, colour = factor(cyl))) + geom_point() p + theme_pander() + scale_color_pander() ggplot(mpg, aes(x = class, fill = drv)) + geom_bar() + scale_fill_pander() + theme_pander() } } ggthemes/man/scale_hc.Rd0000644000176200001440000000730514561301051014661 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/hc.R \name{scale_colour_hc} \alias{scale_colour_hc} \alias{scale_color_hc} \alias{scale_fill_hc} \title{Highcharts color and fill scales} \usage{ scale_colour_hc(palette = "default", ...) scale_color_hc(palette = "default", ...) scale_fill_hc(palette = "default", ...) } \arguments{ \item{palette}{\code{character} The name of the Highcharts theme to use. One of \code{"default"}, or \code{"darkunica"}.} \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Colour and fill scales which use the palettes in \code{\link{hc_pal}()} and are meant for use with \code{\link{theme_hc}()}. } \seealso{ Other colour hc: \code{\link{hc_pal}()} } \concept{colour hc} ggthemes/man/theme_excel.Rd0000644000176200001440000000212014561020227015373 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel.R \name{theme_excel} \alias{theme_excel} \title{ggplot theme based on old Excel plots} \usage{ theme_excel(base_size = 12, base_family = "", horizontal = TRUE) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{horizontal}{\code{logical}. Horizontal axis lines?} } \value{ An object of class \code{\link[ggplot2]{theme}()}. } \description{ Theme to replicate the ugly monstrosity that was the old gray-background Excel chart. Please never use this. This theme should be combined with the \code{\link{scale_colour_excel}()} color scale. } \examples{ library("ggplot2") # Line and scatter plot colors p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel() + scale_colour_excel() # Bar plot (area/fill) colors ggplot(mpg, aes(x = class, fill = drv)) + geom_bar() + scale_fill_excel() + theme_excel() } \seealso{ Other themes excel: \code{\link{theme_excel_new}()} } \concept{themes excel} ggthemes/man/theme_gdocs.Rd0000644000176200001440000000113314561020227015375 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/gdocs.R \name{theme_gdocs} \alias{theme_gdocs} \title{Theme with Google Docs Chart defaults} \usage{ theme_gdocs(base_size = 12, base_family = "sans") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme similar to the default look of charts in Google Docs. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_gdocs() + scale_color_gdocs() } \concept{themes gdocs} ggthemes/man/scale_fivethirtyeight.Rd0000644000176200001440000000721514561050522017511 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fivethirtyeight.R \name{scale_colour_fivethirtyeight} \alias{scale_colour_fivethirtyeight} \alias{scale_color_fivethirtyeight} \alias{scale_fill_fivethirtyeight} \title{FiveThirtyEight color scales} \usage{ scale_colour_fivethirtyeight(...) scale_color_fivethirtyeight(...) scale_fill_fivethirtyeight(...) } \arguments{ \item{...}{ Arguments passed on to \code{\link[ggplot2:discrete_scale]{discrete_scale}} \describe{ \item{\code{palette}}{A palette function that when called with a single integer argument (the number of levels in the scale) returns the values that they should take (e.g., \code{\link[scales:hue_pal]{scales::hue_pal()}}).} \item{\code{breaks}}{One of: \itemize{ \item \code{NULL} for no breaks \item \code{waiver()} for the default breaks (the scale limits) \item A character vector of breaks \item A function that takes the limits as input and returns breaks as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{limits}}{One of: \itemize{ \item \code{NULL} to use the default scale values \item A character vector that defines possible values of the scale and their order \item A function that accepts the existing (automatic) values and returns new ones. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{drop}}{Should unused factor levels be omitted from the scale? The default, \code{TRUE}, uses the levels that appear in the data; \code{FALSE} uses all the levels in the factor.} \item{\code{na.translate}}{Unlike continuous scales, discrete scales can easily show missing values, and do so by default. If you want to remove missing values from a discrete scale, specify \code{na.translate = FALSE}.} \item{\code{scale_name}}{The name of the scale that should be used for error messages associated with this scale.} \item{\code{name}}{The name of the scale. Used as the axis or legend title. If \code{waiver()}, the default, the name of the scale is taken from the first mapping used for that aesthetic. If \code{NULL}, the legend title will be omitted.} \item{\code{labels}}{One of: \itemize{ \item \code{NULL} for no labels \item \code{waiver()} for the default labels computed by the transformation object \item A character vector giving labels (must be same length as \code{breaks}) \item An expression vector (must be the same length as breaks). See ?plotmath for details. \item A function that takes the breaks as input and returns labels as output. Also accepts rlang \link[rlang:as_function]{lambda} function notation. }} \item{\code{guide}}{A function used to create a guide or its name. See \code{\link[ggplot2:guides]{guides()}} for more information.} \item{\code{expand}}{For position scales, a vector of range expansion constants used to add some padding around the data to ensure that they are placed some distance away from the axes. Use the convenience function \code{\link[ggplot2:expansion]{expansion()}} to generate the values for the \code{expand} argument. The defaults are to expand the scale by 5\% on each side for continuous variables, and by 0.6 units on each side for discrete variables.} \item{\code{position}}{For position scales, The position of the axis. \code{left} or \code{right} for y axes, \code{top} or \code{bottom} for x axes.} \item{\code{super}}{The super class to use for the constructed scale} }} } \description{ Color scales using the colors in the FiveThirtyEight graphics. } \seealso{ \code{\link{theme_fivethirtyeight}()} for examples. Other colour fivethirtyeight: \code{\link{fivethirtyeight_pal}()} } \concept{colour fivethirtyeight} ggthemes/man/theme_few.Rd0000644000176200001440000000223114561020227015057 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/few.R \name{theme_few} \alias{theme_few} \title{Theme based on Few's "Practical Rules for Using Color in Charts"} \usage{ theme_few(base_size = 12, base_family = "") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} } \description{ Theme based on the rules and examples from Stephen Few's \emph{Show Me the Numbers} and "Practical Rules for Using Color in Charts". } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_few() + scale_colour_few() p + theme_few() + scale_colour_few("Light") p + theme_few() + scale_colour_few("Dark") ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + theme_few() + scale_shape_few() } \references{ Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}. 2nd edition. Analytics Press. Stephen Few, "Practical Rules for Using Color in Charts", \url{https://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf}. } \concept{themes few} ggthemes/man/theme_stata.Rd0000644000176200001440000000324514561020227015420 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stata.R \name{theme_stata} \alias{theme_stata} \title{Themes based on Stata graph schemes} \usage{ theme_stata(base_size = 11, base_family = "sans", scheme = "s2color") } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{scheme}{One of "s2color", "s2mono", "s1color", "s1rcolor", or "s1mono", "s2manual", "s1manual", or "sj"} } \description{ Themes based on Stata graph schemes } \details{ These themes approximate Stata schemes using the features \pkg{ggplot2}. The graphical models of Stata and ggplot2 differ in various ways that make an exact replication impossible (or more difficult than it is worth). Some features in Stata schemes not in ggplot2: defaults for specific graph types, different levels of titles, captions and notes. These themes also adopt some of the ggplot2 defaults, and more effort was made to match the colors and sizes of major elements than in matching the margins. } \examples{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~ am) + labs(title = "Graphs by car type", x = "Weight (lbs.)", y = "MPG") # s2color p + theme_stata() + scale_colour_stata("s2color") # s2mono p + theme_stata(scheme = "s2mono") + scale_colour_stata("mono") # s1color p + theme_stata(scheme = "s2color") + scale_colour_stata("s1color") # s1rcolor p + theme_stata(scheme = "s1rcolor") + scale_colour_stata("s1rcolor") # s1mono p + theme_stata(scheme = "s1mono") + scale_colour_stata("mono") } \references{ \url{https://www.stata.com/help.cgi?schemes} } \concept{themes stata} ggthemes/man/scale_colour_gradient_tableau.Rd0000644000176200001440000000454114561277522021162 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tableau.R \name{scale_colour_gradient_tableau} \alias{scale_colour_gradient_tableau} \alias{scale_fill_gradient_tableau} \alias{scale_color_gradient_tableau} \alias{scale_color_continuous_tableau} \alias{scale_fill_continuous_tableau} \title{Tableau sequential colour scales (continuous)} \usage{ scale_colour_gradient_tableau( palette = "Blue", ..., na.value = "grey50", guide = "colourbar" ) scale_fill_gradient_tableau( palette = "Blue", ..., na.value = "grey50", guide = "colourbar" ) scale_color_gradient_tableau( palette = "Blue", ..., na.value = "grey50", guide = "colourbar" ) scale_color_continuous_tableau( palette = "Blue", ..., na.value = "grey50", guide = "colourbar" ) scale_fill_continuous_tableau( palette = "Blue", ..., na.value = "grey50", guide = "colourbar" ) } \arguments{ \item{palette}{Palette name. \describe{ \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} }} \item{...}{Arguments passed to \code{tableau_gradient_pal}.} \item{na.value}{Colour to use for missing values} \item{guide}{Type of legend. Use \code{'colourbar'} for continuous colour bar, or \code{'legend'} for discrete colour legend.} } \description{ Continuous color scales using the sequential color palettes in Tableau. See \funclink{scale_colour_tableau} for Tableau discrete color scales, and \funclink{scale_colour_gradient2_tableau} for diverging color scales. } \examples{ library("ggplot2") df <- data.frame( x = runif(100), y = runif(100), z1 = rnorm(100), z2 = abs(rnorm(100)) ) p <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z2)) + theme_igray() palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-sequential"]] for (palette in head(names(palettes))) { print(p + scale_colour_gradient_tableau(palette) + ggtitle(palette)) } } \seealso{ Other colour tableau: \code{\link{scale_colour_gradient2_tableau}()}, \code{\link{scale_colour_tableau}()}, \code{\link{tableau_color_pal}()}, \code{\link{tableau_gradient_pal}()} } \concept{colour tableau} ggthemes/man/theme_tufte.Rd0000644000176200001440000000275614561020227015441 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/tufte.R \name{theme_tufte} \alias{theme_tufte} \title{Tufte Maximal Data, Minimal Ink Theme} \usage{ theme_tufte(base_size = 11, base_family = "serif", ticks = TRUE) } \arguments{ \item{base_size}{base font size, given in pts.} \item{base_family}{base font family} \item{ticks}{\code{logical} Show axis ticks?} } \description{ Theme based on Chapter 6 'Data-Ink Maximization and Graphical Design' of Edward Tufte *The Visual Display of Quantitative Information*. No border, no axis lines, no grids. This theme works best in combination with \code{\link{geom_rug}()} or \code{\link{geom_rangeframe}()}. } \note{ The default font family is set to 'serif' as he uses serif fonts for labels in 'The Visual Display of Quantitative Information'. The serif font used by Tufte in his books is a variant of Bembo, while the sans serif font is Gill Sans. If these fonts are installed on your system, then you can use them with the package \bold{extrafont}. } \examples{ library("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() + scale_x_continuous(breaks = extended_range_breaks()(mtcars$wt)) + scale_y_continuous(breaks = extended_range_breaks()(mtcars$mpg)) + ggtitle("Cars") p + geom_rangeframe() + coord_cartesian(clip="off") + theme_tufte() p + geom_rug() + theme_tufte(ticks = FALSE) } \references{ Tufte, Edward R. (2001) The Visual Display of Quantitative Information, Chapter 6. } \concept{themes tufte} ggthemes/DESCRIPTION0000644000176200001440000000420014561541612013564 0ustar liggesusersPackage: ggthemes Version: 5.1.0 Title: Extra Themes, Scales and Geoms for 'ggplot2' Authors@R: c(person("Jeffrey B.", "Arnold", role = c("aut", "cre"), email = "jeffrey.arnold@gmail.com", comment = ""), person("Gergely", "Daroczi", role = "ctb"), person("Bo", "Werth", role = "ctb"), person("Brian", "Weitzner", role = "ctb"), person("Joshua", "Kunst", role = "ctb"), person("Baptise", "Auguie", role = "ctb"), person("Bob", "Rudis", role = "ctb"), person("Hadley", "Wickham", role = c("ctb"), comment = "Code from the ggplot2 package."), person("Justin", "Talbot", role = "ctb", comment = "Code from the labeling package"), person("Joshua", "London", role = "ctb")) Depends: R (>= 3.3.0) Imports: ggplot2 (>= 3.0.0), graphics, grid, lifecycle, methods, purrr, scales, stringr, tibble Suggests: dplyr, covr, extrafont, glue, knitr, lattice, lintr, maps, mapproj, pander, quantreg, rlang, rmarkdown, spelling, testthat (>= 3.2.0), tidyr, vdiffr, withr Description: Some extra themes, geoms, and scales for 'ggplot2'. Provides 'ggplot2' themes and scales that replicate the look of plots by Edward Tufte, Stephen Few, 'Fivethirtyeight', 'The Economist', 'Stata', 'Excel', and 'The Wall Street Journal', among others. Provides 'geoms' for Tufte's box plot and range frame. License: GPL-2 URL: https://jrnold.github.io/ggthemes/, https://github.com/jrnold/ggthemes BugReports: https://github.com/jrnold/ggthemes/issues RoxygenNote: 7.3.1 LazyData: true Language: en-US Encoding: UTF-8 Config/testthat/edition: 3 NeedsCompilation: no Packaged: 2024-02-09 17:47:25 UTC; jrnold Author: Jeffrey B. Arnold [aut, cre] (), Gergely Daroczi [ctb], Bo Werth [ctb], Brian Weitzner [ctb], Joshua Kunst [ctb], Baptise Auguie [ctb], Bob Rudis [ctb], Hadley Wickham [ctb] (Code from the ggplot2 package.), Justin Talbot [ctb] (Code from the labeling package), Joshua London [ctb] Maintainer: Jeffrey B. Arnold Repository: CRAN Date/Publication: 2024-02-10 00:30:02 UTC ggthemes/build/0000755000176200001440000000000014561462454013167 5ustar liggesusersggthemes/build/ggthemes.pdf0000644000176200001440000130564614561462454015504 0ustar liggesusers%PDF-1.5 % 2 0 obj << /Type /ObjStm /N 100 /First 828 /Length 1379 /Filter /FlateDecode >> stream xXr8+$H聪z5Ue66 .㤿~ -ؘGL,,sWDI@HB)%PpBCDH('!CEPF 1"d3"%Qd(IhAnCAB@gP(P^ Ba%#h +I*?)+ F0lDLxY{<)h',?p?@1UUĜD׈$BO p $$PIßsA8@d+02G/*p#"t@ {42Ht\NhHWYLC$s$Gn8Wp!e:'\ G/p$XQd `á.u62%B'? 'B:6R jE³$.Al4:uI )&+C6 M I:FJ*ա \sHԀ*p5)(Eu"(dP1y<][ǿȗIʊWS$~)kbyvDw5k ]c?^٦;5oc߀j\:7hC#׊y뙛ôȴd&IlkJb&7wGf^L T[n/uޙe:Ki"WtG]Giud8Hl8o$r;xx׍i )7AW\TKg2<š|kqkp]q1&\xg7gu~r;3L=xIb>-Iw{;! hٛ7I}&n[l[v _4SڪL`zLw]~ аĚuz ;H-#f_(j{(L6q/]LE>^>QO޽b&*9%D0!=lqs=zbZaV/QVWvzٹw6^N$n'kq»Xɢy> ";!]oS[֬>:3iw5q鷻:8vݭ~;\X }۟.G{Ixsփ\'[6 O,>4dYvs˾8w&ue P4W>C\6t~Cwb[ | _ endstream endobj 333 0 obj << /Length 903 /Filter /FlateDecode >> stream xڕVMs8Wp[ʖlajLJ؝V krBZ^A^~LnVyQ% h $>tD[rO+6'0AEHc1 "t'Dy0_QBa q6XA)VA8e>F$U|:)X+*%`ֽėt9>Y:3;+sa`]M%˫k94>цY{q{Ə~ì6-B^A݆ S^Blt/tfi,m B Y6X4옖ԩQQY5!Sv%v`u!<%auzڛOBgMy}61HuR^Q-ӽZ:5sͤ$R^R- Hβ4wM:f߁(W]SA.TDEs(7T*~4s;ݱd,lrɽVFJ w&n۞xeu̯BOXlG\Q O|Yփ+O)YJ$,͢٬xnGꔝkw 0K6{Z[u-;/:>5GʊԢVܦk$9D o)-GVC&_%*˞Ԧ ?L*^6[*.T)iS- u-\_> j^-}7~{yh%Rz՟ zBF K7^ʦ}.j^fPGZ>V' G= S= =3y!"r4&7?pC endstream endobj 385 0 obj << /Length 1132 /Filter /FlateDecode >> stream xMo6:(ح0 ;dYehHtӏzsdwuI%D(>χxxݽ]߭CqCz`z, [gއZ}u!Fn&C4iA᱁"m>"q/*%7mw04QGcc VykLO)vJ7U^qR_}+Yf,c|D.Q+յm6yPklc4M&MV7r1 Xg6I9nJyzi.@{ ܥΟߝQKb]_>D i>M4>$Rf|Y'쒃""a`7Z`e"3P3A(ծ9/zQ03)m)QSyK-Lh5e BIMq;?8R֛Ѐ;8dAfxHD*+/娿Tud$vѺc*ʸ`'9 V};sD,*&֕<#N`'NQ|sS#1[Vi yzծՓ(XPq<'d ;OBog5f0~^h:vJgqF>Jtl92 hO}l{n4Q b8@EXۚ(B^n/~c&ꏻS:RƖu|NF1M}飈:?dKQ+ү\(Zˑ=ciDޅ: Q)dS䨝" >cnbdqj3n1Vxܱd=bhTwt/a3{>L#gg _O-\lZ~^bܭ/!ɟvZ= [{xkj>sbFI]|ֺ;4&mSE%AJAm$65`~ٌ qa'/wU endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 882 /Length 1975 /Filter /FlateDecode >> stream xڽ]o8+xPtf;q[][ ly̯( 変*j.,RGb)1(džW/jkmWyr5٫?~bGk:鰥CEP:]n3경,2Y[g:u3M9o,wح`/ppQYY}*ɭ< ft鰡Y}#Y4f;䖞,AwQd-ۉf ѬG;@fМw8Y -(C~0QCy==̕n6ծeTԹwŸZW|RܘZ]~a~ zb$w@>nWն.o^f;U9Kfo,spy[5x&':~=xqJ280\GM[1~F5 B4sVv;cE;nrOn 25#&fVmӶwm^M!ɲ+.{|MO5@x[$rr2+>őϗ[wxrV/w~(wGҿjKs> \rl$t-$/nOd@Py:Cе4[dNZ,D2yJ0}rzRpWwIp'ه oNN:śŇ?ժm/w?ŗmݬjW3^5rx q*FĚKN+FC&EIp Y_Ok+il"[} 9G_nwp@mPo޲cyޏ73#T˛5JNIMKOeHet+RlҳI&=lҳI&=\sI%=\sI%=\sI'=|I'=|I'=B yOŌYUҷ9 Lz#S>;ESkxpn@rr fza;ݯMXIRmeOPa^voKs endstream endobj 466 0 obj << /Length 943 /Filter /FlateDecode >> stream xK6ZF6tz]9 hlZ..0L~}&&X |$Ay T8`1cF0f.՟I[ӆon95ǂc{¡2lDXMJm {}0I7ia~E1^]1'%hGK.X Pwb AH̘80!fHJ#b[0R ^Uj1mFiUOb}<:}_FX+@Ɣe|2zp+=L$v8:282dm+*=p'/~z.]޵}C_AjMdA[+./>xثsc9h~txҧ'P4_=E3 <.fT;#̳vc,rdktD<̜Ϭ 8ˌcoJ>VޤW /| "'o=#t~ nLZWuɩRI+> r<R<#ky[W8iR.;u Mlݾk 1]NX?ԏU|Bw}ԯei?G)_Ɯ:{wkq 3>ԣ^K.젫lˠ$cW4zeUO/x2xna3߬+.IiA4>_=r@=>tƣ_ =v0\xԫaD͸ZݯD:OƫV: ~!ȈX2 "Lc&'͎NO@!> stream xYs6_K rnk;I;WwICK1E$۹v EJl_pD\`?U}wym@pΔs)\.}[#*L' ,H揦A39Yn\͢ηm^ɃEF2tD)}V,vE\&l׾QNf.ZQg\7#"/UmԼ_1/WDsJkhig"lGo[l% :΅`iy[?TQd~mKƄ!Mvo/wȮ"o(N첢-ܙpxѭuPzW.[aFEAee\m2l^W5ʨO>ֶYW8-$#ҡ>KYC31! {$c'0ih;ayx[/{ dbӼ$/wvc{<\6I;<,0p٥;y%;1\ Ogv̜놓H*\f%,$ `!:ɕaX`*vwkb1?OYbLzJRbR]Ŧ{G擭KE"U5w]LB FyG-nXn/0g8zD)'MdE~ue&iy>i/33}Ԉ?dN_'_)$\-E rnKgؠ4}E .ʖl~ OG:DTCk(T'E [狉- Sq広vWBejz3SLEH>>pK֖=M=%Oӹ(gl ARևFg;=':91ӧ"u~7ڶ܋pOv*-͌JE;ʎCt,y @{aBW~ע]> stream xڽVMs6Wpw=86SOZKIIFS)D*X@bx ^N_'H؛.r[@vD;0SJRꕵ^,kNPE( cjb4< Rh* 3;x<0ZZJw1> cz+TqIcZofgv5-}mk X7i]ءj.m.ںM|g U7J윻lV\[?0`tK%1wٰֈh8?&),4GӃkY6_vI ^FvBKx^ Ĩ'0 <&,lB្ԫk(8!;-87fF~!zNݡA6)}6 dXE,U5In2`}RFZچlJh]䶣Ta/lkQWkۂ5{o8e$ F8.=! Ӡu6dU&60'B9;/#:*H˞줨[wr;rq[NC}q+k~ y^O `<|0#vl 1a%Azߌ k<ʛ :)VIWO>K$ 'eG蒸7,eP\y*w{C4Ń*t^ćO@p>{/,&wJB<={+b|<>Ss_>J8+{1J r}uc3~w D}m6…{[ /Y f1Ox,Y`ԇnj^Uf ~3e|yK N׿> endstream endobj 536 0 obj << /Length 790 /Filter /FlateDecode >> stream xڵV]o0}ϯҗ-?I{vR5ۚ*8@!ЬZ{}ιqn28<8LQB0wgh2G#\MNO|} a2 S%yz&e@9Ǔ =⊠9lNmV*-O`u뽫ro><82ܺpZ^VlB`ˀw!H1҄YEl4-U‰m8ߍzJKٶ٤+XaiNkXh8AQ YM޶UfE/ endstream endobj 411 0 obj << /Type /ObjStm /N 100 /First 896 /Length 2118 /Filter /FlateDecode >> stream xڽZo~ A0$1hCZrI'Ò7wX"X&7;qv l-%⌖B6F~S4LZ Z -\ k eåA*ER \-P!U!Sj+)1 Ps,$kȂI6@Je# 7Ԑ+J )Ab3 py Aa l60ɬaܐ T]2%O!,ЊG;Dz J`6H ȩ&nA͵4Z`gQ |%#Df ςͧ+jxF\3`5p |BI> ̶dP`t8Ƽ!g`;CI : Tӄ4T7&Cg :Gj>Щ>Bf)/Tg(v92ΑS] ud! m 6CJY0P)CC"`h1TI;P0I1gӂXs`4I[K.b#;| R`,keaDK=1x@Q2iRXU++(zpB`2_wBRK|,AM '|v98$pY^ f_Ӽ_.oś&^o7};6ِnϟ.v>$ǡ~po`_e$v@?AE`IG=uH[mm'ǖzGrl]w}&"]t}I']t}I']t}iק]v}iק]v}ig]u}Q_3=:?z/9J.f b1PE  5GLb(ڒ6[ _Tp|d,ѴVؠv A !Bج3VK-zU~*j;|z(ZCE%˫F`S|Tϒ [>/E! ;U"˱0-t6|֌6/L`V`ZIlp(RyS|& J,BENy!8ej]h58;kڈ ѷ0.PS5JOIhP$!lUQ|dtl@e>Mr턓a!~^ vUL]o!yԅy^; O3ȢȀxŌQNބH|̏W;օd6"5S`[A,FD=?X*h! hwQ\;A9UZ$䰬ʀT rǓ9D'8Bx*@Pఌ;)(,': {ᤂ>Bx;C~v9Oc5{;_f!5=[K!zNislR kHk/V[)֝9 ٞn/|gٱ}GPGPyiE#D%zS)P;.0E@Q}|/ɏ*W%98ן/./\|AQ!t*ׄ %*a-}efVFCO!*넳o+'H ͷQ=TǤڏ;w*O=#%:,wkw_]\CkFj|oeтS@}{.9?77y8{$'æBS64y}tOP\dY5zp*QjFw4oL#U|”b-upVOk5{rx&vb  endstream endobj 556 0 obj << /Length 1415 /Filter /FlateDecode >> stream xڥW[F~@LfjrM6RlSUid8kj{\ m3w켜<g>[XPY K%qvh>էO F`_vWucȿ5ŀGֈO3WJb㱼p_^Sc1v.#LrݴX^U8l=`! r1Jy#^oQrd]ռiE  `,)03e+۽ZmԃwwkQY!KY5RhUGlg󜗿w7)Ci_bעe!C`}y9KNmӑf] ½ڦ`i͟rnld]Z jlHڿ|ЍrcADNVL>|><sI '$ani% a  FIuY4!ݴ$(|a*Zc(}0r’̿ R6!E jʪ׃@gŮYnsNyBiE(kc_߾84QoYAx%ZFJ#֐Èkш1 wR  kDCU[52z"LTMeY|'MSdwޞF#v _Ggp?Q/iQfWu吏`6 (i}=|A Yx(\6ȊIfHUK#5[<*ju64Y E -*^j ]k>pRp '"`tbu G|522Vhi(1j&cyచgZL h?o,!+^>F&n4֣jy)(uP^/W}$Р m/5\\ h~W)w涭p /s Oi'(dMfr]Bg9CUB"G"1 Qu.ox̅ywǢT㕸Ld0Ij( a8$xɠ({ <^"8jE@|Tэ8UldWf] XrĎbp@C0fl֝ 2|Kt!dqptw0Jab S2ۿЕ8-`E_tGh Ua1$ endstream endobj 572 0 obj << /Length 1313 /Filter /FlateDecode >> stream xڥVKs6Wp|PS⛢=ii&=4vOiFHHBC4FV;o JL9i{]'Ofi$OԹ_9(N,I}wofYxEɂ ` KEQ|?Ж-ZZioSGL#ݶK69}x{jnFWp46{O$ʫrY|5w5X !Pܿx),(8tX%dCs Z떶!5Q241[&5ȐW57jfϭjDp!6j굱\> stream xX[o6~D6Cԭ0tm%.vև(ɒ&_CJHb!xHs!ŜÜw棳D4]ߙwQO||"T]܎GTg˯&."N_go}!OfsYFjޮi zcH?#ud1ؿt-ו=7)Hs~oE=zN]dJ®A5.uv<(aE`匨+;u|꺂|G.3[__GzFs㤲d'C`kE vRy m}FY#*)s]&|KI, 8WD  P9iR4Q&^Y{px lL2Q$u~`&9Z&X=Q_xcP`w2mjMH17M5(\(ɠ7&H=&@`V8.J7d'ZAsmپxБϐ ܳ+$={UZj˾*R( + πKA %l9d%|cg&Mav8&AqDIZ% .WZiKUl=#qfLUj9r #en\ r Ϥ~F"OMG{f%M2s"++=*]PAd[97'T6=TM#u$v #o{RCpRj}y"[c{q5 {(t/pС/;Q (}a(mxgpT [6,Uor@'R'9ڷǮ(F DC7 =ӓ]IID .7qY/JUU: vvrrb{nPʣ^+$ȉd/0d܁K~% v7=tFÓ1ױHR(do49Ԉ!fm)zob2ppPk%祆6ߕj7 8 _զG7fLVY{a7+汣_~Ŷ6u]T/=Tqg' d?G~8gg~ȉFr"*9oh endstream endobj 605 0 obj << /Length 1272 /Filter /FlateDecode >> stream xڵWKo8WF+[!M(#)- ZezUo!9R$v.@Crp#HBmF QI396]9g_H3:q*Kҟ1iف4"2LǾ\NBv:$͍=_iײ s4/,lPwy(f2&Il7!ʘ2_y0VmܟHd/2-4NHb? gٵ0Ϋ盭dm#ⶬD ؟h$-gۭrSCCAb{Yg"AUIlNA1h.u82z;{Q֫=^صCUyi!$#|\ (系aS' NrFnfm3Mi#z}81M\X؈,B6Ǭ N0v6+ߨ7'2Ào"51i H7Ñ>Hp,ڴ,>*(L2M?f!KP#6V q;3¥4C\ύH@8z?ہ"7[zW/Q A)}zz h٤Yv\~.&rYg{ߏŠ^UîxM#"J,DGCR'zOR): >u#yD48On0=tE{FڭhJ2*w滴ݚYa> pu Y(ofF7\Lxqj =0Wrc`~诬1sN.933?lvuʃҽ2$N :Zض5oЂ_҄{Ii|__cǧ *mz-J==\+)zQ!9\in-fi͓s'!-ӯ DLe|^S8w|! UJ0AmiQuO% }Ơke~7ÛtE`8Uԃg6Q|a32T7}Yn=ǣOӊy;:lv|G%=-JqIḤK5P> ]z0ʦIW#{d{5V`਀+YLcVkYK endstream endobj 625 0 obj << /Length 2403 /Filter /FlateDecode >> stream x]۸=P@F\Q絇CzHH6åX6m++KDe/7!eIz7KX~/owon?$"cYċ݂>aHbE"Xm{uZC,B$# :Ʒb$K kD#wU "oוW%AjFպu`SKyOyrOK_ȗRp_pF){,4hBKhH"ea.V,T-[j=? &M!XhI~2"Z!뭜JWì~@+(TRmSՓM#! Hz]ٵʌoȠZ+|UZZu̵76Ց*Y_@zp芮7de#ւ8cwE rH0,bq80f*>wF#YJ64֭/3Dgq"=}[ 4wMi@L+g1A5]٨Q9 '$oawE,y yT%OkXѷvCG&,-G-S`ЋDs@ք!ġ$Q߿5\v^$74!򠺧AWTo1J{(ͯ1tz%>2"2" AF|dȪ B[&ͽA5}-NC@A%~Z70{PSv)&>,&agv`Ӟu5L$hla|6:WmWεf*B~ѶکA=I.M_M`Dn@B0?2A#n;>AJ^ FK(-Y,1a?aӤc&Aۮ8\YébrþշwYyVZYZqw:4{ >Ff3?:{%Ac#kD<.G|>7[pl]sl +] endstream endobj 640 0 obj << /Length 1538 /Filter /FlateDecode >> stream xڵX[8~ϯ@ 6C}igf[i4mV#q$!M16IH "Vy `knanp='5Yƈ|y%y+E%q u6jF"@ P#z clU'ݣ?D9򼴹嗴 UT҂( @o۬gWj>dg3L)&EBtNi3GR?8ő7Q/6oJ!ŁT,\ꞠnԣR_ rS9+2}}zfq`Ji3-"fQS!cef@&hkwcJ]j\xĬ' fy[ ʁë"`?EV |:I6"Az+Y1O<&U `bч߁B@&((95;-_E[nWz;'ϗZK)pK1>-4V8]T7˩̲e*#t\)E 2` 5<6HE;/Z348J9)@e]@圧qԇ>q ]f례P 3EE݃(`NZ9!bCL?_|SuI }T|U  ~bq2hrAoYff}+PZёfڤ"GAߘ[`\eS}N}YS1<ĂC#$Q7[5q%1oPZ vpphvSj r`$xh>\񉯄# ~neexJkAִ|"s*/nB*B09kհsgC]Z^˓r]uUf2қy endstream endobj 657 0 obj << /Length 1289 /Filter /FlateDecode >> stream xV[o6~>@͒u M +5l6Jt!)En4)> ~8=47xRȋ#J€{ɗS+LO?y{C2'hvL/3=r!tC<8=@%$f'+ *u:'~@$^VЂ $ajݓ?iHF =›,H\ʴ\XeF!oA!eONXf^z>;0w"?;-V*+C~q3H GM >Rj++~,5oG tb5kkp4f'3טېc (IAak]y/A?82,.G!c 3 S0Vga ,A4n O kbQӛp 8D0!IX@VNOG2n} nGhW4}DG qgXheCȄ̲'7,%UwҤWā0jk:(~߫UU妱~ XwߢQNi#әY;>N9Wܕ+յZuKC벼FJc2608#j_F{EN2!v{՝)+ݮef=rCIHG֌#=E2Xr.l+F|}\ZcX)鴚2o\+ /":?o,Ȕ0GTbzR_l]{+蒆uY*";vFY%q 8tojj\5zFKCgolY@9T@qb߻._tD+]{I9mO8/\PmE82ѹu# H*+r`OKf ]~p FVd+jǦڅySsxƨXWXC$/ԯAi-VŌ*ٴUW0g//`eJ)R ܪV'DTƈ8q%Ҍxeu!|~_"kd[;i@p [}LW%`Se]n)6*z} v$17Xb˜P7\ET)-Z]> 4Y)S7G\ LD` 6=!wPyہS:[J]t;J4mCb(r b1U5 endstream endobj 549 0 obj << /Type /ObjStm /N 100 /First 885 /Length 2257 /Filter /FlateDecode >> stream xZQo~ׯ З!\rH8 w\hm卭58_oV+]lKZyɥfɏÙof(Q!eMDkEk''-IƝ씵x)N*,y?m@!`EQF,2^`11„#;NX:b(DR//tdȊ,#:T>HJqN&F'89˞ N#re8!)o!rҢ|w6BJ@0E@= M/#N*Nvؠ(3v@$00Kt0ǂ=@Hr<4Ģh4bk0p#:!#v +N#.8^X0̀CV1O-lɸ$ohIz"# )HF:)fU@ǫ(zt^>[t5l-&Ƌ48eK2 HT9>A:=FS0Z#doD1Z=`I P9㘳8 QW7ռQǪxuJlV Vb!yQۢ-^Fύ:#Yݗ/Q-M `y}TuuuzoreV| LqKy߷!>--[оqYZvIsZ  S9eq^6J^(Jeߦߋ I3'ߋ˦_zR]rG&&I!DIya!‰ {nA8=WҾ .?ᮍ]v_e=.I]&=tZ$}XAMIa4cH Ly_w88דYfu Ԗ38VP(I b=`?NgCIb9V QK)&CVseNv,ʫrȓ%'aC΢q)llGHH%,ĨCHK-' _&7P&9l;d<fPu-~v:njuBIS辙Zr+lQ`J\V+3߉\)p\WCv6 G /@rqOY-P}DzjX' s?a 9U 8R/K|r l eMR0oBe Nz(tq:GtrH!!y~W.o־Ňp9,tDŌ@9Qf㫳=ʰ/ܑ}g6 @N,pj0U }8*2^2ͦr~>s>.u'ЎmŬcz$ O.ոyHRzџ5@e ~ mfPDQ?aqOa?Iv%{kA>I Z]+hxNnRNyu5iSZv+Q~C崿0ST쮧0|*l(bD =xk'KAD  \N?`(sv#p9]WwyY/3mu?Juzj%DxȒY\ᑄ`ݿ {Xqd)8hq^LK5FN27-ڣt۟WʡNZ:"Vgcר+$oy^~SP(G1n>R endstream endobj 675 0 obj << /Length 1142 /Filter /FlateDecode >> stream xڵW_o6 lV%ٲc`bm=rm(TGI:r`}Q؉%%(IOV\AXnMQjf- w}ځ4=_eϳY-kpTy)|h&,Dߡ˭?oY`Q: v[J 4_mZXVmjȍY)ɂl+em%Lhul) Nh隟͏Y6ԆP {;/CP I{ΆupJ6@{et֧Tf]v́3FzgԴǪQ++nZVEh!P?yҽXP,k;˾8-rVUn|VbX 4 %<\it_+}B(JWL27,gԧ 胥0YORJ}g1ۥ:*jUPi1ci oMtC`H>An?)8h ̯)W endstream endobj 687 0 obj << /Length 1373 /Filter /FlateDecode >> stream xڵWKo6R >$J ib&7$d-+D+)}gHJUNSk g44x}xz '2X]R"bD`>*IsWѧgR)#i^NW $ ؁9O.whY1.Fvր(0Ҍ$ rr-ʭt#lw æj48I8 7dzW^yEtW5_XW\:ůtk12j7ݲZ0qqI΍;0 /i_y4&B[{*#99\h6N-ŌD "Mzowo VjEp!7V=gߩ7wZ. ;>`^v—/@{oP\-XX{W#mV )un^ fWƭ^н4Y߸sRAB?8^Cj0drcCx Q@2b v[۫ffL -Au슺geWYEo:v!x1gjJ#nϗq^/x#!31-8x -gt,cզhU󰸪mZ p$Vt[зXwf&[qHo,G%,y4h²"DN2 MQUV+|$}`=yja,!)c.J8_x_cL7c,uMCLWb9往T>|צxx~Ӈ م3>YnXM?D+-[- G%r p3t3U&vD D8&郬iY=ɚ=+ >mێkAIaTG:\bEEVڄ>sGAfAWDe"?i7@*蟰ZR;iucmѢo6%Kshj9[TIekyRҍ FItkok"4*LNtecwJ=/ü'̳43UFW/6!G}T&5R;*MG{كpބc+\=Һ$>D3%>PXY:+CCC 䴆T=PzƠg{PqsB;$NEQ_If^u28Ͱ$K1fo[*ڲV̠|ڂgpb-Nj@^> stream xڝYK70)R{ 3Y 6L!] h5%GsoOv>*Eb9Qx3HE",i1S/i_[]ͮGsOoߧh9ri \nwW0#>l 2~->y`#ɁL`\E͟V R@e?+E`ZH'+rnx27Bū7JV|EL ɔъ.$MWmԗM=cgbG`qDz#Q6np(77=NGXGz~ڱj9UM7u{͜ţ̹ޗN͢y^t*FvES9+G}:`[ǫ$/tl^}?]/?5]i-5aY7eYԚw?[;42{)c-.i˞Y?}yg.X,/Ct>~z ?ŇI@e)ـ]YXOdrCdǰMk~rQϩ$ {^9THV@ԻE6Շ;Mk dɾbIxLlYNd!󆝟*a#aQ" ffG5VeO_ik@-=FKlb_t?7'TF"COn dUsvxzuөzZ/Bzuo$cI0kAnCy]@;bAFs|˺}bz*x @޵qƎ4];zv7|5 R\ 1A$ImtU_0*nǣ]2Ir5=U d^8^~Ƴ..xȄmx21X5-uR\u.]BQҌ*?"q592wZ ۩չ3P$ڡTbFp=HP9<Ӭ"|!u3#W=+R0l p"d=!GuxT 3_Ȳp~.iWeY^ztMKk v}HH |ȦcO=Kreޢ,~nΒDY>IP.BзOgjATe`FO1d;u^cr/s715DdF;NdI( |]:3iuj GOPL|MsfF߃(^R[]Ғ'1\'g᷀eE~ e6{ޏ\0t.$&^}h;1F>\iɇ`cuxW1T/|*mBWͨ6f^=3љbWi8a׹uc{ߜ!܍j4VPA~3Ѝ ;WNtX,U J'3sAEm8Jr5U"IC`l9`׭.$NYwMĜd>t̄sqE I{ONYʇXej<'DGL."\ǩwL=Q7MݷM=]D*h H o| WDGpVT& $嬯Zc{f]8X[ÕiAZʣv]-qq]i/r#лfvǰeK>u j^> stream xڝko6{~~մ C&Cak_ڢ%*K$~x,NAywaZYɛ"E^d͗w]G. }ϚG'Ӌ`~f<> g%͗nĢCW_dE<&>&jՎb%|䞨qfg/҂9ߍu-rg3[˖v }-̊m.rkTm0R>B#şg2!`2B 'Kv-:< G, =ܷ&YD NfHMZ"gGfvq9cBoVȨAXbR󫿏^屨iZiv>v|::N'X'",Eg@]ACKnD]U }wz(Պp4pa@˶.ҽ67z#=,עOc.wY~x H4G`ʴq0rcI1dj,Wݺa_H6QN;lZ}{Sl[/x-Z,nnˬU942d"YT(O ou8r>@iq*/iA:u<:Ymu-js/F d)kI:KQW+j0f.2p΢jrѴЅXKPhX*&|+Tub\B%a<NB.0F'8œN.KOu֝ Iat-43tϰ_vr:0Cb(l :$ #u( GX ]$,6ؾRW[NTP2`Q7WZ|;*~هA`e]+C)ԍ@8YSr{"`fOIW0F#tH4wB"/&e7 ㊂,ISwdj8c%}f<"*a*KTuLYP7c,Ɏ蓃iN endstream endobj 756 0 obj << /Length 2076 /Filter /FlateDecode >> stream xڝ]6=ؗ@̈ar6qhȒO=o %EuVcrf8a8ٿ_kC"fbϖC&x!SR̖TiۚUXT^=IJG%)pc0/A!s|ۼR7{unμD8 4*GOg/f"=VpD4)\`(Ng Y]t<:fꗹiZXxv]Yo ANk tO1T,u*U,u*2Udh|BQ usMc̹^g`DdޙI'_=D(W@iIxAD_޿yCn3.M6baeIǪۼ*Tj3թ-rSuUTzH*uff@ųFL]'h$8u}ƴ#ܐOO#ҔՇw?O6fgЅfD˽i is=4g3ݤjy-괍A7[L8<q4s`ףXè%1R ;4i ӴÆ~k[!,xoSE;$u"bYx"6_aޒ$Ѭa(4& t&͟phh::.$㼻 &f)`chE}*0 B8-Lݼ:61oM.kݎH(_\%0*]zWO0iv%Jʩi jNcq/"Hm2a2% BȝE"/l'@ (Sqz+ 7Gꎕ ;ys,ٸ^zܬJN}mX5?vYE$$턺3h!ᄦATNc-m{#d]ŋUXaĎ4 }FQ L ֺ(:ܜbckw;ߋU*^Rզ=եsq99 }1r[**7B;tǩGI&(rׂ*&=n1L8;ê5ErMG)2yT%a;6Oe]?7z4KZa G,QILȆU_Wee-Y@mzٺAhɦ ػx`QH9 `hچ6rUovoG YҮ|yg5at:e'xF1eL1ǡ\OA Hp+"7Ɍ.Գq2nڕ8ekkGG>|=D`z"]q (^=?4lϗq5N<\|>X0>BK!TqP> }as. uo/Q +f8TvZJ\.O_;4'}8S-idhL[s q18sf}Tlcꦝ  F@5)eAFnΊvQUsmfFptgFUh{cՃOy !t7St/]ݦ.}95cM0sO`뒼>y%P#7f~"Je#gJ԰qCbWS] ~?,7|tS͈n=4UzRGcږ]져m_~=eӶ9y]JD7 U zVy/| endstream endobj 769 0 obj << /Length 2018 /Filter /FlateDecode >> stream xY[D~﯈xi"5Sό=ZE-BdX8vvï眙cxwRU[r|.߹MfL~͓/,UBMnLjERLnVS~ye,z;XclL9(y'}}>%21N:R3S:xTƊh" 嚞@/|nq:`އ?ZGrMs9;˲z6i0m pJ6hn<+hT}ejS4V$oά2M'op JP V Zs(r>#4}iYw>R9C xJ :e3o0f3fdJ/,|TZsTN7{'vB"܇h[D4%kڦ&πeþr7s vT)OG[LӻLfr(eN7o^p*@ة+FCR(tյ OMSw]ѹ`gVn6k&,z`=*tֿqL"H%}v}XTdBacmyr1r&[myAB`h3>GSqϬX懕YoLxȠLd'U~w5mhS}y)y oH6OƜ ;ߓا1SA h[/,V#a>L!lsT?UC 9|ޥt[w0$PGM[;5t]´HM{3C*>T4}Ȋ@0r5yuUe8m%An A^:8ZEV0.1(߼p)KA-j>n*`Xޚ|o!¦5ɕqFvG%2cum=Sr|6Og Xg[=e]]DLR[;=(^HmFXł! M@A s]b,,nAW˔%`8(lq`IBɢHC2G\S>] [PB\U<) pe#tbK8%[H$jt |*9h|$?kjm~8u "d[Sx18LhTʶ1eqD>jX4&m#`jȊ`\2R&"\ ;^RqjƼv^}ex]+F cC{WoswsO`609VS?coqIƔ1UkCA5s<8#S_^-%[„-tꊠ`^᫴{*CakP].&ʬ>q ʵVI.\zfgBqwHc+ X :m :ƹd^gUx3ntCbSu&t}u*(.gaxwBDyα2_MkQ9~*9zvCL>,]խVyAGu`@-#rm9S,M}/!~OćfctV¤ ik.AwYooP)uͽ^zURvs5bж}t1+v#撴7n7Du/7`)pR\E$~zyF%TiVk v7OY - endstream endobj 672 0 obj << /Type /ObjStm /N 100 /First 868 /Length 1845 /Filter /FlateDecode >> stream xYn7}W1yᒜ^ #@"m(h-֐V}Ϭr$A w,9PTq&J6h'6L'}&d3}ÎG1F R 'E_'#ωM6Lm29ٔSR - {t0y{hE%,CBI;l|tP)^0oκ (a2ƛ i,W%KtA%NT JQI9fQAB``LTc"h`;3e$O2!  (NT ^ ,G  JOT"ذ1 0(aL3d?*XZ :xP)a,)8B"00J Yb#F\1FN/0UbNX %cOԢpxD+J*o2+X|(]QDEp$v*IG_dpdc!QgpH:%GGG2JD5X)ell9=z[U`8%XXJ Hu`Nl!̕jm5Xu*p`}.6. g~zstd0*@7JA;zЀ+kwmo^_E77Sxe;j~ƴ_ 0D?5[bAG{>9}}0/ @`osyNQ7hs{8>6Q ,[=hfu`~na볯-+_lqo,߲٬È/s^Uc^; Q󤛟ahyU1VSՒ {P˳C6Of5 ~͚_M_-~j۫kꗧms:'ihM-YXL`trm3_rrOɸvs{u~۴k̠fX|@m9Eg[/fv1brjU|^Ϛ{lyUFiJJ#rȺRg&jfPCu`6,xmYsHmRf;QV۩ޡ,2PYtПk7y\o%iG ZZq9@J^LӡsyލwI˰Z~Z~-gF]C=i?Z0"TXl\&p`rVrBi%@mW _SؕJ?!pWa|EP@2-LJH/se;W^=#ؚE#q h|+ryy5BBH+"5ѻ NHW낔\|ܳ2 @Ix8s[~lwЈ 氉Qr#r%^=UC~w׽?xm׬\;r ;#pD.jIa'^Eg{&PPs Gޝ#` N۳ݸ5qu{`JK+U6U*1YN3Zr6ެ!B*k7./b[>|?u -"EqPkٕPzPpޗP8%9Eb *|c88i{ROt|{Z@)%WhLZyTԎK`lYQbڑQJ%mu=}=@>eHfCň9 endstream endobj 779 0 obj << /Length 1145 /Filter /FlateDecode >> stream xKs6_{! 03viv[d^GLO$<~8$"ͽcDYF!%6.WڋRWW|q"#"o&FY`'p|XYww<:/Xm8bFchb˫ o!^vVd $@ 1^}ӢkRi3~yFC}9aocFId|cn;v8ԲRfSdW,P \4F4Dr2[g+J\wNWZpJg0G4:(YW;qdͰBऽR<Ș2*h:[&/ӭīy+Y``oB#cG7=apZ׀ozoaiӮ32Gq$`k<~'[dzӢŢJ]]9LI%q!R65ACU=Z 8ͤ3϶7KGA{`n@"axi >R&֠ `2 pprI so4^XAHtbRfM J6A?]o '}Ҁg笱,$`/mmP̌n?6mA~p}`۽+{ 6ۀG՚gԕ.O ^).>I⍬C wZ4$+{:6Ek% !FvUVo 0ІrVWȎvTL"gd[$J`|'N9/uڍuSr,pۙHPa}d ٪XHq:]$a(ï[$A3l^A}j.atK$ߚ+aF#D!b1}@h_{#TR>wN:rј"wElΞji]:rݸ=rKm-?^v2Pþ^o5tz zm,KA^LEG᧔*^:HZ4 ]R mhh, =  >Љ.&-~榫d縇 ɠ endstream endobj 794 0 obj << /Length 1178 /Filter /FlateDecode >> stream xڵW[O8~_;ܑjKaD $g,~/(B_| 6>XQ[=1 Kz˕w9ԿZ~Z|HH2LsV ~\KΰGL@ShO ΔbH H_Vhki<]jfVH'b_1 [ٸNj4Ai \0ww*&RpѻqU9e2Oj]vxUFd2PC⺶ʮrl1_bOgĨ&&ahzvvyl~aywFtE4&w1$fBk %?Kp.$FYLc>;B^zsZOJ|e7nM2cЙBk!w)+ʙB9~7Li&[eyd1/jU?Ѯ|]} Qze@O+-g隁$ŜB̑%ߺ@}cb5gRT'_vwBAI6ڬ.Ms(mi %={f>󳇇ܞ.md/͏KoNF(}+eݛ9u6 C5*Tw t^)<(O5Y'Pjss͠}nD5'﫵B~3U% ٔBB)L64vDXxhO0?Sx: ;2BYoגuӵ z~Ϙ2(0srT]vյ{LKǾq%-xؕN6RXh-AYUd]J]PL - A  ,K3q{Q endstream endobj 816 0 obj << /Length 1451 /Filter /FlateDecode >> stream xWɎF+9& 0ƎG>نѢ"=p<{RFRduu-^b*V*ƈyZn^IUT皗8V,_lU[(* l)Qvi(-D Id2lHHbi oۼ/^99n6ńJ> zH2-%=s22K؃(R91F/P} ,JK:F.΀y.V# m~f3݋_ CF*hȬd [ G^,0z zXy6of&mo|H-%& f&(#2`F6Ŵq<߮vzH5֍8ۏ!?BR0MRT)$MI]^?҅Lh.!Eg9QXֺˍNԺirS`VMu&}+ HOZt4M!-SH˵H|LK=XUkv`{5Ǽ99`ڕ )? e`cҷ`OTxU;cbFM!I0 aQa?!ɮi[ O7~! endstream endobj 836 0 obj << /Length 2245 /Filter /FlateDecode >> stream xڵYmo_ap l)JöW,Zmie:VO\l63Rd-@m^*\7oXdu[EaD$dRv1Kh)ui>uY\W8 4 ݍ.FrcH3M}1cu_n׷qQ輫+ e-E @nodi}+B{}ٽ!EMdIby6{VMC."{(#,Dˤ)2ypRw4ǣ ju;#$w?,q ֊BWXeyg܌L%efzL%,"N9f]ԝ9IRzF60+[zVoE73)MEyv2d*eG+랖<UGo;1B!x#^h҆NSô N?ohbm`J<1#=^,(_vf[|6^>\t NC[nQ:?eϥ9H8㍛uh)m?LhAmn8|~Ed8D.S(CIŷ\M  }`@ 2R OS: 5aQE\i;?SŒ#few-iQupߢdxxԕ%=0 '\=mQ\J(ʦY  N! 7~Zݦ,MgiKʼnzEKCDک\)1gBL3g< ʳi'p k&^Kp8򠻢hLJ(5L"# w|S".Wca rqm(Z=z"$,+mGdp5X$7O$+宰 $zl #Rl"=I(!R]pD)/*RxI Tt,RNNikoMe3-Bɇ2)BGO85M* m-(Sr Ybg2r]ٺynx$1jP*f#-o- Bfӈf0!+pD 8khV X~*sF;** GzO-g%4Ci# ֻlDM`lҬ;?}zx3K`a2n֑< {MT5q`ly9;!],$U"n=F{p %! Mzy!Bo\K/R\7*|1@I!x65 B]:Ǚyǥ'ei2PêAMudHPnYUW#=+?T3G5u[Wt۹KmM/M(PId>S}5[B-} q#E`>#tAK=S1^%s6O 54|GWpwͿo"{r4|犳@1?|=\ma h*OpJG_gHP_(E[5cWq64iGrc鯽!)5o~"0)gBͼ/5讫Bf6>o*P?֦'.` :|o=T S( ~ǡ>YeA>æ D/?;4^VSw^HRk슲_^rQ  endstream endobj 851 0 obj << /Length 1783 /Filter /FlateDecode >> stream xX[o6~УĬHJa-:4S[LBe%iyHY6v; ~cW<c-\C~F)^1yB䤬#3u[&̬GOe@ܨJ)k6*G=BJ~P=ӳhokkla 4&lHPBgi !G>j*q (tQ$ZDf ld۪nhkglSʞ_5,-"|OC 1W}i.#`ہQ>^\ ڲz}(T]g\|;,sDܭVA4l1H &*$c$B%N(-8<J'=H݆F@.}ZCy3ӌUy͚ra''l}sf]\6iBI8A10"N^ 0vNzJii7bZ2YpŪ8ʶ*yADk j2tK(/)(g\!+9V[2a#xZ1yyM:u =Hr= i>i=Ѓ R =ʺDHz#+"q3^BZYT5R;/⡫A0ڣԥo(a[ [:ȶ)Ԗ<fU҃}-IaӁjXyA}aeݱbI7x-n,#mf+܃~&GX[\FWO`=ϗn3z՘HH_~P Cֵq}JBx  NhD`$w;%+OaBh eJD]z͔p~{A?y\ۉ(FMJ!ISɢY$ !Eu-Џb-] :%ZAJYllJ G3P@P } >/AMΪ6Dv}Bnk<\x>=`j^A2Lzӄ}ǥT' .N4?K(L{3?K\b VehBMtql@惎a+r3q,<{k` UU8W7CufL3ٸg}˙=-xDNf6QlhXAc6EaU7c[f57/’4Y1zJ|~t{`؍ѥcHރ'wH`֌z6#{g[0Ɍ l&CUz L-H"}l Ɂv)zadr/ endstream endobj 866 0 obj << /Length 2234 /Filter /FlateDecode >> stream xڵYm60p ԌD5iMk6͇Xpeګ,/C)[Zk/p8y晡֟&ٛ˳W1d$i<\N','I쓈bͣ˟^]$tG!1"MKqe+1 ">U%f43nꞯ.`Gߜ4A'QoɯE,f!I vުISN.yu(vN]NE9׌3m׵AvTjnptYďsڵf,ιi,|i@OLMNͲ >5q{Tx厪g֒/Vm8stĎk5]%wq 7230U( ডQn$Lqff (- ZNK bYTUvtخ_qј:\5YEަn ,hjz+Sp;My]5W q/t _,AL(hjۀi uG@WN8#‰q]f>8Un6n(9̷hjLae1o)5,c<`y*4'ôf+U!~ 6Yp(%A5I&aqЏ6@ek8~#)Z$)e?RYBBEkĻ4Sa8k|vX]lmGM  "0XEo$; $ 3, Ic{{2{jKuagwzR΀X&wCT;Xl{%>\S<@' Kh[_ltMlVrIiS7s H\M }} &sjKWbO3q؛1\ԯ?BK]dP?~Yh; jzKBPwEBw鹂:<zwȱ^&& _%[EBE5 xE? 1UrLW$ OP&tgx=oFݼ߂A1U|L|&O0^X=϶D~L/MX|t,|xA+%!CJ+Tr_\.d]Ǵ&P+ܝ&~KV~pWuj$>rM2Ds3}z\aQq)JWEJ~w0BBIP6@(NY۷7ۈ|<IbߎM3RrB;߸&RBi|q%h6 %!Z׶C|،/'^d7ekSz تaoa}_\Ɨ{%ч[z̾ endstream endobj 774 0 obj << /Type /ObjStm /N 100 /First 875 /Length 2002 /Filter /FlateDecode >> stream xZQo7~ׯc%900 r-Mț8YkHr{~߬V>۱#,˝%? u+".2RK5H&Gђk)]q 'xRLV+id 'JfWٮ@v僚@q1&Qt f,I#\$P 0Xp+CRHFSRHTA%ňcju)a#ĊNDHrFQKl)&]FRxHF"nhh0DXCu2c$8^YЁ k$3vU^9$c8b lRNukM j#P0:j#&f+3 PlFPX% P .G]&SJ.s6)t8O V<͘Ơ(c1MŮg /L17eq"fX.~DP&1aKG` JؼuI>BL4`$6_i4'\Q HEe !Uyuvvhrt4iuŢ[OOI|pû槷4lDx0Ghswt׮Gs l3|1n{S7P}$WULg- {[_[yb;nq1%C96J8qn2J8JMeX[} cas{Fu{qsO!8]`ղn_׼z5ok^M?',.+覟 .ֆftcĹN .1s/~e6(h0 %@, N8ᐼ1(aŇ(A^A ǜ}ׯ5ǿ7 e7}_ [Na,KD`싅0 dVs;r5۞)g{fcp=a(Ah-`"4tvb 6 QٙWDdC>AI)%t5Ϗih^7<~O>gMs.Wb:ey|<j*wmb+:R*#5y"^F/?GjF QxF}a^Xhsi#[$$[rlX6dP߆:\OCK_!y+*F$PPXd6^>gʟ|x`B}㌀—XJd%c~PبּЩ(%S{u7c3OHȣ t5[ 1K&VvK Z={'>0T8>%N wW{q jX:I> stream xi۸{~Xf"ɤ@-MϨ+KLD[qA`>/ ]ݮg~MWȜ݊QJDLvKoT?mںOeɗ?5g?M.fPRHQ:/̑g=Mfgׂ椐j wi\yFn/x" .))sy9?ߣKRVj)Iʌ]ݮhXs _Sͭ6@H2'i b,vC};߂U} Aeq@ 'LOAjk=vK`xJ$/C]j$EqH;Xi~v4'bcQY?sVQ9$\p¹ ^,'ˁJ k9Bcr>Guwvf{OC@)W'WD=VӃd~Dވ8ad<\lʒN 8n p-L$p l՝;3ft.xc֌{;˓v w d]VYge,:)psw8lzaR;~b4q ܒKZDWF aZȰLI>)9MvFp6%2vD.EvȠ G ;8aT4_>{39IY𙻶כ7 )4pWgepTL VNh;jO;n'hvXWjOZg@yƮ~C2ܩNmB K4e'6=$X:sYѻ! B2S6^$UIgn4`Cص{\FAզwT$~qf1Ky+%IE3`F4N04XW9A6_ݪA~i)7}XšCKP4O '2S$M6 P`:())ciplŽ0 59Kkl_%"K4~pf;ssk&>I,;<ЎxͺJݸJ^S _Hq06vLڽ^+s~/_eDg^FlemܩVmFCgep K bvK)]u{$b2'Jďq ~%I&KMA2v7rlHjrSOS?Zgu>eaF]OlxMh1<g5; endstream endobj 896 0 obj << /Length 1550 /Filter /FlateDecode >> stream xXYoF~ׯ R 6{py- nSki%UQكWeM0ͬu ##^`kF_^^tp0L\hF(ۻ!P-.RUZ#oIp #O+^Z"R+.2-zsJP 4l9sWYUךRMQu[Yd˲HrM'"Ÿ wo^gg9+v FRR/aW r_R%^eJ C2w*ZLH I[eﱷM8hg0Nz_ct `1LFqsa@#Y|\j3T3O̮g!7jI|{y 7GNKrUS_'Lj`{L#!{04$UMRgP )$@k;y6>Xh l B;XsW<h8ĔlůrمMvG QdkFRh_Af̛!;^_(6GD=sK5@c>a)^E}e)Z6_#X@F.Fm Q|arrړɦW:ىƌ;i@TJt4;*GXjYAP=:3YQ#r TbnݒٽUMuQqim DrÛ)Tj l}TD~Ckkϖٮhӵ=#>m3:&l5E}yk9h>G!it2 feYkJHan]X<Qb;J)"(QIWb;(,Q"(Sz <FFEhS`?f&YHj^5&KT#çv `$ZңSia7l-f'tmT:/AXds hQPN{Bdkqnjv:G<\Y;|ҮlkTz'f ZM6`4בӲ^IdH* =`WCf3 ZHYYDF]a|i,?K$uc ߖmSd+[wb4RCI~QLToRv*SE}>obNikԄJ{f{i H'`IG`<̦nq1/L9ìOśW# rLjqz8 iI'шt1#QRTf۩!Z4 뫛1}@p<Ѡ> stream xڥXk۸>B_ h5ÇEE6O"eVW\^$+.S|{x%ith􏻿>޽yxT"iD$iH])KU/e[C3{&cmUguu8_!HRn^.w/~<$l2f#hJ"6<8QtkelŊiB2?6u=eۘڡoXN=mTc ,֪gZTm0EH!%R5@ ƨzU9UÖ]kEܷ}zo=PCmy=|n:4ӧnY3-bb 6\W,ϺHf)&nVS$$ 'ӆӂ䜃 ID2enN7I#4EycB'rŪW&4UiqVqK "O߿_ASd0 v7K[_Ӟ*Խ<'srj=yZ+nŠgMFg̹eRN4%IFp{`0];`8E'17*)AaBj[3]cٞ |S2 8LyRjllեYx))7>A?EʣTiP;0,.າ4u|mA2U%)жVk;SI~4h,-q}o*]"e ]; "W>{ }[>zUY jCwQgsHvn;GQ!ۢ($(u:0TGo ڌšb v.+sb.j 2W{Y*lmXaFs%J-@Ҋdi֠Sۅ;=e=JwgFrՇσ Xd|nov^f..\s4}=h;7@c^C.ezXgB յArU-:3TaZ6{U;X_NWL$[B{60l$L )欏'h*m\ PzƂ\Ma;^YiS1tV@Ҵ -H\ru0H+f754$׷dan-c('؋dfvI-pllwb;dbAD Hb'vL_#z'CBP5 *y!83V[!_{v[cF|2_HDeD&*JwW}Z5pA>.Qpk_{>* 2#/7^xN%Tg(D_8px%D y'}m6۶ 2 ΊKWEx;_ }*[fPpp;qSתi/)=^ Ѐ.?8t pYrǾX R`I0=7zC{j ^{EV4Ϡݧ_h6P"^z%&uWS"0@Sy Y: %+yЊD0ǣ㝛cĶlpmlZګ20θk|~d߮\RCW^5Ƈ}ӡScU\D@>'G /KnqRXk+-G_w 8a& endstream endobj 927 0 obj << /Length 2355 /Filter /FlateDecode >> stream x]۸=/!E}1E.O"\[=Y2D)rHZ`r8 瓢݊oo|%(bub$~)?|{WLn0Xn?4I 5~xQn?:o;\{4@a4ٍ:>{$$+J$D>,4*Nsjs$GUo(3~DE8jPZqǚJ;0KpA<|4l f^8z++*s=*OqTp&zC'ao9`$ed'6^$6/}LP7. i(n]$rRd`ib 1ot0ǣ=mQ5ݺnii(Cz%pg4ĞkPO^7Hfdeyf.2RmPo|qFs,n̈́J~I#O%uݼ8}hgZ5mVb|x[P갲Lk鋃;U'|FDyXgln>tVjftA,Z0"Иy2I?>}ܺQm꧗k̳%ڝſoY9 slR*lwf#l+&Yck"K6a1/)|F@`V]0P}Crg [ Gmj9r6zr#VE >w˺C1,n u k.)#4v o\ں-C=B` WQCml+Ő\A`]DQEjuh\"@aSe zvӊz2۬.9,@j W,-+u%hfp,tF-7,w 㜻:Ɍ0F6ԑ"ntČ@0\S]\c)iipE۫ `qQsB_Ø+yJ}zte3K0'~8cTJ,1q`/0w4BE#fV dc$ ۚ=A>>|t> stream xW]oJ}@~ovԇi#UWjo>UDAp;˂mؐRE33g,[yػZL^ Tz`^ 1z<˗abdͮWY&-u~KL]{V (3bLpeZ> ;reܧΓ|8?~u-6',QH*ZܚMqgŃWE6}?aIn6s̉ wɑ=V>H #Lc:bvoa]mH`X7 )NRj؋w`i(=N ws]MҁZc$aE @ElQ>E\Yud:Z9 f8]=NDi>"rqlDt)c* ]'B ɗY|Wě mO,c؅jyɆ](+2U1fPũ[[HG@%d`!SrCa¯qAb浓]b`}bdU1`!L5)J-11Y304aU702l7]fR7(妔J8/c\!u3ԣfOOqWOq1<HnA~8h[9X[(P37U endstream endobj 954 0 obj << /Length 1456 /Filter /FlateDecode >> stream xڭXn6}WCm4bxх,ڇlvhQ`]}H@E,yuI-^dKIdΜHI|[LN/$8[`8aϨů!̤#LseeMyQʼLF2` zzᑎbB8. C}z/$͓ kǑSx3aDF]oirW^ p\eM)qO(|wX0oaγҥ,cc)e>!("wxO<+҆59e04=$|fY) )TCV$|soK7! L]Z=d b a* G_-Ț0Qd:f[h=Sb|"E6Q6~@1#F.G3}]̳rN,iVpJUi A،b h#= Ѷ=Q69R#k4MˮDHCx6maYy9g ў4i|Dp9dzǵF\39',y=@mGJW8;q#?6tYu7ESl+$]Ŭ%@geͤdaղUȲ#n 1V_sUEO# !ZS}'m(jlۏ%!ʣ~~"W 70/c'%C|ӫp^QELQ`A D8VODӢ֡!Z6vrpx$ G>MuVtچ.4%h>Ƴ\s:Be\[(}C}}Hcmq] ̓mljhQ=givDub{> stream xXKo@WX9q@VBH 26pA{vخPzd|f68X88:+d$* #e$F`:(UE.,(?6}sz.Yc 6c^٦p-RU|T>¶~O9i@D#_R"AFJ̞,YwY}_FWZmGZ#^=rR!qB!5eȐfWq@ _{^;ge/U>F?Vo?!Ղ _S wB0ظ1HrN!PM:T`H͍E"18YuvgQ2i_6U /Ƕ|KJ$Dj7U"-G8%|6^\g}B!?;-UWTD ZDtqL>$HS/GZvG+m2j=.\g$y)J?G})bpjKp ; *'LA4aR lC=QPL4gUMAQDwC=AAc,!zPfEZ!;s|gF[#Ѽ\E\<?fKĘqMg%_-#gz9_mdx S[ sLx`3z\ F!Xh@ap;uzj{!ae%XP:b>f!81 [\+yz7>XlQcKA e3=ffm&qJ!\j+fjony 1%6wmj@<5C,ӡ }pHG L iu=l؞`YO!6W#ax== s3 endstream endobj 874 0 obj << /Type /ObjStm /N 100 /First 882 /Length 1978 /Filter /FlateDecode >> stream xZKo7ϯ1pz ۇU|Km[Ɍ!ο߯zZi"cգ[R )RH(] 9q,m!WCk7j_$Vq y[B1_ĤBk +NY;q4w5 *ÁrM0JƄ&j~e^>lY LC1 s1cKؽ`|ߨ :g-p,aQAG[!tJ?̧@,THk+buAI>qTѰ4XMeSa* P Պ]QP$@0`*I` MCY|-tX0R)}g37L1lXCM`\)8fNG*:?o蘏@$CejL23&L/*A7U?-&8(ɏ#dEC0pj {kE]O'0j:OrϠw%~ joiqpq]7x1.ޫ0?"*GFWgٷ~QHXapαA s(Pc2R8HQ֘ \6ŋ0 2^:ǵ@p8ƭz>|mA0}ބRolVS~Uw>;9N{~鎎߯?5*jLw3L쐜m68oܷאm矏WͿ_u'=vOr{8(4Q%:c.z߬իxt|zxmlOkW42EaPUhp XJ)[10N֧~z:`4<h=֨z+wG a y.9fASiꀷjOC؏ 5'-yQԷpv|ԝN{B,DߐF^(EVߊi:=^qzle`+x*/C9 D8)r }6p䍧cXAp!m2afu&Z瘘8VjR0̠Zw`$3ӳrr7.A8eO@jyX]cMXle]՟%S2|Ɂ IOO3HM4Átlm /C '-lㄵE! (aiNe0# ƕJ2]w^2xsCƶ-C[t.8\AEHvRlJN.w`5|l|ǘq%EQyOwN'q6.!q8aleaqqC~эIIm-h/yn桥}sͣTtQ <@]$h\R<}86DErt0@O E*ab+F:6u &|:2j9?@>& S͐fM*2 6uqGT'"16Y,[p lQ仮e?j9Ku 4LH Xcw:^Ā1҆~@q ޏW >wUyp.hm*n"J@r+_R3#_E"]c"@߅:m{S֐zܕ&RVe˳X/ϩ;S(A/%sg[&gJw,Bst&oT'ڤ(FT1CQ~ۀigU]٬>SH C| ,haS|2s~}wA:2,de"$O\4D؁& ZFgiJ˼{p`KƴZ< oU(zIrQw&6.~~}.rbJ=P <˃g`,xM ;g0 Q/` FG@|{/6t5C<$,-ir[AOx6<@ަ`9xHT JP@> `>Rzz(vYRۡT8 PW|/ ɈRI E[o#=qq)Y4Z]4YݛC U/BȈGeYn$-M:XixF.̇n-{ xj˥ ,h7dQ)z$"{]^,@16$ZHAd]eGψma4)1nZP(. =VbLTk(P;~0#S({MSBl$ϞS]!: ׃S77PDmފkBF-ZAsr[5#d$Ne2, EERI2)zɕإxw%4}'-v endstream endobj 997 0 obj << /Length 2476 /Filter /FlateDecode >> stream xێ۸=_a,P@^DILQ,R`nf-Օ%C$=!)QV<ޢ-y=:氡?ërQDe<<\$7١5i2%J5NI}zn))&<L[de()=l26NA)U,gĘ?!K<#A[.)ȯ=~t2JD_OVWjkJ D(R@xf'Oc*K̆pX52|#jP;PU@Lxf7\;(&` vԛho*\& q,fr37Ǯqá2lXj۱޻3c$riLE8@E FPFsf8+@q=v*`򟱎jӛKms0'3NvX=~i:HQ1 /\vs),8.r:EpF?cvmuuBzz'$֚-d7xDъG_`!ҙL81Bz7qH$njΣ=R;p^dQoީʳ]3(qdgj8h3nzBe1[~378nBRTz[ is6ӹJS=SXՃ`&oo61>1 Qq꾥imǤlF?v 9+!} Ѥ6%6.}-nǡ=>\2n! X/fB%1VGqyߵkFShP>"s7ȵQd<ׂbמpEKVQYZFAF-?񇵬\N4OJ,5H3[y>K&U{=߯ LeyH_߽}a k gB pf&*^HT.^dtzΜAq!sǦB Amű{cBwo&"d-wMz2gwآ9٩-6y,[t'Kw ;tk&>I *s;/)O  ɚMkEګ]ǽ]m JCho TV* -(M\\a1+Sfu V0Au8ɩ{} 5H-C*=r6WL"/VA2xbM{V7 œH>0:VnrkW6P Џ- H$on"E\cU,Fx 8ϵ`kY͞K<"PTzp^5*{ nTBnU "x!\8De6ja c콮EA[$c~4!?}YݻB"fWH q)MkOPY B]II<6BY 窸t>T6@hV__u%24j{)pp!E1,$*08N8w JŅ(]CYzRa˓jVmN}OTɇ\[EH1-tUJ)uCHռ%AUhIШ%APͺ @Kw%0u%&5'o+qi[dļ\P oq;!~ȮX=%g Ѧ{$OCжoiWSi B<3'eկ΍ʯgS7ǟwf1Q9al4mBd`Yf=< j~'|a+zG~pi$DR(_t׎˽ESBWʦ7-(Z,nX *ߕQBIW tT3ðvunsi'EW@y B`ZJV'Q XyH0DJ;⨷>Ȝ KQg]]9/򩇆_ 8 [ui|}; Q}vy^\Hň\L&.>jʝjVadM,˧a-DV_9 uW "XRc{v%'~`3ljrZt:;E l, \]_] w?ӲݏEjUԵ \>ҍgur endstream endobj 1007 0 obj << /Length 1829 /Filter /FlateDecode >> stream xXmo6_!d fER uXm˱0YDixz宱q᛾%W 4ZT-C7+ ҴVaՇ&-(/Pyi;?}\![ۇA(KA10=i>sO&Фaik);r3u]ʞj?a5.ϔ~+<AtZTe㞭-g|zy"Ok7Rc8A}ǂ̿E[Z+Mt#(/~  KrѼ{t`q'A=Y @363;ha;Pw)ժ=v$p׌-]?U-Jd@ vu[BGO̕mk8MBt4 7ʕNC3I'X!Wowr5 endstream endobj 1021 0 obj << /Length 1733 /Filter /FlateDecode >> stream xڭX4ER*/D t-BBp˧;rȣ$όN!Z57 nyur/gy~ADxiXpC!kPtu7Z]"f7 dil"M`riR"Ѿ<^PE>}3!Wk~T4)vk_ˍ:,f?jUj󼸛,n*B|o,3o F Zz._8GBVaήwՊzhf46A6vVvi.2\$,3ڦWiyβlܹI}Bo0QO^ 5#LC8E q'VU8r.jFReug[e};FlÐqLѶ Ҳv|roǶ•~oN5EC#WoU J-i+=%pab(؍n~]P{m%i,zT(.M)57FTUiDRE$YnJutB&C 8`wSr6[1q[vm!0rnegZ&<1%h k(PuL=8eNhuaE=DIJ$w2aΚDc uvPKѺH8Xw[)ڲ;q*Ok(ȏx~Yd0a\Ks Ab4݈كYbvT;rdR.ώ{ 6ϖJ_˂p|4 !m54#ܗOl@1@"W>Jc My}d̓aʢy١&6րFg 4_Obpq5{__MkQO]/4p]4 ITR/Tǒtx4P>~}QZX}AK{__iĢ;^GP.B7OC~UTM(I4ͦjEND a:+5׀.dےz'Z}KGmO~gg[ )cK4) ]SaUL;!ӏFr!mZ)1^g'wy%z`L]<׷ QMVc+]+kk/++tmy{}-ɶ?3_ ߚ,I柛$j83Tȭygp,3!mKiko/&@'q闛Yɂ|CdS%zmLPqd L}FP)ڟ g}CN18SƳ.A8!,Azn1@g}.'C­*Dd endstream endobj 1040 0 obj << /Length 2457 /Filter /FlateDecode >> stream xk #@-p!qEl\OIqZ[,t{3䐔hkN  -ڭo~݇LJRf<[=D*(Q>|S0 hQMy5փ9򆺋ٵ;湁!d7vwR6XYA“U`:ylWꑟsHRY mu&#n2Gf{v]*ֿBk d!J&IO8]-!@[QLB ¸xۿ!"y6Q"%Ρ)VΨ* "lP}꽨58a.1"@PznN1;yP[`6Հ}`@ScYe"y=B5UR&(> !?QI΁#FJ)v<<23`=j4j+r\`%NAcߺaH5c,vl";1P~>C oXt2ݗQA3{+*``&Gz;unM;MI`qɦ9IYr]/0 2/Ҙ_E˓TN]8Qt&!ӎ 6ٻ+0#) `ch'V,>ঋKgB'@1po!M fLn8c تxuλNj,NEfS.)0gBm2V !ۀk,di~%yG+X6B}$,ۏ{& 3jfO+)PK;q"CZݨ9s\C AZű5135M&B&?_rǔ'cIt< k|4#ۢx8Y['Pk갲0Mk鳃OJ"w>w#ny0OO1|̫ ̐hYfaXT.LUXmmi0ɿKZXBJEN\'j=V.*)CY_=# ?2%)gR"l4HD >Y͚K["P8Tz^~ߎvZPC=J77UG4 %bKK╼4ldTfSY$*wc J xe'jPuɅR$hZ4jIsXκ Kw%`0u%&5;+i7A;[ļ\PɝPYC?M6]S yB_JV[3G(N3~unT}=:|064 =vMMK;8c%bwg0A 3`O03[i.L})/FД!jW~6yޢ4jci3R~S-f/ 3L$3B? 8Vl!߽ &ᣭ+s"3Èzuy=/Kٰ 4 v8cDrL5Q`PD;*!" Re3 &/8Jm8="zhxL تKJ_ww28zy^5)L;c)wr[6޶lH[(HNCm׻"1=;C'~`3ljrRtڳL;E`lyyV|u)DW1m8?z> stream xWK6W{[bG撶qNiP, Kz!Y{y}31ϻ71 R`wƈq#h˂OaO }KnyFw9&(N@Ĕ`o ň OOqTkEO'3X͟ך`uS=9QBJHonhoEThҪno,p7zP'E7Hk\L1W 6ʉgk'$IQI[%"6Q/eN|Knw߽fZ]Y^k;d*+,B9|pzs2C^?3zl#*P8pK,hO- j LOZ! TkXOň09!=(R T|붽 ($(Euޗ~:8O^OǪ3Q†_,HwnM(- #>s_umZɢVhJ7dy9ĵsaFGcO祽:~?@=pe?b]62}0uvEk9`KNILaZ;_vUg^us$qÈ\Y`'O<Ol| $|6v|4kCV/L v65i+k8mL@yB&-ES}EOTƁGcKk]=!B;rr(c~OH' 7F8:@z&8qJN1 5B Q<"R endstream endobj 1069 0 obj << /Length 1509 /Filter /FlateDecode >> stream xWK6WF#FD=a& E=l-Ѳ=\JZgQÇVnSX!p7cJ-zaxwE>Ž\ϷA%&nVݼ}: G \У16SX8d(jw6 +9GƗ=l {вq0< &?9Y1A&E 6uwq)Y41S_UnsPD#!U=VY2-N =mkF,n*!uwC{- ěIOo,LՃd?GH7 0&a77ˆr-,[i3Y*4ꍬびD~,YK 1V{0v@R(G>5 ZK|"2ld_s P֓J$`TGO N;s^;.j̡}I&xdU9 OejcAcB(xV\,nn+p=r:aOrHn}Xr6OAx a:gqPY<_ۄ:XF߮ ]Ғ "=ee't %yl(@.h4U|>Bcc%oFđ+ѐI1:dAOۚ Ry+vY(Dju_L_v/e#o`{HVLby68>Tmn[+ì91QGd #xkWϙ( y hv!]ШȺax?k*gy/M Ѽk ŭ-x\IΡ鎪m`*t8 0=CmdfI&P* {KI9c׺~9s; $|1"=6'I]şkA .i]!qb+q$c̩Ţ*J#5Bn |_-.N#ɹr~6+E!r.=ɠ'0_ 4M\5ؔ+WW2=YFl|)4œw$#bZ-C;%M}ECy^LANua 9% }9XF)? ,hsig.sWW:704vypdbe'8\_ H7?&W P`DdS<߽6X7#;M<+~TCB|[(Sj^/VjDD<|γ/0 LsGwR5aԧֈF&}EPjB淢|> stream xZKo9W8sz]`$9n&&X%c~ԲNJ1[EbWEՐBDqpWZbɁp Ԋʮr&I+4k3A ZBM%dI# \B;FxR*BrA?\(j Dơ:qkr e ̟p\@h=BY'ޔ,0? g(.Z3 \\A'(cp9HVTPQ% $z07KpSFkn0Pu1-[_-ނ ֖m l@2LUR J{AfT;rLNOS"d Bkjm#i[p _^0(\i5fǖf;؂5iz (䞖- r(1 nextiP3eW`F,[Pcj4ѻ$x074ꆂ00q ޤ NФI@v&8E}\h'1X3"wKٳ"t_?oWE$boT3S~>Zg9ާ7{3ohy)bLߠ/׳Exƿ<_M?.ºW0w'iz#7_L糛G~ueѧJ&WW3CrZ^yuUWWO~F7oW?ήϧIz3o^~0hJJݝU;%z?t ^4gKؠ'tr[y/X 05V8_uf*fˆ\Y[0KDkM1B5zF lb1[Tp͏{,%,?.ni%RCʻ;PE}m2[)SSP C( m9H#^:$@!\'V䑦O#K|m5/7ug*4k>_rᒌWXظ>CbFה)z nѫ%0(`Զ9q̿t _}F_qQA8( < rqPD'b:rĚ`́GD~Ar4XD/É%V0\"S =t_B j̾^C ΣX?LO8Y6>'X WO#ж,bz%AAA}OsAX2Ћ ˪B-PΨic5 <K0{?,f3d13:@i+'* *OUaʕmUPaĜٶhX^Q?F(c>G$ %g2u?D!bn#1i{ I* ucH5bkP-9Z=#'!CSBՎ5G̈u,&4{WyM)XtKmܶ&R^v/#=f^EN,',555 {עIBOkLow-bn'ص@V ]Zjߵ9 rm Ko-JLEdl[46mz"-Yׯ_ͥT\*s20 )C*uJaCNVk}|کLkx9ΣSbxnXD\ ʐ!]ڳ `Nyx\S>3 yٌ3;g1 xAmDH<7FHlzRc dѿ@>9O+^H= aS]UNxؿ][A\#RN6}5s :h=֏\m=nbɶ6e[m֚w=<>aiCdCŴl_%GxdT~ k"R; _'VF Pt6*^sS!j_$8 endstream endobj 1086 0 obj << /Length 2234 /Filter /FlateDecode >> stream xYoܸ_2eDQ!8O!jki(3R+iVa73t(oeqP"~(b"I,qp >T% _ޥbr08r՞H8nwoei8獌FHSe;ye˾uA4iц֘j[k,qHCŪCւ%il8gvt7{I%Eb!Д}64#apRziQo@K_"oJp"OŵסH8t?t6=>+!蒁&8p[hLZ#$YSu /J"e si;՘Z did#²m v04V7opTMO1h2 ѐMdqц͙WH7n|eZ60L@ўK G RAyي=f5E@C0r3=)Pa9bU W -) %)ߟ޿Erwf+\@[yߴ9F[Gqo9|Qj9{阂?4^Ʋ̃CL`jZcUcxylit)7[yBy=sFBٴe{< 40Y|<*WbJPgdwTנIiCe+ rqlLPZm2YŒE2JvZa LdEy8#(:HԢwNLBXE J Q4 K^T"/.$2?jwS"%Niktڰ+Trfg1g4~AQnjWiHm ƞ 7z;o;p=G7O]O3}GhsQ[@ig2]"ч,:!ftղ (gY2l 3EH+9!CǶ;+#>sKH}2[Nrn03 _HpǛ1=v2(j#}М.H"<>Rh^T=HGj3toU;l>jUZްU? =p_6KeBW$@@P5BHJ:M|h*ߣl QzuxJ,izFpEƻlDjНC}?qW8eו,XޭÂE9Q7hJQ kgcKμL/ C$ V!CIHF~|@*uΏhByO.m)ݷg pϾzq)rk(# I@ bC`843)9Nk NƒuޡGm 2Ί&"/8>/+(3WSԵ2]Y3KmM/P $r<7Kvj_ Kp;?'n7~4zb{28EEp{%ERx("<ڭ AUI|υ74 ת}5DqY:;N>j{Dq|J()~›Fve!1]D#г:]+ ȓ9F B,/V?gn endstream endobj 1100 0 obj << /Length 2146 /Filter /FlateDecode >> stream xYo8_GYR8,p&OCX]Y2Diᐲ$;X\!53W_Owofrlu] ΙLUqxuW~6'2MXp]/9 7 Lu#zgf^}wp(XVLEV^<1x8%SBL7mE%Y(Z1gCVh7Mۋ^>4"w-ƏGm)i6۷HcŪÓiˉ8`Rn:ӛ/8gZiZ,^pTHG=@Nd;4r*=LSUVͮGU *hg:3QG'1ܫ`q  Ҕ$l۝fQ_8>Nx-*g4³Y΁MCx+ N[{lqzI%u%" L۶7-Q ؼH,Oj-,JbD*)fCtw7!vúW=baNY |y3yԝ F~郠E_1CR$H!! =xS$qkX5oMIWq7=r7j!7suঠ (Rm\DF^ɔY67wy`kX@z[/됖BSHCFqЃ页z@h1={/= Xu'HJ- lW:LiA0:W&o!=)OǡJ88B4.>!ؒ_V.pɩ)>SHq @[Gh.aCk-q?n=骀#X.'>sC7S-Kw|A 㱌哂R0BP -TF"Fp0+[K- MeX~Л>ƞhPO^!4HeѬtck}fΠJ }SWc Amš,ͩ+ߦQLDF۪~ -+ktIDãx:W2y.fgO?;VE-q><9.7[^yE }9'?>M}>64yvn%*w.&. PE`CяhUm0>,BFs`W} 00]GCž҂et}h[}/|e'7kA-u6PL` l/Z8'Mi7w+4-`9,k S۳$c<j!=gwL%W6؏sCـԼq3 a5D*C|THu]8N"duۯ_jᖽFhUmمV' O\O|$UPM^@"*`*qnI{dI% w.#;}Q䟅(! 9#~SydLTj*5hv!gQ,+1Zϵv@L]ngKA򗭲c!y j̩";C$ 'Ac{MP`fTE%Cd,jYFRHT(Bv\b=(Cg=;*|'6Kg7|!RaRJ_'‌ntfçλf @o>0th  X҈JE:U1 L0>a—2x=mjX2~8VTg&]Qs 2qm# endstream endobj 1112 0 obj << /Length 1786 /Filter /FlateDecode >> stream xXmo6_!1+%e K Ŋ5Χhʒ&;HYe'ݧ A`:w;֞6e>y1/!`›<‹OBμ{֩ggy.h8}NU~e[{(ʹko7f, 14"=Ōpxѿ4eJlR̪p(-&+ڲ킅SYerRESY,;SlEԸ`7PQJ0ޡo2J5vx36sј('qq]YgMJ 7 18ŞVl?zU[E8oԘL}}-1wjՌqY@~Dl](&R'rtC5Y6xSȡ[)w#[҈{q}@vgޢlr;gG@y gqz"M>tГw2?gf>{B͚aB K/ObɈn@1Фν_G)=a$*3$q#o+,((3&k}01B h g e)vi ߝ2XAx1QCrF=V ?!AOG K#O~\5+ OVM}V–j$]՛ݦ);p f' .Yp?@i9;8.]uLg)ldcRn,|5Sg:KeEcڄD-;6֩s:% 3znP)T/,t}Sh^XfNB0餅.,O^\Jg-Z,X4E@p ߎ Y(Vn"V0!|no03H?t3PM֕q|JB ӊXD%w;%+l?u)أ)u1YDŞjPOA#mz(+C^4,\E@y֕><  NOAJ֙jMt4mV3m eз ~iP,K, su6}{YO_K٢ȓ:=`r^AV2 +{95si;f+à#fOs TA2zO& endstream endobj 1129 0 obj << /Length 2078 /Filter /FlateDecode >> stream xڥYY~_!8A"Hc` iźcg%=U,R-5X,Qcx'/~M,eۣǃ08`/xL&, #c* eyw:4yk LNDEN$9UJ/dTBd^_DfgpCF. jXcmϱ騡үt߫i@;ɘ8v,%M^5=Nle#2DK$來YKla 6aL?Ы4X.|Q']%C1L~Y#dȢ q=>Q9_"3FMSH@gAy૱|g@LdA8۲)<cWkqj]?xڶO4b*:T;Ƥ=q6q 3)X"9e\l%BLSyf6-^K ƙS_bKL/"K,W@|׍Ei;ty5C\*fwИ4vNM37U;b-dDVj(u>+O0/?ZT>h 0@="PV5mM⮧ 5Zc~JbDr8PH:y?[E?k6'kR0 Lla<Ιh `Z CRE/Y+Qe3ЩC! plTQle[qc )W&{7ab(;XTC0v"̰f`0\TvdcסU1Bld/`eFtLX^>͹=N -EU W<0\Hzu)K6[s{( ,\2*T5;ceQODe~l1|`RYmYL@/AtqƂ7zeYv7u?%pel=p ׋*P̃9@VH"Jk"7p/P_.H:tG]h܏0 :f;3Si2 iB6c2K՝CG}8T9N"pJ,fJV-,YOkBBVZPѱ@G@@ձ~HV=zCC8 E=6cO P{3!:;D>kc(qFPڽ_Yڕ(c&xe`ȐX&. `6bC18lBI11 !$n]q2yN3&J$VdT7j9"3ݺ$,<*t2o F"AdWG[EX=_ pWr?{Qf*RlY3됞tx|zeD%B_Ap.ST2SCm?,}RZ8m%o 3Z?ܵ\g ר$d8_߼{Ȳ/7{T{w/n5n" nQU-Pͦ7Rxhw{B9."q  xnK> c ̭j]?zaE4;53%Ym.U7]Y}Uai]wgn1xTXV\` ,CZ\?UMTo(󁤫4 (G3NN]x׌Ǣ,ϻl8!|ʄ&Ά섣y{ /[^uk6T#Lpm6l oWܤ4y HK`2ރZy!JTz?]4#J! \qra$^si<> stream xYo8_GYR8,p&OCX]Y2Diᐲ$;X\!53W_OwoJ1n3d<,\ٍ͗ϜueW?w|w΄ pے+kϼsі{wfw eTmdS X2%Ĕ}]ް?ϾT3& 톽iz{Qj'&^G1U:u蠭5%ۆ~ Xux2 9GLp~YMgzYV5Xe+q7)qlfWNӣ4v =U#Q5تCELy&v# v${,A#TͰp,j iO6%ZLFx#89)Xs<2}Ńt=qiρaPG'7ͽtEK>\2)в„wE$T̿ѽ}?۵Z,υ?Gq^`I6Fx&1KDmGoZ=j-EdyWMoacD*)fCtw7!vúW=baNY |y3yԝ F~郠E_1CR$H!! =xS$qkX5oMIWq7=r7j!7suঠ (Rm\DF^ɔY67wy`kX@z[/됖BSHCFqЃ页z@h1={/= Xu'HJ- lW:LiA0:W&o!=)OǡJ88B4.>!ؒ_V.pɩ)>SHq @[Gh.aCk-q?n=骀#X.'>sC7S-Kw|A 㱌哂R0BP -TF"Fp0+[K- MeX~О>ƞhPO^!4HeѬtck}fy ߶ TDtoӨO&"mU?{ǖk$c"wKoAJR<鳧A"ǖ8ہX - ] PL/Ǎ̦>A\ek_bTp?U 8wl.DLmφt|9v Rq2\ٜc?ιd2RƉ4UQUX "u<< :I~Ip5>IٓWAC5y]ފëpP#ɫ&~*/'J?!o@'g(Pܹ H!Gq8hhM5˓1iOkR!dP}ۅ !Gh?F1uuE._ʎ+U:p0*3 |d;=538BQ]dXeI!QEX ځry@ғZ lZol,.ߘH}3I)}#2љ :R8ޚDMBh* r)+xLkbI#Os(MWd&60w _ʘJ"ax6=hZS ^wNƖ~GG/7 In endstream endobj 1157 0 obj << /Length 1658 /Filter /FlateDecode >> stream xXo6B(0bV$E=2 C5S[EBeӣI#eRۀ !:{[~ $dx B/ }"8aXČCSe>>eRoNZ0F ^X0.櫯w8/ |*R4¥uY4Yіm/LAU}ע, bm55rj JI"=iV+[La懲Κ 8c<7lÌQ<NMє\mk'8&"MT'%Ě`DIʶIF1Kq ~5>Ą9m P±kđ4"fZvDqުlr?3£d >O;u{P9lqN6>G>3\粮qؔlSH7n#UTQdUfy2|p,.r?"? '~?{ބw#ѐQxnzp0 tsaDX<b[ 0iC"¡e^vlz"12wbj9}F OesSهOKg'woH^1Q{F%$!}Š4ꗃMvLI.o= 3 NU *(BG~Vݳ()[O$tT52]f? ]G}_˭xlB1$rVEs?/Vy^\5 KB1yrdxhB2h>k" ";YIHTy͏L~ 1(Y&8WBKgqgs y~aizv$*t}kB5uĘjuNkANʺmfi5vVzdk SnT|~5;\e9[SO4Mnѩ46DTc~(4]~{c5ecLmUX\_-]橥uXZ~E>MQڵJAA|ćP#5S]4 U,TǼ-lTnaH!s2PӻׯgF@a ߐ^f_Tu25h|6or{ 5UNɺqbMϷ'4e cG\`J"/mf]ꉳ^S6 [XtFThnE2tK()(g\!Tm.h`H=;z\CZ;o"otz=Hr7hi!}H빅Rz0=uD|50-^2FHzdJeɞ\qŅA0:C{j+p> stream xZ]o[E}GxY~T* T}JLri]ʼn(zάNԩM*w|3̙sC\ I]TvRp!&Dǹ ] 'l8MMW] u!)d2 \)Id[92̊;J%4u<=@TTVZ: &f&TvgSn2_}n ٣1QNvե~췎gnb ܄W{*gR ^,f)FV$;T~ WP1 +WWaC6kMw/V%xba_0CS@ZuH 5Z1627-N"W`@G8Ňћt ZeT4-%Aх7aUػ W` u X;Վx ].tyH|2Gs(Dh]i38>YgKnӸS.aK Of$iY#q@d/D֍ȝ721k Fu<ΕpPjUi`{k8YǹF0?a75صc.5صaCCR5ԅ܅҅Oޓޑ6.*; 7ٛqG9[M̽h3sfc^|1H1%J^ČY^"FD \?%|u?T#1Nd!(8y@wEy ])yuKm@te=F &i#n;F;u(ߺЊ~0w%pz"(u*`5Og S' Fk qC8$yP&OJg'D%(&V(,7r4Lφ!sޮa]ګ;ɧOZ>NK:3x%tZ06bRP1ӖWʇF!FKڝEýЭ;sg>wZT{5iiieb/Է4?:mG-)ާ-îaW:JVتk' A.la.k `]bx~'M @ ̋;,*>ܬ_z1NNO8 YgA(~gAO%#JI>aP`/-X}.z1 BnRwi/+_ ć[jkxmtQfDʖR2W릗# endstream endobj 1176 0 obj << /Length 2163 /Filter /FlateDecode >> stream xڕYYo~ׯA<}4bxXHVk=c^&+S!)H Ab㫋ӆny󏻛7 d$y;nD&)6>/Zs{-v˛XL$01Kn?܆lg'hL,xbDwKōqH(7~-xLuQ޼PyNm6(-xh< *~g˜0lv,>:_Yx+g8shS}@&@#<7.y joЩٲ? iMNjǮ1##:O*/g̘YL"]1#>n߾n?YHv06f$X&d0#4Gh?e9 #>4Cyrc@uEP'AsM^B?H?"uRFǺs$Mnc'2|D*2T8Sʻ^|%f6+ P7UǯT= [[߯(SeEYle&<6G{GiBtc3M c}KWe 4<]]B͡K) -qNB6j ׍SsL#i%&^^zȉsPBٴySxYp8hjlU^HQW|u4xd's1q+T\;6ʨ=ɇLٯƒЈ{;% 1$-? j Rl&Y3fjbNTn!.Q|Pn۲јwcpVvJ}PZeObͯˆ:G 7L&dH gFɢRf5nLj]͠aoysj<~HT8AYr)(/Fm=zPDxPDߢ"&fe)P٪jIxXN&(Aj6PZnFScʶWH5 e<;6+e=WF5zu5]M_8cg4tͣc_O I.,@OڂV2ƪ(p@}p-HY: мȮ0@ăi E)VnyG J[L4^ =p6EÄH2# CոNbv`PbmG](sg}‚#x7x f#SҌ4lf6DzYfy.X>ÂxtEmY Y4K7L ǁÅw!# YDXa0T2QoÐYIHF^DNA]!{ cm+{g}o1c ,ʈO$đݳ5&Ӧ #+bPGpKukՐ Z9uWVJ xv'l/+'.׮58 /ky67Z#AdϚ'WE8>_TUSpԥ]]Y3KHmM/ݐQQd>cn¦֔f?-`ą; |8ӳ7e3t?>jg!ӌݷ\fKɸ=JIU=ɪ5D\‰q8lUdw6<|w:Z1ov-йlu3]k qםTSݷMQ}K'#>͇38U{rtl(Mc:)iNs^`lj{z돲@JG6\g>??+=q,BhotsIoj8g r_Ń’ 'J!t ޠ!qg_i6m!]BF{A 1ߢ+l1IE,2l|SeqEE/GC}<jz)gY endstream endobj 1189 0 obj << /Length 2093 /Filter /FlateDecode >> stream xYYo6~_GJQ)-[<ł[,"9$uXqE ?7f#ڭ7_߾y{UA,V+F)I3JRnD\zۛ<䜑p]6.?UScQi߿s3)+'۞{1bf"~_hJ !ǐ)A%q]0Chuh;6i;Ӄ<>kz=JU"68{7Hn4qꞳۖ݌=앀خxC>,as4Y2NE==n\4 K1B46>pS $u?mρ*NHAQ=Qy%̝ĹpƮ=0 =}ң<#\"&YAݷ ĵCw鲧"%Y20ff*F-y<öͩ[@40!{~aj g WxBHUiH;٨ZϘiɾk*$۶(mܥǏ6iXTJUOnE4ޡRjM2|Z?N0m1I5ɍ6 }+<'lh>F)3d:Z>LZTfItd},7ӂ&$xDK{ ȝVSx,ų 7~238 :w3^d փXВ@8n:4f?hx5Z{c1%ϧn?n^FZ>[ \^R7_ Nw1nƌI!ѕ"YgW.H. | 9YrNSD䳧&rR˨j/A2>5` z7Pi>h&+uYοP{Z- E1$M>ǟ`.?9jMVKbΫF9G*wX/f(΢78K endstream endobj 1201 0 obj << /Length 1675 /Filter /FlateDecode >> stream xXYoF~ׯ $PPi6-Z-OI`ĕDWx,)Rd7O-=ff搩vbrqVHBbxQrZDևiw\=>2 T38"P ߘ3d*"ՀaV̞Y dU/M\ʏԥ6"kl sFIH_]JWѮD.}~4Q=_?|ڍ0VugJ11PC#!{Z&#/ݺf$d>nD Wy 26i<ܫ秬ڔyS-wV1AҦFT?0owChQp!ꄐC]؞eIeVo$o6|PعMtjdk@V~d ~}h5G9f d]sngMoz+j\=l9m*ӇOgĈ3\(o OT`Gfm~57s>Jh9xw#ʶüR1s9oA8( }ie0*ZC4I=S[ږ^&qQ-H@G>qeZ0OVu(fѸU sGRW-H2Ίư,Ejzϔ75p3Y 22 Dj%B gӡ2f^e0 vSՓoϭ̫7J>{R4!}H"(4`[U/Fȶj2 ^-xGH3_^F<0%{br+=V{qo׸y x\asSIjt3}8K9ʼ8TCBځmv0mg7۟"Mah71M-cx#{Oa/gfz`%rj$A,n)t0~`VZX :XĵcX|?46z}fLkj^5'6PzPJe&H]Jsv?n$F@mA.6ySn_6T*Nv`c:]Wcx0X3}fSntvL]#.oA`н9UT04x4 i0d}̺xAuDQs)0=;]_WW?SHb endstream endobj 1215 0 obj << /Length 1838 /Filter /FlateDecode >> stream xXmo6_!,Elm Ŋɧhiʒ'Iw#eQ A #~귗I"bY:FFT_V՗hR}\%Μq R pe!4+ndyPN CV_פ`q,6ҥlBD|#}_ك Ҍqf8[Y6ʖZRv"7g"!s劆@B^1 >ˢvV0KRީuK ɢIVuKr/隷k_-zqiݪF 'b@'/FC O$ KN`R&aaů k#Џl[vB!Ÿ[t4HO) Yu|NY=nQiovhӶXȘesBc zZ71kvZb{iGZٞuPC5 59 R[1pHr](v>ǰ!x<&I6IJ@aVp^1&W1] ~4ߨNi[h4T dneqO<8_4{It{)D":w #RGup>c$oHbԻ$h`otK;Ḧ%N3XyPm>!n(na"ũo"4Ẽ<+MLki{]u!9KTdq|WY"aI'!)R#( BC`mao7gi-}.=,JJFؑ:5`^ 4ky7 N,t9`S퉕>ʷy,7H1X؁)!8k!4kq!SX3uѲQ;p!iw"AW!Rz 6yn]'U+`^Be< 9Lth΂i7lغ!.7ҪUI 3_ahax@boyb&S'jTk#\m$Jmcuҡ]c-M'j7~ƨcZ\47Z=#S*K{wM]-v4sѷYK w_xoA3Ls$Je:=>] ֝a@'(?p%">n_QJTQ6oL7>F>bXiTݒalkLBY [7rIL2,2?tB7Z.jnB۰O?i~Rr7DA4~ ӐG2R5Y^ZoU=O.=G==Cz$χ`쟬o܋|fa?.oAF.&a/?N T endstream endobj 1232 0 obj << /Length 2069 /Filter /FlateDecode >> stream xnD_aH![Z.BgҘu`OsΜv4,g2ޝǽ/xu^$H'8gaxiY{wVEA/DJo7?J!,;;U${!OXg2HI{rWnrW,]?j b7/GeTxKCēG4e,Jz6~}n `H"ҡXBp_*M#TQ:nBsYE/_Ɯ0b+[YhҐTƎVjA wrѶ"3n6n]`GmM-fqLd7Zܲ BMM#b!Yjb(02tYsyN검 ]s@-6, K-:kG`ЂY2E& *[T 83`Fu%)Ͱ8IR^SyoP@?`N}2h-E֬5Ǻ6;Be%ވ Y[d΁, Q%f8-e=ٺZ~5C9Kscϑ4YUg?m0"O MBe-neURSD,SGm]j$#~h+pnO"|%z ʮ[n ~ij\f"[Cգ;3 |l,5=UB!iiY4n,1f|\^q@q;Hfy feSGOL* { wig"_b,g#2s!@Ru'hke13pNDN n@0q0*q_Gļ(7[ QBxA[G I\gU1{\ Oz#)-) b " X*Lpnj'OkS`y/ğ%،z,c=yw-wsUᄶvH~=) MfMíC"`Y)*b1Aj!.Dq_+}s}6h 7Ҳ:BlqPX5N5*4@ 4b_PIk3GVUaW^}NJoj!Kg<틆νNsږ oEVKE@{YMB 3(%b8~?u8. *Cjtv;o$*^|V.\y!٢!B9+v&d!dtEw*1[|OL;ϒs*M&:`wbevž)aըpmv֓/-H-8!1h3tCbF2?a gogMⳂ ei I!gB?zvv@[__. d= endstream endobj 1247 0 obj << /Length 2174 /Filter /FlateDecode >> stream xێ6=_G `1$ubۤE-2-ڦmmeIL%Y㙶E?ka2(58q䛇9u:Vv—1/-. KԖ' ZTN5MڤKyWb>z]506+P*i Z H6VfO;ًRO"Ztm::iQqn #ál`ԩ;a%_GN sUK}v*4]6T}7l}??18RG rS<>sbȣ(VWm%/ :m_ߊ^Hc ] X}~WH?z\A[{] B|~דlo[Y` +"C޽/ls9 endstream endobj 1259 0 obj << /Length 978 /Filter /FlateDecode >> stream xڽVn8}W}%)6[}ji[${E9A~+#N) qs;guwɛkA#$<"1J3 Ki4_FcP17+=,~|sӞh 9u2,G&8g$pB"3 e8*v 0Qc~H>^wT28S@7?q`Vƛf~cc um5.!98X'Dؙh/pqĥ8(pwU3坳/7#C ?&8Fk!,O@0}I*%@4!I6ϊA.\|Yb&'&3"hQM>>~SGhel*h6{=b`a WӾ3+i<;zfx[իf{刺#n_ К)qAcxrkiƨ R93 FP<^`n_.BV~7\wS )ouSo)(kfnUF/G"JuysT6"uhonaD16R(jl"':EJOf !Kظ!WLJ׭9ky+/j?4/Զq?sةFU1预#0Zj^hs[C.P2-'4M.rP?ޞY Nu\k&=y زAz̧(z|h,n>8L.HH)ϐWV巶XE5ژ)v`19h_wu|""}.fE2toAC^3i UzJ{uq)ÏfK;9Grѽ]؞=QdKݪ0B)ێs> stream xZMoGW14?#@vawi ICvɦ%KIBtzUU]p1fu1d8JՄ$= N ѥb:\aqBjmon`5@*q!,~o7IɛK hLrH* >Nfpx́JV,i#|:p_^Op"BƓ1x*_Zan-&Wgz1l=F-ZCl`?47NnT4mɃQvՆYM'xQE-τwnq ԻW ђ ua}G]Hd>䭰I"pψꁹ6:rZl20X1!F`,:KB4!p:Oh"t<iFlz:+{ ?{كBVUP7..PLf'& ul;j &FsvVtn`-A/Ab#d{$t kgY..CbO輼J2pfZ-)~o: ][^g]sޓ5s)ꚮYP)>=])%5=9y'tܑFxv3RJEjg9vQSQ[lױe]Bn"ŃCZHFvVͳ,؅4ϱ\oTEhs8]:] pskaI@FSYx1%lg>UD??y !FN!$褵>i &?HOBzepT;}SyMjtGQd,aW$ 2cݴ-T4g]h v!u!W “9VIpS:!c}Gө >LJ8.eQtxw1c4Y,+ц~8>Fz=qofUfχ'ٺP~Ód}{u#j_Y-r mulލntWG%?"vP˾=83+8 ֻ_HɄ;H/ҋiŴbZv"/xH۫> stream x]6=h_5CJ[9\RRs]X5Z3eb0Lh,NCw+&C]o:~x s[ZU~.fT!:qA){5TN3wnfZDzz_Ov+ƛ: Kɶw]""E|hD~qBLme˺,w4 '1P3el*oQ+mMDmE"tWzQ:nvj6"1CHXZv(aINoy栋l}dңغϰ$4.&kkz0AamLmuAq@dtXvYZnƞF%c`v%( L^R-aPQC6E4!:d '\$ӇG9Y2:u+kCi*YνQp)=PTY@m%]pgSY~{96 =}Qp6G>sK7a-LsG~抃 S43D G‘pF3նhn1Jo- M/_߾~P cϙ4'A5#UAD fVT+\31˒J_o|qhMk*nqJ~|d򓊠PN¡!w4ctLmJP|x[+PpkL7dF2n< TǔLn>6R !iC¬U6ǭŶ?]6Pe{G(@~GcVC{Y6s)4Đ#_p8 OH9K}XGyo4a ~^+7s#~0qj4&B,l@0qĶRbGJC̋$WnBT^qM IE"zrv !߿!#SbT0˘fM2{Wj^U>>"HFӪhL ^w:zZ{FR_jsO|/bIur?LfpF%љ*l =vIh ,Fbp\T 3nmRvW˲'$,s$vH6a >#irM})햑/{j A7Ʉ\J$>ӹI}RG^9I@:K ggx3醭<78;.ɝ !3N_ymq|UlqUj[k^M}y*<@U94e>eӔ !Y Y^{AєfTLDZtdmsl32|@yTmexp>!ڗ&8 7E{1JR_PsCr~f ۹ PMi4j& pjJn'U8rLqT:Ndp߷Uӯ{fмi^f g4Ox>nܷM]s S79Ql&ԥNjvYR_Z?MhcxK? P/ ݀%%ulbw B~X*E~1XW>rСfn:՝mï-,-vM#]7oUGosms9~j6pqBP%NNcٽi# }poLόs*Oj?x[ endstream endobj 1287 0 obj << /Length 1999 /Filter /FlateDecode >> stream xXY6~_!$/nlC,&$6m %*) /YxTQu|uPʣlLydIwQ,@X>4|+L-8Ka%M%KecO,f_r23An'wtM8A?)=T" 7ݲ-}ԁ.$"|?G&ß81j,pt*x?LQs$F1RҺiɌ+*?J2.PNNoYO퐿 2}o㫕Y꿺9cle(s{ > ;SE 8Kқ[̼2hZ ;#s:O:t};Q|־uάh Ͼy=)_}Ӄyg͉_mPĉTS׈̣v~(4]w'~ N}6]Y˭n7N0e(:o>~p)O2L@>B:7E}q@JveW4c'zSfb9/s˥ V\SPκBWXmܙdF Cav9T’4 yЙkX@z[/uHDM!)q|.k =+Q"b;d{c$#pHe{nڕid XLq_`t@M3[( -maRCKWT7<U¤E }Yy6KA%cVԟ|Ild6#@t {'<k mvL%oz\~q3wzj2-X_L ʱsS0̅Zx~otKcTMYWpc4>킏 Dc)TYkַ*}gNc%ʱL65 ͩÉ;cӨO*fFwe ʮo wΠ6agPn#[?[_k|n"yԧTlm5r N0 qeX q{,gL1'Zo 1v.Fr.I&xdbjlgbFjg1UQBiA@=yx-~0nxp#T^NW٬hYw"}xʺ bREmCDѕ5gs$X\TKw\<,cy&CLKQCZl+'g a4b+@)F?/]ЏMvQZ7.N W&*SVQK+r˳v +t%i[ u}VUU+f,K{ǻ{bs6a{B2o,' r@*^2G閬5Y2c~> stream xX[o6~ϯY+ K E5S[MZuD~yHrdņC"ywśwRF,rf+zȉ#>sfKF/_lBg}ᵸ( + \e72eG4IY"orI^[)&SznP9Ә1u'Iό2%$w~H@{ &IdA4Ѓ:"U RWnNb5˻\Ċ7UQwR,k4M\YUf5C,#q</0J|VlB!+RFѵ Z^Y.ʵ/dViFS[7 3q}BX7mQi:@!]Pj [ZzD8JZ2a CCWr3>6az^ ɳ%-y]u}H} h>_wn3lf%*NyI#dה}ŒU'|&zb!ji<98?8B:e1_CZ=^RG9S?$a v5Dȉ8t@yk`IkŁ%\Te+nIAqR9~)R8V1@piJu KGB,A#*F8>N0$MՊ7܃:1ku.Q/QCr^Hy_I4]1j|! ok압Ze(FVOq:otr4l֢**+5{D8l%NE6ƈ{{+b\s6V=P&=a޽9nʥ:o.h=4:Y&0'>ŭ>ZJ@ܹmE7R?9-`Qq 0U3 B*k6 CK4<?[)iM}hM#f"'.sQ;>`>YHLv-_SQIGDy=ww7&x.{!E&]70Bt; J{eߍʼn)Z>5lgP_71ldH;HSwk߾ő5P_P@=GB0"FgkՈ)2񈘐RC OJFSGm/j3h`gИĜ5'Lwj7=dГzZSFV脥þN4Ρ8?~|v`')3M\AoyI9ۛRVF2L*$$=ngJH)N>֡1]O(^ _$P-'@\CV9msQjGufOojriÔ]132$Ǖ~=# ]4&i_g Qň74Z?f˗yᗒ_5<!M{ vΈ/SN= 0w:}&URoYb͊L#dK ǖƿ}w endstream endobj 1317 0 obj << /Length 2095 /Filter /FlateDecode >> stream xَ8=_a̓3ńA,fd2mk#KDw?U,RmؗYdj._q,\HtqYY,,zg0V_ݫ^74]`Y;I(%],ì`~"~^L8,#CSmpz'5kF@ vSվaK{X5^͚^CXUדKA--rb)+~[2Lx Rukl-;"rZSdWM%},f_F KY$2,YNendk,gJ;!fӇL& Y,R4hڠִa,0 d}P ;-㖖DA,iyw#@kkzgƘ,vRDF̺ݸR #VCk՟Юd.]Ah^r@!ߪAW`3O\c-L GC2@.ƾ1CpT  gtɮS'jN?^ Z$YyKTCn|=i@53U%Ip`DBH~i$ӽlZjurҘeI%8 #A60h}x HP&TJU}Ѭ0,IqDYZ)@><qu8YB4h'#D`)8QQj?|@Q+7˘33(hM/YKB8ִ-yql&DuB{hRIre]OwWc$HK2b<tSe,9&6`43>|}zN?rF*Z &{QϷW Oh=l&P3\W{r_u^,I^Vz.3ElAJ2Y*l ʞ ;P}O`5jQ4cmYIҸ(g1 &˜ld;$ذt'bvIni65V5PBCLw/;cis j&bœtJCbP9EPrg xfφ0lY6^[~tD+ΈUnRrNfr (SG-S˥sa͝m k ny΄(| c+sN:͗!"ئT8l݁ Le6jKa/'\Bi֬V}qLMn1 (aо ^ rKRƓ4 p҄;m.8sC: h6Mpjjn*9Vq׌K $>*{n>l6ZiY2_x9/9tL#7W19d#~ӥ9o8t'ӝ&:ftNhXC9V7Bj!imΒ$ e1r4,ӶT(vGe;fd}"Jx,΃~U7ꬒ_SȂHY6.* lj+sicQSV}Y *SL< ,$)p v&<0dϠ;QU&$,zLH.E>{+.eF&Ͼ&]}2"kHEhYਉªinl~5 6ݍI?-K&R8Fmqq~Ͼ㣷춑w1C:|> stream xWMS0Wh8%3DӖ=)t`z)^(GIhX}|j#j@ц5, $}wu'//A72*(0Z7V(fxVHLh"/܁ n%m5ـZ"2c8FChwbU kF k׸bI}R>tlNaԝ D7~ VxӮ^bkLz$vM}˙E]c;ғ LZ uXdsY$Yi-qa\ia:08$1mXqNgXn*[ N"{fCcVJ ʒ7VXѵ,b P?v;7g"gXćF<+ ,2^;FaҐ֟].\0L!?m8Ͷu1v [KQ )9S[#Ze;3:3?3mA 8 SHFAQg\(\Ql源VqS&wRf[7c*4ȒuH >acPcV|_ endstream endobj 1349 0 obj << /Length 963 /Filter /FlateDecode >> stream xڥVKo6WCe`E(QzHФ@.m^i[X=q}i%8-p|34v~_\$Ra쭷(#FCo>MwywۘDCcRm.؎8W>H BBՓOCkG+kyOY]L<0RRIԗݼ vRN{&pW}>HJ :Iy(z9P9w88 p<ީLw}*p]>*BT͍pE>e0 ( e_xӻ_ܬ_ co_B"{2`\DA.BgaJ((' c ,I<9q$uSrGـWV{+.&Fş%C'ހ?['йMm^W<ӡf`Ni&N^>>/lQ5}\xak ?sln\RV* zܯ$ֆ=kei;=I$pΡ4q.OOZ4PJnT.؜!&_YՄ$e Paj0͘l*JBD3; >ݍlR6ao*3nvB^Xʫ]! Cg$ A};^0"4W@q J~N 3j4k#O<|\½׍yG[|r_ X\ov2H3GβbsIr+MdqQ$n E'8,F fq߶jZ}f[O(N*E )Ӕt*YA&WB8lrA1WVzlVc. dB8?K{G(洯 ƕՓ endstream endobj 1368 0 obj << /Length 1005 /Filter /FlateDecode >> stream xڵVَ6}W~T4E3E:40hc VI\$K3c'SA\I~j|4Z= #C;Y|^}XtSLa%1kZ$[y׆V=3bOYy`&rv-L~@0&I/-Qy8| t7MړzHLbL & xvS&^]oҐ8Y]˜å$$ۼ.9)gݏ' M虄EQCby#9ytv^\BӁ93_y\xyi2o&*2ʄW܍3;v뺪?-i1_g: [ӄ4It)KٴoKG.Dn؅;e_!Iy"8(p}8}ޞ)4vИ,?2CjbwIv)ujղ?̏dQjfY+pCB_gj󮴧bXjB;>KjݻALc'32Ʌ%4m}#K&d^} 5x6^@֑?גOOݪ kш=.#?RmQ `*8E_tpbX"*ٗ'xWX7ȷ OkVjXsEisx-JFS ւ'ZyZpZMeC^#%S ʦ`xb|#(5׶U³K}p'6/FvW ߍ0|;`!ڇ@PZ0JT/> stream xZo7_A/Ƀ?Q m-P89VS6P.&$C>)^?!1"G H0!$H&בH9oG|J:/rN7fd][ QêuS&`W_y\j@CqRݐ u]A|Jzuv(z*gI^aS=HJ8rŀD Qe`8qT*:eϺlZc˜T/epV0) Uk8 ΥcDKM(1bbſ }ygbc=Z{2QTe=SK>cs:fv2Pv )UT`M1.kD5+fLM{AI)ɤqٌ) w * ŤB:ZH%LvN~dfZKI/#s4W3'tųNE* lDXE$TI`"$8DWX%ɉ l$UuB0IT0Mr5YAW?-.(_vpVmNttrr`]>5?ox: n,yz=>}rVl w6GkM4/pմ0D<+֫_} Nbz/e4gyս_^}Ow|mrhtQs-fQX!T;ޛ3XUv\s,|:aѳ`X0DZ8J|$a]yyfY4;jϻyýn|F>¡}6AW3\ra=*i6{53'o|ͻegO'v1j'SU~D"o DJϪm*ScJv_O0-/@iK:ؗUFhV&vrbEDY O(hrί{}xf.rTqs8aހf"`#z7[ې܅-`">H L&ֈ!=D' X5p As[ bپt L.ګ#q.[.!!Qǹ S._84?]5琙[->zCn)Ӯ"i|3s)K8 79;J@n9Զ~)챣Wʃa9TsP%z7AcJ!t $uz470G1gPch9%_t V6'1@ Tt=R%U`|H0nVa܁13)HA(|[pV0}p.j3Xm`;ϻnrH QBfi H ̀ܣ|4ގ'΋X6ұstnN)6K\)VGrjs6 c pDncHb?# !v($0D?qlr>2v_<1Xaa~1 bXl~i\;O*A_ D-لw{$+oV47*dy;_˭rlD;Dd"!#Pc>K=J<-dzibZn2%eJTyAuNJz\LS8(-/bt1M+*N,fv>ow<;a夯DE6xXr~Qkl.CEy4,nQp}ɍZ endstream endobj 1383 0 obj << /Length 895 /Filter /FlateDecode >> stream xڵV[<}ﯰ)KH-"ӂP6n+=_Ҥ [X!;srsf!^-gC hy(!')RghBבi6Rm 8f-Sڙ̈}QXDЌ4*Q%0]>pOK?Cv2`&w:rdXI|1$*j0tj>AVS4sE:U gI6t*;XP긾aS~!Q¨D1UX(T.e[P+*\Dy%XB&/Hvͯ Xaor6T,;`nj 2*|P<^q_6ߔ1},o]uմeW{=pos&u!zoR߯% `g*77M*@U1SQoj VݰGmPW= %R灞Jmdzq#AΡ JЬZ?~[|39',Rwܻ_8 nr(ZܛDŽ9 c{S~o?,wFI,pHS$r1'}0Bq?kO6E ^[u7!ai/F~yz1)Y/ Ӷ!M(! ay{~'ÁR  endstream endobj 1400 0 obj << /Length 2200 /Filter /FlateDecode >> stream xڝY[o6~ϯ$cVHJ*P,bAdm1m@W'{CJd"|;L$7߽iTB2#$$2dBDʢ]{,{ʔg)c>$lDeEEsѝM $Y,%yΣm}Iɟ#*.#N)aUq˯UӹB4!FDLЙ˒ ~HST=WjЫ5ImSfcE)v?׵푋֐'BX(eJQ~ەl@I yI ~S8ULU"ӫTi\W86)sz묺T Dz-.Sh ڭdIs:0h23:Es=5_?X/R'NesXE?痏߿YRfuʃn`zvqk7}~kN`'!Lͩ&tqF.?. l w+ A-Q6GݕQ:2bssFk`u׭hε厗 Xyr&gڄ/02yCaamvr莁?G!ߞ)8τ# tqqR۸Z&2~GIޖ4./Iq~@1<čq] UJ xƍ\ ufq9,MbCZF05\,6HGp 6&)$ȸ=D}6|itKA3]-H*G?"tNyi''J ƚA)ACI^ HV>'ϔRwVƫ7J~RPpk6ߏ un`dSa}`6ҁ3lYxٔU۴,RE.\,Taxߙl^ z+Ajvn x̭W3 )6tzFkX&-H.&RI-l$cT^bTHZ4>j|-y(-찉k * dr\5$=.=yAE} 躔XHSayqPs> Xt!9B59R~<bxQuT,& r/,3Is)TB'hׄ5<]4[7CWA퐻&1-ңBU05Yڣݪ vҁim܈ZH"ҿ)vsg8{c'"6"a>lN x^S愱$2H==: KRk;~+W@cb_ÃZo78@Y:?Fr(ϳ99䧬sE2L2Y:~)ta qԺ@'Ic]EͼA^8Jgk!?9}.mF5fWAd".0RR> stream xڥXo6B0LbAY![aÀv/mQ0mȱ~Qe"Ho/oKY*͗Y<ϵ>-?mT>8V{,WK!C y4k5 `e]4+7j6zaPBhUs`6j .dt|1_q tQfᖐ=v {iaH;oAA ѣe7 Fg]V{Aq ճA>(ѤSjj :Bn1TF'L&?Hee".lf0 b_FeǒE(Qo?H4% !G 6?=pE7'^ z{&k ϛ|U[ 6Z`UqݴeN"1M#i0g$ |?N`҇ qOfЕ$q`ԫpI]Q6?CHPARˣɀ!HǭjRXdѩwL_|p]b!yȣv@_Ca.4ܩ5:31^fW#7$ω;bƥ;D#1ޠD_|ض PzGe } әh^)B_#Z3 +9B;џ9<8r6mYzrȄo'3H:n[r&ZfQOć\za"X˱< ᷤ=7\]m1f|wѲjF`{phlIDpXœim弇t} (Uh'u6m5> stream xڵZ[o۸~0Rn9MzIbc>צae٫Kك;Hdɖ,`"pf8 O6XoD ^[N1H.)OH}I g de 8@ `ϺsϠaI0nx}qc#/FCHg,V!CEA% ԉKuLfGZX/_eɧ$»c0a=z'׆ԓuBEnrA#ݡ?_[;r돻heHP kI:%(d׌w*d 8I >Y/" uG)O0YE6ah VNSSض]/@^* p!pY[NJCw΄ wpT: !֚C3xWv0#o{GgA#iTidwDՁQdl c388,KAl9%6:uV0giiy6tKAH%O+U(TYmkwG h y^2 !ƞuO8C騬i.GlK`P*!u=Zglȑ Ǜ8ڪ򤵐@.H[]UU9<<9'DnNk =w` MN7(X8Df\L:ZNOu4&uZ5 ggޝ9,٢>og-9g"^sIkV1o./)J3aGb_rk,[^GOy_U nynRfk5y-;kzMgkUw+YV ѧ~V>ϸ׽.JT?qGЏ.w*_^Ƨ-gS}j+Ӹy&-߀ds%?` 8י}?Qmȥh< <(&T.!urvQŀ;e@r *$N5g="_f6fZtVx}[QԴeMޅ^fͽ/!6I]| Pp{BJos|0krJZԴ-h$DG WcjqNzA[<"y&7mm ?+e2}Q ]?hćMW!胁m6K 롿C(vb`b8_#it뫝ʹTLcC.jIl*B5|Yco;0R`@F Nׄ'OX:-XчBaZ| 6W'Y3maзoS#XL}Keðj&ĕDd[+U> stream xڽY[o6~dceڵ P hxC:|I%#QMYe% ʡs!eE2}ƈq(`4-I}ZhwLEl7C>#ѷ4IORˈ r$-Ϸ[1upx\՟)B0 )fM?BѤ2j65t !x2߮čɔu2&7.7RHn4o.LL)%\9^tYx $IJ)ZXᑩK )[7^S*&_s7Yp,Ӣ RebK)#8x? H2Dh2%'֖A ᇫ:k0KRz|)dɃ]όBɊ3%?1xfħ *8(B*g-mcN'Φt-,5ɯ1~3xw,lb!~OS)CBaB'5E$,mû_^_msAI\@h5HM;CJ~) 5Vz_TҼNhmQ sM>nqk7Nе?%%ROfՄC{Ϛ0BTs|"\š?[%Qg$)?4nBb$qjHK]4ƑUaW'o]e?,&QK&[(`Ĕjm4l,jPw4mD{`S\$11/^7.}fOpu8$X"C;->& oe>.Ș3gg:' vb3%!m/ǙxtRRff?*%?sCg6iP ړ;MP6'~ۑtLsB^.Hvӻ/4_)ՓF}d:!Ǡu^0  'ʃGߣ55%3TCsU)_$=B_bϕ,{ZcHKFI K]f|P)E4:мMnyKޮmzf\o|{ /E PooCz6m endstream endobj 1450 0 obj << /Length 1092 /Filter /FlateDecode >> stream xڝVKo6teRoE=I9ABH%1p(YNXpypy;ymIB'$Ha8i8 MܹI}~y30|#C%pPc97w2PM"T]Cu9k{o3bQK(ZqGY4Κ3?sm+uMzEQFϳi"_H۵^~cY>أQ[ Sosԕѭ 4s(Odz`9|JrF~^}fNL8nDk'Oʹ]}2|5IU8Nee& g|,.{ f-!1V`Rm{/L] ? DI-Nmyt,"noP nnSo/ (0(>)(ߓYV3Ĥ˟4KmŒ|Bds4'`w@!4D'^ն_#3l 푳kMԃ,= &1!=0J<2v& /`7/:-+L20b0y2FzpwQ=0IG.tK,~*+anKEI #Ww-/Ѳ'#BQ arȉۡ`vgW Y/+9뇶RKЭTOt}m-̅`ɏG-WB*l֧ g, {JOE.ձ^oм>쳲g_KV[BElcZhP#MTx> stream xZQo9~cPDRtm"̓Lv`;~}4i뤶o 4gȏ]pU\LIV1GA5$b$bTJ#i0LfPu%V+FWcà&`B!۽v+V`ʸE#sR`pb&`@%^S^*FPUQT2K K T W @6 شx@Z+\UQ8`I`B C0 | &c@2cnZ$^®E3,vO1+ƈ5/$5xMͩjݜp1h@U{S]i|z$nI :vIFPt4tNY0`"! Bi6F՜) CklRt*wx=eafxjM sprv[W4;[ѶN+eۄ(-I]Ҧ{^9`5c ێa}s6m-WY*+f#ᡭs`,4::u>^{<Ζ՛e_p=bKNV|*R,"e C;:rKmj溧/NǓ_Mb۔b/?owp'l',%Y\S?cۃ;vݯAW^ӫd2BvM rm% EؽCS&@Iwi0mOB46{ ;U?gy3۰gȮVpI[1|vGظg{XۑbuO0m?].,8[̮bڽhɓpTދF,m0_` Vk!4Nf x.^Sc/Qc$byWQxr.\GGmb6^v8~n-tWOgtɥ?}{~p }Pa 7^yU[ ~(O|mi]OE6go*bNzmE؍j@9P;TR r(nf TUjmy-oASB:kٙ:An+ƬBm{G: (zATL[Ō:W.[#}/~=VwU jG˭2bȔ)l_,NYⶺ]mC9͗?<{M囕b(rm-/C"y6 @mK1}ge/cۺޝc{5kA7Bg9DGOaUDo=ǹ v8d 8:[L~a 3c-6m_+fZUfxg+KvvҶXP.o&o3 f[ב:+ TڭOp[ReP1 ^LX$_ѮeM+z梲s-ͣN:RFC@B )Ϯd64wyݞD0v^nmSm)p/&J!ң'yvO_ܩ2 k+Ѷؿ᠐" > u+oJWygjWkc:TA2`+̓},YHwln&*Mb.ǓKx19`KFwyߞ>!BFlz͆`=,c c${5:OA+ccw[7O(Jh[owsx6P@DqMI< ^Xw~";Vdby;5?$9v*)+2MR}.}W'$GB^:PU;訹A:A@_.q6ȍ7P endstream endobj 1465 0 obj << /Length 888 /Filter /FlateDecode >> stream xVn0+PY(h݁@=5AȔ,@[%9KIm'q 0Hy A "lPC8ň#9 Ǹ]\FNf?pgiQ+~(l >P~4Gaδh\ F]6\: ps҆عp>RLGozͭŌͷρxQl:ڴ,,XWA4!=g#&LG[v;xBX,mIc~OESj"ܥ0BވDnh3Bv=$Qq!Wf|lq, K`o._׊dˢmKv>ZsHG֧^Mu\5t¼zcYnZs+WvħYwh20<z7y5m3: IEg>8@u 2;|UL~E#p.`{;wGw\.بM(H }HWPvлM|[@oɞ\U&K]4VԢPʖO!hSqOȕ2-J[E];*D#.^h`DeV.kK>Q[|"ZilϠ(?"_E:樲0h]"ƩȖpYzzZ\i k$NNrvvQL|n8WKGGMK L=kDn{kn F1“83}j ?Ǫ¢!;z-D>4i45hOdA ]L` endstream endobj 1488 0 obj << /Length 957 /Filter /FlateDecode >> stream xVmo6_A_lbH膥[2`Zlq-ZeaQ2C"劮']a0l{yt|xfӋG)N#QBD(}9z7Ňϧ1h~ϠoD-JF+ψ VhX?47n+9wE G8Aq'WUWIHNdNվc}ZWݠ煄̿u5je f\hrc5u-LVr5zBp;C\,`$k[mG;U(wU&ZכV3썠͋CwފEw}cϛ\Nk?ΗfBDwjJ'%F(٤3e1R#FTF\BmCc>*xbM*aE6 VY##iy-mD%]BIMas;<aJ$? 0~p~Tq~c(#/ ?Fܠ#+)Ac/^ m^1wl0s_ [_ 4-*Z^X/ R߿xaafr,&3*)cn& Iq_ p⷏8I1ei4Yw*#l&tIasti ̺?Zc󮖲 `ܽdV xxV߽Cc/Au endstream endobj 1504 0 obj << /Length 1386 /Filter /FlateDecode >> stream xڭWo6_!j[Ӯŀaۗhʒ'mҿ~G򤘲4]>IM@דR$Ox,Q %qȃ*0mr'odQWNvi$<(#i:- [.' H xB(b7+m?Yղ( '_EĎ`$pҜ,}Ћ^xne<Ӣ.ƑV#B˕#ޭ$yB,{ d,|IeRڷ :vy/, ,# J8q BM}vznJ$;@ si'B9#B],;-6rS$4$GS H&n^ŔNqFY:¼;UyZTbTd[7[]$W.GW>^_ZX$g|ݪVBbӈGa;"IeIca'VͶYvߠRHO+#g agܨ_f,JlL V=mshb4J?e 6q"y,|Ӳި6n :DԛQF؎v׳ue_j"^G6l)>oP: ,kC6Dx])V~o{XiC=@L.amCGSm;Ґ}tXx aRBA9ZikdrOۗҵ9qvBZf[s=8JۡkOվQU;2~yy🛿0b$NS,5riԩ%E$Y7=lM8όD) Gi8ŴC(aPMvqz [}pVͶu$&Pfڪ4 q*2 4p0 ^]>n$Y'-P cPr0(x?cD^J\+TuKݪ3OOEy?HC|?hg{B/C@͖/;p,;Dc<%3+UeB<=29} 7?чbE[.+麸`auR׺&soEu A 9qr?9x endstream endobj 1516 0 obj << /Length 1061 /Filter /FlateDecode >> stream xڽVK6WF#H97hQuCLD%Q%7 Eґڤb1o zz/&߭'Wi-eSoPQzYI{=WR$1=u9Jf0 GLo:Fiy|ǑU 0 Eє\)@Z7}%`OpoVs\#+!;Xq̅2YզpjPx2f9'FlWMas^V >Iк Jߡp i4>q+mWL*i4''fliie^nޙߒAn6`PmV%S)L;2;e6Dl6.U6I.lop矅z),S=BYMYoP L}V.[}t ݋Gp國f_fH32?LYFRٶP{Q$Q[3bbγҒ~- ܯ%֓'b =t=p Z˫7n-ޱ;Zy1BAG DŽn7@h)8 8.#sK8X.x9FK5;#'[Ktʏ! txdC4B;k}Oe.X=cP5km#mJ6G(jv@i ]Zx-/P&Hm4lt$|D`GP`75dvR*.ePZI] fV^TxR{9#S3 ė/.+-3WUv$DݛqY"Zm`!a2D+I 'Kw]Ht!=&5չ\zw=y`d endstream endobj 1527 0 obj << /Length 1001 /Filter /FlateDecode >> stream xVn6}߯ h- [ &۾R ]6k!ߞEZI:I %X,H3gH`+zuqQ+AIHCkYc[x7!}rSsy:F>&([ED.Yao.6vxݵy{q1q"1 csZi|`6 QӞ4q\`;kN$¹tz0kl 7ly3" w׈rbj@LhdM^znƊz@#bVʢOhrMKC'I=_<s._4HdMK ~(74|DN[0dA#GqtTha:-7,k ;BQ6!_.@LQH'oyQb(*02U?}'9\ *[ăp绲Y]JPBx+8):) 6e#`F^[$Qu)bfS֔"S7fc\{mnݹ> stream xVK6WDBW4(!MHwSLB$ǻ=w<(z0H97}"2 [og?feE UjZih' 848jOX¡}g'K4j뻸l M|!yĢ:`^X.V_5-4Q 6Tvhfē($CRۛ[=+=.!/Vڠ\9m7{j֭*׀&]2~!BAMoz޾#]MET"$"N! Ld' qe6)(+K֥vE6/p|WzRS]}ЎM(LnQzyB*&1QHBzWWD&)1AL|6^* IXYu%&C$e^LEk>j%JKQO I?yU9.cHUg2•fOD5-JwIj9%xrL%`cS|#O06*w#R!\$> stream xY]o}ׯcP.9$daH[@5C΢ʮ&=C}؉嚊<Ù)^yAe!WR ):Y&`Nֆ HASTa,SVLɋ]lQ.(g t`;+)Y9 == Q9f"\F-eز lɲ%.M1)>]2B^te )6 `hu 2 B'9x@$\E5l_C(>81%Y/alb[V%~RbC @ʐ$Htd!'B dGX#72 (<,$|ٖ%4 Db1Hf8_\$9e;#tINP1}!jb3$sY+dlA'٨I]fs|񳶰~N_mZmYKWjbL5/X?si[%'tD}/u>L^Ku_zW퇥-ŃM;j~IJm\Q?jŰOŚ> stream xW[o6~$c5KR"%C&ÊV-Zex\'{oE(iv Ew.^a/z J8zQr/z1K/K|󦻕y֯_`&E1@,z^ 9 1ν\|-\*&-0}[>ڪ"q8p8V/S[Fp(IoZ_(~^Y/dsk֫e|".}q(fB̾l>LcDil~%۴]^WgH[ZcbpB5ui!4 JY-X)#m޷"zߵÅ#~ 16 `/B3;QŭCpъA+#e$ώ,fYYN#=jXTm6OՇƳkD Z6t) |NB#zQ >-10T@~vEiDsre t6_A}Iz?j˲KEZ ٪E޺*=O>6N](^j%IL63Yׇ:r%)>5⠈W5nM4n兵uw_ߦ\?t5:H"&^A =&j+/u~~y *B=ytpߜAtg&22j#m8MJyk>k~}'t1{h ? yD4__NE &Pg0]>"=#ȣ01^yjao'Ȼbye#q@0(({s-,C|͛fg*z*qnX+[H=g~ßK|p̨ `eW*τ0Ydž=ZuyW̩ECk-še:`^!eFc(SP|aM!3ң> 7G9D*JBaZ@YNR{]U<6}+M]:}ϘшdrQ!†_s"R h" endstream endobj 1577 0 obj << /Length 1024 /Filter /FlateDecode >> stream xWM6WFW IIXA$) LB$Kn6K^R]M0DH3oތf) ~^<&Q#M QLJ H"V<رh dG[Qm,gKp%|BLMZexXvx D) !CA~ ҠUfJAȁJ sx;ѐO~ d౑1`)Cg b{F~"oݷ=ʻ%YeX={>Cƃ)Hj 34bipM F82x={YSCw=A@BHXu֍FL6$WmoI]/\}r0-o{\ ߗ}w#F.<7$BdX_.k/?'箨PD␢J(YsTAlqݡ|^mQO'LF67d2'7KVt'I'p |e"yﺹ3^ܭ@?lu+뻓9~OvG/WJo]?O,bK,KMo^1n ; mGXθHWGyՔ;GR HCsl}; 3G"Zdzn<_<nFs"o7Qߜ9]WQ5X7_]RUY;cqPo[s(AJȣ]M@x.Oe)$I&g9+6ltwM+2ދm/] endstream endobj 1591 0 obj << /Length 1140 /Filter /FlateDecode >> stream xWK6W>&V4)Z" \ի^DlSG7p! ܁Ώm9)H#/rGA r}yqmOL@0<\e;wżO'GoQ!MF\ f-tz<@S % J$lAi7|۝gPyzw u3}luC7#^$Зn|uW]=k㄁Ef3ƁĪʇZHQ,u;nse+չeM3L|H[wm%L$Ǿ͙IꮻN0<Q SI#k[GѶ9Egbjޟ{qq#uu\EM/ W^2Y|C?2S˓ 4"Ze*z{\䶡pe{"t8= ڠa*H>g@ʜ"O]ԃAvc}4[C%W @Nپ}|n n+9K϶ԽI}6YA |4ର"oӲPY1IQ` TI)yO,סbmj3cE+FoOFwKk܅DI!GdL,l E4/LA-"ӛpFr|[ʾ93X.!餆gjz IK dDޖyEhQ&p5| Ra (vˢX'yߞf˜O5xY༾ HAW){䴤p^_= nfԓg9 r50s\ ˪~W"}v:Շ9A9 XQɕ귫IqczU4YOnqdz Mxpįgs|amQa8O߈4a_(Zzx~nde,^g/`/X%-TTuv!qsc~#^_/~\%=ɡXx ;j> stream xڽWK6W>hEIE{شI^vSLB$QnC{٢ݵml8p^9!/z Oi@!^Ly1]~X] N4(=PtU#cH.zI%!2Q;<3q'^l7C"ǝ?P0ԏcګx\8p(a5/.wf,4,mZzJA,4$(26 /Wq@zdqтdfr˲QEk.\Cv+UUF 2MR Op+9JɬǮs'&B*D(QZ{ES hUkV+ٳǁ85l52g,z+q؉XZZp+ah^4WB ,DAЗ0(<(EȢԧ`[ص+d6qds]s婴TEԝ#dFLe%gGz1~b]ىjv]qk܋)iďU'}pjtERZyZLC-ٯ^u:"!OP?sQAׄT ,(ڃXem|Q/dlۈs!vwEהt.4H+fA@;gu&/Y\z$`0w,gZxeE5MW|N"6G5w`qx>ĝBZ5kzZ|=٘ݗ#e?}c0?bտq;$*G62,W{{9kY1i= \k*3{q#Q ͦNP̴i;STBn8ruNRd,1d-_}^T,ERMmm ߗ=" C Ymkp5L/pH$0ud@K endstream endobj 1619 0 obj << /Length 1219 /Filter /FlateDecode >> stream xXo6_!6P"EQր=dh3Ⱥ:O]Q-k%Md"% ٺXxѾzeDŌ0o2/b> -يZ"K Ph[(R,~9sa{([&^?x)^xuQ Bi47~*Po4>|;lE56<&_kz5m4QUzPh"C! l~neIf(:7Û1F$$`?0lgQH8=ҬTܪO<`yFfIq9# ; 8g7}2VfMطm2C0KP@zgCdCй\U-q!x+;^0A ^K g" v캲> stream xXY6~:!mvA) \RG$ywݢC蕼@ÙoN ԰wW7kD(X ۲F[JO \~^}8=N׏ـ#x mEj:@˘(EI^1hc7m {0ЗX5jyVl996ț"Il4e-8s_"EBk!&D?+zEYTr{S>R1+I&GȫT-4C~%t;l_w!e~[Y!455^W勻ZG UE#Zj:KP\+5MFc}sb^۷خIܖBic]C-kZX'ghb儐bwsbF.B1m1<1cetqw.F+Ch׫ٗo {=m"JͶʺIX$rv.i`_N3jO>D'"IRZm|N0UӀW,(z# "vF-݈M\gnc߆#؆Ֆ.-} ]p$U:%IT/tt +fa\wT 2w@qйʆ; ^ F#F`#_53 {)*FnyPLvy~7矂VI`yox;Vh81}D1LX;5 B9*'YRf5ۗ1d_-O:-:[mMaoꎐU+r0~ٝKj|#tàx^]=i߯]."uށGi{~$eYj 1TLۇ, T*_Qfj5,Bb4ܔ]{P^":?Te"}U8+RGi9?PrE|6|Ú~HnJ] ѝɋ}DP4t*Unj >'8xr[$aA9'盒e)Oz5x endstream endobj 1644 0 obj << /Length 1273 /Filter /FlateDecode >> stream xW[o6~hu 6 +(5SLZ%Kٰёsa9<׏Wx~rx/CYLbr @a{I r]Ė|7z~}a.lQQL?I`N#|',_YVwOwR`#3 JCeUc EV SR6 'zo;i̾KZZy fZBz6N1.y;=kM9u[Yܰ\4Up&GlC}W`bX+dlhlO_AUgeX5oٮiCKTlox˪ivq Yv|=5]oKhqU"*Oir~9u3h/'WׁE,jkEJ! O'3^*$PAf(d&~ے-_&'TgdI% Vñe?(BQnD-lE :x)H?fZ%J 8(MƭmXpeۦ5CyS/aYL&z`Ya@ &$F1Häs |>ƣd"g×SZް\­bXV/oT|'R'fd)AURRkM7U=::Q7P A 44G:n> stream xZQo ~_ǻj$Q"8 wZ@{\l 殿;]'xyp‘9GGiS*QoB!ILd؋  3AWTFRRLvn!EL./eSHr2%k0Zģj2jSDH ͬcP1W+ \L Kz0b5)PKՁ )#Y 85 9MO=c&>&RH r1DC:DQ_,D5 ER"JA*x3W)VaHuU*3Xq@#}֣:]`,r1v'&z윦@VɛT &y):DE%5CN  z !~Q`7YH[B  jĩH֤(eMS X>`f,cg%٤,:Kر6&༆5)FԌѨ!YAtYh&r2 -(mTr9r"ߪ 5 !M,ߣ<R׎Qp1xNMPu,7=י']Ϯ{48 ixd#MYez]l#xR4駫B"4z#9@?CHKv82`!F8{a@hPi":v47xv@GeJ֣!m4<r>Խ::3tVâ{gbp񣽸|qv1_np}Є wB՞M]E|;q6y7je6m46QiԦL96e%bO'<)Sy W6lj^d6U+7ky6?﯇~\P NmbhH10Bn\iFǻk_/z๛!=]{sd#܍w&B8eo8[LC< `"^Z_ g[,ђ^ Elţ=aE"YN{rCRz02YO9{4>Pq^̷m]ϕk'<[8Pޢn@Ť5ȷá&bO:X@chv(1VI<¹x|S}'_kvj3{CڴA(Qb <7Hiql6a1KkLvɗWL#Pb]hk8jhygR&0g]2m[3;cc#(QQQȓ6!X$ѡ+GG<3) OQ,UrgӨ9L2;v6Li=ߦaI;]m5v ɷg Sܢ+K4^y6$, J%XOHQ :b/n.a1_El5e endstream endobj 1664 0 obj << /Length 984 /Filter /FlateDecode >> stream xV[o6~ ^D] ŒaC,ӲZ(nG-Iw / %@ɛ: YLbXQ AF X E/21ZNO6][W+Cep&f8?YZq)rU}#{6{ҕ[r3|\-&L iLGVRi]OڀcDTkp3yOQh;c}² bIxHEmH vؕhզ5v6~y1#(\YĂNAM>Kc!r8zâHڪ0 LuUUH޴3̂/w0kK'Zm1:{gPB 7"*0IvM q06\ؓV{2{ds%b_#.O 2a.+U5Ɛ %St4=Bwe.*<1z7wD0:ueb0c>.9KrQPX=c.9l>%eY=%CŽ,6V(2i+yd8:@[)Z o`WtU(Lޏڃգ0)P4-*^,J}h`4i~mdwqFD m~mV=X5Yd4u~O?^׭{#I32 CW]<g#etMlGi 9E J 緹f/iB!%/Ͷ_49V]-e.A,M=\F\ygvmi$uSym+ˣ余6Ny0KӇ> stream xڥWK6WŋZRo-Iɺ! \J*nr(Y_3{LGo4r?O[m~&.zpg<(u]NF5O$%9h8ge2Iƥh{iؙ;;BoZB~'O6W$~LRˢ+[UұG[Ok=xR?l4)ٖO⺋sO$&,g˘.euOpse3&K@f~-bm+VR?_`JU/`JŚW~rWxm)K]͓٬ˍN pBS֕b/`Ԏ)J5[pݷfk[+OTa;.b)Gٲo hC2؞,'vL񱤚AoC9)B?5N[Pg)ʗ7/D}U(2."}}cI̒h@ІiyݱV0u:s%:k˙7C\,@[/YUŮ hu+Eve`/;-6G-/^t##SWZ _swRo9A;CɓMfy>#CL> stream xڭW6 5䷁Cw[ޥQYrs_?N|DJE)\O^.&Ϯɼ,cgv0B^N#/ |gr>?x*{;8pGnhEdTm UNš:5O(sx;GH7ڰa*pk>6R'qyY"'%y(sz<^.&L0E> NcEW[XY 10yN>=?(qzI}ˇI<8{Y;/fQ3s?BU4`SKgl& ۇ}^&ЋblP"oV2^l=<57~%te Fڐ!fPS&hBj+! ˵` HYQ_|m ÙƞY% 6h7,F.Gk&%ٛ ԒA_f8rἩ׼4'lſㆵ ,;2Naf%8 [ +jvJ]j3yYB8bs^-Yy;&7R)nzs},4Bkb!@WO{'^No~Dh&uA HC/Niѳ;x(`BDfA :ΟeS=;3(ODפb$҆vd9D@p>HD/DE[ZGMiG[qpI pꈉ5m* 6+7VCy+w^zfZEs 92 z;ƵN/#r`#\0b'n Σr+ B"yk%) g?T:HzQ$7 Uu4CF\" j)vUic%YUhևAI>@/ GQf=%FZ] l7c. Yeyv$fАN8^jɟ*|wah V;Ċh^4[8 L?QTX+K]W BJAFZq6SrYOvK6sY=)z/VNUƟ P>Z70(úqCP!hSS o<3j#MmG35<5 5>D@,b*cqyOmIovIOVɖ iW(%oAń1g?/hI#l%T(ko-mʖZ:4+t?Cp u[hPrR!Ti+ݙeQO9Q[j֏Гo̵#wshRSyɶϧ|~I65}k[ uW/=4vg~t. endstream endobj 1699 0 obj << /Length 1073 /Filter /FlateDecode >> stream xڭWKoFW,C%\-,C '|ij+! Tߞ)DjS̷3_śnj2  hFgV1[a'.#@S'U&^N )OQRL>~"h |#tP]=s0;}*}wK07!8 {cYǑEaC2{h΄hws̪}]rP1b (iMRg6J+curX/*oZ]^R' w>XGݲ3={=$6C:Jc1e;slfD)U9pMqh%c ~(b+'U^ՖtUWr:7'ۦe3nfm>nSTe5U&0 CD+QKf%d%=ͮG+BH&:m6UiH"h1d2}L}m|rcp1ڻ>W<3}i*ܹ*ͱ_KEY2nZ*cdE«anF a/"5DB/b?tFHk!%}#ZB:r{ad1;!TiYc8*4xEbf ƇCfíhy7iNfp)y!k$Sԉ-F!k{-cA:\̼^lg"8T@xݶahV8Ň5mQ|5 !E*L )5RvoNo|̙^.K\3CYGlUI4Med`0(ݝ?:եe&nJYS}Xx 6OTf҈|vC{{E(vy/no)U-R~ Dx+9T6㰲:ᦪ65qNC4<;1K7%;;+VȒ)=;K`w+m^ endstream endobj 1716 0 obj << /Length 1689 /Filter /FlateDecode >> stream xڽXYo8~$6CQ%C=v- Ʀm:\7~,Hlw_,r8~spfh=._PF +/Qo>i4:|gb Fo[V(_G?F Y-[KY4kEA(qFv}Q$8AQheɋobö$hE5S{Sc6r)dՌدK3oa qe1|=e\(,' E1v2$'Ii(F [{ #"Ahj|iAM^J grAD^s6ȍ3n].֖♉ɁS}~lOjy0 RԷ)v<1뫷W3f<^s^f`ާ9VC9 AO\зš9[ygYv9|yeQ~9qk>b"Nt@4[i(Col?V'@g(KO]k3Gik?nKKb˷-Za9ƪ!uMΪux'7S̊ `, rG:3q6qqD(N--Yx>42amrz/ d+>q=K ޳'Aar/_eP6M_'Eݜsq|b~CNIYRl301 MzfTBm~+`fKΥ%8 ԵfGw;ҝLtmTI}odB4.86zxuA&i<`h˭'5! c_#nuSn|]\{Yo+rU_W^qgNYΊȀ<7 hrKЋʇM endstream endobj 1728 0 obj << /Length 746 /Filter /FlateDecode >> stream xڝ]o0+Pob`lcѻF[*fSM)"lG@VƆ@4EQs91,dϖ뙻 '~0BУ2Xz1OzaąL̐>1 Ԝ^rWtE] V_+B%5Guɡ eԼ9&2wܖ0HD.J=lZSomc@MC> IG)fdw0ҷ!1HMVr^Ai`xB*`1f)?lJ~CR C $QxIZSoQ+aO25V|QVuҵg<6au_dzb4)F<]LI2G=_/C u{*.wK;~p FÙSh ۷$-iUN8rJdڔLRS_ip8wJ'S%oJE#hZ1ƀgSp3 ^z82).5drf Tp(*GMvl k )-)0_hsݴq#^ 2~m]Uq2>\6Z ֛aJ &Z\D,Z;l3e\dmL\tl&SGn.Me{R?|1*L޼2ChѴ]:3bH~ڏcK endstream endobj 1655 0 obj << /Type /ObjStm /N 100 /First 972 /Length 2040 /Filter /FlateDecode >> stream xZn#}Wq!lE`v ,Ж{dMdh|}NQ,9ź2MDoE )>ʍbBDe&B$8@drd!pe rl(W< I|aΌc^޵ʙ@s>PL -!Er|Ara$YFpv!C\&0DNel .(p )"7$"ȕXh2 kzQx Xux%ϖGlL 9aM@srPEr$]@EYL1f<ѕw I4Os*R֗1x2r |0Il;+$P"dj01(1|x!P'D,̜X?C &ne0GfU X&{x!w jc,j$PT?cgA]uy;/Qâ?_ ܜ6l~n~n<_<[PNAV‘ɚC͟5o0]̛?绋aZi&L~7g]{le\~ߏֲ&sHXˬ7AQ!-`VfAKLr6 q)EoёjNTB5wǟ3}vF FhECLxaF9VO&L#8ͯgӭ֘:dg8pSE FN\-5RL4עvQ\P=R iy=D /$B.|\A^_O:j>{ݯ:}hI7j~İ|XJ:rqݏrϭ;?,~UźvBouʰm!R4eYbReRd!fCBdUn@2XJNe_;[dFI')t@CkO< GYf)g];?}:+4Ξv@iq=?o%6B{kL(Ŵ+f-'vZ`dKį _;c7'W7S%B9[b0 o c:Әv a$X9)(&^Xm-/ٕOXKM3VKâpe>Zn+CJo%76,J-oϖmqS:@,ƞ8K%uq!ddK)\!em0%5דj0`>OO}*zIJhWힳ܈jxEBaՈVr4q~Sͼf6D<ѲAeB[ou帝p0)V'݁[q#!ї-yxCח,?ԷWOV{ƲĺhBj P By5Dw{bitZM_}+VZ>K {,O-n"-{&+ xe|x6>Gg<d~M @M5a7W$üKcL%6FR> stream xZKo6Wh]= rveHח]iÇFP |3#)<}y@w?}~~{{!!y >~ى"/cNx= y|G7oB?ڌYV&d b+%?pg:31#&V= m]g0}A'̊8& Vdc&'_?ԺgIw2Vo:}p~0dSF}NyU sXmTfCm홳 /VW'O=x*ͯq,Ojf3ː$؋\EIx!HlY& ":/%]-GBߌ]DkHLR Vv$G, 5"H`+ʞ&e0 Œσ5 VTH:A \d?wFmC]cX=ta C!"P)s 8>{TXYZ;]C(@JAql&/4\TK&ҷ)qtw$#C5O!2{Bgի@PJ^^?7pE~eE؆ۏʞ֏k  g):mDVr~]#1)7)}ӆ e~=&W%;]vNe<ʝl=]{^D$y[AH//ҳX@dc}x?^2QMYw'á:(7l z!HE/o惓Un)]QgQr[HKW1BR]kOЭI:b%- c:f\-+F)^c%JЅ^v2fEB|EKè-@B`ϸ,qc'2h6dtyV,SD{#c "0K7EJnuJhRȓ$CS$;DZoZxY؀ q>EXjeqΖܯtܝi8tD_:] P7Ku_c=}EB3Ԛ؏0Ho/HScs~ =ǫAυ>KQWn[ {/]<0|8īC>31L\CIhH=? endstream endobj 1970 0 obj << /Length 2103 /Filter /FlateDecode >> stream x\ߏ8~߿"tznup>t=E$+!gbb vSOvg<3gx[|Cf=`Bzh/|_{s1 `t*`%w^#kqA=bTd,7tA#F8EYq{{o){Ag<7KwwڕO:ޞף{\T^N: ӚT9}n+=L6+7"}6.և1K;|G1.3n6r`9Y净1*"ԬCEeOY׻K0kX* 9ԉ?y*"3 _FfuTq;f/Lk0m Ed]>=(Y9TD-sET˚~'_I̓/ߡ9IvVro2LvsljH!p)i+~BYG}yN!}GSػv1o0nTEŘ~V%y2ʷrU&-#hu `a[d_JCS͠- Z66ħcU *[P(u6^R}WY3 ze̘{pAa=r8@9|ьZzqƨGaP~ EC_}tKce]r `X[U%k;ׁ6)U)+dnRl:h굏 O;80i: *}Z@\k+ QY`H詥l>${IVR b  AAb#Օ18 SĶe~` d˾~_6@I(7#6cQYǐP7̉nE'pkvZB;?.pJZ؛VkL  Zj*.CX_gq endstream endobj 1796 0 obj << /Type /ObjStm /N 100 /First 1029 /Length 3038 /Filter /FlateDecode >> stream xڽ[M$ ϯ1TK%€?I0l,؃1c׀WcjQeG=[EQdM)2^=-QbѓgH%?Z*eqi+GŵX[u*'pyZq/I:beI-VK\rVUMR2pVS-=jxܭTUnDv(DTKR+I/&Ui.4'5 -Ԋoxj2ioísƐuc,45ǎRc^n6qak_f91=n%u>5I=|e52}jLpFOxf4|-KKZƯ Z HO<ōpVEnb,yēe+L9\0+9Rr?!U:}Nz9>K?&Ԇ?8(3~6hYh-# m}>lDuFHu˖׶EoC66B G^آ)ѤT-S\VKM6er¨q'OD^EM gוAi(|amї NoC@wDŽTA=9B#>gĐ)ŁnmDۍSцF}&j?؍*CMPU2$"{-<0ד# C eh6k8Yk=`hAUU*NrחE٫rpKq`}l/%q{)덈FXU&=&#ta=J؀lޑ꺕F`lﭑ"܊Y`+BЈJN\o Bzى_t ч}Q}pxqCtofVƃy +6h֥݉~}8PFD>F=~3y7C;rTѵr3`Bkz,Lح81k<GuϋYjgJ∲6_(Z lP_Ek'o/3_e'_&h1'f&Cހ+(06୬ 6 xTt~1_=')w/ܺON?L}\ʹxPK9wʃ:l6_ĸSȼ`ecݷ5ߠŘ}_+{LSYγ ͗xt;r_)'<Ise™ˢp!\T.Ebpa\Y,D" Bd!Y,DDDDDŨG1QzŨG1QzŨG1QzŨG1QzŨG1QzŨG1QzŨG1QzŨG1QzŨG1QzŨG1QzŨG1QzŨG1QzŨG1QzŨG1QzŜ9Nd'29h䠑N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓N:9䠓NoG}=;x#;7=j&B +kĄF|#rJA95#Vv#b1UkHYz%V3F1J#soA}<&GL9Nʘ0 .}f,gv#.U#$ GkFĐ1 {F}#>!A9'm8ZLRxfԘ=w\L@8ͮ۰rZ/FkF%1E_]R" b0n0@5DKw.F@Wch/1Uw5Rk@G\K(w.ʫ6J{v#oR#n猻=t(w% endstream endobj 1972 0 obj << /Type /ObjStm /N 100 /First 1014 /Length 2064 /Filter /FlateDecode >> stream xڽͮ$ )L6"%"00@ ػAA/>.ƭ*N\HVJʉZ Dž$K\Xnqђ*Ņ'SsrָgAJLUqPnb5T18$'fYV lT`䘴B-Y x*u79+F1N9X FqTšJTS-RϦ-Uh꩚ųYNs0Jkb6$)yWԲ$br0C!jI\ÚyRa\b< I;l`qTwct'Ir kp֒5Ncs  =wO#vMI}\KX}>Oxf99?`<pqUWIr}&gKިUKurW{1sG.NpG'<%[x cm DT'[%|ÒZLB-#<6 y8[LưÜKxj},&0\p5p }v?۷?v~{O e?~vۧ}MYfXRycx[Exjm!ݾO?}K}~?ikogTl/Kt,R~8Nͥ D`B*[CA_ Z6C2&vtgX#5mJR8ևB-]7!eHlɶxA6`.Z@{ +F.[qB+Հ8jaj@J5h˕j0J5e(yR C CoojH;^"UEBH(CnB;A-;¡ST"[{Wu rYrIK~%:-9JDs@h,*%: lJ\TKZF! r_K'(2L2 =.w" "> q3 Ub)O ;>a%:D_ +\J@}%q@1XZ!zAԕ_@_H!U1/_TE! ±;!V9be@TS!ucI *nvメw31)DƧBn|@n|wメwSYߍލO!l}iWu76 REQƝ"TZ_T CPT CKEBU(K=kw-Xf+\ޝKĞɪU]%]% ~V *!*1CBW) 0ac?8$ΛT[`S-uҒՌ-"OT]7c_viP"md(RojBѶR(,Yg-GI R7:B,͐lp%j@*By;Jfktw Szep{@@('j/ P*m\RAEQk*Zt}`jMwTefV2Pl2b;*2%:DE#4>!"DhDs"4*%^,DUAoY o+S8ҧ5 Fuej(ve4CpCOUKBٮY(HJqEӮJH]ᐩf/@,gW:D⵪)$؞.I yX ";=IL'D|(0ZkpGHt3'#$S]؃9qhbe/G\\y[bw@9=!V60]\+Op+.$_˲4{V_~Ȧw^s[7$DnqF8 z2ԕFJx}q!lxFu q0)D[qs=+ҽfX6ot)ѽ1x+ endstream endobj 2134 0 obj << /Length 2042 /Filter /FlateDecode >> stream x\IoFWX4CB%R!K'P"%GEA}eA6p;AiAq Q&RdS2 >Qꇿ}{'ɓTeHrm=o?x&+{n,sx4χ|lE䋊 hONbU=s!ɩxPMũzǒ;`r77Tx%%E!0vz9f T#ű.FxF'@i H 1c3ڌlKajc 6tFG*5;D=B6x e G?KLd$y[j}|/Ku~^mB2$I&5Y e7HƝqȒ5#LeN;5cWdjvqfMP q/^GB10¼y)a>[$_F/QR 0J,!>Yb<[o,L#tr|' 9dWP>sL!/|dfLRf((:t'qI*a42\{4P j ]|<X8h[]흥Aqok>{Z15&e2@Ǎ=&:^H`ii5ņx̌)8(N*( `u? b>wdJq 7F/5o¾戹LFS:%=8utSuH2eFभ$[7(DGX>LWKt }F` =}-& y!ãJզ SDq@\'6Z 8]zyUP}TOy=yMpU|_@M]}ײ*ԗUavN:W :ѰOA:ԃg~/Qe:^f-J6ٰZjEأvkǙDm Kcq(,^&_X.6v]NFEٛͬfcThH5& a4UT(-DŽ77g`rF`T*J`N9Vcj9&=*Z\}fr W8<ѣTiJt8Î^`ʧٷ /Q5 @?4q'Dv[9N@;aae7 (0b^T@d"$4A--K>]cwmsHHT;um#aCCqldi+n:xIh87|zyRD@@;yvt3  -y,lvcaV`؍f@zNa6plЦޞ\|]m-&V0uFrƐ}'`_, CT1[cdiRsλt$N:۳p&阛TW0/ʽN> stream xڽ[K1pX/>mAIl:("0bh Y8S=!:p5端Yj. T DXbakEM2/Z2{zu ߣ% D { [A!٘+l6u3澑eYIŒKwiƉ2L[_bxr'r6 jb|EI\zKL}:M}`L}@]mRx;!_5411, U `澞7Nj( VQk0//,VV+%] %dV t_³jt;&4`CTFiTݦ i\d4:BK'cHe8_4 fH:|[5} i춄% CWq-D v~):N8XB{!<×0/.tÇOoק_WO F?_r .<@N؃͊P,8\g}_/twO2w~R- A-o$xd$l! p 9RЖ .QcRǨD\hI/$Z.7fGv8& I Iu$)!92oN'ǭB$u(o$E=$ S \B-bH9>YFF=' 9A8s`*c }Cf"F NL K}7K$.D"oHlqHلB)w gw_;)lm1[K9#}6D]vFyگ8ю߱^_ ׌Vס,:RjԸyQ˵zO -mַh#4 :K)Yy@,j e]"]{$z`Bh} fx$ bpᠺ *AP]8%I,rShIqj9@0`)5'*5sVy{ ).NLohg+t?EkjȆ|_=}4A_5^P%bx<7~J/_w~JoN58<~'O||8}k'h+/n^8Ӝ cTϐ?Nk2XĞE/Xp,$r=G @<y#G +X Bcahd d d d d d d d d d ddddddddddd d d d d d d d d d d d d d d d d d d d d d d d d d d d d d 5k @\r 5[ @nr -[ @r={ @y#G @<yr R R R R R R R R R R R R R R | ɭ C2iAIBle:/+@#սaB3Bfh,qP+j|,u2@DmdjzuTTK~Cէ/{$daCAxb%\3IٳhUA}c}ao_Q17n Ցת@-{ѕoQqH1tTа#T 9gE!NQ.kgJIc(5ȡ~q:쳜4BpS@e6|:)u% <; 5!C"*afg;>d+m!D2Af䳠v7& y78r>%9yp@h!8z硞Hu^Z^Y)oVv@少UgpgPt$mk~RqiIN8PWrNE8&a+ V)**7=gZY4[_F'^L'-ͯ%1r~FmI"r㦍r{0xwqoLIN(2JittR$a HWpoq9]R;ArX<׎)et, $9z2ưd(@$$cn)Vm27X:%ζ()Ps 'M

Oʞf𝄠$V:; 54a$2[-saeZf#qeIьqm4í#52m4f9ܧ"͘s옊趾'."rX:п>Toö:6MO$h~e#$&{ z)2!N'DbiW怌VC)Qi^{Mґ-L1 8QGQ-olnysoq(R#t{:?!l~syΊ93 u endstream endobj 2218 0 obj << /Length 895 /Filter /FlateDecode >> stream xYn@+,E,PHi4Fyv $N;ǥj.jE}9s38 pnлV40H*8 #e$F`0 ]|Oג1AJ;KYùkN/Z$7ޅ.pi͑lm!$kW/kJF&(Wa)֧_yQ!0`uN`9)K"#!r&,P9y*Ҕ%~j "иWaroa76i,CT{b"ݻݻW$OfЊ9ZigxBqԎm[]u9p޺(Ijoy|#nĬh/fqʷu;Z0îJ >I20 Ce4cpGg@f{ %bxibN6M2Yoު6F{PM"zO9-o';GHbi0w_Ĵ9  4zCU$`U9%_􅿊G]R<ՊB`i(غ=l >n*4Xr6i7DuT*I9 @&htbԪ)M3c)0hkbQf赃6젥.d.O#lf}ir,nE^" *Y^o 4;tbfѴ5K/ 4BZ> stream xڽM+xL.YEmAIl:("0b p}z{ `ȵ;=/&ޜJ )TZRАk5; NAJ6BlF5\BHQ;XYwJfi CjHATPeXZQӳ%PT =\iX2'jF RFnaV E=ndV%-107-0qŨj\R`6.Z-nc u$yij[ y|C`qolJAMNjRcj&SVC+LRytVq]-ShĦ)`@k<楗ФLb[m%4M֋Vզ )I .SJASA[aJP9A{IT38]׵Ki蒇C EMEw ?5?Y`s"/|kB*Ђcz\wgbXbGNLM,c4*X3chT>{8[hZ{6 &F˸& *湈*3&e]-1.ksYT^;ǯz?ܝ{ !}8ipwSxϩ/-E B3j2\mx*~ ?={ ~}7woD1;D `QjGDEłƑZ*s>D{gQ]Y5FUpՐҡO{}\6nP>DRdKX R)&j&bklhIR <Y  K#V.%`(R!)kD<\"KvF Y{[+ IHo@dZ!榱Yn }IDicrpDBrt%NjA eTF!c5x_:[Mtښ8ޅ*° Gžf ;`D/Y9 Ryj9L;!K^&Kۄ#Q1EW,.ƒ!P+EX-v"(L.:cJ*V _FCx-f7| ZѰ`g܈{԰[:X:6$J̉΀4Nrxe%JdY+, YC-1[5DYBlMi4ʑr=']a 3I-ff=3f710{5nba61Krd~S&U.l7F(llc 1IlqMN^ y{4˷C>f 8ld;sxc+re~[\Y+ agVJ3CGDZC쌍dni]^0rtNX;xi,*'d]m_,Q d/F, !E ε@h~:#A}cƷ4{? u^,|?xpzM8)|x ƻǯ?ݏ?~[3%]֠mo?~H|wϓ?0 7_~1Ŝ(nFuÕٕٕŕŕŕŕŕŕŕŕŕŕ+WW\]ruՕ+WWn\rs͕+7Wn\Y]Y]Y]Y]Y]Y]Y]Y]Y]Y]rwݕ+wW]r9%7ȍFq7 uÕɕɕɕɕɕYÞ4C. =߈*#'t8Kǝ!60x>Cav iƢy(߶^*=G  endstream endobj 2220 0 obj << /Type /ObjStm /N 100 /First 1002 /Length 1801 /Filter /FlateDecode >> stream xM+x/Eł9vly6va$>o4A=`f%S )L-d"+Ur %H.PP₄V 9d!ZO*TcP%,տ*9dX k-䗩o"p)\# i ٕQr}ʁ\J > diU"̡WB[Ԝ kԵX ͵\q`S8m=MmApak- \\_MA0D?%V)H%Mթ-ŵT J=|=pڶ-ՙRqf`Xެ(X>G9;K`"cZ7-f3dBM,YarTBe<$ U3ġ@54KlB+ l9XbH%4 D5"4O|*D ß`lxcb~䣌t@.(\-n.Gy3yŗL}Ls9oc_Qm}*>|,&> }?]x}-u{Jtzt~ߏwt~~:ӯw%Dotcxm-n 3.pE8 o>?.Z*|  \ rLp)DM+!}4"8A@j Eb<,B扡Il23 F 6*s]ǀ[O Eb53,EW$)2,{xƱ g8\ ><  Y?"A 1yC[H+L##A55AX?Z$O5E[Av3,MpT_Ual+0pLπX.pP2o2_O~Y9+=/f OPOlT5J2CY\=Mg@Crme譃'P&7zHj7 f** _ʴ>Pu D%pʒڍ W+oS5E3:eM(5 ++#6% p6"җ!(ܠ~!bie3=~/f*ݚCր)Jsk@\9Jᗩ>1@??b58M* K˵2%Z"+!x}75eXz}"H~(}ئVjo!h!zB'"B18dDW> stream xڜP]% !C wwwݵr{ݯREt|2ZHAV(fgLH5u6t6`UX:@:FVx22 gkdOtt^h :T\YC# oC;G.!lnh'p03w092тhJ?(L-m mtֆ|013223fQY:;G/Ofڿ\M?"?\L&.ta&ca u\lMeI)h.Aq-J௡0wv碧/)-ЙbQ[a;<#`4+##hO,khfc``0']P+Ll=~ˁ WToc!!;w `fgPCb(ikj7yPc(JC020kk?z{u˅N7WGvf~:\-roKu?O\TIgC+A[3ENb@ gcsrտ*9YuQ+T-lNN&E@ 0tt4gf&VV#t妧s]}@t~#vo8#vo3^7bKF2(o.8@~#Pv]7eW@U~#P'T#E7eqt#fOC{Хd6LN.6p6_οAApUahh :!fGoga@XAAo _E32&ZfPQ&v-@,~ZUz$eK:~FgD\217 J@37aYAL-a[A͘ o=Lt 7AM/FFPՠ@6 㿤9jfЮ?L!=PPc]($q]_k, @,F G<A%1V[o& N7!@|L !nv8bvPX*h@P8k@PV? h"9"y?.ocGHIM-@ h 8gglY~_+F;f{#Ar庚+ s)6 xڪ֎KQ-uٵB2M#W2}}4I`*V|_59GO{ hrEpݨ2 D?| :Ԙ\[)}$Y /(NB2NK;A8lG%^|*aMDaB5߅F藥_l7YrjE[&R -26ةtJ`$&5DZlB(aؑ HT\D#52&K<|T`@\ ďA%" ޴x?‘2HTdY` pŷ"m޾r'uǂU :<Vβ wXy̻ry5lZ"» nS|#o^t ]8! `ЎO> X)%;ɷ}1wTb(\JYtQ.ٚ&afrZj]s!6^nЗХռrѲdD9p3#y;'[GI%l8봲wa6.gG'pVS}zJD4c1{`{Աm-aXtLݑ"1؍t +n $-Rݎ3uwޤ"M~TT3*5j+E׬B\԰,":"KUFфȘd~oɯ9:?sO^qX^J0]0$F 2Ktƭ*ۅګe/mMB9?SBIgË鏟+7fCP |qi(pI*4mM#$w04V"{ !&TN5;,-"֨ ':m[~H.+u{uINx "b}7j|i?k1c1y*-iKelp_a21#׊9q^fS,['ExA 5Jx?]`y+`X)[qXuU{FAQ'yѶQ/r/09/'2v#&dBݹV T Xv$ hf%EgTeL/sט܊kj<.,K\|*f,C6x{QIY{fs`3T(/c&i|d%$N/MVO+uTEɁ:YCxXΊ'./-s\+ZtrN.9j,uհ.D9pR'_m E{=Q1b~;9vdgxB[ euZ/k#=jtҬO^;;HQH$ɶp#0b:Bj~Uߤ¡җ!,F`_}EjR+9I|_[I܏b#ܭJ<ߎ#3hlaֻVW*jBH~$]>Ϯ4XvGQIsI$%J~:L%cK@ف4,^E ڐXitpɩ%3nU_IHy 'fm?Lsepfl-%fӍ#ug9ဳ)NxXF)k6wRlMlD߾3n@I{_ }?( =JȯX_e 0 !@ _W1q$1މL3~Z`Ns?g `:餏-Fuh/bGpFV̟pBBEBT^D4j :RGߗP֪VTUxs:+Fê;tK!MRIʊt2 ĕisزXdѳ)~u]>`T7S;nw(ic[K ‹ r#IE꜊cnMDP"PC K @NFSWSw^BC\rK`ΗZ _7p8UԸPF 5.x"nVFTMZth+L<~TS9%{wj19ԧsu1$Ǿ{ŝFZI g#);g9{rn|YI-|W9%xe.%al'xdv:} ڀ*t^vИ{+~|zFnP:F iQ ZzJă .TVX 2ϽvLlKxk#sզGꦇp768U1 7S^atKWk;XG\tuQGeTT& nb *D$!Ŋu JV\X/ 7q/3[3S#dGR?rv-:EMK0#~=cTB7O&1&el$k,5@{eK~RTs*6*l— qx&n "&d#+gJ|)jb:ÎrE٫wOP5,,{՝..=Ȁ-;>n)N ӗXF>r 4(~&lJ_A$Kʚh??sh]^NaH\Q`'q dv~KK{D;kt2eu] 3e۾Q69#9-1XJW㸃+ඛyܿfg˾w4MCS׭y LA-󥅍l#m1} D_m&ș m2‚\|j3„HЃ82bD|*6 >VMFsjKX3@r"l Q_^ eFj]`V)vG&=On$}Wn1hKC}Ƙ@.{j?otU@rᡵ25|2.^=|P0۽"=e$Yj;^۩fۥsp*1qT%jq$>D(c7qg_*rfgwU1tq }~:yZ3f᮫Q ^fq[C&tũ8oSv{;h*SqoP6lۃW/dp5xQ.,1k!ΈitT`;EW\;%18=OvxlC(PgwG&T[ C1͇*j r/=H_oع`ecpZXcϾ`b<OyMV̅Nϖu<}TL+fөSNq@Ju|=< GGusK7i [dvez/Kt6Ag#Yzt6&zt1ïI,U㻴TYe>74ݘ|X0%p3>a!n !/h.˙]Pq\?RHPjuqKbӔ*Rme$@Yn}ުwJ +L dql |) x{s3Я|eUGaBB=j>'fĦ %iз')zTKXH;pLOaW/Uz"g+ OBnc0P,Z͜5h]2XUafltrE˳ktClzǏ4 \Sb MTp1o la=@\p@Y3XeJB #;ӄJQzpEH?t~xoWvH31ߪ]D0+U6FV|@`iˡl1/ώy$R/"^x,3RDQy_!LK9#ݝ[RV5ᵆ5FJGu61( ѡ~'O}ɳ%4G^R%ᭌ$QE7H?-$Oȸ(>y1}{HvvM; K|-vlz;8> -u7_>=^-*7QmZv1Љ2"bZل=K'KPu($Țd폊aa4f,_O{, 奌 Ux[NhOvkÇXHء\&k==:;{P$2RA5r[rR'XŒ!rLMZ5JZ)Xҋy5҆Zp$ U/݇+?V: 9ﲔ[F]90<^i;yakOge5 ®‰m`P<]NP׾HzNY^E4Z;Ao`M@nvx{pZ+gsc=xJʹm;2oKx DOFET[SWϊ&(tovJv(6o=MuD}\V6h 'P` 1&i..;%~W[CeSBOэ}252OFPHvWX FɐjHHk5"9)Hϣ-Bkls]B`}b3^hZΆU6"kh'B3r }!Ds|y”Xw'8{]wU c=6𜔒f~}]rYmu1xed4Z& \l 5%q fF[lr(r=(ty6'36[of5zg*8dl7q'}lіƊ+[nRst3QlO$}yu5Xl( ܷ(ܮ`[2a;[<Wob*D|**SԺ֪۞v&#LEXdHK#[Ɍ~h#$4No]ϙU"l ID8v8 +,a|Y#p|VvJ )!Q.S+Exgl!Q{R6TSўn۵Ur.>i>[zY 4Sl(Wb$&)Gl5 Bl;̶E:~Ϙ 5 emRMAg4Sŝ[Zv_XOzTK+9əME΄*~`F_(c@e#7j & \G[=uXo}9ybQtԑ*]k\KL(vpUӵ/O(moFP>KTz8-*5q[ֳBLuF$rkƇ`hWs//> ̺i#[| _bJճ*Sms)]36ZdWYxd_VWY+1T"j?N} II+K%Odx7u|6˧/O][U HK_E0"F2)ǿ!8ElG拉,nb5KYH?PyxͭE k*EBI[H:Q%:c=9";ϓERi07Y1AԪ,Y?J  WɢB%4?kpjp)mr(wSmx"ap j=5N0rٙu-S_^ԸaIO,Z W۝:8]*aoe?\ Y{/agJڤ  Tg,n_Bl@mxod /%F53g'[lhZO[c]g/n(O{Y/mmLq[U9PUdʲauKeLҖ ͮ?ԲԱU(AOŻhZ' PW$+0,+`@Q، 36yw)Vc_::>?y&A-w~j~Z3&d ,ʬsS=3t"IG 'zy޶Z㩸<*ueg0 /몒Y<2W,\zHXo5g:-hv3('ZÉ?P_ LjqAhqn3(DumN|Hhq%{;?譌VɺqQ{LQgo2ǧQXCB/"ٚu$g^ 5]HqG M>8s2(tC )!DJ&\oNړIT/2djpF^) ;HR޷+G]8մ#~Mx #u?Y Dn^RhMfIW]&1R}pFO}ZHI[CWwf`s=,2nqr@b z/GU._6n鳪V]$dF:TPgAiqC asS`GBM4#7f 6SO5;"0_`K\IDf%"qaɺEw2$#E 3eK{hQėu}i;\mfV~<- XN 32 P [tӞ9c-l 0 n^")ԛ88/vz/j6~SZUK@q".kA3 TxmsUス#%0ߺe !2b@Ly"xMTHӁk+Wp6vӒlX(F!B R Gu2=5lw+kў]Ң edvҨ֍T?x&GB{jxuNL95v[> B/| "տXLUzDe/R`elŗ8{(oݠib1s?KRq5Q ]ͩlVUuN0R~@sPI@V(^wXf (/D8m{L~Ńrvxiױ"Oq騤G=tAV@*lЅ!ظ囍 o089-W!]^stcdSoie.qDm}POhRQ43 6%THyr/ .[fg)++7qU%j HD.d]|!B[R$173B8moލ@wmkxO髜CySR׏{?}Tl bjyK$rWIN. 8*蓲ΗnЯdq UIȶ {d_djhþ8&:*s{qrDkuu}[vfmnEzrͱIu#  ,&# #.piiNzedzCؖ4 $wQI}W]w|y]؉帑?^:G.װo$}K|H,NӶa'7Vzo0z[ɭZ|A NNG'o?ZpدQn&q`I \{w=Yyrr:wC$F Ha'XX ^N@ 73>݊x':_֜Zs=Fã䵋"Al͞뭅AHAySFv&q_hL +Ch'؞lj . 8?bʻ4ra>~ղĦZ_ᅬ0U0 C5xe+bP6[pGw>x44_-&/EjQꛩ-δDEWLOl'_>< mt\t 3,)7^BjfȨmL(هBtPN[_{}2`M1PѾ{ڳ&QxV-w)E^kʠ\ ߲P h|~aV,^)xfFW`_z-TN@6L2~NHqPMCB1iwE\C 'oݼ- &>Ao"hMXY>ƹ{\{$}*TXaC.9STF6+V=f&᠂_!IDޚR DiAPiqsUMNMC'޽׺eFUQFQY49A /y2JcN/`ڣqW5%¿Zz\(0XHcS❳glYX= =[ggU/u=4wӚQ@i?d+_"u_7i(L@]59̲a-[6L/yu4~]m"[ !mO8.[/X\g|ƩP@019g2M?s' י+Oת_Z2Y&%GlNⶺT?aOnkM|o4ܽ׏LԆ߈E+ղS`;?4~ÈM֭hzKl:abB2:B]CN?6[Eѹ 5M$,S.BwpLIf}SqX{uXS]*MA^ð2/CKf䃃T>lLbrb+ y~ȡPi=#-S1=7^⠻) ˑ:ի쩯}>w޲/ɩٕ{b A$__SL‰sqP pQsI7RCr]CYmH+I-K%j뛵SHE9e,vdoFDst@2~w%tB&wO #o%WE&ѹ-4* |9$Î|C L5LSתjsjޮ"{C3sg< r'4mkJ:]v_k2S_!4s)XpF?hi¶1L EIq0I[46 2@x Pڣ}Y4%\nNiAc;!Jz5,]{- &SnuFf7d}V^V|AF>Wh#B1rB=wf>*[Dw>:U3 b+,?ҕ`=I.u_ܣ^Fwϟ4y1ww}rN{6H͔&#mL֪R tv mx 45)1 K5!Uj~{$Vsx7uΥmm\nq̵lׅk 3Ifu0r+D/iÆfhFhyYپ"{rU-7ussx/OJlc;w'^n)i{6nkmPgyGNZ-:/b ut_k#1u)2hG^ԝb$SUVڹ\;]G7]S,I0J3@Bڏ':P&sb6ґj`m(jZŒ`vG-Paz4Tf/gwSNԉĸ~CքM~a؃K8H&wT Ќ 6SAtY >NU8L0T7~F#izpRxBYǜ?mkPii=]lj9o=LfA H*b:Mގ`Y%:7́FIg0eIu;q'x~l4)2CEHiʙYӡ-}nĂ7r)HLTWvf`/dڥuo6Sou5V1JT#背¢ 0@Pjtbў9\9j$]#`'tmWPS'QP^s)#p4=ф8W\Ny oVXbnNbٚVī9*w|fn X9r,*raJ-r ҝW,|M  pqwfI{\( SlI[nW?GeՍ7Z}O`_0sZVBbbj7K X`0]lDrf.خ6]eG(SM?]jUD3l V>?`|c\ƌUѫ!&A'Y24תo2`#}5zp+ ;vQ. ^sW%.1IhZ+a3[[n]m {luH{7 rKnxMz VڪA775(pbF>9 ;G7_nvGlw|ܬi&u.8d+ M^Z73ܓ"`')ngS9)ZLCRk͗*cqB1܍a}.m 3fW=AsEMe${'pE!ZǕە6 -&(sU쫍OV?o ~T a=B#uz?ۮ|h %M"zK9?_"OPoO)M^T_ê`woz(Jh%l|E;W7Â1+ѳrdTԵʧoOr$Icv d~a)V#(ĉ_FTcTo՚9?p}oo42JVⓅ} #uބ&l>"a@h\2ǽb۳R vWZ_'knasӶQĪV=}]mEs^PR't4XV$A"^cIױ\PN],Q&]R뇰kk] i*E;Qs!rUΚIӕ;ˡg39TBA ;Ue\m躮>44N:1r16~;밋Tsm,쁩lM<><2C} vl>aRn=#?.F0zIVUêG8aQ_ ?'\/[x_'٠bk)}%ɖ Yd>%W~jP=o7e7c31~ec1:R:]͂nSAl1IoN^ i~+7l)=*I>Z i59Kɠ;P@; $W蘦+#ٝ[\hǦҜ՞/xrG洬\ѣ Qh> F7vKR>q">ީ(oL⸚ZIؑaiͬl3{f;W5%tf]GI8cɶz󗑚~N7&3Ȇs/DlnVE(YnfG] l˥澘yk$iHH Y \gv3pHʒŔ>Ԓ0Il ,д<~qf2w9f㗵>T(+8{2 kg?yŸT5V_h!N`g >jZɀq4^r6Bu:,';.us 01utJqOlGQy[ qF2^f&n`jb&OI%7O\cy!vAUa !)xWGQ|@x{; <(ݤd#O%>z>=2Ru+ya1iRIbDxd dPiR8$x3IڋjBt8&t T7_\ &ߞKq];wF- $d~D""$6k'9} sX\x02R$ae=ș=m ?g UiP`'#P!?^޺u}IC/u1W7[6|}6PXx'9* A< tU֬ן2g|$1Xݕpܯj'Dy/+clSvO<<\-<%a/?m}sOQ>j3Ⱜt+ v*𱮨AY/?Rk 7Yzwolfszwj{F:*m@ןͣzǓ5l{Qan a"X{FF &Rb-"y65|[}HgPR{HӔ0?i(=nfK`m*xwThtQx LdxC\8SK ~g`)):[z4 ѹ._LnϼV[='q cTٿ|v=fZIl774/\ꠄ&0j\܉3W1n4npe=0\0#ciRI7L5=FuWGv%.VUy(`:` %df/3-$N : rH9CHz&Mptb6v wog oɢ~I@T[I^(^%DpH^B- KaNqRuSɵ &uůK(f._\ 0%]&֛{QR(pÆ?фk|.Qzi"BlȶcZ߾g*8E.=]6^n3nT!X>'&!fv_K;ib*v^/ufDa~Y2V^DyXKotv'a6GR%<} O:|0ڏݮݾPqgJ0Q DCY 6}%}_Y.e^r*qk*OVg":bR![iO-UK3!r.v\Dƙ\FU+*{6jOi~?ʥјU%y|)=-aIkw&%WwvS:8? #yͰG5!ݫj 7E"t& `{8~fx=@ ؐoTf otD:f(b $tސEp%{ RO7̢9t7yVOWCPk*@ymL,6dnbOSxQ$qJa" .4[lU(*\G_XQAK'Ack1Rw {{o`~.Pe휤c2:EI5q1ءϸB5,Q;΋UGs݉lA,UoCaJ~ Svt t,)}%khe"JT>b0kC2S`"b@˥08*RF)͔ltUQ>I5HM`B6I}xw=5m>!U317N0 ҽsƲܯRBҵٓa>&lR5reH-b]HklG%5>nibHJs 2k+FZtTK-a,,gGG,Ǻ8l<[t'~ø.~P"A=Ui["1= 4' F/zwnh2K8{z@vb#b=k>ÒBOI>v_p( >( C;ѦDM<-7݃xL& P)a )*N&&ao?rC{WM>b;/2F[?9@PLJdd $z0 TUI)BNI*vP]N<3kfk"!̄y-~sYw@T1NTe%HDLGu$u㚧":Wعc55sIIaHWt=a6Og%}wKb؄evn{$pj;tjUin .51EH%'(83t#y$B;tbEy7[s'7}cɳK@H? T WR/v\Z`YMH:VK;VTpǘYMLs>~9f֮[uݱ`nj+Hy7>SKT5Cʥrz7%c }```+s7߂ϰ6sxm/=N#?)KPbEt&Arb㬌4>FR'* "8׻f2Dr Tk|N:H RtǕ6f ܑ>L"9^N}5jXUԿ74j[ϧB1yQ2Kѷ(:PJpK8|?Q):>[{D>ܒ]H=0nL*/u4N7bԊ?Ů&Cl U Hk $.?@Ƚ}6ı k1WLmeQg6/Urm  7j b:94qg~;38^]8w- JE?PG7ӶɃ={{xѝO%ސ6zwz_l1Bu==t0bB6W֊鉬n]vy HcցCc%s֛h I. JqS"^ ܎'z2ۀo,t)C2~'ɂMv~2DVͫ5D͠L}{’f^JJ=/na4 P }WAd㥃I -_,穘t-ʅʮPEfC%jȑkv^V_wC G| [kz])W5'@eKE>~ؖ_7BV*g* #qHÔ%jM)B=U')C;̄~**<%H$c)Fh.`1. d?V蹯pDR[cNa}_J,#l{8''"ORQS);r^ٔPw&rc\TtP^\W!>&Rf!$Rf:t %>I¶n^"7^&Erﴢ~׮>`+h)_CSB=A7|pV`4x_rmv5Lh$\GJtܬM5=0 rs$l/SQ5?IS;&#=؏0MDL^L_y7cenW|fjOc9Cc6Wf8Qu.CBHIhz0+;h%L+Z(CG1] 3x =K`I)L4_&.|GFv01L3BL87sa3}&@I~mNdI+d.{'^o˓ 9V ,U91P ܡΰLȅwjLz69S>,.7٦deBCA=d}ؠq\S'lzS&m\?PƧr_>bfn4YXRXMz d%~ͽXPC%1'U1iehP\@.YlBe}gzVB Ky3h`6eݧؖ}h8ϧo1pN&+xrp|SXܗວ]<3?l[Yp6 mr䳤hs;q$U_gɺ(+=SWzT,$~!E}is8,[KCfۢ}Do endstream endobj 2241 0 obj << /Length1 1384 /Length2 5903 /Length3 0 /Length 6852 /Filter /FlateDecode >> stream xڍtTT6]ҡiK:af!f`rn)KT)P$%CE}}9oZ{s]}]TXrkaHPװH\1C`)x,ho )54!Pn`q,%1Ho -C|0@_B½)xPh WWee~*p4 A W qLQP| .[vV Gah"< /) A#q!>H :z'X/r_DJ@@(O2tpPSO H/ BGw@S&37xx#(+ 505՟: =@rݐ(?$ s5SL91$HVLZJ {pfN/3n`'pF8qXo/}tD08HgǙNqG#[~`7{`({W,jja*g9UUQVXL` I @ZZ g"#O#tB{C? .7@ (?w濲L4}?~=G] N( ]}8 ^ '.ᭉÌ_nKk$u p 8ZvqgI $%41I)FC(pkƝ$,H7Q$ pN(4ůB1ވ}(AqZMoap( *N媟<+9)tOjL'y#̷hf49ΰ-MNN5Yif}_F~MLy5+"܍O Q Z=L>ҽtZ9*ldh1#F&@y] [w)˱6 b)びfb/YڰҽU]˺[Q>W:ƙyd{dqd24_mEjUߪfn@T,Pd{Z_ 7VtIܰ6rVSyI4$[B)#m{ʣH'31(W]&T6t{s-<jMCQb7~5n H[=xMh*jAKFmq|R{t>r>EJ!mifBJ[Q2X M?>? BsX9#y-++nD) =`F9^Km]yQE3C &0@'&⾏ُyuG3~vҕ< s)U!uFm"VRyNYԊ1=w|tg>i!4;W1F톱FhtWGA̡krziܫA1F b7سIRikt7"8;'a!* 3юfN/6;ήcf.i&j;A?T;1 kvTn;F2YV_y!;᳷6yxؠ%:c߽*"%7 ?}[P;Aj}-e.֗ock8B?ʹn֧:&݉d~gVlW&[k )VlN7?H!>b-<gҠ /j!jUVi>K1'R3N^uѻ1ג?|=(vǰ:g}]N:> '~ Yߜͦsӣ׃$L`DYyKWNSU92؆f& "›QY_qrriaYGFm\4"wVˇ<陬MEA~UQgqw)g^)bm;4̜#/ b3ߛ-g)$f'⽷T{wsu¹K {"'ظ7׹寮>Jq(D 6QuA,L|H|x\ZaRo%k̍8AYPʄTܲUnWdI{QrOX()n~_ sT* 2y]oJht,7 ZX]z(4hI`IͶI/kk z^)㻯V79fg]^"4$R}! طr_ys ?$I>PV"qSujgt!UIhI\*BWg/d {gTZ2 UIڽ?)H :eK)[aL V3F%dg؅UB:3ݵ{Sd/ M>h=XYcV:ӃT VIئY꺄5}.Lp6 aD\{sJKVL-륃֯ZxXK3 dʧwh>hTJYk"4$ a\qCFj>{ P g6O6vUђ.1Y5Ja{*_%L!y%b,\J=w,2FvC~9y"eydh¢LBXc ZWz;@|ܿFl`X=4Ea9l cl\W^RYGeQS6;iZ jߖ顂R5W(738*c߽-S1z뤘zyW[,-:3PXKw0M#纳B$}Tk/o֕ ~LXL7RY^QAI7`en,%wkBP9/juq5hEzЦm`DEF{yDb4t{}{̕lt7bƒa-Qo]|v>YF!&=`\='!NZC&bk`7G_'*ooN~mQPPj^^4rnzPj>'D^C r@DE=(91ϴ}xyښׄ{+9&1TlƓ寮8~HC9 >5OzH0pGY>> Mjz&XI$7ĵCRYwG_|Bjp9](?2[g% أu*`&mD'p& I,?Z9RK?3gV.0b_"y0`Y,)aEaZ9Vz<%ioaU5Bs$յ%fEeqVЈ2Vl_lv'f݅WD:kήPTnܓy#gX1!ĕG-5 s6.ӰlVh.1#QӘfN Fk,3B rj;5*|IP e)ec>A>@1#,)H=0:]n.l,0K{b\{e伉Ox]seL"se W0s8~ըt+=>tl~׉,>sg*8IqOFu:RNRWIC%<+RՍzH~{{ 1Om}=J"[{O9b*V34c6n`AHw>86rxtvYtN<_xG#c?vNZ]\7{,(,Mc5z]7?_ ,_XI6Rz 1< RۺɻY|FDN>EFR]܀/x{?(]n!PfO&y~"T*lƷfˢ OZeF>8;yJkqmI:["3)U <_o{(it'$ߑFRt>)7rpOL·^2Jvj6E.y6h憜"`WabIHw﮹bEe7UmSLʌ[W Fbq&6R+:tTr0 Tkp~ϸ"<;lPePqjwh~ݬT*F/@ ?Vd?mO:IQ@2Iۢ7h3uʓ8 #$MZbȒ'˂aG,VK׼R/Ia?Z_ܶCz>#+@re@>ܗ]n!%ؔ`L-K?V 1նj$]Ā@n/Uug/m=\AK:D*0pa""'/A endstream endobj 2243 0 obj << /Length1 1592 /Length2 8912 /Length3 0 /Length 9962 /Filter /FlateDecode >> stream xڍT6t H3twww 130CtHww Jw ! JK7ҡ{yoZs}}k?k`㐱Z'(@NCC͋ȨF8ef4P?r &D<5#(#$ * mU(f¼\vs`f 8\@@9?h tA `G `\\@g8'NFtAp;e&wk،}{0/t N`kN詨` _d쀿w'C0 ؂@-EuN'&Їx;z )P:?+sN{a 93cO ~ߗz@|lmظ `7ߜlv @[XOXr<~q6?m/l8@|o[#V ;0? ۿ=&pAa6PKIPQ%-)+ p8x<Σ ]?bU Pd}Կjv[o ࿓iB 0Gx'O濳_)993E`'uC<a K5 zUu=H/;h/sC@P8+!|[f?h/r?PXCm~o ~$yXSu8!PCg?-E 4~ a^ȃo g.?;?C P|wGX?|P_ӱvsu}Y?_ϋ Yc@BB:jd(<8юү^rc"&,r*}Q4w֔u]=٬iQܱx4sII7(UZk?6UA]cu}_<TC;4zjʲI(E "ZH;oDN̤SN&XZ$@>*P=h! A 6D)ϏQmX3~&}w+,Wu''f=Bɶ<߽aIJEۑ6 4(̓Ipþ rr:jxTO74!w;cmÐ۞פn*d08,^0NwK. sWs5~(1+DSW i濻9 $4@v/ Ć5x~*f8m'8X؏,9~C-M+@Y{._L++O[!I&Z(mFc{?' ̱xA:Cq2gyQ,Se"߲(O%iL,hOe) WnF0NhȐ7rzW'Зpb#ޓVhIesyc̅~ZUveyUbH+&g$B}c  <ߍxalwQ<%mgoLh.;dEb$d,9 ozXL՝e(^.46<e߸q'Vc]cEt57#YG$eJp'FuL)T e2A"b϶IAg$c2ř3ALJg@t<>_C_N*XwvآWVg~#1\zsyظ")d~A?P#srM;: zum=)A _H~8b{EapP "dƯh{<&LUOwE3"lxCyZpcnAN[誏T W~Eu3te{¯曏= d$Q$|4HlcYz=(Iߓ\fȕȖ;y$1 lTU>!毤$κ.;O.TMH__fsS4Ӿ_Nǎ&'s:#3տ3= V;g Vx}bV#-;ԙяkwaۤ@etj:LS_\! h>9Cq C˖UŪorN: JG;m9~ئe=k .l-@0a7Bk/^N4p+آ7$rl([(^L?o70(MTTqFbYy\̇VXg91p3z: f1J}\AE/ވw_XZXV WpgWJ aI.2_F:To(/v|cg.m:X;@kٶ1GWP+[EU1zd_(k`*յt7.j鞸j &TUuSV# Xԩ#zaؐL> &,c,xiZ_$(̽ɼFG"aq2o\8h:ZG짘vVQXlHDѦCMՓif4 P' M[/u lV7wM|]Ӆd UenqYQmd#^Ux4E 9-wC1;VB4èe{S%KG@jf!s'. SGrhtݻZbnGd&8]fbʼUuRN uDwH%g ̢=OW.r+񰔤_\[>+Ь'!qP6+1u|h!:r`O!@61;%r}^:6զ<$I)*|FN0!pIzgC,,Iկ?qNwʅb[ӯ?R>a81Oʐ,p~3d6T!30aYfR[!}m xYg$\i7a]r% ]#/E8T. 1sV ޸7GS]lV=߫+H (1K4s'd.U㕄f`դaO'Zj5 t\EE8ݧߎS̻{>}ּH8bǩe=~*7oˮ2ph1W?22/x9`8jGj^[mJ)&a2ˋ;|nYSٺS64؅)%}6J!4-k.'SC,?nzBRkԝ QI殧.fƓz<&)+{ {)m5,zE X &\30.uc `FVd|W@ Ne`?4ǥS(pr|c% a;M&VM2GݾUP?0Ztn LAc8'wD')OB|A/Xt=wQ>xb sۗc+q![7zJZrX"J20d略p(&n|%>ߓw+XSO\T|,jt`t>KזW3mZ:ٖR L[s_;K˿Ua?S6E@'cOp7g I=2+U|~Xe}Rs>ÎŚWR0 ?oMs7} 2Zɘ05p]:%;Fi^҂0+)' (F@Do3b:mU:u.B=\x;m8^5ˊ˗-VVrg]I[?ZH#qƑS3_q롷uYg0gÙ #Gwc\x~tcdh)2+NƲh)aÒxV} L*Rܤr2r G翻 7ӏx<ݽVJ a5KnZ{t_kuԐ}T¼CWC7aBS%Jl/{FdkW"$Z0YF OXvJyDSbz\>!jDMn=M|T .nT13|Y@JH|QַPM *Y|WoSBt;G}Mz+wƼ.R H?䍸U  k^AiYQNsjy2x&z~#{,bNXM␻6pz]j|<:D7`;AMS9_e$:w$jd##aQF2u8F-ߴ類pAs;Le)]+yhts@d ƇW,XZ_x|Yu(c1p.RiYM<Kɭq2~8zġ,Y:v5Q}W ¾cWSvL4]I)oC5VTJRt5VG6b`=+;.6ŭ jLԱZ\d{E b(5dé`DuʅX֛q^5̲5KK89o'vȪ 8  "e{M/ɘ [ >Y%HPaX\ڻG =F?? j}HPSOH[rM<ԗ㮡-$ߋ_R:aGe07_tdP%>AެAwŋfSAٰSz*:IuT<*F}oa 3ό\iiTȜ#w;OaC^Fk'Kbd^4rLq>>Kvd(ym/&^W:"*]VI$.EQ )v9vƬ*8fL%2{=0|xtZ[pybT ddc; qt=gudtg󒘂K :gi{i0ljj+(K}q^6Io9˨J ?޼@m]$RkK.聇~jR,槏*V]rJTHl?ʰ"L"q>5:3P["qie/6c>\B۲kvGyγ; v郔 ްO^r) p)xg$F(Gݪo muI'zt$$Az*^Bb-F$ 7bS7+E_rLR{bJ;+Aӄ VGZ( u}8iP`\mx=;_ ;3F|=EkSHXK ⟹GL7Ư6JM%\`opAK\u$rUH).c#.Q[? }sU1)J ?J1pxX,Cľa_y.v1Wt켁c2;uC㸍7Sޡn3hJ:IkJ}nZLG[X*=: R[XWvg­WLU}s *?KxBƙ2~N6Ԃ>]t$^k{'+R1銏 Lh曍Md Bҙ`!{&i E&4C* Ь-,%FapqH{~F>W_}~8B1tHM/xn@OO3%,Vv ) (c0(}~?PhSJ^h/ ~CUlR果:bQ3ku(4 ̑%o֪kwzv"۴ؽRM%o@3q]F[OIHs@Q}_ )u!L:B'ƥLh5G.ӲrXz.٪Z;}nef-5]by?w 4kPfJ,t j,4҉ɷI `WM.KAOu|{kLf;A>OGD߈ǦiTPUʮ:*>e8 9/` ,/:;Rdk"}L^ x(|vMX8@5i+XVbu2\i3N&E"OZ^G"璫ZM(p܆Bh6օV]+.W}#qouS?9mp4j"6j1ZԿfWM|00R4vN ?6 [_6iStVWzӊy5{f^a_\jn#Sj᣺i=v, 6iaʆiZ #C%9h}3kLF*+7dx1/'.EMr}J$&58E[Lxk{r05mFLSLQћ~ ބ^X=^m#͏dc/~~]%ȅ/Șr 0vZK_zne#K<=>oS$q>(>&hNkYWmK!1!|&^jΧ2:+h2':G},z 9`Ăc )- o^K*v{5яQ#NT*ND1;ZeP2mvEn8Oy=J*E[IM&.#ƶQMp h9< CHӃv>a<7zf'm52!wF<82)a endstream endobj 2245 0 obj << /Length1 1504 /Length2 8078 /Length3 0 /Length 9087 /Filter /FlateDecode >> stream xڍvTZ.)Cttw 0C H#-% 4HIH "͏zݻֽk֚[}~޽ZCM$qs UU<윜h:`=/3G }Oq=/% O0@! W4ziG'/ i,L.!!I 6 -mG 0L6P0;Z@ w%a;=@ǮhO{6h+ԝ@?*X ;hax!+=._@{Wǧ|;l4 9 ' > EWSXJ;:8 PW_ɀ]@Of bi.R+Ʉq r@ ǯ:^NN_'~>NN' ?@]@~>tqq,P9 Ad?] I{\_]z#!#"c=>l\6n>N@i*@_]prpqӱ_`k8.ZosqZ<}qKwMῪD ɹv3n므'ѺA@i 3 K{AX?*Yj6$Ǯk+_{z?\tt}6kAO>d!掛tqz=]p= %GS 5 8L @>P7| 7~zr8޿X<'d4h!juU'I3%xye6Ul1LYV[3Ur[[8njdjMe8x ;f P?]pe ;TqK!mzl_Ɔr9.wu9*DBzG[Zv -/QjiE{ђ=jq6FVq)b܃wN¡"#2ȵzEXwe|_0'd"DԎ9=ˑDɏc9~[cyЪ |RWB ϩD޳ ]UX-7.ר T޺ojv&)aKpWO -S_V X|.ΰ>4zб$o{N%ug|^,E[dbG iA;bV+՛z WXo׫euM?[}=|~c: ߬.U+DC͑=>b\gˋ~Ngh2ĢOW4G1V;ΪJCt/V0;~V>y)g @U,iPt?*Ez/[|la[ KoZĆ51,&.M-Ƿmo+B}d\o0,P1~Yu}b*~3. lMzgt.T;"Sawڝ4疂g9xskT8.;Y`$fq1&^o%wa-ۺ\|W܈|z*k uo.)5?I XXgμK~$bomx="~ N-i # gC1΢kNv[q(gqucH k/Vn(baH9>Y ͫHi:+ǐfFSϬOWz)Ao<p| S&ive-wnf@S#U@-s{(8TjmDCn '9wVep?fjyD;(Iq M>!5y#g8-<߄}8kC$[|W5ytd ZyYW#kS晪N֯A?n3LPyZ(foaɣ$2l7OZ(6#${A)/TPĹ[3/՞fcSiZjH Ĥ_YJS3:/rg\b* ["@*9s՛d$2a\݇.$+/ Y](itJYj6Ew-_e\HFq'PQڑtcL M ғK^ (ݘmwڑ(ܬ>ƗGUc}1d%Μ ̈́P7w(qV쑦{^/%prE5NJOW,z)zHyP0bNȔ(y4x s;?ay~%Zr$XWg3oiT%VV^/nҚ6.a:$ DhTݴqf.PJk+\ÍQ4Ň?_$v_fzGa>pd-t V=b}Hߞ~R+\ ZW{8=9wEҤBiLt UODEV. :bPU,owS8tR[ҮFnGvIBW,3Jv|2h{.nm .h+.yI+`է&SVDR]C(zK %%NN>Wcy͕ЄV'9wg7t_օva]:>BrI`8{ˠQڅi`ʋo~h pv Z#ǝ)_J/Zærq>[fO(h̶8Xr,۰@sVEu'ӫ`k/] R.-(b9i;ͳbn]HyBme\rCU!&rA~JW$(xחzRّqe7+ Hk)(4>k4Kf,ڽrb( !K5n7cz^M0&|HjWT I:jQ3cƖlsj3N^؁6%1 (3Tm dvdtӻlfTޟ.0k\гqB2,oR6u0LmޭÞ}ψZMln\l v'G 'uvB c<5|܋Â.wåÿ0 HZD2csҔd`<azKicUTۼRj3LcmfG !gdV~nT~L! ϕ4fZ˳Pѡy RCuA* ZWlU5ZkECv;HzPA@Oc{8`âJ*#,_eM]"$97Adr*^{*'5j˹%ķDBneKڃy^aH,yzf-m\<1#ڊ&IQy]7 [7dBqtsq (2^6Lc{"g/E3>yn]o}Q š9t|ζfG>CPI fY#vD7n^NoyQ/W03%#z:s*_ *f$vp@C9TR=:\F)X,(~3OG/YNݠZ֛yVtg:lRK%l3)^(ի{Pzq9$0m+â4TTz Xomﺽ^9 ;6.4N^@;<ֿDй+tx/!^"iT@jn5q,VbrM3$&TKK)ZKR,MSD>W&hFҭGy ;}g".!f9ȢgޮЍvߖgwyi'OZ^9$N4\aE;b5t.Iі-ܖuYص}3hޝci(ԡt_gv&/O3\_,y "TxS&c~qQϵ-Z[^WX`K<>8A]OSjJ{nvmR{1+6/n$scr+?K$*o'TYylQ(Bݍ~C>"=9#sk;oKYAŸWx?~)f4+V5-e!dwL?q0y,hK %`Folck!cNWU<_JGUOBa d\J+"oޞǵt, 0VOxVKam{j:ldHrRQmBm蔤B*&:XYq Y"mAl Ӌ򗼼έFv85L9ŗiRڏZE$bSsQ4Lj~z KM2|UoXwb.,E>|kF^s:яؗ<>w!Qdݾ+%"Z+-AMexl j6o*~s(4̱G-tf(!EqƜ:Y4=4Zbx5 F']ڞ)I(È l$覵NS=Dcg?5NRLc<7<GfXCY}AˆW<̽$?߆i ysRtś,Ңu+!"3MzK_JPvݟ\>N)b`uCt\PM[=)ϙ& /V)ϻ4 Q+rjF.uĪ.^VpC Oŕk>E 3k9Y4>҇>pC$y3S -ްRfɡƹp>`*%WB~on#ù/fu$ߔtM]cRlڞ6Y(E*Pն ]Lr!D#Lеes r  q<2Ltnu) iv%myӵW4}~AI‡a'Ϗ81{e#=Tȼb}a"+|`-@1 PCX l}ouM&0zY7nPk)qZNSaF _H73f.VD0yBQB ն2lMp.ys"6OZ.v(yX</Ὀ6w6CG]XK 94unLRxB>ZZz#*ߔ1|ktOl 0}>5$`;kv4Dãٮ_wa  p:ZAeG)ePiqsv!) `"Zc.1%`-oZ55Iȷg2z-p;*rcO#1?~k)S['B II_mɬQ/)!t)"'԰u?* Mhn,Fj75fƶDdC>lP0W~Ѻ f?)ەUL^9 ϱ<\b"{rJRj7}8b>xV'Л=9__5jx !ٝM>9'r'[Qgd Hq4a03V#V`F&*~B,xsMyTn&MJoјvTzGBsbUSGLWH!wŇX}񽮪 aH$Fz@ܹ:m2ZPBIsYњBvg֯Al_3?/b)yg=wߍH5 1v7@w-ݍ<HVixZ;{<`I9znY5>л0kE10 ཆ;@ +k,A>LMX"r._l}-2bq̺!!y(oE^ԘbߠFz($݊f<&?MË͇z{JJg,[䚃|6dMTj 6{dU/{tXFl5?tݓf4z? 2 88SD$Q/g9Hjl]Of?'XepS"Zs`mdIHu]~}<{5BvV?9;ͱfe x}<~ n˻O1;/-It86?? S򅖕8¦?MX*w^yRKr8A94b ׃d V`R8mX@Q,o}nЪhzJ!'!{V^r|huR2$>x>8NfF-,=Pn'W#S;V6 T>`8j^ wdTxT3}V^`FlH[TKMlsAnS)IQl^KEYk@H3ѹW"72< Қ,|9vpQsC߶腺cU FbPx<~p4TL4_6K8GTNɋ2%k&J8w05K)LfmD@FZ ~pӡ׀=]VhQCL6$5~>#\9S2e[I^#=A ൺ+C1m)6J’C4#e\+"jpgDu fD>eI"gG4 VE\; . VOeTBS@Ĉ ;_V=Ìy=;4.ɚ"$_Qh5:P G5ӵ 1FBaJEkey !! YOs8f:#{a-I*K]kƮ@DkT(E"6Q~G%suˠV)M#JΣF+XτMNͪ&nۗeibhg PJޮl!8 .է]_U`Đ9kF\MV!P\vcݵ mG!6XܰA] >$q`\s*I2&]=ۜ@eǡ:AdՂ5Db 륁27=̋6 "7o ¬V\ʴp^y}3qa2hю?s /#&P H4_gaPkU t&bLGIj"}Kꎮ )32ü} j>S$r3sGeQ lY }[l|Ã\x5FNj\; 3?Ck6ʢW?~qjNTѦx@z_3A}_櫁b֧GH.> stream xڍtT.!HHKw )!30 "(P JJ7J?}ZYzٍLU\P0j& 1@LLBDLL CVp[@Q>0$B94VAc@$HFNL #%C`D@}HՐ^({Ϳ ?xBQ0Ї=] pOx QB? @}(?+a ә 7`7E!((Ua.P6 ESm= A{6HtGJC = @p!XO _g!X`= #jQW5jHOO(C>u {C  n0ۯ&\}D0o_.XtP4 %&&&#+@hf^F/5`/m sbH} ~Po?%pg; AX5폌]> ؊a~}~E,lto*2ť/`Lc]F!?bE-Ĥ\7+ ]mm?OG xӉ}8bZ)Kz"`.ws(!ZHj7bhN IfDa͂Ѡ23qF.FC!`4™ l/ɄYϨ#ګz'߃sQ>R/V88 i+U,Tg,Z>c !o Y=g'=uZC-_)u*14㻞:K&[f'yA 8_?-q^IvR>D'C_eRa?#hD.D8K 4Չi{&FQrU *:"j:8:h O{ at g``ԃxђOqwԓD=XʫBZ3R!oXAb%!DW Mis1kYv4FHLǜr(V@MX&Z2Y']1힆1 D̽1+|NǼ3Ywm(@%]/_+cbLAa" kri.yRU&o}Eqct +F}UT>=L Y=^DZ\i.i_ˆa_|Hnwuh% ٷ hXET|1Y7TDl%M'ĝ蒂m(zo,i'G:;RyA/F*EMY)TZ*旎3 i_w܀Qmfn n/Mr(  q *sŞ<fG֟ SCYAo%by~4Y,RQoV:@c\9o 3}3,}$>#$xdpW+nJy8EO:1>-E djN<tp F:(#ø0I8$$de7m|dcpyY6QSrO 7}Ա)Et`*r[PWF4u_0,zIϲ]Le?+Zyd\Ei-ffF`:;E<46{cШ+XI$h>i*8>޲6WM0(?1:A5<|;2JVXB{r͝|b[/<ǣu54Y*ld>]xKGJėLRyIyK.v~z^\}-'|{iHy.nCgy,Ljds0jնSy|;%ǟ|w4ɁcDjjl.D"a6o7wXW ^>F]*G2x>\SiQs{L#[WP`_$WjՠO1/Wi&"~|8n g8ZI6?~DfLlhj/%^z):,--ˏ]t.ympڐ-k5YhnZSsH<8_=e1\jKxJOr28x)4^oǽuQ@k,DVXݗY!f%k/M{XevȲ8^DՁD1g:KZJUiԏ)jo[9:d{Cǒ9Vjܮ4m [er=ucLya-f&_7ep(SuW;M@H >1OxK3m;)} 1멁R:>g$_ #@j-FRR4OQO|{õ\DQO/)]\ h\$N+|aR7I#YiSb !ϓVɩ6>4mhTU킣lœpEМ} M~ldQ<6/ d=pп뫨[|Z碮%͒45^7}#lVGu #wصj]=fs<}/SݿSK^a?I5yC1ͫ!epҴurj9C HYM0MJKop%n>~"!  :DϏ©WsPžRs{8li3IF;^u҈ {NYuK^'g7opfx Jg:uҲIn.Tÿ yo1W5x=HHX滾!)u#(2;:CƎ;|ol0hɁajB wb[; V J͞4:)'tQ,q-噤ȋ{&"~]"T}KmMs6Tևcjo;=:r̸~R; *I}4BzлK WS]1ԋPp .rV܉k4ASH^kڲ6{GXM5%̷,mv}*ko,Gr SM gT4 aL b#S8 k;tAV71Lbŵޓ0v/ wWd~5m7^a[\jCC&-p|OBmюĮ׼0%}k[4;pd7,ζ?ӗmL[7rVaz(zл^(̏[ Xݱ|Kp=}B<dStUb-6/a!;NSM1wSZR福v Ў]Zl-8~.*A0ʜ9h{dqo 8g(],pS6w&Ќ~t%d%nߖ$Y//c|C렷Y|”AMZlroMD]?N}Vޓն_9x5pSzJcUn_[9tMe[Y+ vN|TY׹!XjaA _)5_ zϮ$_m)e m]-4Ƅ|h4/ DKkگz<(;=a- R/A+ߐ8Rx?x_iY9Vju/|v-w,SȀVgWe`ܪ5cELnKyCfpEzԪuVJcr0❤[X#qZd)0k4?B4Ơ^vP G15i 6mhW W)Dz}njքH|x^ڮ(Me ڤvlQk3Gr=?zGdBk8'hv$̧>.3{' ?k$ަxpn^y_N{Dn.gaC mu.f$pr .LGy` *l ~ߡ7ZcJW(l~զ"8kJ*q1ykDN:r}:)SwAC3TPq-C:~mBl!5O-撒2IgG)Z1_{05"xĽPEe4j*%$ n&}#ٷeN"ij.?a:?mܣԥhvTyuPBCz3yWm[N$w\ }ދL]I&]aYB &od]/;ZF2[˖=rfiμc\ tk{RQd_͹2 >],o s}qThe+j%/_PZ(QLtϾzelwa/ڮ@c +v,ft`A[1IJ* rZ =O yTpӖ.tՠ2 bX4H~ZV5@-Un.dazEw~F3x>b,;~H}Zqn#.V)(^+]im#B-iP kqLrə=7bBj$y+N+#ۧɇR&T"dۑq?l#.v,H_fg;m }BW9rU,rw.<>0]fn{R4waxQr AŁz endstream endobj 2249 0 obj << /Length1 1423 /Length2 6202 /Length3 0 /Length 7182 /Filter /FlateDecode >> stream xڍxTS6"U^;H RB B$t^&ҋTHi"={ߙgyyv6"mSC A@Y"@0)1m'0bh ]a`,Φ:hĤ@R@ @vP >Ðr(]\X>!<8p3:`#!)eX)!!A3Fj/@`0 j viM`0Bñ`Wg@" 0ↂ\F=/_~AJ'W"w0A;Q^=@zjڂXO,?4.F v85E0W #A (+ UQPe3 ŐO KpPh+8j"dB1 F! =b!SE3Ue?-˩K$ŀ$3>Dɿŝ%Kc. o?! L!?+RsC"?~3c4N  pso&S"h=AཿG`!//!(>EÉ {`p4}UQ4؄E`WW)nָ(S%!A zѮ+cp=#0N98r!;+/ @a~Q'ta0Otv q|vV!yhq#2ޢ7B9A8S}-`Liؔ/#ٰف X<}ߎ^Xh/ ̔\IfS]"/ .;0$΀*TFlbN6 V%Cnƚ&#OJm߼V,c3>~|כ&r]%VFC>k`b?=mBF riJ<}sք~z{]z5բEdslV nJtNcW⨂ Avұj;LKN-X>L ["%?=WG .dR4 4Knw>EIBo4i G1ӎƛgnl%4j6UhM;mxr& ss[;ԥ(HΌřPSOk^ U q+e~1W!lPlD8]߮Z۹ Xkv 뉽RDw=^2{ĨLaqo(:"n]pRF)8ͷ[\mnhs3;̆ɇEq9Wґw~=צ7t`Q˱;( G+Y 绸IB`>l;~Hy&B^aŚUs*{DqVXV/'^~_Ր vL:Az2,b&ϲ}|W~5|V+AtIxV0c5K*kYLF+ 6Eצͻ$w&ߑNή ҷR\[CJ1ݫ)3* 69tٔN7buE3}k L"[ o'nȩHx;F&p! C(ސEU[ޮЎ˼3,Mzy aI7db?wOccs0)֑?ݖ_Jr w%;S&)&ZD ƒxB+kB  7}GU>ˬdd,+ nMùm_LPH$ՠqӯ]ъ'{kG” >Z­5'$,XvNg6&[9?ZQK SV1͜!!◗y2Y?ɏ*fGkۍ6R.ܬ"IE3ĔdQ+$q5#mlc4VBDC~>c}or'R0e"(\B.+u&}uK8p`m𚧗t V?WέwK37'wyȤt*z]6Dj%.^36.}ٷ>"DEKW"͠vzH 7 e筮, XQ:$3Xh,=Xջ3Pϝ do{~᳝3n9V=`צyu<<Aߜů(|ߢ!'+yWJPkanRwї D\#5'XP5洄4=Nfvfd6jS7j绉 w&Gg8;!xÔH_`ě{[h+C&͹߹q|A.KOj=$YDifmL(,3lV_n]woM]̏h|87Ǫx+Ut2z5jbzIRZ,t2Ό 7u_K[T^y>(̫+W[?G(/ `$]-F3IFLj>C;Vjx:^':UO< Bh1x@ xڠ/BsɌZ/v@BgѹѼwӠT+29j׼YG#x[&:F;T8T>0 x:ܵ]Cmϋ3gH0A"R&UW',ĘD|Q/A8<kLyxE'PVnSy(Ǐ$(2KwE6mK 69C&nfH?bWgt&L~7&S%os/)3b5kY_raQjAY_'Vէ0Q n 02mb Z٘<`d `S.{u 5˩?mE h7;XLK;ʒ>ot e$Ck2doW޺rwLHh݃'P[avI79][S9-s9s7)a$OqSenM&\:u#'o }D _R59)jZ9o0_i:g!"ʈ,ᵎeO຀(Q.߾l|+8[v2ư[}l_22A&F&d3P҅զؠm*Wnzݗr%CnDyϪꞅ^iC3ޔw^EժLhp8x]IAճ$HBZ!+GϘuITNDm'--3ٙC|b7BWy!Vq2PDTؙ'gp~\u{ʖcΧ̀%[ȉYl>+UL>;6gcMOA[PHC*$$S7Cfa2Rշ.ՠj TP 36eWtYaj a% яl;<5YutZHkCs6T */~k~0wIôT<xZYg$Fə>[pX_y۸ELFXΝrB22fjI;Km)}uOvv}MqDCų% f;PRrFOGpX&=?3v* .^ci78d[‰NfOԵfjY6jlE(y/ï_HMb{ veÒe]a'x>v_\?VݡV籿ּOĂt\LΡ7)3zwCү/K_ Qx-؜&NPISZ>ո  xCCpbb"8Qv-_[-OoVT²")8.{$$/[ܕ ||doE"8r(kjR]x"#aHer=q@'svA*{Etٔ]2&/u%Py4UY]F1,y VOUf_w$-kuT(zUNt,m!~Eɏ;h j#=ˇlY퓔FK+Y&|U.Rj%`o\kGaN:E ?IZ:oƫ믰P8XEw^l*;J#2uU[dDQPI-q' |,d2}cF;9YLRW=i87ls, +e+[;ދ"kI;吋kqg-*D#.?FC< acLsP#GFMze5|ЮCbC܈ t@d秵`dT$jGh*0UkA$rt7G?$5p>ni6pȴ`:fwRyp;p%޷m$.>M%bS. <:$.0`w1e&:tk:C՚r?f YUM m%%sqvgr2Ed%ŦfXNur$й=ʖT܎o^ ኘKeN-=b,n{+xi`hڷMkJEkzYUL WH?7-g?޴{u2k$qwM*r*^2܏X;OZRXltNBt?'u_KNײU4h|C!5tS._ZVy[mϭ'_$iԋk֛:2,骣|Mr' C~4a5'm e-\5PuH'F".g")HZs.φa2n骰D3jLC.5_?Ed8ޯ6Bu=3xQ-,?~{3/*dbNuf*S8ɬX[P$6Ngz_yo49B-8/?̌lnHQwrf_Q5"-.*c ]iR 9 /k2myRak١;'gہ_ei. w!&t[Y3y4!T:SgޛrŧݶN5g(/,6Ξ cHj?Όn\m3Ccݡ* ݝhڜ%ߴfD֥!2$A maYb*LOwLlFie*, sƉg E+|,Hؔ&k8ኙUQ6xi3}7KVXY_HH|m'a_ݻ^^g[Y90b߮> g8cQy+^vq64roj*ݖId%=7@pp!{TqV$4!Qc 9ahp4ʤ2#dI Q1쮄$m?ڧ9d(^}j#bq **SuXB} D4aT%Was]MdڳА_h4h{)QrD%&ZLJ~xzRMAm:L_q@ |SA-E`Z<,}o,Q)XGӅNYd?eI0srTh5e endstream endobj 2251 0 obj << /Length1 725 /Length2 14862 /Length3 0 /Length 15411 /Filter /FlateDecode >> stream xmspe-mc6;ضmtl[ӱm[;~{[ﭯ?SO1֪z(H$A.j@Ff^333 B hbe7v4fUOwttP;а56rhڻYZ܄ݜ]\9 \,s+[ @LQI[FA @-Nƶ%W[+S) ;lLAfVo 7?̝j" j 1&511 'q3?@SMGp,'`fe0ZXś Srif@]mmj1{;W@ {w'"-5-?2.!>%'ﴒ_,U.NV]fI_-[%*j ``qq}\SW'' ߤ3 ¯.ٛXUITBL-|[EmifxpH4h"s-sBjD<!_.!|U.xi03Uq\[ R`=u,@b1*BJXISg|"jPg,C LwWw) - +u .tf9kFڊ]KZsL8^iqw}Hϐ J9%)w4Z^2UnJ;C"P5"ҦާRtqM+;tVb,ke^)lFI Z,!&rgGa|n$뷦_7O\4x{ػDi_(,beQ Kc iUa7׻y3mI0k (_9 3Uh@S;Ců⓻O0d6*D|ĐȰA.Y2Y 'sK>Nnt$ [_fhIsze69`&wzt|7 bӼ"ƕȮE媙f iӯ?= ∜`nCh1y>w,v%nVɺI/g>ą ;4--C1ޡebDuyUWLO4QʩJеjt_d/LH 3ڥ$!NLrhB67g׏ ֿZj^f25B0F~߶5 ه$?x{4LeG0G^vPهH=X{j2ޙW֭ :d9Wh% v)qm w:?;7ҼK &WNras;y DFbqyɐv&?EVpK@z43ǧګHcb_%76~ohͥzz'=6>%X8 duN,&S*F`+~ ?$m89弸'g{Y0-B(N$!ʰuu+q[C=Я ta/)S^r=0[#*ge`&,}4m<÷c,e.Э% q>Gj ΁tj:Z M8mQUKn@F^;L)'$s[l_wEA6DF!X*m~J5&gn悩SMhXa<^<è@b_!vO+ZKCGz9=b3R4S:ޮ@ 0DÂyCkuzbn) T9v|" Dqѕzy@GrD<1uJ$V`y^({?nΓ²]P8:`Ț3>* :+sg t-FOw+{?5kKCI3.w#D`I raN ɗ>В) 8\{e}rϤo +$C\Ål q4&5Brc['zɞJHx]ZlU#V9=!&.RJTфioSg5{v3Ls<8/+>uFyɾ3KL_煷 ܗ$\P4=^%d86B#\ztt g\Qqi!+y[᪮W"I4MNy9 "߲"g 8p[\e}b ڠL6HV R_lo$vbhh[Wy˜w^]&C<\}ER'Vv8U75E(`V,Q_bk0Ƚ*ٌĄWջYF.q4y& -qc`k=~Xi!VC }xMwWf|,^LV9@#JR1}2$w:~MQrOyn ZF#ydo`j6n>jMEL.%riaȸNZu 5{2d)f}#s$T`s"{.}b1Ϗ,c,:!DYqד~D;Ni.o1 XXi$R h[J-amٚs!KЇ'\ЪwcRf̘Iwz:L˒N&ѠAQxIζJޔ¬tL^A\/7%t8}FJp9FMh, 5gn7ЁSBdc;lrzNj:hƈ7CEwhgfzAB_ c.smo@S֊hڮ؀60ϳ{:;ӌ'XKt^˅.`chtڋ^#1ZNQ`|! ϐd5N5;S]Y[De\I 7 ҜۤAE&FqQV+֋jWަZvzoX\1/a\:6CKNu'ycܑ9͈r<*qܦr)L#B"!JZCʼns2ŁFE)MkR[FITߑo&)8o#TDEpl?E, VbW^\mYg$&+c) ?ذF!7^aUSzrUfKJLMf$FiZqQoxkiUV+L\ER]J҇%"aW_|}i7Lb8{Kd8):|#X'wwVCKW.R*n E'E \| ɀ  |2R0ΒyZ72=1L¼z\u` `Yk{{TdBߪTՏZ>$6c?gεřSWN+{0A6±2yax)Q,=A>d  Io%5Ħϵe[vx]Sc}tEL9Ca['t3)!n.h@v%^|uqiC/t!Q`/i\_Àp1uI~H؃ ;9{Ѥ8s*M}}r{vêel?g&_>h܃[$\~QPzl8-a6R^aqmM!woo>8uu܎E tBkƴk\,YlP&POx<.#O+;LԆ)Zx1lqxTǿ\V,OXQLA/ӚIp%S[WM7+YcC/(AB.%)2׬,'G7`i \(>h+Ry5cʌu=mfYnʡe cLG{˟(375 HITʡEL:lf,,+A{*a &e(6OuWjӌf0gA;]KشAC)v ^Wt\Wq[c^Lf~[d펶7#Bpd&&͔6V-7HG#K8aPNleoH_1G5,BG?5-Z-78 .C>V-;^nZj? cGjp&(49'^7\mS37Մ4votB5W.@ qunL4kVG PH' kPwiWRcX7@ӎM˧"WUA,<:/p]"k|ѵnB0&R}H7#ja|BTmPs?sY(S@8]!53W]V[(j,?C);OGWMgz0QF ABuʘ)ל'Tޱ=y{JpʖK5D&Y^IkLg2O$q59F8FJ 9+=OCWm2pveǐ{6r~JSi|؈MNJfs7 6T.z= cͭ (l\L(gr ϒr;]?a7dfFOj:ש} dwP;uBJ9z8OQ{jCNL#nV\,y I'O6SKT}gUUfv޾*#JRfA7` 2U i;낒jAG*Ϥ:U(b)|ݫ88ʰ5u^{vx_IC4Se,.A2̃Hšt Vy)9k= G"K/μb>*E u9kO#41`9X*Jw?/g?$sR X뒉_aH|* -T ~u{0F܊% "FW |cY/U_6Q1P٦eʃw[*M"<ßR@F6DF1/k0IJ"󫈏 Fg7,NTl. 1vǰ[xp16<="&p7z. qҹ aҀ>#@[ I ̒W9M?He;¬wyC= %Shm#?"ײ{Q[5EiUپoUwǬ%O\Q*-l% i> ˸@ ׏0#F|{Vy1S3LO *QкjLVU)g5ZcaQ9EjL])q ;an4`{dWؾPRKHXe*wmћF% n%ӫ'W1a20V]6F6SWr;=5RcjWtY5\P5Q\r:˹)mۯOj IHYR4]2:3a]hƶfc\lչ!K:N5v'1PnWσ4Us>ffv`c<Ǯ?3H>N2p1Eܵd}!Ln$2^`Tdh=BWss-04KELbn~ӽI^ r@*dO~,拵w 5cAi?Ⱥș{^:Hkw+`L8kS?Ea?1mcʸ-T0v(Ov2P/<1ֲrV'$T %EF4g(sS@A^<|b0(7@ĿKB+k(|a8}}N7Q 3b˝O%뾵-1YA“=@mUAŕB9Z#VM;%]`ҘJQk[ZpYBW=dEF.y-)lۭio#-3am2jzX@1 Qjj.oaԃtJjfI^-U+%9@I=PՄ\tIt3C ;vbXQ&9p}_qe]{rY|A Cx)B '9,+L qA\}Z^^f~ra8ͱ{i3\2ET@ bA{=MOUSC+-zXd ŅR_3t p_[HǎPxaRkmQoj*EB?MB<#"+;BÿIIK_jWL󩈥[B"|>Lw#ʹ߆N?xwv6 {83{&n)+MJCswr(!sG>X?+%j}cw ь:. 81M,K}YMf_9%Ԏ44Ad{s;nvXd+!<,h[솰~ WwڬdԶĞ_|֢ {_T-qSeX""jJ6OJD;Bx  s:`+<-L'[#K`S#cќBAGT"S+wǦT 5ɝT3yʕBy]*RA;ɌM׌@ѹ cЖD(Oq۰fj2@#~^HAn0 9ӫq9si=[Op&ʁ~J 9,fO+y ۖrkI?G`X5B \[UOBhhZy3)weK"`."6[a=`H8'1 m<߼έUIJheowZ}=.})z{ ZB*ĎJ:ȵYߖn)NTq;\W -Xwd1]S$9%܏jLֺ$qrj-M;*k*ȹH9]w YoG *߉ީ Ln;kP@7@lCg E,@]&#Y}.DuS?𖌦OisXSQ]rE?Þ.ȸrH?ww2QŊTaďP}DfE`qJK:c.̐Zs@T}Uë9o~\m|g g=H%0$rTIj꤈/3=gϊn_xO.ỽjL4mFyAGB7uIѩj ҿ=9`;6c\L5{u_SwSL=U|xnPTzy ASxJ-1;3ddikއ@Vi/ot[\Wg lUŦ}kRj!V}s%x@GC!=l4Ԭq@54(H%wrLwf0*>\0Ca$+= $zY=ˤ8[O0`{ ӵ;NI^x9E\N/gjN!EL(*6Z*z /L7%Up3^Q+cdaVL);gpy3)r %1ܣtb`:j:kuuVbGbAur,az+v>Oo5gæeP.&ڪ1Ze.-' 7 gBZ-v׮Q~xoݲ-TQ(V]XYUo-Ya6N_GD5nl.n>L:P^ڝ_ݷ @\2MK.>$#.dz}Nyиa)Q9m’8S[8;TL_戮'+_J2,ƌEC;ӷbmuɑ6G{l+"DR4.~LT:({uxNНdYKKᾒ"L`F?Vӿ?n!Z V\H5Ȋ츬 ԫfF'oǦ\tX7 )ZU[#7`*B3["zu#]?{Gѩ̆NP7h_z1a-œU{q~l+I.Ҵ4cgq W`THo̢2Q4'nc't9m1o kϻϤVVWmR3j&5fۯbcw;T鳜\чT{+ڎ)U5ܻ~:#f&6qdjr-[FԑFn37u1ܒ#pANoF{Iz-{L0;Y7YK7J|A\+Bo,wKa IҮsdu0YT K#zh3@U' 5F 40rM16?Xz@ zNH9\ėG=2"dPv p{iîT4U{L"*g&׵6{Qj#aDʋ 5hDrIǃn_s7ތ:4" [:+9נbwn4r{ݖ_>S/I nbĪSpa:[(Op\k5UB"oAԔv#}ˠu>~Ƃ8aYbzl9u[ef@3C(uߺ(匿βx[⯋:>hڻ)ֱl3[n H+i)_jeU6a.K( ]rTfXLg"&tK_pU~>u'p\h:.m&%ۼG fuv@PLeۮ'~БLj,s€Ip8A=;8\g<rJ++]kG>sk/B[dl,s'J!o֗{',EPuٙ!᪦i?ڴ^0xL2eiOwPG?[ҬD@= S@mR0sGE\bgV#kv1s!8Z?E!n;IBŷ/[>m+BtIm =5㘸r8ͱ'> stream xuSyQa"AXHx\dDg"B+1+|&WY#]AĆ#t rt&TA>Z4s:¢gBvP#X4L,SB ]3i̜!>@͝[q?,fδ6Ptw'alPXp+c62@gH4Lx`Ѹp;џb B;E`B !@5|SGa5 V ku^(o>H0fn_T06x)"o1WB;Blľ  îWALd3Ep?5wO-47˝dq\xӽsiiWsYw! 10uL 2)5,fμ87 `px.1"`P @7C0sN0aB0 Q̯4xf.=eςAp+P/AIg'ϐc0nYXm,Zn+t^fD6r)m`9o9L{c" j湥i0=gCT~Ф5EkcϝWFWO;T&#񺓛Qz|%1͏(u#%[҅S.x^Ѡ[ꨂJvU}E*&6޼d(۴dzt̬]ӣ뫻5S^ّX}Dkm60dx0t~zli^Kɚv󶞆{k'֩#%ILf=?x$6wjVurhu(237k<]iu4Mтָ'" ^&?S^PZo#fn=q-ޞ'IS 6Ɖg'v5+:+E-%F#/7삯O$1w_H\W8PAݓҨ@BT9>2hZJ?U7[qf*L&\꺪#oXl-Aih\Fѹw)}ʭDءx5{b 2+: M%w:~uxe[ؤ=j*/ާ z:V]q[e"Y)sa@&YDtd[~Lwp[:eMY1uX|ƹڪ~9qluL,a$+o[{$mr>[4|x~p7>Qi\XZT< 0\8e@<2}llDUޭ\Q=D-)p#1ve9k|U\3)J)}AؾގWuЉ<گ4kli3[}!FW7=81&A[%E R9etI犓%?Hd)g֍{}:drވ>~s@ҞhReQ? {#nq69WxKKԇn7r겜p=*VmI.xu$ #c|?M>ՙe:Y`{Yt2C eͺiۍ{6i8U捞5 K֭^]%+ ڍ#VE\~E"Pk~%lLs+ęyoj UVHF`iͶ8QO 6kKZ$M sSC] ąhv~B1Ja:`:>LcKRa-4&w([nR(UK}5*a㧬'R4>o R:`4V̷(2語rnxjo \s͓T҅ اPPhy`#qRãvEjA fR[SiNuC%eNy՝թsG9޷h{cdE>!Gm,)hi|-M7Q21dՈDZêhEm 쩒\h endstream endobj 2255 0 obj << /Length1 1626 /Length2 13260 /Length3 0 /Length 14103 /Filter /FlateDecode >> stream xڭuctۖnl/m۶mvR͊m'[}8;ƻ&9"%TP434uecY8)qʚ[0Ž&v"&\5c C p03wP(QRSS ?5_NfWk;{[kG%  ,!)'Sؚ8X\ -2F&N&S;G?#;[cJs%08ٛY|؛8X89},f_=pXYKnj7 {G/ /W0;'g'#G {gWVt67p+ŗ`geilgWI|i ,l&24[8[x| fh7 ' ["88[89}WwY'Uo`ooVڔ+Wn3 [fE\Mn_3C`lb C/g@cG zW%ZZkc_Kg2b`carWk56WWKm;hacIX`j`կ*&&_R-#ÿ-l"*[E5UDĨ8+{aRdW!!;w-#}dcRgYgG wW W?O:FQr656rqt"Uyw#%;#`˴t:I^FFJi63?RT=)&>Ĕ}țdԇբd4Tw'+ꖼCMw0;B]=Q<#6ġw"5&K:yz$;Ή&6M>#xhn2b)*L`ܞ!kZII?@]NX[xg#-dX"ݥd^epp1>U%),lf\"¬5Lڝ%~̓5WQ@/;aaI})0P(Fu(!Zz AhSDz _XZL'֨Hh =wB"zl!h#QV.mɚ% ZVY'/r7`܅Y 1DaJ@7Q^ ;Tf-($]>́M] ‘ԴԴS>t*7Yy%u@.!HgR&yG(#+NnVo6?*sԮ :\iQj9E/ f h4Y xG1clJUI=}9Ǿu:HlS8~۞IۓG fmSvqXJz!ӛ(sӞQzԪqƇ7LJOdvo,F8kHnnjy3 9+!x)en8TuOk$=BJkN9~݄œz̏@JP;ЩvY!Z^@|cbl$M訦2~;KMB_wG<*7wԺOErF3ol:\"81o_Ma^G~b![9I+6>k$ |,EgE GɎCu( Bk嗢]t~[@ Lg!Kل?nqtn>#[BڠQE*Rǣn.%FA R8ʑ,6pHQG@]st֤V# 1%gk؟,<;@wނNe(Q5"kp8FsVVorZx#0KU*A+qd{^^LM6fjIV?G,(47j|efVK,!NzXUs{ CC0N%<p@?l|eN$]1.)Y?> 3^a0FGͶTjv!;\ S.pm&M-+ʠh{&o͆yYdK rbO"|-YG!o]z2|֬=%N& i0#M^YF&1c4yih 8UqTt]]i2< gg6/|B9v($y`c lඑC"UA,\n7ZLR9 & ςOR/7axIYQ>Py=Q6$pPX\l #yNXRB鏓a0 ^onz񜅹?ApM+E Jdq1hx/VFbZK-qխ"fxّ&HB }]߃XĪON'0i!nQ;0uܕZi:/z.阱[ 9xiͫ,Gf…޵^%Р&&_Tp2?& Ƹ[>^ߦoi "%6牐-CLUdbD)NPn,̟R5=dž= , 9 wDqhQm'Y^_Y?^Y6S}!š?%ugVe% #N{,xiW㳗4]Rda%0g!Ҋ8rr䩉+֡m`K6 /Fn̸HSî## -SX-{gRw՚z7 }0Xk,ѝo.JM#>6Crp)Bau/]KqmUf]bXw5 1Găp~:|@JkIrKvZOOᾒ?dꎫT 21ϵ٠nE/.)]4cϥ㾁rwsAZ}kx|hgYfWz,1gr Q^vLMzg}Jzqjӈcv`A݃ ۛ&Y%`NQ%(+v1?aFw`k Mf swjrMq+5<|78<DFQB_,$+},x۵AGE ^r,9\_96 GR^*Cȗ.^<+kK`2s"P~#JzҜ',5JH\Xa0 ^ FN߇"(KrÌ,]ܧ?p 3N!fhHRh{|$ Qo&\Xa\쫧L(bhNU Pח_~<Im $ޥӁ8P0D{B*@{cE3I~@a>'bԴ&y 5\O_-f³P ݒ (4eks30r4{8 Y:QkW F3D@~8Т&ѝ '@Ucؑ 9mQ7lE|^I!o\WhKz]f=p {D# #g#"PZoѧ,F}b,i#Y~nS}Ulb.&c3=~w&m^/9GT2Yqyn ggs`;zv?tkq"~YBߣF?QBEۑ(d;~CFk;1l{&cxWڰ4Բ*_zG(!y9}ʻa_JD(vuLbbYMݗ@&:Ì1LD^FtlkȂZm䏟OdU-xZ7yxs*imɨG }jN([4;B@y7ڮzlb1 󈜇0@}r)O@Y.|pR:{ AAx?[[>;`Q a[`^Y7IsmS2NQKG x򢫐5х'Ʋ; N<Tcn:?7 oL 1)|PI &Aυ82)]\ /u^SV+(܂L--&2R&;+c<ώ8STk[@[U %WYælײWbvlP9?Di?p-R{./>Ow6 â\ŷJ>rݰ>_T6ɮ^X`WB@:Mٱ3CɘD{dnZI<C"ް)1@/k`˕%XпlhQ}7抈2gvicɔUOd3˳֤rLr>qnහ(IǚR,"|>$əw!Z])RId3"\I"|3`{uVRWcBԸME=>9_%[A#[U1]@K8SK c,W܉Nsh SɅ*ܗ6CQQHo*|^J$IGѡzBq&6k!:.yxwvT2จخ[[9G;*( ֠˳HR?w NK@?>㕸 PҺ4Do(hge3T+n?$po*y G>+pgМO􆰾+$}kA-}&YQ=G(9%u+AwBQ:$[2Z8S(rQCA:#h^B2*5nݹCLjR SQDO$vܧZlD>nDhYYbH_p^Nt\U皂 _)xl]OU AQH)Ā]yIqRVޜ/۝`&ͳsH9t)E("oV`ocf'$5䔏xsU?)7=LC@>pYVuLONT@xv(, &ۗfkke'L5R{6j8Էԋc^l!ו׻ }"",Y&Gi:?&3 j6@)cpg;1OAVndUR.pnۊ FPZ[0mDBҦgrQkNUe+lZlNL'& U';z Έڇ!g5XM^?YiPtႧj;FֻKYBI1||b0i,AKvHOπ[+j,Xpf=hrjK6f? lzd&˾Yu+^z@zҨCgJ+ ].7GKXu21B/eW=ϒrCsx Q`泥*@vh@4_/T fMUVAԧ=LGg;D!Rs%*#)/ls +5eVg8yύ'#Iv>qEZDi@pR۬o yy3y!ݒx-! UE6ИO~=imRPH sw-G.Je{#:Pb5]!i#z G=LBܶE DEk$<~T6^8rIJAȖbxE-nCِzXə|>18$S+d&{0q EA[L:酵g"~AD}N% vxc,^HA9o!ɥr⎸%Ww}CKZ's[?&*lU'YrZ'I9"_P+jNvCB hYa{ !w_Eƾʫ3d .F Z{v;0 7 @I1Xg/M`CV Ip#@/p9Kˇ*њ,"T~zP&5D9AA0{zfm͕ΫpcSęS'wz;# ^Iiww3 f}{=~ee<5ӳ#ԭg#5Yd^&kr7c)N]Nn\"VE2nRj^Gω#+X( neԺ۾HW\͂2kj^+p? )9:<@Uު Aكz\|;"'D&| ~.Q{FeT p_M< TNc̋DYToT'@qj PF{g{!' A 9s0~ ,gIt7-k%Y@to0:E6n> oMh`W 'is=L JԐrj]Ԣ՘Y,Yٝ;*&N1/!I WrO˥q4Y{9U'FG5(ʖӁgXeCnd-Nh;@Z\(PKLv3 I⻳h `D. B+]F>IT"ַbowa9"5^Zae+a9Jj}4`Ɏ$֔SڑQޜ2A <HT|^"ʙٰ6]q B<=#:yӫא!oHBd1buxedt%% Okp+uY>;5y&w(+L\9/M2G]']9JLY/{Zp^[d ^.4~1TL ٸ e 8~6,fЋnP,IgL}wEyO-K 7,6"BWѢzh.$⋭bsdFnIH.WFw)Zb&gc8eO݇dϬ+`Ifڅ*ϲ#Y"Gv3U 6+ i@vz e m5 nxUZlh1`*+~7QC$WԙFd_΃ui5 H_ƨĨ{Y9b "xrX(zn{nvB,*[Oϔq``o7QdTǩޞefNfW'Oo E*rց?jI;-͘*@XMzɐ~[gnNg.K SQVSDOq1v8lZd'(UDa^b kꢆ8YBV^Y}N6y}:Z#r:ZVVz{F!󴋛srI׌OGkq&pZNu5't]հs >V.<3FpG #:=Oh ءlr]>Ӓeѩ)&j#vmw0 ,dyAZ[̲T(м *w|2pDrA1>m}_SvTix)C㾋wA_`+D$ؐ&tFY,kK7@=k >?;ÓSuK`>kddOY?#v;FX  Ap OKT]n=lS.faTĖa͂fMneAPQwg$Sxn%M4{S5I}{@~rE֖Ku;H.@w~Tw.+rj<+L$M+X aշ10uY:2LeqHSqPP߀#[T@X:c#;ibw5;'%̢̦Y5΂o;@僩qL߶]q*8c&쐸^ӊWp7R)e$._b˟26kll*BKe[Ey`xsHG]I6kчʄڤ`Ӣ#qdu%]vDO`}z!(E eiLO\i)㉠,|E0f|Mfwj塒 ĥc]D#0sJ,;Z^zH%!G֯ ~=[of p i<PG҄bЩ=S HNŻԱƪإ81A}ҶB c˭ate# M#bci8 nQk1‰nO5ͽ✳^˹ºO%IXOVT F)op)恊9Xr:ӛ-=R~c/:2[Ky VUBb+mv, Geܓ0TcNdR q;\trw ֍읣{!~/4`zX5!N%I\W~1FhRۚvaF3CV|b`ocoJቾJLu%ex K.&o0-@V+WYٴT(Ni1R榁~(do5t]Pf+`Ѿ碗I$19O 8o`uvߟ–y`ӄ86`N =8_7^9iQԛBèNhy)9WZ CzW##$ٚI#1Ɣ^Fq$r@X7qF0jJ^KԍpD_yNz,׌%%iD^Ep&ܱ 94> ^Qgy8O\G2\:<>%^ GZ{z3nH;FdXOHOð4e^r??܄Ys熲B/7.!o~NG SM63fuvI`u_-_8c/ ߞSm#Q ܈&& taS7AN;*M^gY(W a緍)WQB>\|Tބc*7m]RJ]:a@ۼkW}?:D?ZS eʧ@MP$+}!䚻Ic_kiB̄Ij) 2aǘ!0sgkpmݑ4KvhN_[4"g0s p{ W;KB XZ;ጫY<ڲ)T]s'jDf ?[כS> S憼oyp5矀`*B}*%="_idBeQf&4< qAߛ62Z髑iCwX(];n]V;J059l ͽO^- [:  _(I[{[0 c[Jv.\d^2tQ&ejXFZ58_|Xjv)h~1JO4*Cdpe_607d+ߴG`N(OmSVݺ(ú\_@9RX-X ʝڊY4A2|ٔՍ&t_i15S\SHޣR 2(˅;<ޒQtw?S㖮k4>^Rd Gm~EHe"> stream xڬspfo&vضtq'm۶mv:sLo柙Ǯµp{U$JDm 6N ,̼skCgG[k[y3௜Bhdnk#nh@#++ fk`njVSѠO?&Ct47P}qZYmB_;~Nf@ % RPHmV%gC+s#H0uX0164GƿX"h`t6wt0w:8큓-Ml_ 뿺`JNFvNQ%?&-m)_0N6'? csG;+9+ gGs̀45p0::OwNRme?s0wrZ0±i7 ?"ccb `a?t.@5;hǤ`7$e>(o!7r+G%ZJ{.=h >V'jw0'm1K 3#排n@c%s'#3ߞKfc t2_m003?$p[1_3kkK)o G5lQQ[7' '7+&俀X o,g$INFo.\UKY5jcvY/وLD@ c\BCcXfTeu뻖eW9_4YfĘ5E.Kql}S K-fjK3s+kG p QH"E U$ Gv:yT g+13DF<3 kYОG=Aづl6aVLYT͏AB 5tֺ]SᆢJoZ7FR{'I@\ҟ9h+مqoђ)QaO>@Z4njyS!G xfڣtROG qDZC}c2e:фmujG0ixɏ5\ڀ T麑nIIaⒹ[IM 5Wcטn1gVdh9jTC:%ح,_j$ȶ7r=ߛڭ_St\ImZ _6ux Q[E\Z1o ^V18<@hx <[KR2J~A7Oxp+h/GM5Y6OR&O: qܫIB4C?òVr @vVTp)W1m#ÃH et%o?TTh,,iICþ+keEOZ2#PSt2O R1,M GSbv[ ])- /{UC \f?yI%f Ro Ziͨr-UnO7E9#w'8vwaķ;1,ay(n(Dm@yT( k;mi߾?xvay6_]-~?`5yJWϢ3}BD I2t vo^_lw$e L t8H ~RZW!n0 FQ_֖ $hW6iN嶁ԜGXA/J mk\bjRc6tH5mEī1!P!vTSl^k[B^1&I3}59_&g}((&\1yjZz7! Y?%I;0φ-ڱ} D|s:c>&RUZ9eeZIRtIclt{'wԗY&`SOdCt*ĥK^:p ;ОY gRxXn>Fk9oqc3KkKXw"N}6%+ǟPT7!99l&Ь*FEe 7gqzޭ~}ku,gp5e:I's ߜX=ԍYDۡ<  nh5D^_9{q1L t` ;]R㙇s X$Pzhvɬ~E&v(NIky@b5ma(T̴)"RG.]F~%d, *\\IhRNJɔл* =5 $*f¢`9+EI#RWXt{[ĶI'ﰦ:$`6X>L%l3YC}3h?.Rg}a fk%O3X>X/U`fE6sYDŬ* qo2 xVd5wޖ .̟QF(A^UٵY*t[~ 鹄b#= Iv9&1*Gbێt1)paic(D?{]枳b^C%GK zzɛBsq{H)kJ( #C)d15/kD>^,?Jr*z\S,妊Q}ڇK4"gGy. !LV( Mt/'F1JS~؟=~*|a6ؓzwV()7CN|n*[5~rBhʆkN&yp3/ӻ!o' C M*DF6SҊmn#  z.yEg8ƍmٔDo_<-Gin5egпjVť_4y"C,tTB-d!YAt|(*)B@uV=m'9[&4K(y|Late"ڈ4ó nG<~а܃0xvCrRP>ΞT9ɥFEbX/ӊ'?O\OHyKB{@\lƠsT29sPoFmnC:;<­YEƖۄӧyߗ?W:3oCJp-ө~{D Z*+M< qbOhӃE푓cf< ֊S5KIiP`ˁ`KH 7 Ŗ'r^tލ`!Z`W@T ]rSoo}/`Ve>jr8ќ0^ ޶qs߸#Dos7in]٩<8͡U@ xV3bIp!aԏ nV tw j(Ma.`m䙃K~S zOפ8yv]2 %z7Z8TtSzvkL?Y 0h:uw"/G!\($K5e+@ &5TG~a]T^pV~όxֳ>}ncTJƥ/pxBTx\fȺ|WX3۬s"fwڻfn]oWƵ&aS8b^Uoo{zJjL uV>5d ߇Uf%qXDS=zR|I6{eri4=%?N6\;J‚Đjd=*1h3N|3pvT#o5;Эf%N7z2LթeaNAc]mLr]k;fPq+rgNj>Cv55"k+KwKGPVe yD>=ΉOo6QHOL:q-G˲^\<5C`8蔣8[lY jha^.;ʇzGl[WEeyyσ^a;Θn •ۿ_Zb6?sI Z 3e,EmW鎴.4clNVTflL&Jv-~gٟ9yKd&I5IshQV [Ϸ Vѵ*lx(D)cah)r,"yG_sA79S02 ?ʚI'W(~F$C\IZXfU&R!F-)§,xHb i1fڍ,i[ܵq5V DKb蘿CO|]_'mUD.9?uKp;-cKB@HOR]%]p ҪQP z`FL6~[ֲkvl).i7'KlоŢ+"ɶrԹrRo]e3ֲxq{_t np9:qB\^gV{GzO5{=. 17Pkwֆb}T ?I2\6_ E >O ޥ52CE4xٚO-~L0ºx=^ ~rhl;9\t b MM\7ʋӴPx"1cc69[Qj9D5g!D.Lraõ*x$p9 /B[")}{[LfYJ6hzS!1 o\,?ҙuԼq7ef.u M6,9An 10N 𑄱 ݴH|^KK$7櫚eȅ4:c~}ebge0'AD3bOw9!!Gkelr P+j`48VF=٥4gXR϶X!k8 b7iGE{_d'x to$)&IIC11im4a-hrT(]C)D#34wOuyAa 4~0`|ɛḒ(P<_tF&;*`t[@NOTS؉GU(S*ձ+>'T^H>.;Qz\һ 6s,46 mMnZDo.QOwWR2fc79z,ycӮq7 l?Vݼ웟-9%g=}aj& (X5S4zfL VPuyp/6ht 6a}O hiCv@♀[:¬\2. >7뀭JS4%I)0(F!*U!&G/G M<ژ@bF,_\U(dFC6R%&ɶ&V3D4T]^@o3KmU(QF.(u*4gٻpwKITV6sGapB"- L4J#Z%ߐBɹU/axqقj@︅ ;Ur#?Yx%pT%omB1##.DgJuAMG8sܫicɑj#-S秤NF23/Ԁw7W'~W0E8h?Tz}xY,9?x#2 2;ILЮOܖaqB\j>)iq&m~h?+ N>:L\z|RcZ6Wi[Cql OM&ʛ{wCQ//ns#% )K0٪S5b>S/3IuA +ӟ7oN߃CfjZ#N%Uۏ`0c>*b:]ɺ0Eg`oWfWP[R ^Z l|=ACc 'N9 6 >Z4 E'X4,YT*d3 2bAqAaW`fl,tcrqesWЀ\?dQ!^UD\ EGHCi7e~~#ILzQ|:9g,nMBpO2ʻU~Â"xDqP &Br=hz18ռC)["mo- 1mi ςbѴ>P@kBu+@*8bf?B/\J[իS|H,b. c˅rp)zFao><.~%{R\Q0&^o<(oŪ:F~?wA6g3+S(WOiт啿8M3ǵ4JaÉNZߌc.hi ݔ8Rr،r=[5[eQ}Fk'_ ![&[ܵcT$BɠdH5~4qK}ʧ&UeӦl͛1|fu\s57t=oi`!dZef*{.&)n=%HcGV+<=!=~ gvtf%* W 4Ap.!a%m\gf+楝jJޏHB1zGbS)LH۟D1v;yn19Z&8q=kcBBd^9/0ႛh߂Qګr=>_kI{zɚ9:F.Qb\tB1YWJ$ c[ 7$Xݙo΁\)c^ K0m mnG| RnL_fJvKIF6!P_-mj EXZ#@|71 @J7 WMW-F@BnȋaIiyaW 9Uf+A3fÚ_,[oaeA2 HCO!\CcRLs(T7lS5_Q|mʙqؽp/<fY8Zex~o+b皦aA]@jqU3 ;8WHo&QjZwNR^!d*~ jc00? 9/7HBk7W#~6+1ΆQ1=Rjn[PW [$# P]^oi1 (g7?.#}]=K8u%ϏwD&sr+~BGʮAT9\~3LAKδԇb93"vf T(ؼf!8 (DŽmv2svTV;"%I+ήV9~cpMRGT]7&d<; [k7;DG֗6Wd C/^J Pf>Ү.$'n?4co30a\)N$\G);\(k4ӥi&)V|LpA?~X{0o`AB6 󳠼;,䎧dE+nxWFIJ>yo u}OG,Q5ZFr3^s(1%Us=)3{[_9i*Oٛ3mC7>3zgYO)(ޘ1g0)nXb`v_CQ.T&ŧ=+vOJjƞ8`uZ*5zf'I{bkBk~ic*[Ӳ=ꉞ>N~#I%fZQW[{^} C+HO7wT:y\N%kTAyA+Hx(`!)riR56Ӱo} maܖ g?WXjͣXhTUsi4F,_>: ˜x[4N@ _m8\iEЃpXvf'P^*(e4,[gb8Dm0siz$ح'B}4\beRbEsN%FǟS106i&%vS8ZQ 4`Zf]k IbM, ?>&L yߎygkѭYB^gMbL{旻[6IOJC\QeqU\(' J\wU!&غà0jdی}@똥hn  kC8Au;^nDLxUxhh`stJUZ%h`ve+K R!NʼnĪByo)Lfծ[GϺUBS?cÄwst|d-oml8M4VbF\IU_2 '9ݖUuIL9 ! ji;OPi dF7REDI]^)W -žqu czm| Q}-V5VtFI2OTnF Z,9\D 4&CFϭ@5ö)tzK$5/`&v=-1GGJGm*,`{QX# cDg5rKi#Amy*})$aZ6 !g>͎q#kb$mJZrQÌpU@*c}g}t6#VԒ~B"1$XLǥAA/NSfעQePֹct`킅+V8jtu5U4nEZzjQ"N<ͽw5levulQ! S<>YU6LYDbF 8M߷&&J]+A;oĵ ԦH#wϥ$p:=@\w8ة:5l")?HI-fUq`ǀW|,*OBJpkb$[7t-~۱A(xYǂr1~EĬ=6 >f= |2ZjЌ%`y /Pm|0KP,[*5j+Աaw|D*κ:[wیviD_}; Nm~j8B`0R}z[I*@gS(C̻K: *\ek.LH\ QT.mB\K?TwS Լ+Y>JO7Խ_Gt9 _'1]}h*Kd0QͶ|fzIʓf`dPVܡW+l>"DjuJ.Ab S9,zpj-rr'NM$A VWN%͙Xi:O"wՑ.F`&&MW]7 VX-ГlYA\ M0AѦ"TW4tQCvx7#[nǓnHHEfeY4`^Vv*brsnJB&=&\`*- U!YgUʈGǮ"'P]I,+Ճ}ķ9͏ ΕmzJ3ӔO=eAmGzڲ5*kА`82ԸSZ;mZςUE|ɺ+]=Kh<N#Gd <~̼Pn$Mdيbqt6zQoS;y_nf΢|`dcum^JJTČuuy[`цf4D,*5LnL7Y.O*T|QD.leUKNzdvhMXu! `7>ǬPMzږWI,Og?6LQC#iC7SR`fKGmLE"J}d)=9cyG~GgE#Qehlj7wa2V끽=(o0*tdzT{?ܷњ8G:,d@#̾t/c5 mPN*7_WamrLqS6*z.rUM?,z\kT@D24*GV|㙴:Գ{!$9ӣּ)gS`)PJ?+]cf䎝[Kk`î;-(.!(HEOе^ EDlj7''7s-.B~wGy2K x`kA }'Piiz!iA!! {NR}֩]NUzl+EN&"We GШ+C/!wK_M(_vW?,dŁ1S iqVEP 3ae»]SF` 2'*xǵ$pZ3f"w:5/ШlakKo\ܪ@lUٿ9k8F49qW-gxۖ$u15~3Hpn|} Ԃ &E=.M@֤\}T|D)it"m[g a# cn^} |J6\dx!nZ:*L϶2췒 J]Xx3ڇ@R62gt1 r՛Wcp[?Ew`rsj(quZҘ`I]oziқ9OO뮠2 ̪}KspDVӝ\g<ý4l13:''aK7_dӞiɷFFqk*wCj2!*J;7Y0J`źtO>_Z4]CemU٬1`ĕ[VTe5Nu`rƿ122/7mCXQ,,AL}qg5|4~g{,<rAygLhZH#2js)"Ά4D͋@EP.Gge֥xN28~Lf8]}?_D̀`AAj& V 8Nc< ҧdED~E34q`,XCThoβI-$j :Fsؐ,aĖ@ #-P3;G.\:t`D mb 7ԝXPu)>Ay<|ډf3uB . ulc9~SF*2e3.yBC >5&1fzfZUb$2! ڪBLOFu|jwdh#2)!c$Nʼnhj]dɘ߳Ĕ56##+P)|@kRmt!|DkM;qȤy9kgbĒ="fg%j%Is{ҏ (â|f]ϋܚғE7(rhw `:<襀ui_[#Mݤ}%|\- }ޤ?l̸!{(h0Щxq!Nʿސ/hD lg-jnZ{E;*~s*\(!)㶟Q"oCQ<<#I$,`nSQ.OJ:Jo1{B~fY]mT >aJe]l| 1ڻx(NP&Iy2|^ 쪼h,oJӽIh6#;n]}R/dt*`ߌG-bB}FWMݮn+9n{S&4n0HN9 Gdo52D|d,)zaX1ZNPb#?[q\#si^&Q\ھ͛Ǡk)q? px҉PHM0õx<% H06)|S[wV÷gC"<'%2Q59MPҒD|V||@.Cl3|Xɵ8SH<25 M{oKU|N4=pއ4̩-LM|\N;%[dT["eZYGpEW.N^VA&LuHF *t)ch q4f:ge1Un'km˔ _`e>;萂\] gobq7j X?JۭDDLdz«eLtó"lca^cCel)_GҐS^I=o2eJY"?ٿ 1ekoAX$0aUCx' /z)~48T>^}InV͵!da8ѐ am~9GJ64;6E9ADG8\^Pp+[G!J^T[Tg0mK=ze:3WgrFSfJxP cƫ*R\߫/u4 z8*l1Nqz|Jc L3%Au*dPE;E4[4ey͵!5'b+ȈXՠ[כ\m}@h= 1. yz+5VW+Lqg$u uR ϟ9"&dc;>|\iW]NhGK^ ,\Ewo Qm@vch"12J?aV-[yCyPKYsfMDz sN(nBXɱ h4c<_ 5uiF|}vDdq׉umԱ)Y𱹎=3[;NJk;'?tќ ]-0 O tBZT'#t޼̀DNY8TM,KY /o}evB(i=ܤl'6/Ugpb73$-n [ԉԪX3#~悮~=t5Ð^L{.hN2 ^w6Ȟ;Ttd$Tw ׻YqHF;M]>IYä́g)jnCI,hHJ`W{ +(xkFgц6M[~kz\m#2(}P]+0e1[g`bgTHE@qdK{gd$m(1.Idx@cuFVN`Š`ǘZmI toBsQK% f'QJv9ui(HċNc <M[I1aܔdEkmz/X6qևUw"InKjqrT% Å$;M?F`րj@nF%#cXSuu\[L?޺Y\>~fSj(FQ`hGuN[>iλOᤢo^ ȝC^O.q!7 LYd /4#Q=4X 6fN$b1ZaH&=13 9x[],+S>c EZȻa+u 6݇`1A<\N$aWatHUq? NI9&!2> stream xڭwc|ofXƶmNc4m4ml&sΙ;3_fΧ µ܀@*: 9,\>zbٙڸMCnnOBN0%{ggS' #Ŀt4v؛Xٛ-̇d pzel=?b98Idg_Nf6@g:K6xc9\6 ,1M]>b[Ί=_r3WйiߙH`4gTw c῏[oߡ%\mlm?_;d{ hl7c[߭5J&ba;jظ9K(F%e)9U}ҫ| !3\>E4PDMgbq_gyc'@/)ARu13U:9}P:? h dolR;<) 9PڨVTPc6isuOfˆ'xOKFWv+A)RfP:Lۓ*%/;X`/ 0L5av6}+<9ttG9862=#U(i̓J9[DfHŔU*4`ZslZ.nԦm1Ot.o)=]i_fdKa=dbRtN_55F.ɱK d&:i;TYf ֐тXF ۡk)n g/2# \龑a-s1>/lh5ص;[{Xϡ1acSzjei f*8ڔ@r ~G֝\=PB3WևZҌRk_X.[600ģY#@UL G U yC5):t$+L08gGYYšT[]"}^m;Z&nBϊNL}G_@54>~α\o}ܕP Ԣ i2z\ XvfZ[p +Ǘ[AbuE'S灍 :f^bI!q43!ߌb}HKojD^J%Kh}A-rRK񚦮Yk>UT͢[pU)]4p יy}ķA.b,Šno%u&)o՘0C[o6\Tȁ ]1,@v<"1} %0nς::3 ՂO8rF3$;5[ߪ EcmA+5 Gx$& c|gNԩpLA 쾭eب. 3?~-zm/ev2"JB*hϐ"%FĆkq+y61SVHy5k$7\wب$m&#NojـB3PfL"4r b9oc`S/6^߱^ \9` IL}[wQ`@ROʃ7s7@,/8iH_uv3͋j/KdS5+*MM_]+3Uai;&70Jt*ɔ؈3*_68_LpofOu#YoPfZ)`rjf6\+5?eT$g(qb ݘluG&H')QE d2AtW[й)'33-\jSvUukN Q,Fs6#_ٹտrؗ>KefF-Bu&~ԡeܔ"{q:UkɆYű_6iE+zk bH?0QᓭNq5y!9Q_yL W/EI/YX{xXJ/crX46vvHmA&,+ZЮx( "rv?rUŖ*;!ZH "ӓ? 1PYD.^ߣ:KJ+EݮސW[sQFO _-UoG?{Îd˿ZH{;ᘊ ԱİPP*a9F>?*:Df0@ֶ3t >[Fne6 [ "5?>@2+1v(׻ȹ7WyvG!Fdq[V/GXiu9pGR6O>AX8(<>ņ΃%OǶ) J-;[o׀D~ajAX!tH緰v]O9Q"2W %77)ÆDrGK^+ Ǖ諭e(JS B_$| ݼRM;Wl:7t,[KCٚ ܨAA|%gYXf`oڭtx|dq0~K |"! (CJ%.A qf wV vk.?؞ \)g-ت¼GBhK=g-n9]dk +p 1%*Ca,&췑bg m\!DiI>~nql:ٵ=֘) q ǽA9d$kzI2s= f=f޷`V#ʳ⑻NϛW9)( 4_^Gix46ȋcnne掿!z CS0E[?8z@1<_,Q!RaEӏWx$5/+ zEC@(X0if`>|J嫚mmXT#4 [Op Kgvh9#%a"1wd51~;9XEqT M*|BJzEˍ^KUn~CQ7ʞZ_!Z*? ,f .8:u0ǔס"ӥoؓ:ҋj>YԨ?{ & iAMf<\V̳_bA>R/q!ԢnG O%+>Gېf1ߚ05rJ)%lHsZWqv)-[?Yj yՆP ZJ lx(()6m"{?FxX7T{W \HGݬyU琢Pz+EOH;6VHgz&Kψ}݊|-pR3eg;R5XlO`yb淵ӐGqH&< fŌN6 huIdFe5bbY^>KKJ7xlnFqP*IN? لEQ?u^1 []yߟJ(0 OȹmVS@[XݨN2l$ӫVhJK8{(-/1O Jlkk9W! ǭmIscƂ{XE%bQ0@ɀQWx(ݲȦd%^|wX1|RV*E`_1R}mUѽQT7.`gЌ<ןixIR[_%z9H ܯ(%Ӗ3)+c՜5c7z7!z|FOIRH݊ j>EB5ٙ |׳טZJt'/PK-m9 47XI^yB?ݟ59]P0n=F[!d)UzixeMk"w0{KvKP9]fx|eq?;@ԹRğEqVY u_:YaOb ̓7xilzy$:uW?<#qI͉/pB6(lMKGW#L;h_B^Nu~l_Ρ* oL_:|Bq2m>rEΔ́ΚӁwT\cZ_azs5Dx7,ͻF}&L}GOELC6Y?\ϟ Ocd8ɯ'xxHK.QOjaW$g~U>o/Q`˅X5A@o~2x^#j"~&=̣˷5.4rP4qBYg.ωD-ap6fjz.{9G_~ 3&g%41 ت®43- sdN"YR:95Rȼ+[$>Q5D.PO/j? SNڋgjZIypJfXC A`Zٛ}?oQxDkI-.!YFQДkW-^U>U r^[p*>qVYFhGr="iU쑢W_t/uC ;l-?u~5𔍾V/qo]a~.Jshԙ 8js?)E(W'~ۈS: #!#7nt!?Hϼ0b2F^;lA 7ozHٍbKƘsե#+ v z~$U%kNvX_ۤA#;,TVhߗ?䇙&sJ"ܸ_1lMpiɡ eX"HcqSF-Ds!z܄H;\Kˆ,KX7oq7uS^N|GH`EF|#Zu6pr!7EDى Y*@io3cʔc Y\ #yB 56ed|. 29[mJSHKVqKܾ;-LJkb g.=^*ǂ`ڻ ڡJXl̟9ج.kIlgH_Yz _+AIRs_7ifW=Ge^iKT Ωㅵ7Hws뜌5YN)G>;]WLH]XA9#'6lѳJJ`*Ɵ*$"3;lI@• y[o%M#$;jpjʲQě\u\pc!ىʼnd᪍ P\}߫u+!5ߞ=+r\M=ihq)BGwZWs^w/*/An;Td1WJh K+3h`Znc??ngpW{]gk%CFV$SROyфQmUX@Z,f\DؼSY>ǐM8U"(f7 &l\A|jeOfʑgFx4K m9_37*άSgorhjB=ycƉ `𣷤 `oڮIPhEb2 )tDf4m{o)cN6z_RUT+ݮBGk*eŮϟ n5~.=͝&{=[˽ }Y>q̹&@YxU΅]tqwTr t>NJgSe1 /~&CZ#:/4T$3dvgf]3}໐AnT)@?eJ#UPJ v)?BQS꥔^Ifb /|k~:)=yc,>Z'nTg:B}UU1VKmp|7}o;W5>>Z 0wE;wtpg]4f5-Pq9“ߠۚLW՗J|I9i>6'_}sVe[x,h07q<89lYxHBD+_o+kTg_5J5, ivTɓl#&Sl1d\UFu}ymhkj<5[Q ?uh|KU2ӱi[~TOr<u2fG{ Ȉٱ^Y%f>TR8PC6Et˫)v3Ȧb/sL=vcOhދ[A\}0N,?"k$ \O@ՐgAx\q46W4:&LkLߩ(%/wK 4'gcvcXF %Gzx1UR_ԺdN䘻'ɼ8k0=PA8żiԣ*u'Z܁_Ɔ%B*aQ#FƘU0 lIkbPl(* ;tlwZ>V<_ef N46$bKN|׳pΗeKf?ŦO PMБŕMđv0ݐe͐1@`#3 3ԣ뒱`?ItwT K6'{nݩ2d.cM905P"*i9)䦜C$~*^GoQIl IԜ6_ghTuugߥD2vuA 'W0jk 7iɊnNڻaxf'4`?{8-&ϥ^H 䩏د]kɒC@[ |໳u?߸ vqxD=Njes\{7ݖWVi7wN+8W &\C e1R+ɶ&HX_?X:J>SMG% N6O&?0ppX0Úw#OP"}[ }a[-TLI*汽i+Rƴ"Jقk-mi_OMLͳLT#"LCn`SA!di0-mpi1*&ī-G UT1KpЫ4gb:럢?y'ʵXd{7ym\ ) )0yݪXh9;"QĮ!Jd?l1 endstream endobj 2261 0 obj << /Length1 1647 /Length2 15742 /Length3 0 /Length 16589 /Filter /FlateDecode >> stream xڭcx].F'tl۶bv:6;mfw־9>Gq{QP*1%Xy.N< @sg#_Bhlio'n hM@++ fp4pPkj -,\6 [_׆j@ 0ĔeR)o.6&yK`f`bogjOiN}8N _3 Dm->,Fv`igbbOfJhW/י%7t0r'_`oW埒uu6s8ݝe Z:l< h4\,+z#_ ߪ7l_\\ݐ0]쾦ًy?SwMpjXhd } y%5 F;{@eM'a5[-\(OE :Q&ڣJo?ٞzb; ߯0c;8nKFԧm)0<r_N>;V1 m0TXEz[pINbuccT{0=4W+Y ℸL~MQ?:Ҋ.كG[&xIL,yc=k4hmY WŔV~E h;t"+pQb?{zBaE;Mַ%*4ȶVǝ @<`1)O3ܩOY 쮒"t9RaYO3'nh9O<·G2hV"ֳh's܆}GC?Slↅ?eYhzȕ[lm , ThLn>WJ@pNZVgө \+-ٚ)s X/^dGӶJC*FUl"6{B< B+g{O>D.]cG6h+~Z^MHr!<=8!mvhf +,Dx}裯Pˡ&h$UjOxR6#7{,=ėFQ*BlV * ;!q%l hƖ9sNOaK FW&դ)&؞%U>}0/MGgHkgg a{4sH#MQZd[O FrvH ʾ{H@= øjI(=(;"t9`e?w"c~C%L5?H)D(gg>1_~gsUh,n!13?L^%vL v \-#CLk#mIfIҨdlӇ2*"߭?C%iiHܢb? )gb؊+Ȗz R)}v 6J+i3nR*ED6v%-)m*=&KxYّ1hrVw&n7!]2yfᨸ32yM˥D {'҈!2tF@sМxM2+apfFM-GN0keƄqCQ."_,E@CKB X擮6w^T'~NWOi͢tDi$sS`:"L3*EQ&J18ť iߓgMƵ@(Z$e>^^a5M#7к(Qx3S`-z}+sfr0an֜TӔBLB~Mxzq}Oٵ] "J>XmmŲ }dY ȃg`)zF360'YI,NjMr".hawu{DwLL+JsCkc(/hlsRY0 xL'3VhL((ZP4T)>uq; #<1EMIa;L!sc}W4ʇfiڤHe/qk ̄XO^piwq!ϕY_Oq[[ 4|]2e.~= ~; ?V4-TDG@ Ø,w{.L0`mih %Zԫիg\S0^`swRR'r14 T p[ X^:Y.Em&'+M,+?PCգ0f=zK5C:Āmd5K"EXt[D%OTLn*n{^^"h0aXrK}ujޖ?S艃Od$s,L w=yk6 ,0aCh ?>}_Yvy Re*!d^gCo@{YT` =) WyY6,PMH瓚@Ȼ`Xb?lNſFX\(\H$ ]8\P^Q]xG}ڼ8i6f9gM-O)^H|_-dXO99Eel?z /kmeܬ[㳖&!([} Wb@\Z6y(CD>tՌ\Ku߄%u ۸Ls\sB+$&fq1|-X %cRCSAYZ0 I?Eїc~RGJ?_xhјm]bҁV7M!l:Qmi 0@, ms—\X,,bZ"/m6N4{zUxU3g(WWMV~2VȈA>M NQ&ug 2.<!#:kGaWDm=똵8E58 ʯ gw+ew~}pV֓p:tUw,:NG+1[Kt_dqn}fdH q"†6=)~n ~S0>{'RH/%hCm*\2J],RܓR7%7MenKzP@wEhdJyw2ڜgOSl3^(.QD5voMMD#1\n, @{C7%z$k`<1nzMҧB)#Gw{@X}x6nittRv\|a=MDW26}dk5yDb~[Qu@#yo"I MLnS?htҭ?"of++XL67 僈7%TfpoL|/҉؃w}ƐIFL Y J& dq$U}x勋n"K qN1;jAMc2w:'ɹG^-RKZF7ڛ* C?irG ~Forԅ)BS qEܠ*jpu AEd f93/5c⅊rΝg,?nQ;ՖSϚr%)8ST_Ѫ,^b~8(ӉeCbӌ/ 8-8?9,~J9+Ư?=?K:ηމIQ CԻQ3Nqp3[k0R p(4 ʣ~ђS 3soAC/A٤ F'zOʛ鐋PW%},E w.OxNVW$jht~x7*Zq;#X UIn>T>㽁tQ[p5(2Y}|n?yaP41OHlNJ(y=JuInȣرXD>9Xi=> _WC=O7r_fl;> Me>O;MJxIXd aY_!͎-hnF!>D ӛLt=l+aڶLʹ^ں0.l-k1vfϼu_AdM$´r%I %[n\-'>ٍXcnW{rZޝ>zr|@m߿e۟2>;L8.n$BԽOm\pjީeǁWs?*4l"^UC <:enH1|k*VN 6=9I#uV3Vˬ6~31b>l$3]P!Y]ݔpzvؼ9pM ֭4{#|r@V.dPDՠ>euNH4dڱmvkWwdHֲ䛳J .H6<^ɽqX:;cNIt{.T.W6BLDGEd?c#O0k):P+`F Z#[ {R Os}tTAW0 9x6(IWlC v!]V%HMDu 4fe~~~17&>/W!Mo?°jpfǿ'iv\R#eZHEYjօ[9ls5 2n;92E?bQs N~:DƃA=A>^?C1Frt}%Eai_PJNKğ nxZeJ3@SeG'a$XnyK2~L ͞mj+W,piqiD?[.nd7 fj-=ev&p}lXOv ؐu 6’v dWTtG-z6&ҝX׎FQ4!ڙU3Ώ&H4̄z\P|yr{vI(AO|}A8|+X>^8iwz)a\}e1lv< +rW3`-8FN U-klN U60"߄ﱃZs/L|P=}WM(kFM WLe2Il}`9s@?t5F毡&\溁3m\)XY Cc(ڸOUX)߷+ZK(jQ:֞4M9g|_E-{؝(jN+^uJHoAte县epPU*f_g9;G`zZ m[0Nǻ:^,*_0: 3HT<6⠇<#l^" >H/'t[4m~)]ׇ[}sl`/sC&;b]BD(5VG &܆Mot{9aof&y T}B(۝1lrV=Gq=1f ِJG4ݴC{[-YM XW'VS )26\/WRw]Mj],Y){hqm]}-#]iӾ>& ]?hHvKZWkjD6]Z ɩ^"\=JStc{Alhe7a7w7X1m ҫEMVդ@\T1pƑ9uzeήgśBv҅'p0_sH/eY!i$,\ r4hDȰ^̢ 7;s)??oDќHƯF7ҮSbw\dTN tUިJFb*Z(=9j=M1# Z"|%<52U(:bZb(7܁c1y9l ڎwN zρ$9ÁjSx;\M쒢}QIYpR,v9[Ri&4@E}~(T<`v{zh[@jϼ,arsEaud9=[4Y(^ctD?zީNm$ phR$bMq3 w`Xp #oGRR! xkzYUQ ml2g ϡ 0WX} ,Wa~ BWzTtdRƨRL*9ڛt!jȻ]Bu]Qg#z!QaiE>H8Zv/nluiB͂X7!^̰!8;~F+.i Ud̘^͹lLV<ģS_\ Ixloz.2fl7JN{ꄯ_g/KӋCdڻ@EBA|\s|մ FF(Rbh!u!['8mC8ϖ!eI1/ڪݵx*IS7BWݖk`gKvƬ`ex[yD#rVhWM%'Jaq cD*jIqtv,!"/< otq$ G1CZ>u`o݁nA'e]%Zg,1H>y,VxM\ p7&ROChU/I<5Z֞!g2a,V8,w;ݓ t}I' >SuTgmq׻-X#znagRCmBVɰxGx= +<orӖK;/ t]E2͑,T\Ӂ'8^V(ǝm1wJX lR=(\[HׯMhҕKhb6\00[߂Sҙ߹fdUy5@.`w68UJ$>w1?As䣞˧%GSbObeetEef; F0ϋJl 0+b02}_Q\ЋPӸf9C4'B*H aΌB h#=rn{ \/>=tyբ+plQn,бOg`ZÑg<(=}8lǙ y ' 'e"M9 :sǾr Cٽi+1|f|];KQ!\ !kn$5;nP.ض5g+|U2B"\f|ngeK~28o_w17Opa?B+][S01J9.E lV9ND\Yh~ǔA,y5<7Ȏƫ$Q/l}al)'>l5.(8@PbD#@4QA~ *{<_[ru啘DC )!yϬANwc nhŘx~-3ngXۆ1wű%? F$c6șF$*t33ojpF" z< S!균/ IVL^p\y|*J|z.E Wr@[@ )UpqM &s>=Pڌ vuLDw I0MdiOW.OG7H9 |ܬVo8l(9P+s:A%c^q;%͎ØM8xn>ME\% I\E׶bEΆ ?Z1lV@big%heso =fx (="zq` 3 3YU> 0Vsc_ $7? 3 Q lŸj[E5Dyq%y^sZ8Pax"&r$(DgX0gX@e16ᅤ[MQ` A9Lx?:2L{}W]β [GdNIr`Jb{n+'U߾JbjPѻ蒧cA. mUq?2RaHn@νl^n=* tE™ ybtUa՛0~_%8qa;NG Z)ը$`7aMs}~:]$l0h}9M<`!b߂3AHN}`h:ph0!oeUB#g"8g.+woWޘdůTLoO_Qt.Jec~jP1ÎOЫU$&Hf0@j]w Q-,EEILV}Iĸz8!'HbfO 1mZi zc߹]. ܛ +trן>M{gձ2.F!rdP`"jz\$V ^(3-+ wWφ3U+MW,pu_BgG|_D`v$>KCᾌ|x2i z~~#s$Xt%CaM`KU_|"/djAZdTN*kh*MКSwC8 ^zn]tO'sSLk 3]2]9@ns;C_B)ʂ~/έY m+T?Ƹ֧`r~)ӺdP" Y4Q>OD%4V:pHá!0Q~68A7;ߡs}pA]A+̴ &˽ zTt8%( , vdg˴0AI=HJ(q;. fa@/=sud\lB%i,~=kN^gb\O=<{뾶pzĊNdF ϧ]̛j\)KyVR|>O'qaXU^, qy 4Ҷ[& m13a[D+kA,=VE/1|\p^e(ji,u ~$Y*`4%qiiB pZLEI,"sHH?acW)7V.sdYT)0#Zv+mͳb@`$̷^F&Q:,}%6ʃ]2jN/5-DHd+$x֊^.u2'ܿ@p!pp5RaB FbgV4*F)W|v7c؞_9^fpE!,j7S5:تULj+Y ;ELl|=ߔꒆ~J\s\Mk# KVG/p69Isw-~M[VYĈ;Ax܄w.§LMMkB-$)pn2?zpIu #͓La"Z-}܋F_@/-$sbų bW)"D{Zis.?\KW:4ЀX`eACYTė\lzG͸87tO mQGb<2ʔ+FXWW^i bQee ?Ʀ0dŝZҊ2Fj){BBS6+m]7?l4![сu~D+S! =+Ck?ͺM/>jYyQ7P-M6Xv\b-,v?Xܐ¢-jn[ v=|>.###tGp߻B;QH_HNR3 Q aVWMLd ,ߥEd>T 駾~lc?+|1-&2?Vq{Uilvn?૬`fCENx$]VWHKN~R'&wafȠ|YC^H񎯣џ_ZuǍ.Z)FCWs>>|?mE>?}%C?8iĠ_7C+H Z;[E Mk٤~u=+9~ Wɞ-S͹mLn魟S(E~ƕxGD <h+dnC?;_gJ\9?oJs/%Qsi>Lz*?dfxfVq)~ޓq𲺂G'@ >#ey4)y`DdbD+Ѩ/Y3< 2@eQi}ofrs t۰<5Jr7cFz xD$z0ܙ44~7fXB1B<`=}5eXI,7֮ |יE #u'GaTgʾDYhr5ȓosl_y* {XTVFb`FPF&,XNRI\ZU{%7lgKoqJ8"Z6Hl1Б YxQF_,j؆}x*ޅ*# "|dP۫agU[퀮uþPXi3NVfvD{L92NYt3 <+J ֍+󩮌X)O(μd \Rݨ3k6ch7Q]Q"DGT_ޛKS w7TXe GNm5?B;C/[.xI~i>H9َ$u4'tQ)'w Anq)OXra9ڴ RC%9ӵ{Aj ΀'g5\0oa*VkjyQݖѫKϒ:U3,zLCR̙?8,Yoe.(%V }!V (Uv=feI^c>+#Xjn{sq4I_6T_sI}m5Z{q,~eixuk[qomh7{ +%bQ8{v zD>\-ɯoZԠɻ" w<U)bi-IJ~0d' 9",\A‘u/O8?Uy&2X3cHW,nZxźzl GX*{@QR5M;@ɄMu('1xZz+KNsneV\(d#Ї:(3IrrZ9x7; endstream endobj 2263 0 obj << /Length 494 /Filter /FlateDecode >> stream xmMo0 !Rz|UAa۪V&$E 6~=HUAgɯ~uo$ƛLD- t @ZcNt=YNk`T=Ro æeCڕ(>Պ AiZsn[6uc^0Xah\je?0bprOY[AKS|dۙoF)MZ}4W@{YmG;<9`;K (EytbabisbgEjq(po$}Idon-p!J m-O[L endstream endobj 2264 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 2265 0 obj << /Length 695 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS>u;q~:fc_0F)lGιmu f8Gӫ6b"!YUe.`M{My?IC4}+̝l/Bj*{pϻƲO('$ *{>J-9_eQ"V$)MP:^9 ^` br @ {@(\,RH&ti m+3ԅ ,;F$БzFFieD(0A1a8yΠFpnù[w6p@ )9r9b_ia|F-(:(nQHY^`nA|n(戥K}s\}sԑoA&vqc⠦ YK^ʛ!_my_)=^ ^{TGRw1RDž'xJzImi9j'pͽܳ/-_Z,N_: ~iyY2q,nЪ5QN Y58.] endstream endobj 2266 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vw%g43>\ 6 EJ78 1{~`W(-;]%=xe_,b+-O;q\L}UI--=BKE1p[! Mߊyu>.N5K)Wb٬8i[_uʕMzQ)V(Txޢjy!Z2P="Zd0\ÃGR\).2*Шa!U,H`+j.5Nα@VK-x%3%AYӀzΚ>kP#5m0Woþj.ZT$X/)n)#Wo(oRZ $Kp4Z-b\1ܰJ P"GXQi/8k^Zq:Zs9dB )sL-7xJ`aɽ)f$1 dъcCZC<73JgznHȰYɚTa,_-O87}KԴܗLloK+gJ.GZyVc48Wt]:P~`rZq.n1] S/Pu7Ue:?&?!d&1yHn5)yғBx#1ޞ]Go׏M?X endstream endobj 2268 0 obj << /Length 700 /Filter /FlateDecode >> stream xmTn0CƆ@LE"jD;oƤjgy_xN{qV'wC&]\]]u>t\qxں7ŦmN7isƬ'k~G]?ߓ` 4;RV_n86]{̭֚u[sfߴ L:?v>4|`0nhWu}QE KU=5Yw߇l?N6jwwv Z/բ,ko{&PaffIq XMJ0LfhrdĥP> stream xmTn0CƆ@LE"j.RC~8iZ)Ayo7?nkNy$냛G׎ծU[7|SlfM[kwʽ5g x=i6;RV׵_n85]֚̽u[OsE͡i P{ LՑ @4=tb/yVvL MnݞArjwf4P׏ީFT]Nrî}sBZ2pmmR?\rs<, X#.KIɌCH'hjmJIQ09da"2rG~\5hגQv]`n @v)(A'b}qHI($ux-JBJ!^I :ggM597F7FN}Y{}&Ff.pdk_ ΜN0VG9ʱwDK4X=CaCɁg2)4X(rb0/s4lƵǮb]ˌ[r> stream xmTn0CƆ@LE"h.RC~8iZ)Ayo7?^$ŝPIs77EW]}==硫nTشxGɛz?{k۝=` 4vN߷u8NM>(s&`ywS0jzQshz+&TuS~Hxqq`P<+ OC톦}SWUn}@`T;P3qtj}w*5UWSܰo\ze \[3. 9ff ؤdF@!i @F\ ` H sn4ȶ` $(Ng 2R0zd9#Cb.k(@.0[Czr aà8SuX$Q:\CAfpGR~m%^!N%$h&՚R #ƿp'XϾ>AI }3Nh25gNE'bkkؿs %|V !3?fc91ӊ9|u 6ZcWCab d1׮eF-9Ag깐3Z=I= 6-7p?)pegT> stream xmTn0CƆ@LE"j.RC~8M])A̼7W?^$PIsWWEW]}~{SCWmݨMi7mv9I+ڴg{ҏÄ~F )P ǦkZn;@1zz5= 7m=x Fgu P}?i]X<;k C톦}UYoO} A`TS7~wpjmS!詺]]ꂅK(ew&97\=̒5⒁yAa>:M1ȈK,x΍t,@F*&" C,zdWXPv-hakH/]d"btv"gg?|2JB^G5kdwt,uVT Jb9;kBX!00a0bw3W M";\88̿9Earʱs ށ?c>+q p~PrL  hi˜c>:q-+01~k2#Ϡ3\OLqRυ>¹M \)s9O \Y!O>\\/Au*[ӺkzT%C0t endstream endobj 2272 0 obj << /Length 700 /Filter /FlateDecode >> stream xmTn0CƆ@LE"j.RC~8M])A̼7W?^$PIsWWEW]}~{SCWmݨMi7mv9I+ڴg{ҏÄ~F )P ǦkZn;@1zz5= 7m=x Fgu P}?i]X<;k C톦}UYoO} A`TS7~wpjmS!詺]]ꂅK(ew&97\=̒5⒁yAa>:M1ȈK,x΍t,@F*&" C,zdWXPv-hakH/]d"btv"gg?|2JB^G5kdwt,uVT Jb9;kBX!00a0bw3W M";\88̿9Earʱs ށ?c>+q p~PrL  hi˜c>:q-+01~k2#Ϡ3\OLqRυ>¹M \)s9O \Y!O>\\/Au*[ӺkzT%C2t endstream endobj 2273 0 obj << /Length 814 /Filter /FlateDecode >> stream xuUn@Cx ,ei#$JW)R w8`x3f_,Y}..=pF=Lc겺oxķCvYQ_s9;~1_B4-辒O~:p̵:롫9Dsg~&1^`32(WB0(~z?v؎r8ӫh~?u~Wu]t<(V4dqy5jޫ kOGKWj4?L%/۳v _NU4(61ȘH`Zp0aASgAQ@Q LE)58ZP\RC%4k(4mA%MJ$*C6TQ.c3p4ct| 1v9y\;摴.y.i*OYIa%a2A{&cxs4c̲ lcw36av7fgΘ4aʒOg[2O[1[3K?mgS- }3 O3ev/Nz}\-!={3pII)dKdgI$[d$[HI$[$[$[d$[/¿l᳔l1l/%[K~Jɖj%[^JlIo$,v)%sRJxʚ>fT+cVS߰n$7G"=MS8鬧'k?G}&馿r endstream endobj 2274 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5M2үxO%r^q &\TƦkR@YwDoYia) SZM5_$$>kxq4|;o4vhwqB؝Bf#j{p7P_?{+4}+VYu}e}n.ˍggfjj{k:lF #QhJq  HQ/e.!Pp #]gQtVTv)#l-g!7'uӾ:[sI r.39uf *gQNxEqV11V啣Yq:54kDCZ+)]Ws8:а/9R\Qrz\8Ç]按Sp/ d8D(B!4׳030 =;fzÞJmw&^0C~/nS0GKW皠NdzG5cC)!=E^K<3Iò8ȿ q3NOg{ACt~Qn~ɸ\ %1.: *4hH`<4̶E hS endstream endobj 2275 0 obj << /Length 550 /Filter /FlateDecode >> stream xmSˎ0+$1$#8h@Bܰp`~ +8*=SJ]sCM&ESݮ`w z\ħmbo'ޚr028~}uHXz_z.XA_`1o"xR:bct\$7҈٘TmH@ ]W0ywznͩV+1r]oś}X 6g1ͭnm{!^ ' bނP48YhC`୤\UY=0ZĎiơ 7([4r;"A"e"qDgs"2dK$#В%#KDDNs5&]J[/G endstream endobj 2221 0 obj << /Type /ObjStm /N 100 /First 988 /Length 4028 /Filter /FlateDecode >> stream x[oFws_@Q9$8G,d%GG "EKrAr8y34,h+*8aZl2|@=hS%F(ư3}RbKB8[8Z } lfCpSP,e(tx [[l V#8Wrz e- wNc c8nA#IPWN@z:K g螀q20`y*@kdU`q(0`T at€1 Z2*9ĘbQIp6gjhj ГIp3i-x22h!X2sǦӽJWvv+J$#H\7lMm'(#^<=-寸zH[[wx݀RKј{SOrT(J#|Q`X; : rQF:PN#4O'GACWщrC˦6'x}$]sdmӡw1IP@hoX>~wDUwRxm[+$CTAs T:^bpf*e>ێnf.RWeLVeA++H pGHDUgt,#Y~y5'ml՜JZ?J-O'j6[Lg{>}t2#V^/8\ f<~<^J}E[>U9Yt<ܽ(G7`<:\K=_ æf f9$<#G9yA/䄼$krJސ3rNޒw䂼'ɀ n|0j4ͮ%,% qeZ3웿8Ȑ c)_1Bt9#zVܐ?n Șܒ &%,o/AL:`VN $ЀxMn벜/F tQ/ǡ1u.@y G|<ߐYʒ,~%YN tVowA$?G#syl7G><~vz>>wO**kgvk%x?xfPf 5P+7'O?z}M,j AZVSN6tt;[ J\ڭU-d6*]<| tqmйb߅1Yw u`sȀo 0Aݎ&[޽{[:=' I5~׳`1gM}VIGF`r p34 Db3F;jvg+Zm:>>Ӥԝ,5i x<4cp(~ٺ%q\Lf ,RVU;c&+ؾN uxm^VoVlTh{_%o{Ŋ6a{N7p*}>a}i$.:Whl/+]i?ner-.nGAhS[Տ7/N;f|<, ؃.s k#MEmUx]Pu2є  6+b jh3I*7i+&CVeѓQ`|'@fy`_;X|)Ar^AB< !+ aRuU%+ y!Qdo%h k,͙B>GĖX:g[f>fpaaN V~]5F_~2vp!tlFcՎWD~}@ˊ !YXG>ax3RZ8 `&Rt-s; C[^.-vB{<ڡXh6_`,p|2nޏyD̏};}7f 'KL%kȔ %hPr{Vv-Lά)|"^yK&*tL¯Er"EZQʤL475LC&Lk-Zesg cS`O Dn_ v3&@D""D6t,s*tUl{w-6Ll؛m9Z-Dl&<^]`-lȭsu[n!-p:9TO "Wmetp]a5]mg9_{ q5?O/UQ,6C: u*)S1QORƬlRQe=-i11-J':5L4iYv[ vv HAC`Gp m\2|So;r? b'T2J̬: ? #h]Rh,+_/I"_Ē5E꬚:Z;;f\Tظt8xj:sYWZ&1fkbh뒌ɚ%F]N.b"FM?1 &:Ĩ"V]/SXٚ'.b& 9Ibܚ~bAX1O, ɹB`LX`DX.L @70]n5@wjT?@~d Y  d@ .D @4]o 5@tP]_v9o0/¼QyWuE70*¼.¼F]EEa(¼TB9"S>e#Ɯn:d?1 F%fmF,$4K%t1 ƻ'bs/ endstream endobj 2281 0 obj << /Type /ObjStm /N 100 /First 946 /Length 3646 /Filter /FlateDecode >> stream xڝ\ˎ+W2ka @l#.B33X#M$}SEjoƴb"q-D'뼇?t҅Ni MEBCY;iB礃sQI# Ӯ iE+i%W`'%8 ufƁ[!0,Eht҂O 1v!` dж\dᐍAv# tt6tt琎v0r:tRv0`ܩ$U`)kDi"^Aop" p0b[L .BFU5{mjGQw+4Qa,s7*yiyZ좄 h\.F0"YB k4F+#+ NDD &2JŲ0@Wl HS XK:FMlF,`p5=fh"hdJS8٬E4V T OXB+ dGc;TWPXl%Һ  ] PK KCMKE00,~.j^xß+˿oOU" SZׯ 3?SgGgLLODՙ 5038sNTݙήq8ulAN-pv" 0#L: rS'3't]`8D 4GPuTAPN*Pj"@ #@N: @qȉY'@H1  &DQ 8H@ яUc`#|G0 zd0#䡊xIr[.ն[Nk'+m!N2[WBd9$r:k]] quֺ$uU-DIRZ*մSNK')+i!N2ZWBD9 $r9g]= sκr&ͺjRY͜$lV/'ѓǵ_Bu6%ot뻿ttxw_?n/'?]㗷zCݧzߟ6xS?o4o|pz{]nbe~cAB崻6HZ4y gLe֓zB57lڼ-v%MKBg c ?Ni߳df9OtH~=<29qO6rjj{x9_!3.c{ܝN%?1K8IDp<_wg)C=߰I"g-8\Bp7N=wCP6gnOᦫS㌡oB%S<@璾il$ SɏYoayչNiy:`l!pI8.p&-ygL(2ݯ۷ >sL_A-)|q44c\$e7l&)0[싎K&B* ^x4nR4p>r|B>X#"߾?n7]A~? 0h6M.ƛlrW !D uC.Gu̕ԙ3_am EfRg2>\v{f경MmQw!"㙑 رWYy5O)@F Vi?FD; e'n/P1赨'xjV=*iGٰ U4;#D6w|Z71wz5 cpc~o64nBaaɶ,wkM8q1)fhXN{[cCҺu͠3Jzg;Ǒ5CC 4-6fcq9rlOwٙgmA"oZ%oEԨ,E~ ZjhZ%oF7;*et揫bS47UXm_aHnAd'%8s`HsHyY$?:JO/(FT-TziL;Zõ7 Xl6̈́غûn9lz%GC>ҳ m3H]Bi90ߎ`8n(88nLF /0z׈~|A;dJ\,k@7Tr~av7NLPB.OWYf|y߉\gh C-.T3bX2&)/v4)KKTܟƤ.Ruim JTI/חӋ'q/V"M*xҚmWMe$pُ(*vRq7o%Q4Ͳ;h% ܰ> $h6q0nF*5Kc1lVYi@B% |뷍yMokPf|7 M*s/<iMA8<؝zz]^WTT\4(o$veC>e2,vZ}m쎅:,Nhdȸju=7*Vv#[(O;buee|lk8M,]}Mk[rf]+[[bwD=1W3<>CezYAtޱihTSFт3,G6K%g~ps gu9M6/E P bwr><%Y_^ux/> }six!Y2!1lrJ~}j;X/_>4B}`jZYr*:GchQhiƖ@[ >_.FY썳V Mg%[I!?(@x$UcAoYGRC J'|hd-5Mh`&Ca6_< ֏HP9 B.) 5:_8h"TlKi,"(6}L󱈐2FI{3u&=0Y\ba!O>-e1iopъ!B4 K.Or Ü2Z J EO:'P> endobj 2338 0 obj << /Type /ObjStm /N 94 /First 975 /Length 3713 /Filter /FlateDecode >> stream xڥ[]9n+20IQ0 쒙d̢~cv$_cyO]@62KW$tsD!(Ca硽flZ1=TtGQlQ;JUzC5GCl?[CFQZeEGZy|w|kiv24:y9z0|'iWݝhh̖f#sM3'i&JK@ƴ%s4F)r>7K"Mə̉P};oDbuH͋$F"tes"]i^$!~?iK &lM͉tD5?^?뿉_!%j =}іfi_ZwȘ,@Lԭ@zEHdq?5 ?Fso 4@r j߄__7 8;Z%ΝOM;%[y3.L pb=SSX~Ȱ69xy Envz]a vJk7{릖ed4ye2݉a*Q .^M+h[FрyUۀywNsрp{mkoT[yE򊖘BK )[Ozf'xQ%7IoEW aDmzb[/فqlx)}}K1:0w;%7y$0ox}3}c304ZN/1^{zF`wJW(r]a_:o? q 9 Jv4('i0P&D>I#%ĩ H.dbI Ix~_R.@ 'N%4п|F%i\  ;P <=K1-Ta)J uNȕtwfWI#JPgeM"c80ed Cj+0W[ 6ęE1GJY W^̅.,0$aIsRpbz_"]t4oe%.7Z7Zm9Z$Q91rT`NDI*0}R1ʟF"]BnKf?sް!7lHE.,0$ x4!bRH lHI*i 3/vZFhr_n˺E-4:LSZ ,@),&~l Kc }iL/RF'hsvuC~-4 ЗUY c E 7cl@_ Kh\ \C(Zߤ1V1x#4fЗF;Z2>I*Py'b3PKFn0ʉ'e7W;viDr{!Mz {W$~Q0zB0{`NB+V:RhJ^ߠte-BbV YITb*ہ9UXIbၺժ ɧ Ys:PE X7^8)4fCTsxBcV:PbC X6I,

9BN_$rRWUMKu]qH t,*W$?+80rw; ]=H$\pKt?ISPw I$m M6 W$*U]w~rj%ꔬI$ p`.o|}'ᚔ\|R.SIdHewbCF|矾lm$q,I_qMkR.@Y?ylfv{yR/X|Ih3h3M}w1IJ#]fffռpc}"ŸC;iI$%.84:JBҨdntbd,q$bFoҐF'IB'iho?>z\hll٠}_>?~_|O7|9θ6̏H1g)W_=<^`}g.և_91s31s,јюq+[^#1ϟ>fϣ+͏F \}\ӵ/?Om6l\Pˌ}d8}a'_><]NZ&HeT&HM,3V5?_~Ϸ*2 ɔ\%? 2seN̨qPyKP@g:֛޿ˌZg:!6LPd/a &x6ðƆ?-ߘYԙEY cԗ~cHE2&C_oNlg>sh6'^Ͽ39̡MLی+qc̢,̢MLی_~{󋯙EYŬ: ][gHwCrPEǬ|=/ꬳ:%j_\$fq}k̆P<}KҮ)~|ml1~TZYRb6d~$O^Vۏje&5ˡrhچ˯-1%d#ut+Y;wYbvt/Q_M??GYNO_~0\?>~yo_.{<qJ endstream endobj 2433 0 obj << /Type /XRef /Index [0 2434] /Size 2434 /W [1 3 1] /Root 2431 0 R /Info 2432 0 R /ID [<1BE0319D0284A3B9AFEB83A24D9E1A2F> <1BE0319D0284A3B9AFEB83A24D9E1A2F>] /Length 5581 /Filter /FlateDecode >> stream x%g$Qz>}ܙssyjr6[$$dYX$$[BںU9ke%[ղlAHRe}upZ֟[v+ZAmj4`\~ TOso j.jkh.jvk.jgԦ5rj4WJLm*X=vhjԦ4z-j57Fj47fj[5Vjь7oWY3>hs*ۏMw٨?prs[;v. !Z|mGk՚S]wNM<bn3jwՖksjBy0KՖj^KjMj>GZ"ޏNqͧLZ B-r| 3bXoZK U?7ޫM}.}8\E`_G91k}Tmj>c ״7j[|=9F[M 9m`1i?XE~H`WR7XZ>H`>XvB2XvU홦Q6بDˁ:جA퉦=ɩI59jijdh`v{ivR>ث&4s4 ~j;0 ;`4'~`Wi 130' %5m`Ψ9]4ԜՁ> yԮhK`ooz3&~Ki| F"RG#bŮ};;,BtD 4E"HlD92Qa 40tqL'1ṗbX[gHc^ͥpkgyp ;Ŵ`~>lcp^8H` J_y ^;.'ڑviJ8+G7k` .sǰ8=p'GE %oq܃(Zv7Sk% W*\8l8,9mϷ6<]9vx 1"FDW]=O2x =|W]PM/H/?-mqeRԆxK\.\qybp^Fϴk- ozlQ"oƜvQ9\JN;aLQؘZWf=8C\0g8'$ӗXj^ݟ8 <\ћU\pnmxWR;pXg?G='05Llyt4L]ttye.(ěE |!"89vbD _ҏ]`."@."@#Gb[a9%"rssss9ݹ{S(Ƕ܍{NrNhNh.(_N9999yLz>$4 NB&E_d#TachlhBӔ۲57cmIˢjjc$7)}wY 00000,K:6#f#[|dL200 y ~?E/{c7A"!!!qePݍݐc7ƾoLJb[9h&n2F,)i&L)7t7FwLCT0 i7ǔ7M؏&Igz-fݘN`w6lUIσ^1byYjo̤X5ij`CY6!KN{ a7ð3GC`g6Nϳ~/HEgE*\p#^LD/7܆+px1:ăv: ) 37=KKFY~\{S֧s3;*/x2y~S }sdS ͯuGڏy-?#$IVYwٗ>eO?3}jK ;_H?rgy>}jYsԿڧf>}LMH9~|.}jujыDCHyL/ vq6*X k:XԾ< uX `yjc9O gI{%~+<HІ1 y0BXa ,eVJXa u6Fa lm`]0 a}A8cpNI8aY=t.?fK \kpnM܅{pCx p2a8֫dҫR$ʜųpŘؙ)E0˙YC]2K2O3Pp \ewάɬLtgSl5{je tfa[fM,<E5MX$k=:X@m? ;F~U68L$̃"X K`),V*X k`-6& [`+l0;`'i {`/p!8 G(pN)8 3p98"\p57&܂p=!<3x/%אx =|HGjo?P endstream endobj startxref 357588 %%EOF ggthemes/build/stage23.rdb0000644000176200001440000010421314561462446015132 0ustar liggesuserskwI6 -@` [Mq29hU]RZNЩ2SڽfaO5'?ѫ[wrHt)9{wZYm[(;STOT~2rn?abnj^`̬~.%VJfz[ZJmZ᝭+/޴~2ܿ<;ο4JcHy#W* o<~J?[ʺ+oH0`?ra4B?mߜ/i=~6_|䇼헕L?qkvXK*w5]kS_%W3칏۬ i>(.W.pi-T(/\ܛܚ]m>a՜ϭmԍRaJkͼv]sŢ{?vr0[(_Ԥ۾Akgެ8C|oR4ثYWS |Wl6fTZΕ&¶4YiʄˍL4n0j߭ F- W2S]jZ`Ga01A J(0վudhVH`2x"Rfqai:}t"m&sm[tAgv)bB2%Kݗ!IzNVA(˅ >le^nny33dЍ NҊA7e}Sx$}g*AȻr*("#HmNB8{Hځց㿌oVd=܉^t-Tb<[*<61~^*UQeIgXD50u=c? -,R刿bq~|O9yij֒-R$ItVD8B- ,.qU;w2ŏ$iLͲM]K&cP a+ ӟIږr(M&']ӟ7oBN[Pخhe#5o6{ߋ>qv*jGk!}p]3QA ##@Q,c/2\W^bNAS)ի~CrE)teKFCHi1<=#Zq ':?9 O8 S;O3O7{ֿ*һF ܓ0;yW=$<[xvUW%S:g`_W/a˵aU7RsTApf1Ǜ;)%>=y'c2ج"J,x"}Zɪ_8U ޓ]1Af䌃c;Y5;$}@nmi(+)Ӷ4JD|ށe(H# \si; ]w-c-Y_:붶wt9>jv;лnwu6>|0Cusjύ%Hf-_F nTjWSKN /*f`A^i./{~d`o}5>Z~OZe iucwhmW5 LO/գnGT3}w<_Z}=po˄&^4ugz-/zq5. P oVSCN49CE&.՝RǨ]n־յ>7sxK8yD[67~\>_}S,~_wح-PsY36+b&8mmak3vr-VxܻQ-]ZҘIGsz18Nƿ$~7'sjϴ斤Ͷm:\{usR~;Iɐ]sNލ=hVd[faֲݫŮVKZH"tBfn#-]o 7{kc}?%H5y߫طG_|䇼;S =^?NW܍} W ϋK•yXɽɭVܚ•kyN6dN;CfxzGFWkRo^M[2M-طv,s!.'3:~/%GϿB_~R_<."_+qW%( c/(yY#\,͖&5^ut~ٲ횵wgR|UC\v2 |d_ {5,;}+aG㺧4%YPN"'U5hPoAwOEcC~Q,3ظƖ{|c,0 c&hH>\=ӹx$=f*A;p*E*5ҁ+Ӟh Rcǔ(; ߃ȇ@~?%%DBtL y@qPE(?ԝ z>M@MZfmW܎bh%\}9W)ATiI'#xKe8g҅ͦ4K2x^}Use2'3@3?dي:XaŨ7ų ,ިfhj۳lTgY=iYV3*?OCݬm 2S/(] "l/֐PC+9fF㫦H.nc|\<)|L\CͣT۱yZ<"0;?d6yARz2%C<͗w:kj5P-V!ȋ^j -̂Jح'*쉘 nq B0 _OK]ঞ6T2Tpau!+“'c+{+NabfbwOcW)V ŽECF.aG6lr𾤁-"ҡDx,4p8v,8&R#8#ƽZx$>7 -grS޳R`ǖ= :y4S5 ,Z)# 6,*9 G:lObo_BJxGUV+[w +d[We]w!Q&Fʌ#h?mZh'MQ_UJ:(q7I$I{|OJTIgJ(qiRD8i2j¾r"Lq'aKS=X9Yeb \]bˡ}@ȳd;qF8q~s\I&pCd,fnHO# uԞsYs='xopO-:g f$9uW%oΘANž3Rri TZHAY{.SX ?SX$[$1o]HK0TjtԭFBU) ˘$"SS;SS\uz]X=]OQ[;*RB_"T:ÍԩƸ)):=%BYY2*Rϼ5:n&)"}/{{9A4 $n,ѧkA$Im듒0?K"]$:ڼ?Q(v ljql5dJ:tk+x 5V$JXgkU"W [jD؉u}2T`Q L_K4#aTvq'2X/V46e9 hJ%&9={!Q!&L<䣔FegYAbtj8{@Kh]^icLA$ȢQи D.^Rm!rt&R`~ͦ9mP>v&7a5#Q]ĖͪʆӣK֒`; =y`/tߓ(Et4J8t{y x0m .vMgMVҋzeo`8< ldmM3EH:Ϛ./þԇXs﨨oaWfu:2 )sr|ŽCtƀ;8_ツ'%::Np}٢K5 \- kf87 [קLP8Q5})DufKz8#YU̦6G<βry*Ը - u7;A&+Y9ZnHLzn$edT>|n_-L;iEy{޾^Y[{e^9d*N*kya}^SfR͍RP4 ]s9;/]UkQز^]PW*Q,٦ru'hkzm䗔c؏ÍV)0A&9¸صp3xiJ!Yس2qc["fr׌ 9\}Q[KN&e4JFZD!&d ݍ5;+6> )집AB9`2RFw)պGN耗8W%cLX+UŌS򸌴}q6٭9Vl-ije] o@#̖Y 3wP_+QV$vdFJ+cUfY5w-:̴ kzxUF]*.qo $N[.z]QU"tasi5ym̰KWjUbO1씬DI.RͥEm)OaJU-_3GX{K/; ?A1Onf͟~2@j:dӠKL[V-֌㶿 2߫L:5&w0; LyEs<ȰKzxO>A&rFA=c49dmW묢{ˀLݩÖ4fݷMb9рA}p&Z%%?dMkVuVR{a+pՆao.z_@<ݿNg?KL#DCߡw8[1݉daCB+8݅Y(ÿRͿt6Oe`"XTaL9 lyG}$< [n厢 ]ЅW3Oܢ;*?j,QG`ga43 aG*&K3 '`O셗I :OᙄgaGPK*T`|gpggpg=Ϡ3U0p*܋8Q-]JV5N~Qsz5PmTZAGVSް8lQD8j%쐔O>}q(+Mmi@S2~Ih];HoG3õ57\4>jjV܍} W ϋK•yXɽɭVF(^k5=,Z%M$v#?8&Zlv=+tN^`̬~.%VJfz[Z/WWW^$ǹa/nzo][ wRqRܑW`oqN1OO~۾?;_4ؚXZ2C/fmin%}D%>b[.T~=^9%m鞻yw;J0r )}t MKC㑠w+k4s2TC:6*$}Nb8l$I( J,0վudhAsܺK~k/p'"N{J9񵤪S/!tA^hE-Ut{x^M/TةQe LP(iKighC/nEIҐ?5_TiCx\Q#h[)7)+=l4̀aB_BឆnZhLoniŠA&!>fߝ=J'}IHҡMR^5''U5|H8x9 -7 DzUuOy>nc 5@U Ym ꜐% p$³%⯱s!%umxq k:u"Iectxt0pSLxt%O-&Ԥ%Q%N3r&tP̚^H$$WuVJWTIgOI(}Nm'I!Wfa%; FO&^%0+s/+izcD)3q/Nt.'؉3‰M27m$e1pCd?~isԵM$]+49 '߄|{ƚ;D}|2Cݑg9I-}(2蹵18;>H8{BY3 gЧۺ=*^@tkusz}j%C<~p]0igw\XRx$+*ReC<~#Un崜^ -\@O) _ ~uv6R'<4 Y/?.[s 3wPv>!޾^Y[{e^9dǶd7jfnZ*覕>wh_¦Rpe+VrorkvUs>Q7J+׮7uM󊹲V:1<qS->6;:Q/mfV?o+TYj3`-Rq+/:! f֨ RNC%Yس*澦 Iwt[1J>!INQX,n7-M#7sfeYPM7S4`1.q9? '\ j_-@JpbniŠ`v%!N0:B>⑤C < Aj40AjZ''f4h*|QPC_Yx*۠ o:ɰZu#t56j}2[n݌m`Ee! o+sXew?jF|^ЗD9sug!=t]ҬhV6r}Y }YHF#X{Z(~q"JE͒!~{JUם!B;&FeZI4Ig5{+%N d8=&It桖OD(CFB"L&؉Rrc(qe8VMHXIӗ?%K +Y+M2WFW%Iݤo;Uf:s/O22O$I!O53yq+a\aMP摩m4a$HmR*cM:b' 1I,U`hIe*G}KSul2P&Q%N3n&IZoQ`Iu2dk̔$-~$9H`jmZ2+e2^K^LLҶOCo29P̿Lϟ~ +le^a.#Aߋf$9D(z0ȓx$gyhfĎ< `s 8ȡ_O2v,wXYt@gBgp t'aT_- |߹/%8>,`sqܧZ% \ބ}S6m̀a?|NWav?Q/8ģ `y9nJtAX0x].Ȅ-kA#8ߋ~E;KnxW"Jnْ UoKa,e(Y۝-f ӉP8YcQ)tfб74 7}ct(<I'hznvϙv sBsݬX>jn V`(gjY[zlΦl1+<8FRw%FVz,-mu5h^*DzA]pb$4}$!쇝0ʄ`?RogDcO"~ H/} i{)3As|: 7}}D[c"7 =B ÖP69/+tE7gaVlTՕ2AHIVq,a/^ -Z[B;ܔꋷϟV2 < p+ %U۬Re^uR"s`9sbotuOQ7C:$< huIM*ruTsM^ސ틲Q6l+~ 9$w2R'`wY~K3>y$`^1 n;E<^7\i4mU \2þ.ðZYvdU5Y*E&,lJ>NjI+o4 Nׁ˰3u qIn"} xHFgQ oþM 1l+U( 2"wA͟ 9:I^$G+$Z~<ʞ pQ`0>pbs >Que փvy~>Kc -8QNumNɥ B7 mrEm"EHqh;EFzZղFz%Iw'C}EWa|﫚w(iO& ;$g"vm `H=aن3vt3܈L$g8| [exEĪ/F1%LMH\ނ}_d$FM$#1 2liD#1qH%x/awGbSHm6ՑV/Ñ%ý͡ ;?;P05.%Q݅rJnx Tyke0{g9#V@7:KwDȟBцWdeðVz؛+g݅oluL_/Ґ3?y}ZMLXADDOÖ&Rh/*ไa/g?IJ|̋YArff -^$9{ -%!=hh$ohVmj&3tJQrCqRêuo+%Պ3jWפZӀ_Vaf%w'Q# GTgeâbϺcB9ٍm1β'lZgMW^~Yܕl{nFk)YF,ۢk'aOF6[fRMQgnz$\E"J&x:Q-E`KM5D2x!AhЭ*ZY"SOuPrC@n1d3R4thw{13 MY,() ?ӝ,748cohLEc7oRM;KKifl)5%ý[JeOIb;G_a#nc3b6Jn8[̵[ ʜF+u4?##]K2"~ 4wZ' ޯX#u Sx}s8{nW\5l8\e q;-b!U^$ [}NBosgډ .LqrXB r.L䆀/S[Cժ6_;ɻW-2wV,[E+U- #S+5M6ifmvvSbM,-sO՜j%-{9NYy}t퓶$BLubGb۝^cP%4G܆5G'b[jCb7 o_Sbׁ;(EO~EC<4&P+I}dp 'M'jVӧZ0"sx %ǀgc1YmܘnWEVѱ ŭtfWB]o1Fbbih%CƶhVbV٫^1cƆwў88O/ͥ(yAO9ʞ=~)Ɉ(ӑ}R/>R8Ŷ/h@ O31.)零v0  qpUH/%A9 jB >&Qܒe,s{X+VAӰ64OI\Uiӑ? &nh3\g2*7]-˨ ^wT[mA|f$y| e{qԢ"W_uGC<{Ћ{]xfk)Zi((jZbzknq|I,L<5yZ(s]$> | [X{JEW0J)xi_U%*Ǿ{T 366ܗGJc/{>(!dPjM }"{_}G?ܫѡvoCjjV܍} W ϋK•yXɽɭVF(^k5=W,[+W*9jt &ѡ}wġDWNGX\daV?oW]L/6a+|YgՕA>E1 K_?o][= RqRѩW`o?C^~C0t)*r]>q"8\0^t=,Tr `_P+\jEHإ0}v/KG_.sl[a6 D 㰥 )0վudhA3{WDI8ID$Ρqd7֛pmQ5|pcxqi ?4P4~ٗ &tK>x-Ei߉;.Z,2߳z ޺7xioime3Oa?POސt^閞sH٧?Q,[^YuzrfeYw|Mם1w2M $v,r6,wܸ+",m _li3lsܝߑE:FR-)HKI8ZQ=t s("I:F1 $GIak&^$H*Qjwa ,C֏?&(0*jH)q5tyQ>PV%;ST2/.'qC$cwY2Azb&gQ1 of9l^}HфfNWav?Q/8ģHC|QT B49ģX,2mt`D)r9FSQNV"Jw_C)ɯr2,|^-œ VMХV[/ꦨ7(ۊMWp{Wn8iC 7t,dVNGwjH:.MbVx{77Q8[-&喖:>]*DzA]pb$4}$!쇝0I#؏.9&@SR3j1%C<{sA ͱ8AVvp-pбqOKYFlNϦTlTՕ) rزBNJBro0U+h5:ՂxTeN^n|vi&)H0/:)9d;:%{餧[0Z'4vQO9qJ`\j WLX2ʆm KDDǀ{N|_O] >׽"vhEXD/RBrE8aB2Gzv"xb _x\.W~!<j_HaK8 j_Hқ"w _hKpvIƀ/BI/ԭ8%Ö38?'k0DhDn8%7tG0QuL >vy~>Kcs-8QNumNɥ Co8\u[w{{n{z>R}4qN^Z(54l$q̾!<_U͂)~ާT$/D*Jzgòi=VtW~VY1^?jQqP'ٓqj܄ڷd8H"*17d$F8\N5Ʃ{6#`M{ ; TWGbuE{8sw#1nGFb Dmxv)! DIrR^{` T4CMφ3DsFt@9tGш /mIx%x \~~Y{"aYawa%7<[}cY`'Voz= [n<8w֎H`u^;~Gv)z1UWg pij QNum%v`Ü@DT7݀c['т:8n9 07ݶaXku5Yԃp,;0.{W7y\z)zT$oFZ־4eӤE^)Y3hw"gg<,RRrVoNW/`K߂5q ?Lݢ }n;ʞdk]gw8'Rl1ۚQW&G?vhQˑnZc:pS\wfønj%=]TZJM\SZZ0M@V&0Z{ Rإ4Ћd{R{-'$Yon/QTNw(!l[$[2תo-*sј[Lw1n/EˈI3rKvӴ%k 4x/<&<[x5 Q > noL`Ouyxە.WM:1}B.o[:NPE~wZ}NBosgډ .LqrwS6Dnŗ)Pe`KY<TZ2ܦ_q'0N:E~Պekt߰hert ֕o&ֽͬbWeɻSu/[^8+ഄ+W}ҶwDhi[lwtW a "nÇ#܌?-5!1{ /`KM~u:G"Jn쟺lQ"I'<q1VVBC&IؓJ5Sr-RcYس1,6_ZnL^ERzVѱ ŭtfWB]o1Fbbih%CƶhV5bV٫^1cƆwўc$v'N]^$K5Et;Qك=a{~S4Q w*x#%7< t_|4r}qm_b,-%gOa˭c \jS7mQ fCe| ~jR9 jB 7 FIILʈ2< ⃄aKm|i>mݱ \-qσ9aD &9l63E؋{Va.¾]zjղ*{uGkftkgoAB_vG-Z/}U{q8ij8nKzzqVލwk-yꭹ%Ͳ2YwԬi=u܋6wp2%_=CzU'ݯ`P|ģHCRRQ9$:^Нᴱ侴w?Vz/G%xOD\g!۫@5%}^#nx?J&G8ģJJA&/Q/߈ӛ';(whKvths߾@NO813{c(3qe Z[*#+Z5p#9f{W/Mu9b[DAdtt0+R%-I5c1RC @~@*"r߿nV!2&1WZN60B,Z;nYm!)^3qG>ճVH;d;%A0~KLCpC~nϹi|l=Q3sRA7܇E6ߗ +_{[˵?󹵍Q*,\_v-׮kzXtҲnZ%督T/IDh?R8$S!h) >ͥfvQ,.a—Z\]]y}\D=1Owmq훇s׽?:1V5W*NaT; 3`L-~gO~۾[?;_4Tdo0tݱrʵid[G"=$x|*/LW%]t5 ռ;[mA6*l- =Jxe¥F_^{J{h- =&.s\[ݼniCɟథP0-UHk%C &']*JP'98vđѦzGZoµ6)eMv}A'($`4~ٗ <[3|<.!A|OM]S'U; d:I2,R#T=-/$}R_j}_J't?Q,K-tvZϸ^d]̲l6zFG(R m uKsaqk^p*Ls[a3g"Xu: 3i0airC ULNp2{&wPѓ^įފ%&B>À`ߒ_D3c73z_?7]e,wT+3cwE[I0ÙH?i2k,,'߄|AC20a/0*jfx=8<(?٭߾ I]{@XD_rC ד;e?3+L"ߗRdg@n~&1$rƘr.o¾)of簟GX4!q;\Dɿj/@x 1T=ҕja(֯1awFBb'DFk;U(9l Z.P$JƟ sXɿPct,{Un? |_ش{KWG5_IY9YѬpofNΒ t/I'Ji=[ 6wwEkN믅"jW+ QwP >ڹo*%./'a?|N~>Έv)'DA$TcWv{)3AsuKYAF\B-[㞖&Φڮ TlTՕ)A[$ IVh [d+h5:݂xTe #*éj=tT5a4 #@j&Nz_\GNzuRk9 ڮ 딣sK]&,03sb(%|u~ 98w׽"@LDZD]ARDrE8}e Id* "@&wq\N]A!Dy x%v(w{nڮ &+(;+dH_Aངjӈf+N!@ub!F-H'vQ~[)<'k0DhDn8%7<ړIE1Que ry,mη` Dex8յ8%F7?mrEm"\u*R}4qN^Z(5l$q!mU/fAO& {I^Tؕ1?!φeӕ>ZݮU__`nD&Z9| [exEĪG}$6&&t$F\oZ#1| o"7NaKO#G_DʏfངCj.Ĩڋdp$FpFbN.L((.LSrCc^{-W 65ׄ5=H{QG#'/`Pvaj';ܱKԨ-oޮz,<8.,|F'`Sri,)jfśDDOÖ&<篅Ky9TtژNi7%6~+jwΓd^ j6jF|CKÞ~CK/pg, Mb4uDqxW)Jn8[jXmd|;˼y`yҳX#?*ܳad k U f78˞lj}*6M^zQgV4C9+!wb&ݮR̪ycs[~̓$ڦ|}bL"j7`|.^RŢ %CB O>-le:Qi4O=tpFޘ[tp,LONwZjpOu7[Sј[L5-jtLEDZL9ij12ʞ @2р8 D g-%q+0d[ոVsCE^96 w=@D$酰x CuoyU=i1cegro0-MzsaKynVXyG;dzL-)K,lݎ[hR1-,v"2JNWBԩ<)lׯ\J)?ًd`t@r(ȩ)55=a7izIx^g9T_7>vy ,׻тx$*éףl#@%8:R F%8'a7-9 07ݶaXku\}Yԃp,;0.{T7yM͔R瀣]KAk_G@ArݲiRϢ`IKZ;UK3 C3QHR))oa|{7R_tϥˑwnknYT 7v1]s,۠AqNrc\A5d L\G?vho8oGZmjŎMrݙuS-袚RjrJnjoN;M{ :R RjYE==[JMpRCv~X7їw؈(lX='?ukUݷv9Vh-&zFGFл"eD$l%PiO}xk?أ.A|x oN`Ou{xە.WM:1}B.orXH;AU#9 v!=h'/2ʅ_PQ`_PrC@)-e!]T j LN|b.7,ZjYue[9|hI3uo#nbi{T+iyu v% 'm{gI6{Gz;m 퇠J- j8p3NԜo%-5ׁ;(EO~EC<4&P+I}dp GM'jVӧZ0"sx }b~C1,Yu |q/-7UQ"rsgwtxBq+6ٕ)E[̢fFв-ǩ|*Whƾa]'< Sף`(yAO)ʞ=~)Ɉ(l}bL5NF./NK,ӱD #jM[TF i fCevWe+W7G>AMAT45▔(cS>HU.\}vN2lٛmP%엝7P`~/xmͪ/'n.w䆀Zbzknq|I,L<5yZ(s]$> | [X{JE$2uQO9ģHCRUTUT})tg8ml/ՔHZݾ|X-(9*|G<~pݟQ>lJ)OD =#W#QtRnsbG|2[#q{B WPeHOHcdH> z"-z:G -Prǰ՗POOa|gފ8  A@!< [~]Xp*zYT$ zYURGJDME%"ׁ7`|%2%-W"J&VD3*R}XK) k^jZ_*:vch6t R18b{Wq My=ȷ 7,KN,QriQRU8-5 do}ݮ” DuK׵U R{þjTbXk Oy"[VhcQHGaLaa(c+ONdи~7L;}R;;\[ssf5[}fTM+}FqѾr煫MkBy m}P'9q(O*TֵMs""'],JP8:gx07+{_v6~ aOG{^H3g%5x$R:>H#bNO 3KC$€IIf- Ya *{5bΘz^,˸ 9KV[SN'03#w}O9#+ Zf ´m.* ?V&L3蕻rȪi!u/iV:l#tAGո:@QmFCa_r8Mz3*>sxd*+$#2%WJp4:ԉiX]HkkmhMC}or.mkb9 L=Jumط#7[=Bx%-.lToːsZRC0a*JRkf#eѦsM B,',z(V0( lܹ1iwYN]t}}Q@*QggaL(f{4p RwDo¾,xSJ.^~cv~XZy -O]h >yʸ/N־jw捐9ȿ)ҝ$YxbLxc{%RH42uͦ`ڶ'q2oLms'I̪Q*&{mW+zM*4-?F2/ꦑhOmid&I~'˺ܨѼ@O9y\}̗t̔O@̔S^N@Gx'ϸڒkRpCꪱ+:qRXChL%:ސے'"apHqDH JT&MRT:RR%цLt^H*R:֮PR%vo-XO^ g_]DŽ+U4#aTv?x$=䮻3"l;팔T`3*:u Ra'NaEb\GpGc"Q<%ZW*BT)̣j0M &"SS;9+):W,ݞs4>Tq~43NTЗcp#D8+ujgSu:3zJPM oR"U<:yktcLSLE%I#MQK>_ $Z%a.*,QwDqhrD)t-rDZIא)8NӭMT%dX}ŖAΆתDTՔXdd޿Lto7$1/ьQQM@!It>nH.na(lw))l!p/KI/Kq̅.q_{Za I6:A"(tTe:^ 'OԠ9Ѥ$ItFn6D8IҏzUJ:#wu"JG;_RW'tP!WfQaIa:(̰d&Iݲ2qRfЗ3]5Kĉ8#M'SdB9n i$5W:qRHD8sYs$/TWW(X-ycDŽ E3FEmQ;x"*nMc#Hq,OJ(p'RwJ֌ d#Bɠ |.7P ~)ШD+`8ģ S33V^+VfFy:GQʗx<9bۺnͱb˺ڏ?flmkO?9?N9LX/ipv. a?Vιͪɦ3i EE"9Q~/Ӡ7췊T'+kUf&ewj'`O(<ΘUDH]v3#㰏+;m%ݡ82V( ~Df8aՁuV9;RQFBt9QVx"ymvm)hXY*N-dB=5 ni ڽ9a/F74XT/þ}7Oị|RZ>Zge+Fݑi1j8ݍl*cfidXނ}K9wTlݬhQu.תQ/jBV?-m-x<2ږcϊfc ¾V]+uR`OS69ysݽ7;uͲghꔺ v}$c4>}籮N 雛d//,%/2yj\o'?x^%=yyV M|)W^3EAVU?{m!_mIh*5#T5Katr6s.9 -ur:J[ߪwNxr?|F7J>wEowJp;0:Kޗ4⚌uH/1Qr7!ژ;k;#hjC؋@[3p_:2]/!ɦ`_R3O"0 =aCbpFMϪ_H#w@ex) {2t%-[QT=vUfzN{2t93c"UQ=v5fޚ0b=rzIRџ⨷ᜄj0(:*9*70pZQ))wTڿUkZI8:8睽v;p;u;(c"ͽD&: igeznMUQOC-o`rtV!INQX,K1[fᐳޮ?, t`?¡<SrМ$-X٬x *<=(HhnX啒O^StuK+~5i :JCѤHeAUdOD(rG't4zIe%wP"JG;_RGr&tPa:*Q0F(DΉ)e(AeOt.G'tt"Y(DhL(Mi:(Q:T'}:O$G' uM!ɣ ֣{G?&o-0*jKވ9#}'w]Uc[Vq';\`3jxRPC 9V$*xt̛CrW%&R1L&(uQP|:DxJt) sSX$Nbɦ&_C;N6IRI؋PaI0Du6V%rO学LĊX''Me { D3FEm7Qx"*nMc#HQ(PdR0GvO<#J9ģÄiC|?^+qP(;@72Ky[>PT_ezR1mb6týo]0,j6 fC?%ނ}Kٻ)`-o#(U܄'aDǽx b(+%C<>erwhQ6 :YQ{,ZLA$kB QF %ǀK`(t9jDx z (\)eDuͯAiJ5ZjBz8#YkӪt<{es[r)Fig2Fjh&5 3 l0jeu *IϿ Y/?.[s 3?,z땵ջ^P?[;Ƕd7 b 'X"|քW\.Hr]!M8Rn(Ѓ_J'Ra>_$H05s{:cw$< >9Byd͙g,+镢Ŗ:Zэϛ.şM{Zus33[ě̥8wVzѿ5'Li 4RMn*RzXQT/ֻfk?Aә'7L[p~. O`s%t{"u# -Pkf""]laE5任]Kg*¢[O=}s2ƘQ֊9fi/Nn1er's.k7,3L} J|"_\B=ɺY+ל0fS{9E}T ҙ󾤁xKK.uGXb䲐{% YV=! #b@[s.MP݆=ȱ-4K5jfnZ*覕>wh_¦Rpe+VrorkvUs>Q7J+׮7uM3Vi8GC{ךb 63zeqR^0lÖV)xaՕAƄ %M]o[3ù~k1VKW*N bT;b3`L-.DOzyPG{[do`_4e[-K;l(|$qNr{帾{Yݥ?#EvMS{@W+\jEHjV0R߭ Ea2Bz4>KBJB8[lS[J4~:H+ %Ms>HRM]SZqWqش$lƼb^}9BI!rn G_p=_J't |ģX,;]̼UiEȭeV rO42 li L{a:} ix 9nZK( r-n2N̕C'AIؓ굜[ꖾĄW5 Ew7\_,n;}Exi2139U) g6̗DI3)w^Kd,~/M`w< a/0*jfx"*ݷ #bd!Lg(p6WC8!uzA)N'be n4*̰-|p{)~T7݈%=o[Lc'VݤmYQmVU,m|ԅ@0`dFnUҙ;*lCgzwsGV2Rk€'lf-r'3smu鐉є7j&=%C:xX#)XDfur?>`vNZhCy 7"wP5H[REs l@|҂eKtm]܊.bhKއ-mS ~?mfZZ% _8*42rZ ptQ>/hm~nCc8OMRDC4iTR̩e*9H}herDU> 2%33kz!ks`: =a2N'vۡ)9ģڒ3&?4z"Ɯ(lVEϕM:FSuQ[2C0j!D=.^gSr7agS8G } H*HOK,]z6nn^hp{|Dx=eo1vulhU-GB[6!V;p.^~os'ڑArjܚ^oVɽQԡpBqhj^u |.l᱘kM&RQN %C _6~nw (Eɿh ggthemes/tests/0000755000176200001440000000000014561051016013216 5ustar liggesusersggthemes/tests/spelling.R0000644000176200001440000000024114561020227015153 0ustar liggesusersif(requireNamespace('spelling', quietly = TRUE)) spelling::spell_check_test(vignettes = TRUE, error = FALSE, skip_on_cran = TRUE) ggthemes/tests/testthat/0000755000176200001440000000000014561541612015064 5ustar liggesusersggthemes/tests/testthat/test-gdocs.R0000644000176200001440000000105614561250635017267 0ustar liggesuserstest_that("gdocs_pal works", { pal <- gdocs_pal() expect_type(pal, "closure") n <- 3 vals <- pal(n) expect_type(vals, "character") expect_equal(length(vals), n) }) test_that("scale_fill_gdocs works", { expect_s3_class(scale_fill_gdocs(), "ScaleDiscrete") }) test_that("scale_colour_gdocs works", { expect_s3_class(scale_fill_gdocs(), "ScaleDiscrete") }) test_that("scale_color_gdocs works", { expect_equal_scale(scale_color_gdocs(), scale_colour_gdocs()) }) test_that("theme_gdocs works", { expect_s3_class(theme_gdocs(), "theme") }) ggthemes/tests/testthat/test-stata.R0000644000176200001440000000277714561250635017317 0ustar liggesuserstest_that("stata_pal works", { p <- stata_pal() expect_type(p, "closure") expect_type(attr(p, "max_n"), "integer") n <- 5 vals <- p(n) expect_hexcolor(vals) expect_length(vals, n) expect_warning(stata_pal()(100)) }) test_that("scale_colour_stata works", { expect_s3_class(scale_colour_stata(), "ScaleDiscrete") }) test_that("scale_color_stata works", { expect_equal_scale(scale_colour_stata(), scale_color_stata()) }) test_that("scale_fill_stata works", { expect_s3_class(scale_fill_stata(), "ScaleDiscrete") }) test_that("scale_shape_stata works", { expect_s3_class(scale_shape_stata(), "ScaleDiscrete") }) test_that("theme_stata works", { expect_s3_class(theme_stata(), "theme") for (i in c("s2mono", "s1mono", "s2manual", "s1rcolor", "s1color")) { expect_s3_class(theme_stata(scheme = i), "theme") } }) test_that("theme_state raises error with invallid scheme", { expect_error(theme_stata(scheme = "dsagasagdadgaga"), regexp = "`scheme` must be one of") }) test_that("stata_shape_pal works", { p <- stata_shape_pal() expect_type(p, "closure") n <- 5L vals <- p(n) expect_type(vals, "integer") expect_length(vals, n) expect_true(all(vals < 0)) expect_warning(p(100)) }) test_that("stata_linetype_pal works", { p <- stata_linetype_pal() expect_type(p, "closure") n <- 5L vals <- p(n) expect_equal(vals, c("solid", "84", "23", "F414", "F4")) }) test_that("scale_linetype_stata works", { expect_s3_class(scale_linetype_stata(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-calc.R0000644000176200001440000000167014561051016017064 0ustar liggesuserstest_that("calc_shape_pal works", { pal <- calc_shape_pal() expect_type(pal, "closure") expect_type(attr(pal, "max_n"), "integer") n <- 5L shapes <- pal(n) expect_type(shapes, "integer") expect_true(all(shapes < 0)) expect_equal(length(shapes), n) }) test_that("calc_pal works", { pal <- calc_pal() expect_type(pal, "closure") expect_type(attr(pal, "max_n"), "integer") n <- 5L expect_hexcolor(pal(n)) expect_warning(pal(100)) expect_error(pal(-1)) }) test_that("calc_shape_pal raises warning for large n", { expect_warning(calc_shape_pal()(100)) }) test_that("theme_calc works", { expect_s3_class(theme_calc(), "theme") }) test_that("scale_colour_calc works", { expect_s3_class(scale_colour_calc(), "ScaleDiscrete") }) test_that("scale_fill_calc works", { expect_s3_class(scale_fill_calc(), "ScaleDiscrete") }) test_that("scale_shape_calc works", { expect_s3_class(scale_shape_calc(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-theme_map.R0000644000176200001440000000021514561051016020113 0ustar liggesuserstest_that("theme_map works", { thm <- theme_map() expect_s3_class(thm, "theme") expect_equal(thm$panel.background, element_blank()) }) ggthemes/tests/testthat/helper-utils.R0000644000176200001440000000107114561250635017625 0ustar liggesusersis_hexcolor <- function(x) { pattern <- stringr::regex("^#[a-f0-9]{6}$", ignore_case = TRUE) out <- stringr::str_detect(x, pattern) out[is.na(out)] <- FALSE out } expect_hexcolor <- function(object) { # capture object and label act <- quasi_label(rlang::enquo(object)) valid <- is_hexcolor(act$val) expect( all(valid), glue::glue("Not all elements of {act$lab} are hex colors.") ) invisible(act$val) } expect_equal_scale <- function(x, y, ...) { x <- as.list(x) y <- as.list(y) x$call <- y$call <- NULL expect_equal(x, y, ...) } ggthemes/tests/testthat/test-wsj_pal.R0000644000176200001440000000114014561051016017611 0ustar liggesuserstest_that("theme_wsj works", { expect_s3_class(theme_wsj(), "theme") }) test_that("wsj_pal works", { p <- wsj_pal() expect_type(p, "closure") expect_type(attr(p, "max_n"), "integer") expect_hexcolor(p(3)) }) test_that("theme_wsj works", { expect_s3_class(theme_wsj(), "theme") }) test_that("theme_wsj raises error with invalid palette", { expect_error(wsj_pal("asdgasa"), regexp = "valid palette") }) test_that("scale_colour_wsj works", { expect_s3_class(scale_colour_wsj(), "ScaleDiscrete") }) test_that("scale_fill_wsj works", { expect_s3_class(scale_fill_wsj(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-economist.R0000644000176200001440000000357314561250635020176 0ustar liggesuserstest_that("economist_pal fill=FALSE works", { p <- economist_pal(fill = FALSE) expect_type(p, "closure") for (i in 1:9) { expect_hexcolor(p(i)) } }) test_that("economist_pal fill=TRUE works", { p <- economist_pal(fill = TRUE) expect_type(p, "closure") for (i in 1:9) { expect_hexcolor(p(i)) } }) test_that("economist_pal raises warning with large number", { expect_warning(economist_pal()(10)) }) test_that("scale_colour_economist equals scale_color_economist", { expect_equal_scale(scale_color_economist(), scale_colour_economist()) }) test_that("scale_colour_economist works", { expect_s3_class(scale_color_economist(), "ScaleDiscrete") }) test_that("scale_fill_economist works", { expect_s3_class(scale_fill_economist(), "ScaleDiscrete") }) test_that("theme economist works", { expect_s3_class(theme_economist(), "theme") }) test_that("theme economist with horizontal=FALSE works", { thm <- theme_economist(horizontal = FALSE) expect_s3_class(thm, "theme") expect_equal(thm$panel.grid.major.y, element_blank()) }) test_that("theme economist with dark panel works", { thm <- theme_economist(dkpanel = TRUE) expect_s3_class(thm, "theme") expect_equal(thm$strip.background$fill, purrr::pluck(dplyr::filter(ggthemes_data$economist$bg, name == "dark blue-gray"), "value")) }) test_that("theme economist_white works", { thm <- theme_economist_white(gray_bg = FALSE) expect_equal(thm$panel.background$fill, "white") expect_equal(thm$plot.background$fill, "white") }) test_that("theme economist_white with gray background works", { thm <- theme_economist_white(gray_bg = TRUE) expect_s3_class(thm, "theme") expect_equal(thm$plot.background$fill, purrr::pluck(dplyr::filter(ggthemes_data$economist$bg, name == "light gray"), "value")) }) ggthemes/tests/testthat/test-banking.R0000644000176200001440000000123214561051016017565 0ustar liggesuserstest_that("bank_slopes runs", { x <- 1:5 y <- runif(length(x)) out <- bank_slopes(x, y) expect_equal(length(out), 1L) expect_type(out, "double") }) test_that("bank_slopes with method=\"as\" runs", { x <- 1:5 y <- runif(length(x)) out <- bank_slopes(x, y, method = "as") expect_equal(length(out), 1L) expect_type(out, "double") }) test_that("bank_slopes with invalid method throws error", { expect_error(bank_slopes(1:5, 1:5, method = "aor")) }) test_that("bank_slopes works with cull = TRUE", { x <- c(1, 1, 2) y <- runif(length(x)) out <- bank_slopes(x, y, cull = TRUE) expect_equal(length(out), 1L) expect_type(out, "double") }) ggthemes/tests/testthat/test-tufteboxplot.R0000644000176200001440000000014214561051016020712 0ustar liggesuserstest_that("geom_tufteboxplot works", { expect_s3_class(geom_tufteboxplot(), "LayerInstance") }) ggthemes/tests/testthat/test-base.R0000644000176200001440000000235714561051016017077 0ustar liggesuserstest_that("theme_base runs", { expect_s3_class(theme_base(), "theme") }) test_that("theme_par runs", { expect_s3_class(theme_par(), "theme") }) test_that("theme_par recognizes las", { withr::with_par(list(las = 1), { thm <- theme_par() expect_equal(thm$axis.title.x$angle, 0) expect_equal(thm$axis.title.y$angle, 0) }) withr::with_par(list(las = 2), { thm <- theme_par() expect_equal(thm$axis.title.x$angle, 90) expect_equal(thm$axis.title.y$angle, 0) }) withr::with_par(list(las = 3), { thm <- theme_par() expect_equal(thm$axis.title.x$angle, 90) expect_equal(thm$axis.title.y$angle, 90) }) }) test_that("theme_par recognizes tck", { withr::with_par(list(tck = 1), { expect_equal(theme_par()$axis.ticks.length, grid::unit(-1, "snpc")) }) }) test_that("theme_par recognizes xaxt", { withr::with_par(list(xaxt = "n"), { thm <- theme_par() for (i in c("axis.line.x", "axis.text.x", "axis.ticks.x")) { expect_equal(thm[[i]], element_blank()) } }) }) test_that("theme_par recognizes yaxt", { withr::with_par(list(yaxt = "n"), { thm <- theme_par() for (i in c("axis.line.y", "axis.text.y", "axis.ticks.y")) { expect_equal(thm[[i]], element_blank()) } }) }) ggthemes/tests/testthat/test-fivethirtyeight.R0000644000176200001440000000077114561051016021401 0ustar liggesuserstest_that("theme_fivethirtyeight works", { expect_s3_class(theme_fivethirtyeight(), "theme") }) test_that("scale_fill_fivethirtyeight works", { expect_s3_class(scale_fill_fivethirtyeight(), "ScaleDiscrete") }) test_that("scale_colour_fivethirtyeight works", { expect_s3_class(scale_colour_fivethirtyeight(), "ScaleDiscrete") }) test_that("fivethirtyeight_pal works", { p <- fivethirtyeight_pal() expect_type(p, "closure") expect_type(attr(p, "max_n"), "integer") expect_hexcolor(p(3)) }) ggthemes/tests/testthat/helper-vdiffr.R0000644000176200001440000000033314561051016017735 0ustar liggesusersexpect_doppelganger <- function(title, fig, path = NULL) { # need to call conditionally because vdiffr listed in Suggests (#124) testthat::skip_if_not_installed("vdiffr") vdiffr::expect_doppelganger(title, fig) } ggthemes/tests/testthat/test-canva.R0000644000176200001440000000133414561250635017257 0ustar liggesuserstest_that("canva_pal works", { p <- canva_pal() expect_type(p, "closure") expect_hexcolor(p(4)) }) test_that("canva_pal works with alt palette", { expect_hexcolor(canva_pal("Pop art")(4)) }) test_that("canva_pal raises warning with to large n", { expect_warning(canva_pal()(10)) }) test_that("canva_pal raises error with invalid palette", { expect_error(canva_pal("adsffafd"), regexp = "not a valid name") }) test_that("scale_colour_canva works", { expect_s3_class(scale_colour_canva(), "ScaleDiscrete") }) test_that("scale_color_canva works", { expect_equal_scale(scale_color_canva(), scale_colour_canva()) }) test_that("scale_colour_canva works", { expect_s3_class(scale_fill_canva(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-solarized.R0000644000176200001440000000146614561250635020171 0ustar liggesuserstest_that("theme_solarized_works", { expect_s3_class(theme_solarized(), "theme") expect_s3_class(theme_solarized(light = FALSE), "theme") }) test_that("theme_solarized_2_works", { expect_s3_class(theme_solarized_2(), "theme") expect_s3_class(theme_solarized_2(light = FALSE), "theme") }) test_that("scale_colour_solarized works", { expect_s3_class(scale_colour_solarized(), "ScaleDiscrete") }) test_that("scale_color_solarized works", { expect_equal_scale(scale_colour_solarized(), scale_color_solarized()) }) test_that("scale_fill_solarized works", { expect_s3_class(scale_fill_solarized(), "ScaleDiscrete") }) test_that("solarized_pal works", { pal <- solarized_pal() expect_type(pal, "closure") n <- 5L values <- pal(n) expect_type(values, "character") expect_equal(length(values), n) }) ggthemes/tests/testthat/test-show.R0000644000176200001440000000062214561051016017136 0ustar liggesuserstest_that("show_shapes works", { # creates plot using base plotting system, so just run code --- any # errors / warnings will be caught. x <- 1:10 expect_equal(show_shapes(x), x) }) test_that("show_linetypes works", { x <- 1:5 expect_equal(show_linetypes(x), x) }) test_that("show_linetypes works with labels = FALSE", { x <- 1:5 expect_equal(show_linetypes(x, labels = FALSE), x) }) ggthemes/tests/testthat/test-few.R0000644000176200001440000000312714561250635016752 0ustar liggesuserslibrary("ggplot2") test_that("few_shape_pal works", { out <- few_shape_pal() expect_type(out, "closure") expect_true(!is.null(attr(out, "max_n"))) pal0 <- out(0) expect_identical(length(pal0), 0L) pal3 <- out(3) expect_identical(length(pal3), 3L) expect_warning(out(10)) }) test_that("few_shape_pal works", { out <- scale_shape_few() expect_s3_class(out, c("ScaleDiscrete", "Scale", "ggproto")) }) test_that("few_pal runs", { p <- few_pal("Medium") expect_type(p, "closure") expect_type(attr(p, "max_n"), "integer") out <- p(5) expect_type(out, "character") expect_equal(length(out), 5L) # should use the first accent color expect_equal(out[[1]], ggthemes::ggthemes_data$few$colors$Medium$value[[2]]) expect_warning(p(10)) }) test_that("few_pal works with n = 1", { out <- few_pal("Medium")(1) expect_equal(out, ggthemes::ggthemes_data$few$colors$Medium$value[[1]]) }) test_that("few_pal raises error with bad palette", { expect_error(few_pal("Foo")) }) test_that("scale_colour_few works", { expect_s3_class(scale_colour_few(), "ScaleDiscrete") }) test_that("scale_color_few works", { expect_equal_scale(scale_color_few(), scale_colour_few()) }) test_that("scale_fill_few works", { expect_s3_class(scale_fill_few(), "ScaleDiscrete") }) test_that("theme_few works", { expect_s3_class(theme_few(), "theme") }) test_that("theme_few draws correctly", { df <- data.frame(x = 1:3, y = 1:3, z = c("a", "b", "a"), a = 1) plot <- ggplot(df, aes(x, y, colour = z)) + geom_point() + facet_wrap(~ a) expect_doppelganger("theme_few", plot) }) ggthemes/tests/testthat/test-tufte.R0000644000176200001440000000040714561051016017306 0ustar liggesuserstest_that("theme_tufte works", { thm <- theme_tufte() expect_s3_class(thm, "theme") }) test_that("theme_tufte works with ticks = FALSE", { thm <- theme_tufte(ticks = FALSE) expect_s3_class(thm, "theme") expect_equal(thm$axis.ticks, element_blank()) }) ggthemes/tests/testthat/test-stat_fivenumber.R0000644000176200001440000000013614561051016021353 0ustar liggesuserstest_that("stat_fivenumber works", { expect_s3_class(stat_fivenumber(), "LayerInstance") }) ggthemes/tests/testthat/test-theme_solid.R0000644000176200001440000000021414561051016020447 0ustar liggesuserstest_that("theme_solid works", { thm <- theme_solid(fill = "red") expect_s3_class(thm, "theme") expect_equal(thm$rect$fill, "red") }) ggthemes/tests/testthat/_snaps/0000755000176200001440000000000014561051016016341 5ustar liggesusersggthemes/tests/testthat/_snaps/few/0000755000176200001440000000000014561051016017122 5ustar liggesusersggthemes/tests/testthat/_snaps/few/theme-few.svg0000644000176200001440000001475614561051016021541 0ustar liggesusers 1 1.0 1.5 2.0 2.5 3.0 1.0 1.5 2.0 2.5 3.0 x y z a b theme_few ggthemes/tests/testthat/_snaps/shapes.md0000644000176200001440000000120514561051016020144 0ustar liggesusers# circlefill_pal works Code pal <- circlefill_shape_pal() Condition Warning: `circlefill_shape_pal()` was deprecated in ggthemes 5.0.0. Code expect_type(pal, "closure") expect_equal(attr(pal, "max_n"), 5L) n <- 4L values <- pal(n) expect_type(values, "integer") expect_equal(length(values), n) # scale_shape_circlefill works Code expect_s3_class(scale_shape_circlefill(), "ScaleDiscrete") Condition Warning: `scale_shape_circlefill()` was deprecated in ggthemes 5.0.0. Warning: `circlefill_shape_pal()` was deprecated in ggthemes 5.0.0. ggthemes/tests/testthat/test-igray.R0000644000176200001440000000021614561051016017270 0ustar liggesuserstest_that("theme_igray works", { thm <- theme_igray() expect_s3_class(thm, "theme") expect_equal(thm$plot.background$fill, "gray90") }) ggthemes/tests/testthat/test-shapes.R0000644000176200001440000000312614561051016017443 0ustar liggesuserstest_that("circlefill_pal works", { expect_snapshot({ pal <- circlefill_shape_pal() expect_type(pal, "closure") expect_equal(attr(pal, "max_n"), 5L) n <- 4L values <- pal(n) expect_type(values, "integer") expect_equal(length(values), n) }) }) test_that("scale_shape_circlefill works", { expect_snapshot({ expect_s3_class(scale_shape_circlefill(), "ScaleDiscrete") }) }) test_that("tremmel_shape_pal works", { pal <- tremmel_shape_pal() expect_type(pal, "closure") expect_equal(attr(pal, "max_n"), 3L) n <- 3L values <- pal(n) expect_type(values, "integer") expect_equal(length(values), n) }) test_that("tremmel_shape_pal works for all values", { for (i in 1:3L) { expect_equal(length(tremmel_shape_pal()(i)), i) expect_equal(length(tremmel_shape_pal(alt = TRUE)(i)), i) expect_equal(length(tremmel_shape_pal(overlap = TRUE)(i)), i) } }) test_that("scale_shape_tremmel works", { expect_s3_class(scale_shape_tremmel(), "ScaleDiscrete") }) test_that("cleveland_shape_pal works", { pal <- cleveland_shape_pal() expect_type(pal, "closure") expect_equal(attr(pal, "max_n"), 4) n <- 3 vals <- pal(n) expect_equal(length(vals), n) }) test_that("cleveland_shape_pal works with overlap = FALSE", { pal <- cleveland_shape_pal(overlap = FALSE) expect_type(pal, "closure") expect_equal(attr(pal, "max_n"), 5) n <- 3 vals <- pal(n) expect_equal(length(vals), n) expect_type(vals, "integer") expect_true(all(vals < 0)) }) test_that("scale_shape_cleveland works", { expect_s3_class(scale_shape_cleveland(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-excel.R0000644000176200001440000000270514561051016017262 0ustar liggesuserstest_that("excel_clasic_pal works", { pal <- excel_pal() n <- 5L values <- pal(n) expect_type(values, "character") expect_equal(length(values), n) }) test_that("excel_clasic_pal with line = TRUE works", { pal <- excel_pal(line = TRUE) n <- 5L values <- pal(n) expect_type(values, "character") expect_equal(length(values), n) }) test_that("calc_shape_pal raises warning for large n", { expect_warning(excel_pal()(8)) }) test_that("excel_new_pal works", { pal <- excel_new_pal() n <- 5L vals <- pal(n) expect_type(vals, "character") expect_equal(length(vals), n) }) test_that("excel_new_pal raises error for bad n", { expect_warning(excel_new_pal()(7)) }) test_that("theme_excel works", { expect_s3_class(theme_excel(), "theme") }) test_that("excel_new_pal raises error with bad theme name", { expect_error(excel_new_pal("adfaasdfa"), regexp = "`theme` must be one of") }) test_that("scale_fill_excel works", { expect_s3_class(scale_fill_excel(), "ScaleDiscrete") }) test_that("scale_colour_excel works", { expect_s3_class(scale_colour_excel(), "ScaleDiscrete") }) test_that("scale_colour_excel works", { expect_s3_class(scale_fill_excel_new(), "ScaleDiscrete") }) test_that("scale_fill_excel works", { expect_s3_class(scale_colour_excel_new(), "ScaleDiscrete") }) test_that("theme_excel with horizontal = FALSE works", { thm <- theme_excel(horizontal = FALSE) expect_equal(thm$panel.grid.major.y, element_blank()) }) ggthemes/tests/testthat/test-tableau.R0000644000176200001440000000667614561051016017612 0ustar liggesuserstest_that("tableau_color_pal works", { pal <- tableau_color_pal() expect_type(pal, "closure") expect_type(attr(pal, "max_n"), "integer") n <- 3 vals <- pal(n) expect_type(vals, "character") expect_equal(length(vals), n) }) test_that("tableau_color_pal direction = -1 works", { n <- 4L expect_true(all(tableau_color_pal(direction = -1)(n) == rev(tableau_color_pal()(n)))) }) test_that("tableau_color_pal works with diverging palette", { n <- 3L pal <- tableau_color_pal("Orange-Blue Diverging", type = "ordered-diverging")(n) expect_type(pal, "character") expect_equal(length(pal), n) }) test_that("tableau_color_pal raises error with invalid palette", { expect_error(tableau_color_pal("dsaga")) }) test_that("tableau_shape_pal raises error with bad palette", { expect_error(tableau_shape_pal(palette = "gender")) }) test_that("tableau_shape_pal works", { n <- 3 pal <- tableau_shape_pal()(n) expect_type(pal, "integer") expect_type(attr(tableau_shape_pal(), "max_n"), "integer") # all unicode expect_true(all(pal < 0)) expect_equal(length(pal), n) }) test_that("scale_shape_tableau works", { expect_s3_class(scale_shape_tableau(), "ScaleDiscrete") }) test_that("scale_colour_tableau works", { expect_s3_class(scale_colour_tableau(), "ScaleDiscrete") }) test_that("scale_colour_tableau works with diverging scales", { expect_s3_class(scale_colour_tableau(type = "ordered-diverging", palette = "Orange-Blue Diverging"), "ScaleDiscrete") }) test_that("scale_colour_tableau works with sequential scales", { expect_s3_class(scale_colour_tableau(type = "ordered-sequential", palette = "Blue-Green Sequential"), "ScaleDiscrete") }) test_that("scale_fill_tableau works", { expect_s3_class(scale_fill_tableau(), "ScaleDiscrete") }) test_that("scale_fill_tableau works with diverging scales", { expect_s3_class(scale_fill_tableau(type = "ordered-diverging", palette = "Orange-Blue Diverging"), "ScaleDiscrete") }) test_that("scale_fill_tableau works with sequential scales", { expect_s3_class(scale_fill_tableau(type = "ordered-sequential", palette = "Blue-Green Sequential"), "ScaleDiscrete") }) test_that("tableau_gradient_pal works", { p <- tableau_gradient_pal() expect_type(p, "closure") expect_hexcolor(p(seq(0, 1, by = 0.1))) }) test_that("tableau_seq_gradient_pal works", { p <- tableau_seq_gradient_pal() expect_type(p, "closure") expect_hexcolor(p(seq(0, 1, by = 0.1))) }) test_that("tableau_div_gradient_pal works", { p <- tableau_seq_gradient_pal() expect_type(p, "closure") expect_hexcolor(p(seq(0, 1, by = 0.1))) }) test_that("scale_colour_gradient_tableau works", { expect_s3_class(scale_colour_gradient_tableau(), "ScaleContinuous") }) test_that("scale_fill_gradient_tableau works", { expect_s3_class(scale_fill_gradient_tableau(), "ScaleContinuous") }) test_that("scale_colour_gradient_tableau works", { expect_s3_class(scale_colour_gradient2_tableau(), "ScaleContinuous") }) test_that("scale_fill_gradient_tableau works", { expect_s3_class(scale_fill_gradient2_tableau(), "ScaleContinuous") }) test_that("classic colors are in the correct order", { # Issue #96 pal <- tableau_color_pal("Classic 20")(20) expect_equal(pal[[1]], "#1f77b4") expect_equal(pal[[20]], "#9edae5") }) ggthemes/tests/testthat/test-pander.R0000644000176200001440000000162714561051016017435 0ustar liggesuserstest_that("scale_colour_pander works", { expect_s3_class(scale_colour_pander(), "ScaleDiscrete") }) test_that("scale_fill_pander works", { expect_s3_class(scale_fill_pander(), "ScaleDiscrete") }) test_that("palette_pander works", { colors <- palette_pander(5) expect_hexcolor(colors) }) test_that("palette_pander random_order=TRUE works", { colors <- palette_pander(5, random_order = TRUE) expect_hexcolor(colors) }) test_that("theme_pander works", { expect_s3_class(theme_pander(), "theme") }) test_that("theme_pander works with gm = FALSE", { thm <- theme_pander(gM = FALSE) expect_s3_class(thm, "theme") expect_equal(thm$panel.grid, element_blank()) }) test_that("theme_pander warns about ff argument", { expect_warning(theme_pander(ff = ""), regexp = "deprecated") }) test_that("theme_pander warns about fs argument", { expect_warning(theme_pander(fs = 1), regexp = "deprecated") }) ggthemes/tests/testthat/test-ptol.R0000644000176200001440000000052514561051016017136 0ustar liggesuserstest_that("ptol_pal works", { p <- ptol_pal() expect_type(p, "closure") expect_type(attr(p, "max_n"), "integer") expect_hexcolor(p(11)) }) test_that("scale_colour_ptol works", { expect_s3_class(scale_colour_ptol(), "ScaleDiscrete") }) test_that("scale_fill_ptol works", { expect_s3_class(scale_fill_ptol(), "ScaleDiscrete") }) ggthemes/tests/testthat/test-geom-rangeframe.R0000644000176200001440000000013614561051016021212 0ustar liggesuserstest_that("geom_rangeframe works", { expect_s3_class(geom_rangeframe(), "LayerInstance") }) ggthemes/tests/testthat/test-hc.R0000644000176200001440000000152614561250635016564 0ustar liggesuserstest_that("hc_pal works", { pal <- hc_pal() expect_type(pal, "closure") n <- 5 values <- pal(n) expect_type(values, "character") expect_equal(length(values), n) }) test_that("hc_pal raises error with invalid palette", { expect_error(hc_pal(palette = "asdgasdgasdgas"), regexp = "not valid") }) test_that("scale_colour_hc works", { expect_s3_class(scale_colour_hc(), "ScaleDiscrete") }) test_that("scale_color_hc works", { expect_equal_scale(scale_colour_hc(), scale_color_hc()) }) test_that("scale_fill_hc works", { expect_s3_class(scale_fill_hc(), "ScaleDiscrete") }) test_that("theme_hc works", { expect_s3_class(theme_hc(), "theme") expect_s3_class(theme_hc(style = "darkunica"), "theme") }) test_that("bgcolor raises warning", { expect_warning(theme_hc(bgcolor = "darkunica"), regexp = "deprecated") }) ggthemes/tests/testthat/test-colorblind.R0000644000176200001440000000112514561250635020314 0ustar liggesuserstest_that("colorblind_pal works", { p <- colorblind_pal() expect_type(p, "closure") expect_hexcolor(p(4)) expect_type(attr(p, "max_n"), "integer") }) test_that("colorblind_pal raises warning with to large n", { expect_warning(colorblind_pal()(20)) }) test_that("scale_colour_colorblind works", { expect_s3_class(scale_colour_colorblind(), "ScaleDiscrete") }) test_that("scale_color_canva works", { expect_equal_scale(scale_color_colorblind(), scale_colour_colorblind()) }) test_that("scale_fill_colorblind works", { expect_s3_class(scale_fill_colorblind(), "ScaleDiscrete") }) ggthemes/tests/figs/0000755000176200001440000000000014561020227014146 5ustar liggesusersggthemes/tests/figs/deps.txt0000644000176200001440000000010314561020227015634 0ustar liggesusers- vdiffr-svg-engine: 1.0 - vdiffr: 0.3.0 - freetypeharfbuzz: 0.2.5 ggthemes/tests/figs/few/0000755000176200001440000000000014561020227014727 5ustar liggesusersggthemes/tests/figs/few/theme-few.svg0000644000176200001440000002035214561020227017333 0ustar liggesusers 1 1.0 1.5 2.0 2.5 3.0 1.0 1.5 2.0 2.5 3.0 x y z a b theme_few ggthemes/tests/testthat.R0000644000176200001440000000061414561051016015202 0ustar liggesusers# This file is part of the standard setup for testthat. # It is recommended that you do not modify it. # # Where should you do additional test configuration? # Learn more about the roles of various files in: # * https://r-pkgs.org/testing-design.html#sec-tests-files-overview # * https://testthat.r-lib.org/articles/special-files.html library(testthat) library(ggthemes) test_check("ggthemes") ggthemes/R/0000755000176200001440000000000014561274524012270 5ustar liggesusersggthemes/R/show.R0000644000176200001440000000371614561020226013366 0ustar liggesusers#' Show shapes #' #' A quick and dirty way to show shapes. #' #' @export #' @param shapes A numeric or character vector of shapes. See #' \code{\link[graphics]{par}()}. #' @param labels Include the plotting character value of the symbol. #' @seealso \code{\link[scales]{show_col}()}, \code{\link{show_linetypes}()} #' @return This function called for the side effect of creating a plot. #' It returns \code{shapes}. #' @example inst/examples/ex-show_shapes.R show_shapes <- function(shapes, labels = TRUE) { n <- length(shapes) ncol <- ceiling(sqrt(n)) nrow <- ceiling(n / ncol) x <- c(shapes, rep(NA, nrow * ncol - length(shapes))) x <- matrix(x, ncol = ncol, byrow = TRUE) x <- x[nrow(x):1, ] plot(0, 0, xlim = c(1, ncol(x)), ylim = c(1, nrow(x)), type = "n", xlab = "", ylab = "", axes = FALSE) for (i in seq_len(ncol(x))) { for (j in seq_len(nrow(x))) { points(i, j, pch = x[j, i]) if (labels) { text(i, j, x[j, i], pos = 1, col = "gray70") } } } invisible(shapes) } #' Show linetypes #' #' A quick and dirty way to show linetypes. #' #' @export #' @param linetypes A character vector of linetypes. See #' \code{\link{par}()}. #' @param labels Label each line with its linetype (lty) value. #' #' @seealso \code{\link[scales]{show_col}()}, \code{\link{show_linetypes}()} #' #' @example inst/examples/ex-show_linetypes.R #' @return This function called for the side effect of creating a plot. #' It returns \code{linetypes}. #' @importFrom graphics plot show_linetypes <- function(linetypes, labels = TRUE) { n <- length(linetypes) plot(0, 0, xlim = c(0, 1), ylim = c(n, 1), type = "n", xlab = "", ylab = "", axes = FALSE) for (i in seq_along(linetypes)) { abline(h = i, lty = linetypes[i]) } if (labels) { axis(side = 2, at = seq_len(n), tick = FALSE, labels = linetypes, las = 2) } else { axis(side = 2, at = seq_len(n), tick = FALSE, labels = seq_len(n), las = 2) } invisible(linetypes) } ggthemes/R/calc.R0000644000176200001440000001041114561020226013276 0ustar liggesusers#' Theme Calc #' #' Theme similar to the default settings of LibreOffice Calc charts. #' #' @inheritParams ggplot2::theme_grey #' @export #' @family themes calc #' @example inst/examples/ex-theme_calc.R theme_calc <- function(base_size = 10, base_family = "sans") { (theme_foundation(base_family = base_family, base_size = base_size) + theme(rect = element_rect(colour = "black", fill = "white"), text = element_text(colour = "black"), line = element_line(colour = "gray70"), # 13 pt plot.title = element_text(size = rel(1.3)), legend.title = element_text(size = rel(1)), legend.text = element_text(size = rel(1)), axis.title = element_text(size = rel(1)), axis.line = element_blank(), panel.border = element_rect(fill = NA, colour = "gray70"), panel.grid.minor = element_blank(), panel.grid.major.x = element_blank(), legend.position = "right", legend.direction = "vertical", legend.background = element_rect(colour = NA), legend.key = element_rect(colour = NA))) } #' Calc color palette (discrete) #' #' Color palettes from LibreOffice Calc. #' This palette has 12 values. #' #' @family colour calc #' @export #' @example inst/examples/ex-calc_pal.R calc_pal <- function() { values <- unname(ggthemes::ggthemes_data$calc$colors[["value"]]) max_n <- length(values) f <- manual_pal(values) attr(f, "max_n") <- max_n f } #' LibreOffice Calc color scales #' #' Color scales from LibreOffice Calc. #' #' @inheritParams ggplot2::scale_colour_hue #' @family colour calc #' @rdname scale_calc #' @export #' @seealso See \code{\link{theme_calc}()} for examples. scale_fill_calc <- function(...) { discrete_scale("fill", "calc", calc_pal(), ...) } #' @export #' @rdname scale_calc scale_colour_calc <- function(...) { discrete_scale("colour", "calc", calc_pal(), ...) } #' @export #' @rdname scale_calc scale_color_calc <- scale_colour_calc #' Calc shape palette (discrete) #' #' Shape palette based on the shapes used in LibreOffice Calc. #' #' @export #' @family shapes calc #' @example inst/examples/ex-calc_shape_pal.R calc_shape_pal <- function() { values <- ggthemes::ggthemes_data$calc$shapes[["pch"]] f <- manual_pal(unname(values)) attr(f, "max_n") <- length(values) f } #' Calc shape scale #' #' See \code{\link{calc_shape_pal}()} for details. #' #' @inheritParams ggplot2::scale_x_discrete #' @family shapes calc #' @export #' @seealso \code{\link{theme_calc}()} for examples. scale_shape_calc <- function (...) { discrete_scale("shape", "calc", calc_shape_pal(), ...) } # PT_TO_MM <- 0.352778 # # # Default font is Liberation Sans # theme_libre <- function(base_size = 10, # base_family = "sans") { # colorlist <- list(gray = "#B3B3B3") # theme_bw(base_family = base_family, # base_size = base_size) + # theme( # text = element_text(colour = "black"), # line = element_line( # linetype = "solid", # colour = colorlist$gray, # size = 0.5 * PT_TO_MM # ), # rect = element_rect( # fill = "white", # linetype = "solid", # colour = colorlist$gray, # size = 0.5 * PT_TO_MM # ), # panel.grid.major = element_line( # linetype = "solid", # colour = colorlist$gray, # size = 0.5 * PT_TO_MM # ), # axis.title = element_text( # size = 9 # ), # axis.text = element_text( # size = 10 # ), # axis.ticks = element_line( # colour = colorlist$gray # ), # panel.background = element_rect( # colour = colorlist$gray, # size = 0.5 * PT_TO_MM # ), # title = element_text( # face = "plain", # hjust = 0.5 # ), # plot.title = element_text( # size = 13, # hjust = 0.5 # ), # plot.subtitle = element_text( # size = 11, # hjust = 0.5 # ), # panel.grid.major.x = element_blank(), # panel.grid.minor = element_blank(), # legend.position = "right", # strip.background = element_blank(), # strip.text = element_text(size = 9), # legend.title = element_text( # size = 9 # ) # ) # } ggthemes/R/few.R0000644000176200001440000001123614561020226013163 0ustar liggesusers#' Color Palettes Few "Show Me the Numbers" #' #' Qualitative color palettes from Stephen Few (2012) #' \emph{Show Me the Numbers}. There are three palettes: #' Light, Medium, and Dark. Each palette comprises nine colors: #' gray, blue, orange, green, pink, brown, purple, yellow, red. #' For \code{n = 1}, gray is used. For \code{n > 1}, the eight non-gray #' colors are used. #' #' #' Use the light palette for filled areas, such as bar charts. #' Use the medium palette for points and lines. #' Use the dark palette for highlighting specific points #' or for small and thin lines and points. #' #' @references #' Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}. #' 2nd edition. Analytics Press. #' #' \href{https://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf}{"Practical Rules for Using Color in Charts"}. #' #' @export #' @param palette One of \Sexpr[results=rd]{names(ggthemes:::rd_optlist(ggthemes::ggthemes_data$few$colors))} #' @family colour few #' @example inst/examples/ex-few_pal.R few_pal <- function(palette = "Medium") { palette <- ggthemes::ggthemes_data$few$colors[[palette]] if (is.null(palette)) { stop("palette must be one of: ", paste0("\"", names(ggthemes::ggthemes_data$few$colors), "\"", collapse = ", "), call. = FALSE) } ## The first value, gray, is used for non-data parts. values <- palette[["value"]] max_n <- length(values) - 1L f <- function(n) { check_pal_n(n, max_n) if (n == 1L) { values[[1L]] } else { unname(values[2L:(n + 1L)]) } } attr(f, "max_n") <- length(values) - 1L f } #' Color scales from Few's "Practical Rules for Using Color in Charts" #' #' See \code{\link{few_pal}()}. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams few_pal #' @family colour few #' @rdname scale_few #' @export scale_colour_few <- function(palette = "Medium", ...) { discrete_scale("colour", "few", few_pal(palette), ...) } #' @export #' @rdname scale_few scale_color_few <- scale_colour_few #' @export #' @rdname scale_few scale_fill_few <- function(palette = "Light", ...) { discrete_scale("fill", "few", few_pal(palette), ...) } #' Theme based on Few's "Practical Rules for Using Color in Charts" #' #' Theme based on the rules and examples from Stephen Few's #' \emph{Show Me the Numbers} and "Practical Rules for Using Color in Charts". #' #' @references #' Few, S. (2012) \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}. #' 2nd edition. Analytics Press. #' #' Stephen Few, "Practical Rules for Using Color in Charts", #' \url{https://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf}. #' #' @inheritParams ggplot2::theme_bw #' @family themes few #' @export #' @example inst/examples/ex-theme_few.R theme_few <- function(base_size = 12, base_family="") { gray <- "#4D4D4D" black <- "#000000" theme_bw(base_size = base_size, base_family = base_family) + theme( line = element_line(colour = gray), rect = element_rect(fill = "white", colour = NA), text = element_text(colour = black), axis.ticks = element_line(colour = gray), legend.key = element_rect(colour = NA), ## Examples do not use grid lines panel.border = element_rect(colour = gray), panel.grid = element_blank(), strip.background = element_rect(fill = "white", colour = NA) ) } #' Shape palette from "Show Me the Numbers" (discrete) #' #' Shape palette from Stephen Few's, "Show Me the Numbers". #' The shape palette consists of five shapes: circle, square, triangle, plus, #' times. #' #' @references Few, S. (2012) #' \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}, #' Analytics Press, p. 208. #' #' @export few_shape_pal <- function() { shapes <- ggthemes::ggthemes_data[["few"]][["shapes"]] max_n <- nrow(shapes) f <- function(n) { check_pal_n(n, max_n) shapes[["pch"]][seq_len(n)] } attr(f, "max_n") <- max_n f } #' Scales for shapes from "Show Me the Numbers" #' #' \code{scale_shape_few()} maps discrete variables to up to five easily #' discernible shapes. It is based on the shape palette suggested in #' Few (2012). #' #' @param ... Common \code{\link[ggplot2]{discrete_scale}()} parameters. #' @references Few, S. (2012) #' \emph{Show Me the Numbers: Designing Tables and Graphs to Enlighten}, #' Analytics Press, p. 208. #' @seealso \code{\link{scale_shape_few}()} for the shape palette that this #' scale uses. #' @export scale_shape_few <- function(...) { discrete_scale("shape", "few", few_shape_pal(), ...) } ggthemes/R/utils.R0000644000176200001440000000175414561020226013546 0ustar liggesusers#' Magic Number: Points to Millimeters #' @noRd PT_TO_MM <- 0.352778 charopts <- function(x) { paste(sprintf("\\code{\"%s\"}", x), collapse = ", ") } # copied from ggplot2 "%||%" <- function(a, b) { if (!is.null(a)) a else b } # copied from ggplot2 ggname <- function(prefix, grob) { grob$name <- grid::grobName(grob, prefix) grob } rd_optlist <- function(x) { paste0("\\code{\"", as.character(x), "\"}", collapse = ", ") } check_pal_n <- function(n, max_n) { if (n > max_n) { warning("This palette can handle a maximum of ", max_n, " values.", "You have supplied ", n, ".") } else if (n < 0) { stop("`n` must be a non-negative integer.") } } #' Extract colors from ggthemes data #' #' @param path A character vector of the path in \code{ggthemes_data}. #' @param colors A character vector of color names. #' @noRd get_colors <- function(path, colors) { x <- dplyr::filter(ggthemes::ggthemes_data[[path]], .data$name %in% colors) x <- unname(x[["value"]]) } ggthemes/R/geom-tufteboxplot.R0000644000176200001440000002140014561061663016072 0ustar liggesusers#' Tufte's Box Plot #' #' Edward Tufte's revisions of the box plot as described in #' \emph{The Visual Display of Quantitative Information}. #' This functions provides several box plot variants: #' \itemize{ #' \item{A point indicating the median, a gap indicating the #' interquartile range, and lines for whiskers.} #' \item{An offset line indicating the interquartile range #' and a gap indicating the median.} #' \item{A line indicating the interquartile range, #' a gap indicating the median, and points indicating #' the minimum and maximum values} #' \item{A wide line indicating the interquartile range, #' a gap indicating the median, and lines indicating the minimum and #' maximum.} #' } #' #' @section Aesthetics: #' \itemize{ #' \item x [required] #' \item y [required] #' \item colour #' \item size #' \item linetype #' \item shape #' \item fill #' \item alpha #' } #' #' @references Tufte, Edward R. (2001) The Visual Display of #' Quantitative Information, Chapter 6. #' #' McGill, R., Tukey, J. W. and Larsen, W. A. (1978) Variations of #' box plots. The American Statistician 32, 12-16. #' #' @seealso \code{\link{geom_boxplot}()} #' @inheritParams ggplot2::geom_point #' @param outlier.colour colour for outlying points #' @param outlier.shape shape of outlying points #' @param outlier.size size of outlying points #' @param outlier.stroke stroke for outlying points #' @param median.type If \code{'point'}, then the median is represented by a #' point, and the interquartile range by a gap in the line. If #' \code{median.type='line'}, then the interquartile range is represented by #' a line, possibly offset, and the median by a gap in the line. #' @param whisker.type If \code{'line'}, then whiskers are represented by lines. #' If \code{'point'}, then whiskers are represented by points at #' \code{ymin} and \code{ymax}. #' @param voffset controls the size of the gap in the line representing the #' median when \code{median.type = 'line'}. This is a fraction of the range #' of \code{y}. #' @param hoffset controls how much the interquartile line is offset from the #' whiskers when \code{median.type = 'line'}. This is a fraction of the #' range of \code{x}. #' @param stat The statistical transformation to use on the data for this #' layer, as a string. The default (\code{stat = 'fivenumber'}) calls #' \code{\link{stat_fivenumber}} and produces whiskers that extend #' from the interquartile range to the extremes of the data; specifying #' \code{\link{stat_boxplot}} will produce a more traditional boxplot #' with whiskers extending to the most extreme points that are < 1.5 IQR #' away from the hinges (i.e., the first and third quartiles). #' @family geom tufte #' @export #' #' @example inst/examples/ex-geom_tufteboxplot.R geom_tufteboxplot <- function(mapping = NULL, data = NULL, stat = "fivenumber", position = "dodge", outlier.colour = "black", outlier.shape = 19, outlier.size = 1.5, outlier.stroke = 0.5, voffset = 0.01, hoffset = 0.005, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, median.type = "point", whisker.type = "line", ...) { layer( data = data, mapping = mapping, stat = stat, geom = GeomTufteboxplot, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( outlier.colour = outlier.colour, outlier.shape = outlier.shape, outlier.size = outlier.size, outlier.stroke = outlier.stroke, voffset = voffset, hoffset = hoffset, median.type = median.type, whisker.type = whisker.type, na.rm = na.rm, ... ) ) } #' @rdname geom_tufteboxplot #' @usage NULL #' @format NULL #' @export #' @importFrom ggplot2 draw_key_pointrange ggproto_parent GeomBoxplot GeomSegment GeomPoint #' @importFrom scales alpha #' @importFrom grid grobTree GeomTufteboxplot <- ggplot2::ggproto("GeomTufteboxplot", ggplot2::GeomBoxplot, setup_data = function(self, data, params) { data <- ggproto_parent(GeomBoxplot, self)$setup_data(data, params) x_range <- diff(range(data$x)) y_range <- max(data$ymax) - min(data$ymin) data$hoffset <- params$hoffset * x_range data$voffset <- params$voffset * y_range data }, draw_group = function(data, panel_scales, coord, fatten = 2, outlier.colour = "black", outlier.shape = 19, outlier.size = 1.5, outlier.stroke = 0.5, varwidth = FALSE, median.type = c("point", "line"), whisker.type = c("line", "point"), hoffset = 0.01, voffset = 0.01 ) { median.type <- match.arg(median.type) whisker.type <- match.arg(whisker.type) common <- data.frame( colour = data$colour, linetype = data$linetype, fill = alpha(data$fill, data$alpha), stroke = data$stroke, shape = data$shape, group = data$group, stringsAsFactors = FALSE ) if (whisker.type == "line") { whiskers <- data.frame( x = data$x, xend = data$x, y = c(data$upper, data$lower), yend = c(data$ymax, data$ymin), size = data$size, alpha = data$alpha, common, stringsAsFactors = FALSE ) whiskers_grob <- GeomSegment$draw_panel(whiskers, panel_scales, coord) } else if (whisker.type == "point") { whiskers <- data.frame( x = data$x, y = c(data$ymin, data$ymax), size = data$size, alpha = data$alpha, common, stringsAsFactors = FALSE ) whiskers_grob <- GeomPoint$draw_panel(whiskers, panel_scales, coord) } if (median.type == "point") { middata <- data.frame( x = data$x, y = data$middle, size = data$size * data$width, alpha = data$alpha, common, stringsAsFactors = FALSE ) middle_grob <- GeomPoint$draw_panel(middata, panel_scales, coord) } else if (median.type == "line") { middata <- data.frame( y = c(data$upper, data$middle) + c(0, - data$voffset / 2), yend = c(data$middle, data$lower) + c(data$voffset / 2, 0), x = data$x + data$hoffset, xend = data$x + data$hoffset, size = data$size * data$width, alpha = data$alpha, common, stringsAsFactors = FALSE ) middle_grob <- GeomSegment$draw_panel(middata, panel_scales, coord) } if (!is.null(data$outliers) && length(data$outliers[[1]] >= 1)) { outliers <- data.frame( y = data$outliers[[1]], x = data$x[1], colour = outlier.colour, shape = outlier.shape, size = outlier.size, stroke = outlier.stroke, fill = NA, alpha = NA, stringsAsFactors = FALSE ) outliers_grob <- GeomPoint$draw_panel(outliers, panel_scales, coord) } else { outliers_grob <- NULL } ggname("geom_tufteboxplot", grobTree( outliers_grob, whiskers_grob, middle_grob )) }, draw_legend = ggplot2::draw_key_pointrange, default_aes = ggplot2::aes(weight = 1, colour = "black", fill = "grey20", size = 0.5, alpha = NA, shape = 19, stroke = 0.5, width = 1, linetype = "solid", outlier.colour = "black", outlier.shape = 19, outlier.size = 1.5, outlier.stroke = 0.5) ) ggthemes/R/stata.R0000644000176200001440000003214714561250635013533 0ustar liggesusers#' Stata color palettes (discrete) #' #' Stata color palettes. See Stata documentation for a description of #' the schemes, \url{https://www.stata.com/help.cgi?schemes}. #' #' All these palettes support up to 15 values. #' #' @param scheme \code{character}. One of \code{"s2color"}, #' \code{"s1rcolor"}, \code{"s1color"}, or \code{"mono"}. #' #' @export #' @family stata colour #' @example inst/examples/ex-stata_pal.R stata_pal <- function(scheme="s2color") { colors <- ggthemes::ggthemes_data[["stata"]][["colors"]][["schemes"]][[scheme]] max_n <- length(colors) f <- manual_pal(colors[["value"]]) attr(f, "max_n") <- max_n f } #' Stata color scales #' #' See \code{\link{stata_pal}()} for details. #' #' @inheritParams stata_pal #' @inheritParams ggplot2::scale_colour_hue #' @family colour stata #' @rdname scale_stata #' @export scale_colour_stata <- function(scheme="s2color", ...) { discrete_scale("colour", "stata", stata_pal(scheme), ...) } #' @export #' @rdname scale_stata scale_fill_stata <- function(scheme="s2color", ...) { discrete_scale("fill", "stata", stata_pal(scheme), ...) } #' @export #' @rdname scale_stata scale_color_stata <- scale_colour_stata #' @importFrom ggplot2 margin theme_stata_base <- function(base_size = 11, base_family = "sans") { ## Sizes relsz <- sapply(as.numeric(stata_gsize), `/`, y = as.numeric(stata_gsize$medium)) names(relsz) <- names(stata_gsize) theme_foundation() + theme(line = element_line(linewidth = 0.5, linetype = 1, lineend = "butt", colour = "black"), rect = element_rect(linewidth = 0.5, linetype = 1, fill = "white", colour = "black"), text = element_text(family = base_family, face = "plain", colour = "black", size = base_size, hjust = 0.5, vjust = 1, angle = 0, lineheight = 1, margin = margin(), debug = FALSE), title = element_text(), ## Axis axis.line = element_line(), axis.text = element_text(size = rel(relsz["medsmall"])), axis.text.x = element_text(vjust = 1), axis.text.y = element_text(angle = 90, vjust = 0.5), ## I cannot figure out how to get ggplot to do 2 levels of ticks axis.ticks = element_line(), axis.title = element_text(size = rel(relsz["medsmall"])), axis.title.x = element_text(), axis.title.y = element_text(angle = 90, vjust = 0), # axis.ticks.length = stata_gsize$tiny, # axis.ticks.margin = stata_gsize$half_tiny, axis.ticks.length = unit(4 / 11, "lines"), legend.background = element_rect(linetype = 1, linewidth = rel(stata_linewidths[["thin"]])), legend.spacing = unit(1.2 / 100, "npc"), legend.key = element_rect(linetype = 0), legend.key.size = unit(1.2, "lines"), legend.key.height = NULL, legend.key.width = NULL, legend.text = element_text(size = rel(relsz["medsmall"])), legend.text.align = NULL, ## See textboxstyle leg_title legend.title = element_text(size = rel(relsz["large"]), hjust = 0.5), legend.position = "bottom", legend.direction = NULL, legend.justification = "center", legend.box = "vertical", ## plotregion panel.background = element_rect(), panel.border = element_blank(), panel.grid.major = element_line(), panel.grid.minor = element_blank(), panel.grid.major.x = element_blank(), panel.spacing = unit(0.25, "lines"), ## textboxstyle bytitle bytitle strip.background = element_rect(linetype = 0), strip.text = element_text(size = rel(relsz["medlarge"])), strip.text.x = element_text(vjust = 0.5), strip.text.y = element_text(angle = -90), plot.background = element_rect(linetype = 0, colour = NA), # Stata subtitle plot.title = element_text(size = rel(relsz["large"]), hjust = 0.5, vjust = 1), # Stata subtitle plot.subtitle = element_text(size = rel(relsz["medium"]), hjust = 0.5, vjust = 1), # Stata note plot.caption = element_text(size = rel(relsz["small"]), hjust = 0, vjust = 0), plot.margin = unit(rep(0.035, 4), "npc")) } #' @importFrom tibble deframe #' @importFrom stringr str_c theme_stata_colors <- function(scheme="s2color") { stata_colors <- ggthemes::ggthemes_data[["stata"]][["colors"]][["names"]] stata_colors <- deframe(stata_colors[, c("name", "value")]) schemes <- c("s2color", "s2mono", "s2manual", "sj", "s1color", "s1rcolor", "s1mono", "s1manual") if (scheme == "s2color") { color_plot <- stata_colors["ltbluishgray"] color_bg <- "white" color_fg <- "black" color_grid <- stata_colors["ltbluishgray"] #color_grid_major <- stata_colors["ltbluishgray"] fill_strip <- stata_colors["bluishgray"] color_strip <- NA color_title <- stata_colors["dknavy"] color_border <- NA legend_border <- "black" } else if (scheme %in% c("s2mono", "s2manual", "sj")) { color_plot <- stata_colors["gs15"] color_bg <- "white" color_fg <- "black" color_grid <- stata_colors["dimgray"] #color_grid_major <- stata_colors["dimgray"] fill_strip <- stata_colors["gs13"] color_strip <- NA color_title <- "black" color_border <- NA legend_border <- "black" } else if (scheme == "s1color") { color_plot <- "white" color_bg <- "white" color_fg <- "black" color_grid <- stata_colors["gs14"] fill_strip <- stata_colors["ltkhaki"] color_strip <- "black" color_title <- "black" color_border <- "black" legend_border <- "black" } else if (scheme == "s1rcolor") { color_plot <- "black" color_bg <- "black" color_fg <- "white" color_grid <- stata_colors["gs5"] fill_strip <- stata_colors["maroon"] color_strip <- "white" color_title <- "white" color_border <- "white" legend_border <- "black" } else if (scheme %in% c("s1mono", "s1manual")) { color_plot <- "white" color_bg <- "white" color_fg <- "black" color_grid <- stata_colors["gs14"] fill_strip <- stata_colors["gs13"] color_strip <- "black" color_title <- "black" color_border <- "black" legend_border <- "black" } else { stop(str_c("`scheme` must be one of: ", str_c(sort(schemes), collapse = ","), ", ")) } theme(line = element_line(colour = color_fg, linetype = 1), rect = element_rect(fill = color_bg, colour = color_fg, linetype = 1), text = element_text(colour = color_fg), title = element_text(colour = color_title), axis.title = element_text(colour = color_fg), axis.ticks.x = element_line(colour = color_fg), axis.ticks.y = element_line(colour = color_fg), axis.text.x = element_text(colour = color_fg), axis.text.y = element_text(colour = color_fg), legend.key = element_rect(fill = color_bg, colour = NA, linetype = 0), legend.background = element_rect(linetype = 1, colour = legend_border), panel.background = element_rect(fill = color_bg, colour = color_border, linetype = 1), panel.grid.major = element_line(colour = color_grid), strip.background = element_rect(fill = fill_strip, colour = color_strip, linetype = 1), plot.background = element_rect(fill = color_plot)) } #' Themes based on Stata graph schemes #' #' @param scheme One of "s2color", "s2mono", "s1color", #' "s1rcolor", or "s1mono", "s2manual", #' "s1manual", or "sj" #' @inheritParams ggplot2::theme_grey #' @export #' @family themes stata #' #' @details These themes approximate Stata schemes using the features #' \pkg{ggplot2}. The graphical models of Stata and ggplot2 differ #' in various ways that make an exact replication impossible (or #' more difficult than it is worth). #' Some features in Stata schemes not in ggplot2: #' defaults for specific graph types, different levels of titles, #' captions and notes. These themes also adopt some of the ggplot2 #' defaults, and more effort was made to match the colors and sizes #' of major elements than in matching the margins. #' #' @references \url{https://www.stata.com/help.cgi?schemes} #' #' @example inst/examples/ex-theme_stata.R theme_stata <- function(base_size = 11, base_family = "sans", scheme="s2color") { ## Sizes (theme_stata_base(base_size = eval(base_size), base_family = base_family) + theme_stata_colors(scheme = scheme)) } #' Stata shape palette (discrete) #' #' Shape palette based on the symbol palette in Stata used in scheme s2mono. #' This palette supports up to 10 values. #' #' @export #' @family shapes stata #' @seealso See \code{\link{scale_shape_stata}()} for examples. #' @importFrom purrr map_dfr map #' @importFrom tibble as_tibble #' @importFrom stringr str_replace stata_shape_pal <- function() { ## From s1mono, ignore small shapes shapes <- c("circle", "diamond", "square", "triangle", "X", "plus", "circle_hollow", "diamond_hollow", "square_hollow", "triangle_hollow") statadata <- ggthemes::ggthemes_data[["stata"]][["shapes"]] shapenames <- tibble::deframe(statadata[, c("symbolstyle", "unicode_value")]) values <- as.hexmode(str_replace(shapenames[shapes], "U\\+", "")) values <- -as.integer(values) out <- manual_pal(values) attr(out, "max_n") <- length(shapes) out } #' Stata shape scale #' #' See \code{\link{stata_shape_pal}()} for details. #' #' @inheritParams ggplot2::scale_x_discrete #' @family shape stata #' @export #' @example inst/examples/ex-scale_shape_stata.R #' @importFrom ggplot2 discrete_scale scale_shape_stata <- function(...) { discrete_scale("shape", "stata", stata_shape_pal(), ...) } #' Stata linetype palette (discrete) #' #' Linetype palette based on the linepattern scheme in Stata. #' This palette supports up to 15 values. #' #' @family linetype stata #' @export #' @seealso \code{\link{scale_linetype_stata}()} stata_linetype_pal <- function() { values <- ggthemes::ggthemes_data[["stata"]][["linetypes"]] f <- function(n) { values[seq_len(n)] } attr(f, "max_n") <- length(values) f } #' Stata linetype palette (discrete) #' #' See \code{\link{stata_linetype_pal}()} for details. #' #' @inheritParams ggplot2::scale_x_discrete #' @family linetype stata #' @export #' @example inst/examples/ex-scale_linetype_stata.R scale_linetype_stata <- function(...) { discrete_scale("linetype", "stata", stata_linetype_pal(), ...) } ## Text sizes (from style definitions ado/base/style/gsize-*.style) stata_gsize <- lapply(c(default = 4.1667, full = 100, half = 50, half_tiny = 0.6944, huge = 6.944, large = 4.8611, medium = 3.8194, medlarge = 4.1667, medsmall = 3.4722, miniscule = 0.3472, quarter = 25, quarter_tiny = 0.34722, small = 2.777, tenth = 10, third = 33.33333333333, third_tiny = 0.46296, tiny = 1.3888, vhuge = 9.7222, vlarge = 5.5556, vsmall = 2.0833, zero = 0) / 100, unit, units = "npc") # Line width styles ado/base/style/linewidth-*.style # original values in npc * 100 # provide this in terms of relative values to medium stata_linewidths <- c(medium = 0.3, medthick = 0.45, medthin = 0.25, none = 0, thick = 0.8, thin = 0.2, vthick = 1.4, thin = 0.15, vvthick = 2.6, vvthin = 0.01, vvvthick = 4.2, vvvthin = .000001) / 0.3 # Stata margin styles # From ado/base/style/margin-*.style stata_margins <- list(bargraph = c(3.5, 3.5, 3.5, 0), bottom = c(0, 0, 0, 3), ebargraph = c(1.5, 1.5, 1.5, 0), esubhead = c(2.2, 2.2, 0, 4), horiz_bargraph = c(0, 3.5, 3.5, 3.5), large = c(8, 8, 8, 8), left = c(3, 0, 0, 0), medium = c(3.5, 3.5, 3.5, 3.5), medlarge = c(5, 5, 5, 5), medsmall = c(2.2, 2.2, 2.2, 2.2), right = c(0, 3, 0, 0), sides = c(3.5, 3.5, 0, 0), small = rep(1.2, 4), tiny = rep(0.3, 4), top_bottom = c(0, 0, 3.5, 3.5), top = c(0, 0, 3, 0), vlarge = rep(12, 4), vsmall = rep(0.6, 4), zero = rep(0, 4)) # s1mono line # linepattern p1line solid # linepattern p2line dash # linepattern p3line vshortdash # linepattern p4line longdash_dot # linepattern p5line longdash # linepattern p6line dash_dot # linepattern p7line dot # linepattern p8line shortdash_dot # linepattern p9line tight_dot # linepattern p10line dash_dot_dot # linepattern p11line longdash_shortdash # linepattern p12line dash_3dot # linepattern p13line longdash_dot_dot # linepattern p14line shortdash_dot_dot # linepattern p15line longdash_3dot ggthemes/R/clean.R0000644000176200001440000000473114561020226013466 0ustar liggesusers#' @title Clean ggplot theme #' #' @description Clean ggplot theme with no panel background, black axis lines #' and grey fill colour for chart elements. #' #' @author Konrad Zdeb \email{name.surname@@me.com} #' #' @param base_size Base font size. #' @param base_family Base font family. #' #' @family themes #' @export #' #' @example inst/examples/ex-theme_clean.R theme_clean <- function(base_size = 12, base_family = "sans") { ( theme_foundation(base_size = base_size, base_family = base_family) + theme( axis.line.x = element_line( colour = "black", size = 0.5, linetype = "solid" ), axis.line.y = element_line( colour = "black", size = 0.5, linetype = "solid" ), axis.text = element_text(size = ceiling(base_size * 0.7), colour = "black"), axis.title = element_text(size = ceiling(base_size * 0.8)), panel.grid.minor = element_blank(), panel.grid.major.y = element_line(colour = "gray", linetype = "dotted"), panel.grid.major.x = element_blank(), panel.background = element_blank(), panel.border = element_blank(), strip.background = element_rect(linetype = 0), strip.text = element_text(), strip.text.x = element_text(vjust = 0.5), strip.text.y = element_text(angle = -90), legend.text = element_text(size = ceiling(base_size * 0.9), family = "sans"), legend.title = element_text( size = base_size, face = "bold", family = "sans" ), legend.position = "right", legend.key = element_rect(fill = "white", colour = NA), legend.background = element_rect(colour = "black"), plot.background = element_rect(colour = "black"), plot.title = element_text(size = ceiling(base_size * 1.1), face = "bold"), plot.subtitle = element_text(size = ceiling(base_size * 1.05)) ) ) } ggthemes/R/igray.R0000644000176200001440000000231014561020226013506 0ustar liggesusers#' Inverse gray theme #' #' Theme with white panel and gray background. #' #' @section Details: #' #' This theme inverts the colors in the \code{\link[ggplot2]{theme_gray}()}, a #' white panel and a light gray area around it. This keeps a white #' background for the color scales like \code{\link[ggplot2]{theme_bw}()}. But #' by using a gray background, the plot is closer to the #' typographical color of the document, which is the motivation for #' using a gray panel in \code{\link[ggplot2]{theme_gray}()}. This is #' similar to the style of plots in Stata and Tableau. #' #' @inheritParams ggplot2::theme_grey #' @export #' @family themes #' @seealso \code{\link[ggplot2]{theme_gray}()}, #' \code{\link[ggplot2]{theme_bw}()} #' @example inst/examples/ex-theme_igray.R #' @importFrom ggplot2 theme_gray theme_igray <- function(base_size = 12, base_family = "") { (theme_gray(base_size = base_size, base_family = base_family) + theme(rect = element_rect(fill = "gray90"), legend.key = element_rect(fill = "white"), panel.background = element_rect(fill = "white"), panel.grid.major = element_line(colour = "gray90"), plot.background = element_rect(fill = "gray90"))) } ggthemes/R/geom-rangeframe.R0000644000176200001440000000676114561020226015445 0ustar liggesusers#' Range Frames #' #' Axis lines which extend to the maximum and minimum of the plotted data. #' #' @section Aesthetics: #' \itemize{ #' \item colour #' \item size #' \item linetype #' \item alpha #' } #' #' @inheritParams ggplot2::geom_point #' @param sides A string that controls which sides of the plot the frames appear on. #' It can be set to a string containing any of \code{'trbl'}, for top, right, #' bottom, and left. #' @export #' #' @details This should be used with `coord_cartesian(clip="off")` in order to #' correctly draw the lines. #' #' @references Tufte, Edward R. (2001) The Visual Display of #' Quantitative Information, Chapter 6. #' #' @family geom tufte #' @importFrom ggplot2 layer #' @example inst/examples/ex-geom_rangeframe.R geom_rangeframe <- function(mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., sides = "bl", na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) { layer( data = data, mapping = mapping, stat = stat, geom = GeomRangeFrame, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( sides = sides, na.rm = na.rm, ... ) ) } #' @rdname geom_rangeframe #' @usage NULL #' @format NULL #' @export #' @importFrom ggplot2 Geom #' @importFrom scales alpha GeomRangeFrame <- ggplot2::ggproto("GeomRangeFrame", ggplot2::Geom, optional_aes = c("x", "y"), draw_panel = function(data, panel_scales, coord, sides = "bl") { rugs <- list() data <- coord[["transform"]](data, panel_scales) gp <- gpar(col = alpha(data[["colour"]], data[["alpha"]]), lty = data[["linetype"]], lwd = data[["size"]] * ggplot2::.pt) if (!is.null(data[["x"]])) { if (grepl("b", sides)) { rugs[["x_b"]] <- ggname("range_x_b", segmentsGrob(x0 = unit(min(data[["x"]]), "native"), x1 = unit(max(data[["x"]]), "native"), y0 = unit(0, "npc"), y1 = unit(0, "npc"), gp = gp)) } if (grepl("t", sides)) { rugs[["x_t"]] <- ggname("range_x_t", segmentsGrob(x0 = unit(min(data[["x"]]), "native"), x1 = unit(max(data[["x"]]), "native"), y0 = unit(1, "npc"), y1 = unit(1, "npc"), gp = gp)) } } if (!is.null(data[["y"]])) { if (grepl("l", sides)) { rugs[["y_l"]] <- ggname("range_y_l", segmentsGrob(y0 = unit(min(data[["y"]]), "native"), y1 = unit(max(data[["y"]]), "native"), x0 = unit(0, "npc"), x1 = unit(0, "npc"), gp = gp)) } if (grepl("r", sides)) { rugs[["y_r"]] <- ggname("range_y_r", segmentsGrob(y0 = unit(min(data[["y"]]), "native"), y1 = unit(max(data[["y"]]), "native"), x0 = unit(1, "npc"), x1 = unit(1, "npc"), gp = gp)) } } ggname("geom_rangeframe", gTree(children = do.call("gList", rugs))) }, default_aes = ggplot2::aes(colour = "black", size = 0.5, linetype = 1, alpha = NA), draw_key = ggplot2::draw_key_path ) ggthemes/R/theme-map.R0000644000176200001440000000150014561020226014250 0ustar liggesusers#' Clean theme for maps #' #' A clean theme that is good for displaying maps from #' \code{\link[ggplot2]{geom_map}()}. #' #' @inheritParams ggplot2::theme_grey #' @example inst/examples/ex-theme_map.R #' @export #' @importFrom ggplot2 %+replace% theme_map <- function(base_size = 9, base_family = "") { theme_bw(base_size = base_size, base_family = base_family) %+replace% theme(axis.line = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), axis.title = element_blank(), panel.background = element_blank(), panel.border = element_blank(), panel.grid = element_blank(), panel.spacing = unit(0, "lines"), plot.background = element_blank(), legend.justification = c(0, 0), legend.position = c(0, 0)) } ggthemes/R/base.R0000644000176200001440000003133014561051016013312 0ustar liggesusers#' Theme Base #' #' Theme similar to the default settings of the \sQuote{base} R graphics. #' #' @inheritParams ggplot2::theme_bw #' @export #' @family themes #' @example inst/examples/ex-theme_base.R theme_base <- function(base_size = 16, base_family = "") { theme_foundation() + theme(line = element_line(colour = "black", lineend = "round", linetype = "solid"), rect = element_rect(fill = "white", colour = "black", linetype = "solid"), text = element_text(colour = "black", face = "plain", family = base_family, size = base_size, vjust = 0.5, hjust = 0.5, lineheight = 1), panel.grid = element_blank(), strip.background = element_rect(colour = NA), legend.key = element_rect(colour = NA), title = element_text(size = rel(1)), plot.title = element_text(size = rel(1.2), face = "bold"), strip.text = element_text(), axis.ticks.length = unit(0.5, "lines") ) # TODO: get margins right } # Notes for generating a theme that uses par() for its values. # # $xlog # [1] TRUE # # $ylog # [1] TRUE # # Justification of strings in text, mtext, and title # # text = element_text(vjust = par()$adj, hjust = par$adj()) # $adj # [1] 0.5 # # $ann # [1] TRUE # # $ask # [1] FALSE # # Background. rect = element_rect(fill = par()$bg) # $bg # [1] "white" # # # Type of box drawn around the plot # # Which sides of the box to draw # $bty # [1] "o" # # # magnification of text and symbols relative to the default. ggplot uses base_size instead. # $cex # [1] 1 # # # mag of axis relative to current setting of cex # # axis.text = element_text(size = rel(par()$cex.axis)) # $cex.axis # [1] 1 # # mag of axis relative to current setting of cex # # axis.title = element_text(size = rel(par()$cex.lab)) # $cex.lab # [1] 1 # # # magnification of plot title relative to cex # # plot.title = element_text(size = rel(par()$cex.main)) # $cex.main # [1] 1.2 # # # ggplot does not have subtitles # # magnification of subtitle relative to cex # # strip.title = element_text(size = rel(par()$cex.sub)) # $cex.sub # [1] 1 # # $cin # # character size in inches # [1] 0.2000000 0.2666667 # # # default plotting color - not part of theme in gggplot # $col # [1] "black" # # # color for axis annotation # # # $col.axis # [1] "black" # # color for x and y labels # # axis.text = element_text(colour = par()$col.axis) # # # color for x and y labels # # axis.title = element_text(colour = par()$col.lab) # $col.lab # [1] "black" # # # color for main titles # # plot.title = element_text(colour = par()$col.main) # $col.main # [1] "black" # # # color for subtitles # # strip.title = element_text(colour = par()$col.sub) # $col.sub # [1] "black" # # # size of default character # $cra # [1] 14.4 19.2 # # # numerical values for how single characters rotated. Nothing similar in ggplot # $crt # [1] 0 # # # size of default characters in inches # # Is this base size? # $csi # [1] 0.2666667 # # # size of default character in user coord # # not relevant # $cxy # [1] 0.1859782 0.3665854 # # # device dimensions. not relevant # $din # [1] 11.236111 8.847222 # # # error reporting. not relevant # $err # [1] 0 # # # default font family # # base_family = par()$family # $family # [1] "" # # # color of foreground in plots. Used in axes and boxes around plots. # line = element_line(colour = par()$fg) # rect = element_rect(colour = par()$fg) # text = = element_text(colour = par()$fg) # $fg # [1] "black" # # # gives NDC coordinates of figure region in display device # $fig # [1] 0 1 0 1 # # # figure region dimensions in inches # # TODO: use for aspect ratio? # $fin # [1] 11.236111 8.847222 # # # which font to use for text. # # 1 = "plain" # # 2 = "bold" # # 3 = "italic" # # 4 = "bold.italic" # text = element_text(face = c("plain", "bold", "italic", "bold.italic")[par()$font]) # $font # [1] 1 # # # font to use for axis # axis.text = element_text(face = c("plain", "bold", "italic", "bold.italic")[par()$font]) # $font.axis # [1] 1 # # axis.title = element_text(face = c("plain", "bold", "italic", "bold.italic")[par()$font]) # $font.lab # [1] 1 # # axis.title = element_text(face = c("plain", "bold", "italic", "bold.italic")[par()$font]) # $font.main # [1] 2 # # strip.title = element_text(face = c("plain", "bold", "italic", "bold.italic")[par()$font]) # $font.sub # [1] 1 # # # default number of tick-marks in x and y, and label lenghth. # Not sure how that can be used # $lab # [1] 5 5 7 # # # style of axis labels. # # TODO: code that sets axis.text.x and axis.text.y angle according to its values. # $las # [1] 0 # # # line end style # line = element_line(lineend = par()$lend) # $lend # [1] "round" # # # line height # text = element_text(lineheight = par()$lheight * par()$??) # $lheight # [1] 1 # # # Line join style # # not sure how this is used in ggplot # $ljoin # [1] "round" # # # line mitre imit. Not used in ggplot2. # $lmitre # [1] 10 # # # Line type # # line = element_line(linetype = par()$lty) # $lty # [1] "solid" # # # Line width? # # Does this set size? ?? # # Maybe: line = element_line(size = par()$lwd) # $lwd # [1] 1 # # # margin size in inches # plot.margin = par()$mai # $mai # [1] 1.360000 1.093333 1.093333 0.560000 # # # Number of lines of margin. How is this different than mai? # $mar # [1] 5.1 4.1 4.1 2.1 # # $mex # [1] 1 # # # changes layout. ggplot uses facets. # $mfcol # [1] 1 1 # # # used for layout # $mfg # [1] 1 1 1 1 # # # changes layout. ggplot uses facets. # $mfrow # [1] 1 1 # # # margine line in mex units for axis title, axis labels, and axis.line # $mgp # [1] 3 1 0 # # # ignored in R # $mkh # [1] 0.001 # # # irrelevant to ggplot # $new # [1] FALSE # # # size of outer margins in lines of text # # TODO: what is this in ggplot # $oma # [1] 0 0 0 0 # # # regions inside out margins in NDC # # TODO: ? # $omd # [1] 0 1 0 1 # # # size of outer margins in inches # # TODO??? # $omi # [1] 0 0 0 0 # # # irrelevant # $page # [1] TRUE # # # dfault plotting symbol. not in themes. # $pch # [1] 1 # # # Plot dimensions in inches. # $pin # [1] 9.582778 6.393889 # # # Plot region as fractions of current figure region. # $plt # [1] 0.09730532 0.95016069 0.15372057 0.87642072 # # # point size of text (not symbols) # base_size = par()$ps # $ps # [1] 16 # # # type of region to be drawn. s = square. m = maximal. # # not sure how this maps to ggplot # $pty # [1] "m" # # # not used # $smo # [1] 1 # # # string rotation in degrees # # this is for text() plots not titles and labels # $srt # [1] 0 # # # length of tick marks # # use this to set axis.ticks.length # $tck # [1] NA # # # length of tick marks # $tcl # [1] -0.5 # # # extremes of user coord of plotting regsion # $usr # [1] -0.0381697 0.9924122 0.2730712 1.0279588 # # # used for generating ticks # $xaxp # [1] 1 10 3 # # # used to generate axis # $xaxs # [1] "r" # # # any values other than "n" implies plotting x axis. # $xaxt # [1] "s" # # $xpd # [1] FALSE # # $yaxp # [1] 2 10 -4 # # $yaxs # [1] "r" # # # any value other than "n" implies plotting y axis. # $yaxt # [1] "s" # # # positioning of text in margins by axis and mtext. # $ylbias # [1] 0.2 # #' Theme Par #' #' Theme which uses the current \sQuote{base} graphics parameter values #' from \code{\link[graphics]{par}()}. #' Not all \code{par()} parameters, are supported, and not all are relevant to #' \pkg{ggplot2} themes. #' #' Currently this theme uses the values of the parameters: #' \code{"code"}, "\code{"ps"}", \code{"code"} \code{"family"}, \code{"fg"}, #' \code{"bg"}, \code{"adj"}, \code{"font"}, \code{"cex.axis"}, #' \code{"cex.lab"}, \code{"cex.main"}, \code{"cex.sub"}, \code{"col.axis"}, #' \code{"col.lab"}, \code{"col.main"}, \code{"col.sub"}, \code{"font"}, #' \code{"font.axis"}, \code{"font.lab"}, \code{"font.main"}, #' \code{"font.sub"}, \code{"las"}, \code{"lend"}, #' \code{"lheight"}, \code{"lty"}, \code{"mar"}, \code{"ps"}, \code{"tcl"}, #' \code{"tck"}, \code{"xaxt"}, \code{"yaxt"}. #' #' This theme does not translate the base graphics perfectly, so the graphs #' produced by it will not be identical to those produced by base graphics, #' most notably in the spacing of the margins. #' #' @inheritParams ggplot2::theme_bw #' @export #' @family themes #' @example inst/examples/ex-theme_par.R theme_par <- function(base_size = par()$ps, base_family = par()$family) { faces <- c("plain", "bold", "italic", "bold.italic") half_line <- base_size / 2 thm <- theme_foundation() %+replace% theme(line = element_line(colour = par()$fg, linewidth = 0.5, lineend = par()$lend, linetype = par()$lty), rect = element_rect(fill = par()$bg, colour = par()$fg, linewidth = 0.5, linetype = par()$lty), text = element_text(colour = par()$fg, face = faces[par()$font], family = base_family, size = base_size, angle = 0, margin = margin(), vjust = par()$adj, hjust = par()$adj, lineheight = par()$lheight, debug = FALSE), axis.title = element_text(size = rel(par()$cex.lab), colour = par()$col.lab, face = faces[par()$font.lab]), axis.text = element_text(size = rel(par()$cex.axis), colour = par()$col.axis, face = faces[par()$font.axis]), axis.text.x = element_text(margin = margin(t = 0.8 * half_line / 2, b = 0.8 * half_line / 2)), axis.text.y = element_text(margin = margin(r = 0.8 * half_line / 2, l = 0.8 * half_line / 2)), axis.ticks = element_line(colour = par()$fg), legend.title = element_text(colour = par()$fg), legend.text = element_text(colour = par()$fg), legend.spacing = unit(0.2, "cm"), legend.key = element_rect(colour = NA), panel.spacing = unit(half_line, "pt"), panel.spacing.x = NULL, panel.spacing.y = NULL, panel.background = element_rect(fill = NA, colour = par()$col), panel.grid = element_blank(), plot.background = element_rect(colour = NA), plot.margin = unit(par()$mar, "lines"), plot.title = element_text(size = rel(par()$cex.main), face = faces[par()$font.main], colour = par()$col.main, margin = margin(b = half_line * 1.2)), strip.text = element_text(size = rel(par()$cex.sub), face = faces[par()$font.sub], colour = par()$col.sub), strip.text.x = element_text(margin = margin(t = half_line, b = half_line)), strip.text.y = element_text(margin = margin(l = half_line, r = half_line)), strip.background = element_rect(colour = NA) ) las <- par()$las if (las == 0) { # parallel to axis thm <- thm + theme(axis.title.x = element_text(angle = 0), axis.title.y = element_text(angle = 90)) } else if (las == 1) { # horizontal thm <- thm + theme(axis.title.x = element_text(angle = 0), axis.title.y = element_text(angle = 0)) } else if (las == 2) { # perpendicular thm <- thm + theme(axis.title.x = element_text(angle = 90), axis.title.y = element_text(angle = 0)) } else if (las == 3) { # vertical thm <- thm + theme(axis.title.x = element_text(angle = 90), axis.title.y = element_text(angle = 90)) } # ticks if (! is.na(par()$tck)) { thm <- thm + theme(axis.ticks.length = unit(- par()$tck, "snpc")) } else { thm <- thm + theme(axis.ticks.length = unit(- par()$tcl, "lines")) } # plot x or y axis if (par()$xaxt == "n") { thm <- thm + theme(axis.line.x = element_blank(), axis.text.x = element_blank(), axis.ticks.x = element_blank()) } if (par()$yaxt == "n") { thm <- thm + theme(axis.line.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank()) } thm # TODO: get margins right } ggthemes/R/ptol.R0000644000176200001440000000256514561020226013365 0ustar liggesusers#' Color Palettes from Paul Tol's "Colour Schemes" #' #' Qualitative color palettes from Paul Tol, #' \href{https://personal.sron.nl/~pault/}{"Colour Schemes"}. #' #' Incorporation of the palette into an R package was originally inspired by #' Peter Carl's [Paul Tol 21 Gun Salute](https://tradeblotter.wordpress.com/2013/02/28/the-paul-tol-21-color-salute/) #' #' @export #' @family colour ptol #' @references #' Paul Tol. 2012. "Colour Schemes." SRON Technical Note, SRON/EPS/TN/09-002. #' \url{https://personal.sron.nl/~pault/data/colourschemes.pdf} #' @example inst/examples/ex-ptol_pal.R ptol_pal <- function() { colors <- ggthemes::ggthemes_data[["ptol"]][["qualitative"]] max_n <- length(colors) f <- function(n) { check_pal_n(n, max_n) colors[[n]] } attr(f, "max_n") <- max_n f } #' Color Scales from Paul Tol's "Colour Schemes #' #' See \code{\link{ptol_pal}()}. These palettes support up to 12 values. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams ptol_pal #' @family colour ptol #' @rdname scale_ptol #' @export #' @example inst/examples/ex-scale_colour_ptol.R scale_colour_ptol <- function(...) { discrete_scale("colour", "ptol", ptol_pal(), ...) } #' @export #' @rdname scale_ptol scale_color_ptol <- scale_colour_ptol #' @export #' @rdname scale_ptol scale_fill_ptol <- function(...) { discrete_scale("fill", "ptol", ptol_pal(), ...) } ggthemes/R/fivethirtyeight.R0000644000176200001440000000471614561274201015631 0ustar liggesusers#' Theme inspired by FiveThirtyEight plots #' #' Theme inspired by the plots from FiveThirtyEight.com. #' #' @inheritParams ggplot2::theme_grey #' @family themes fivethirtyeight #' @export #' @example inst/examples/ex-theme_fivethirtyeight.R #' @importFrom grid unit theme_fivethirtyeight <- function(base_size = 12, base_family = "sans") { colors <- deframe(ggthemes::ggthemes_data[["fivethirtyeight"]]) (theme_foundation(base_size = base_size, base_family = base_family) + theme( line = element_line(colour = "black"), rect = element_rect(fill = colors["Light Gray"], linetype = 0, colour = NA), text = element_text(colour = colors["Dark Gray"]), axis.title = element_blank(), axis.text = element_text(), axis.ticks = element_blank(), axis.line = element_blank(), legend.background = element_rect(), legend.position = "bottom", legend.direction = "horizontal", legend.box = "vertical", panel.grid = element_line(colour = NULL), panel.grid.major = element_line(colour = colors["Medium Gray"]), panel.grid.minor = element_blank(), # unfortunately, can't mimic subtitles TODO! plot.title = element_text(hjust = 0, size = rel(1.5), face = "bold"), plot.margin = unit(c(1, 1, 1, 1), "lines"), strip.background = element_rect())) } #' FiveThirtyEight color palette #' #' The standard three-color FiveThirtyEight palette for line plots comprises #' blue, red, and green. #' #' @family colour fivethirtyeight #' @export #' @example inst/examples/ex-fivethirtyeight_pal.R fivethirtyeight_pal <- function() { colors <- deframe(ggthemes::ggthemes_data[["fivethirtyeight"]]) values <- unname(colors[c("Blue", "Red", "Green")]) max_n <- length(values) f <- manual_pal(values) attr(f, "max_n") <- max_n f } #' FiveThirtyEight color scales #' #' Color scales using the colors in the FiveThirtyEight graphics. #' #' @inheritParams ggplot2::scale_colour_hue #' @family colour fivethirtyeight #' @rdname scale_fivethirtyeight #' @seealso \code{\link{theme_fivethirtyeight}()} for examples. #' @export scale_colour_fivethirtyeight <- function(...) { discrete_scale("colour", "economist", fivethirtyeight_pal(), ...) } #' @rdname scale_fivethirtyeight #' @export scale_color_fivethirtyeight <- scale_colour_fivethirtyeight #' @rdname scale_fivethirtyeight #' @export scale_fill_fivethirtyeight <- function(...) { discrete_scale("fill", "economist", fivethirtyeight_pal(), ...) } ggthemes/R/hc.R0000644000176200001440000000664614561301043013004 0ustar liggesusers#' Highcharts Theme #' #' Theme based on \href{https://www.highcharts.com/}{Highcharts} plots. #' #' @references #' #' \url{https://www.highcharts.com/demo/highcharts/line-chart} #' #' @inheritParams ggplot2::theme_bw #' @param style The Highcharts theme to use \code{'default'}, #' \code{'darkunica'}. #' @param bgcolor Deprecated #' @example inst/examples/ex-theme_hc.R #' @family themes hc #' @export theme_hc <- function(base_size = 12, base_family = "sans", style = c("default", "darkunica"), bgcolor = NULL) { if (!is.null(bgcolor)) { warning("`bgcolor` is deprecated. Use `style` instead.") style <- bgcolor } style <- match.arg(style) bgcolor <- switch(style, default = "#FFFFFF", "darkunica" = "#2a2a2b") ret <- theme(rect = element_rect(fill = bgcolor, linetype = 0, colour = NA), text = element_text(size = base_size, family = base_family), title = element_text(hjust = 0.5), axis.title.x = element_text(hjust = 0.5), axis.title.y = element_text(hjust = 0.5), panel.grid.major.y = element_line(colour = "#D8D8D8"), panel.grid.minor.y = element_blank(), panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank(), panel.border = element_blank(), panel.background = element_blank(), legend.position = "bottom", legend.key = element_rect(fill = "#FFFFFF00")) if (style == "darkunica") { ret <- (ret + theme(rect = element_rect(fill = bgcolor), text = element_text(colour = "#A0A0A3"), title = element_text(colour = "#FFFFFF"), axis.title.x = element_text(colour = "#A0A0A3"), axis.title.y = element_text(colour = "#A0A0A3"), panel.grid.major.y = element_line(colour = "#707073"), legend.title = element_text(colour = "#A0A0A3"))) } ret } #' Highcharts color palette (discrete) #' #' The Highcharts uses many different color palettes in its #' plots. This collects a few of them. #' #' @section Palettes: #' #' The following palettes are defined: #' #' #' @param palette \code{character} The name of the Highcharts theme to use. One of #' \code{"default"}, or \code{"darkunica"}. #' #' @family colour hc #' @export hc_pal <- function(palette = "default") { if (palette %in% names(ggthemes::ggthemes_data$hc)) { manual_pal(unname(ggthemes::ggthemes_data$hc[[palette]])) } else { stop("Palette `", palette, "` not valid. Must be one of ", stringr::str_c("`", names(ggthemes::ggthemes_data$hc), "`", collapse = ", "), call. = FALSE) } } #' Highcharts color and fill scales #' #' Colour and fill scales which use the palettes in #' \code{\link{hc_pal}()} and are meant for use with #' \code{\link{theme_hc}()}. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams hc_pal #' @family colour hc #' @rdname scale_hc #' @export scale_colour_hc <- function(palette = "default", ...) { discrete_scale("colour", "hc", hc_pal(palette), ...) } #' @rdname scale_hc #' @export scale_color_hc <- scale_colour_hc #' @rdname scale_hc #' @export scale_fill_hc <- function(palette = "default", ...) { discrete_scale("fill", "hc", hc_pal(palette), ...) } ggthemes/R/excel.R0000644000176200001440000001356714561020226013513 0ustar liggesusers#' Excel 97 ugly color palettes (discrete) #' #' The color palettes used in Microsoft Excel 97 (and up until Excel 2007). #' Use this for that classic ugly look and feel. For ironic purposes only. #' 3D bars and pies not included. Please never use this color palette. #' #' @param line If \code{TRUE}, use the palette for lines and points. Otherwise, #' use the palette for area. #' @family colour excel #' @export #' @example inst/examples/ex-excel_pal.R excel_pal <- function(line = TRUE) { if (line[[1]]) { manual_pal(ggthemes::ggthemes_data$excel$classic$line) } else { manual_pal(ggthemes::ggthemes_data$excel$classic$fill) } } #' Excel (current versions) color palettes (discrete) #' #' Color palettes used by current versions of Microsoft Office and Excel. #' #' @param theme The name of the Office theme or color theme #' (not to be confused with ggplot2 themes) from which to derive the color #' palette. Available themes include: #' \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$excel$themes))} #' @family colour excel #' @example inst/examples/ex-excel_new_pal.R #' @export excel_new_pal <- function(theme = "Office Theme") { allthemes <- ggthemes::ggthemes_data$excel$themes if (!theme %in% names(allthemes)) { stop("`theme` must be one of ", paste0(names(allthemes), collapse = ", ")) } values <- unname(allthemes[[theme]][["accents"]]) f <- manual_pal(values) attr(f, "max_n") <- length(values) f } #' Excel 97 ugly color scales #' #' The classic "ugly" color scales from Excel 97. #' #' @inheritParams excel_pal #' @inheritParams ggplot2::scale_colour_hue #' @family colour excel #' @rdname scale_excel #' @export #' @example inst/examples/ex-theme_excel.R scale_fill_excel <- function(...) { discrete_scale("fill", "excel", excel_pal(line = FALSE), ...) } #' @export #' @rdname scale_excel scale_colour_excel <- function(...) { discrete_scale("colour", "excel", excel_pal(line = TRUE), ...) } #' @export #' @rdname scale_excel scale_color_excel <- scale_colour_excel #' Excel (current versions) color scales #' #' Discrete color scales used in current versions of Microsoft Office and Excel. #' #' @inheritParams excel_new_pal #' @inheritParams ggplot2::scale_colour_hue #' @family colour excel #' @rdname scale_excel_new #' @example inst/examples/ex-theme_excel_new.R #' @export scale_colour_excel_new <- function(theme = "Office Theme", ...) { discrete_scale("colour", "excel_new", excel_new_pal(theme), ...) } #' @export #' @rdname scale_excel_new scale_color_excel_new <- scale_colour_excel_new #' @export #' @rdname scale_excel_new scale_fill_excel_new <- function(theme = "Office Theme", ...) { discrete_scale("fill", "excel_new", excel_new_pal(theme), ...) } #' ggplot theme based on old Excel plots #' #' Theme to replicate the ugly monstrosity that was the old #' gray-background Excel chart. Please never use this. #' This theme should be combined with the \code{\link{scale_colour_excel}()} #' color scale. #' #' @inheritParams ggplot2::theme_grey #' @param horizontal \code{logical}. Horizontal axis lines? #' @return An object of class \code{\link[ggplot2]{theme}()}. #' @export #' @family themes excel #' @example inst/examples/ex-theme_excel.R theme_excel <- function(base_size = 12, base_family = "", horizontal = TRUE) { gray <- "#C0C0C0" ret <- (theme_bw() + theme(panel.background = element_rect(fill = gray), panel.border = element_rect(colour = "black", linetype = 1), panel.grid.major = element_line(colour = "black"), panel.grid.minor = element_blank(), legend.key = element_rect(colour = NA), legend.background = element_rect(colour = "black", linetype = 1), strip.background = element_rect(fill = "white", colour = NA, linetype = 0))) if (horizontal) { ret <- ret + theme(panel.grid.major.x = element_blank()) } else { ret <- ret + theme(panel.grid.major.y = element_blank()) } ret } #' ggplot theme similar to current Excel plot defaults #' #' Theme for ggplot2 that is similar to the default style of charts in #' current versions of Microsoft Excel. #' #' @inheritParams ggplot2::theme_grey #' @return An object of class \code{\link[ggplot2]{theme}()}. #' @export #' @family themes excel #' @example inst/examples/ex-theme_excel_new.R #' theme_excel_new <- function(base_size = 9, base_family = "sans") { colorlist <- list(lt_gray = "#D9D9D9", gray = "#BFBFBF", dk_gray = "#595959") theme_bw(base_family = base_family, base_size = base_size) + theme( text = element_text( colour = colorlist$dk_gray, size = base_size ), line = element_line( linetype = "solid", colour = colorlist$gray ), rect = element_rect( linetype = 0, colour = "white" ), panel.grid.major = element_line( linetype = "solid", colour = colorlist$gray, size = 0.75 * PT_TO_MM ), panel.grid.minor = element_blank(), axis.title = element_blank(), axis.text = element_text( colour = colorlist$dk_gray, size = 9 ), strip.background = element_rect( fill = NA ), strip.text = element_text( colour = colorlist$dk_gray, size = 9 ), axis.ticks = element_blank(), panel.background = element_blank(), panel.border = element_rect(colour = NA), title = element_text( face = "plain", hjust = 0.5 ), plot.title = element_text( size = 14, hjust = 0.5 ), plot.subtitle = element_blank(), legend.position = "bottom", legend.text = element_text( size = 9, colour = colorlist$dk_gray ), legend.title = element_blank(), ) } ggthemes/R/colorblind.R0000644000176200001440000000216114561020226014526 0ustar liggesusers#' Colorblind Color Palette (Discrete) and Scales #' #' An eight-color colorblind safe qualitative discrete palette. #' #' @rdname colorblind #' @references #' Chang, W. "\href{http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/#a-colorblind-friendly-palette}{Cookbook for R}" #' #' \verb{https://jfly.iam.u-tokyo.ac.jp/color} #' #' @export #' @inheritParams ggplot2::scale_colour_hue #' @family colour #' @seealso The \pkg{dichromat} package, \code{\link[scales]{dichromat_pal}()}, #' and \code{\link{scale_color_tableau}()} for other colorblind palettes. #' @example inst/examples/ex-colorblind.R colorblind_pal <- function() { values <- unname(ggthemes::ggthemes_data[["colorblind"]][["value"]]) f <- manual_pal(values) attr(f, "max_n") <- length(values) f } #' @rdname colorblind #' @export scale_colour_colorblind <- function(...) { discrete_scale("colour", "colorblind", colorblind_pal(), ...) } #' @rdname colorblind #' @export scale_color_colorblind <- scale_colour_colorblind #' @rdname colorblind #' @export scale_fill_colorblind <- function(...) { discrete_scale("fill", "colorblind", colorblind_pal(), ...) } ggthemes/R/solarized.R0000644000176200001440000001402414561051016014375 0ustar liggesusers#' Base colors for Solarized light and dark themes #' #' @param light \code{logical} Light theme? #' #' Creates the base colors for a light or dark solarized theme. See #' \url{https://ethanschoonover.com/solarized/}. This function is a port #' of the CSS style example. #' #' @keywords internal solarized_rebase <- function(light = TRUE) { basecolors <- deframe(ggthemes::ggthemes_data$solarized$Base) rebase <- if (light) { basecolors[c(paste0("base", 3:0), paste0("base0", 0:3))] } else { basecolors[c(paste0("base0", 3:0), paste0("base", 0:3))] } names(rebase) <- paste0("rebase", c(paste0("0", 3:0), 0:3)) rebase } solarized_accent_list <- function() { paste0("\\code{\"", names(ggthemes::ggthemes_data$solarized$Accents), "\"}", collapse = ",") } #' Solarized color palette (discrete) #' #' Qualitative color palate based on the Ethan Schoonover's Solarized #' palette, \url{https://ethanschoonover.com/solarized/}. This palette supports #' up to seven values. #' #' @note #' #' For a given starting color and number of colors in the palette, #' the other colors are the combination of colors that maximizes the #' total Euclidean distance between colors in L*a*b space. #' #' @param accent \code{character} Starting color. #' @export #' @family solarized colour #' @example inst/examples/ex-solarized_pal.R solarized_pal <- function(accent = "blue") { palettes <- ggthemes::ggthemes_data[["solarized"]][["palettes"]][[accent]] max_n <- length(palettes) f <- function(n) { check_pal_n(n, max_n) palettes[[n]] } attr(f, "max_n") <- f f } #' Solarized color scales #' #' See \code{\link{solarized_pal}()} for details. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams solarized_pal #' @family colour scales #' @rdname scale_solarized #' @family solarized colour #' @export #' @example inst/examples/ex-scale_solarized.R scale_fill_solarized <- function(accent = "blue", ...) { discrete_scale("fill", "solarized", solarized_pal(accent), ...) } #' @export #' @rdname scale_solarized scale_colour_solarized <- function(accent = "blue", ...) { discrete_scale("colour", "solarized", solarized_pal(accent), ...) } #' @export #' @rdname scale_solarized scale_color_solarized <- scale_colour_solarized #' ggplot color themes based on the Solarized palette #' #' See \url{https://ethanschoonover.com/solarized/} for a #' description of the Solarized palette. #' #' Plots made with this theme integrate seamlessly with the Solarized #' Beamer color theme. #' \url{https://github.com/jrnold/beamercolorthemesolarized}. #' There are two variations: \code{theme_solarized} is similar to #' to \code{\link[ggplot2]{theme_bw}()}, while \code{theme_solarized_2()} is #' similar to \code{\link[ggplot2]{theme_gray}()}. #' #' @rdname theme_solarized #' @inheritParams ggplot2::theme_grey #' @param light \code{logical}. Light or dark theme? #' @export #' @family themes solarized #' @example inst/examples/ex-theme_solarized.R theme_solarized <- function(base_size = 12, base_family = "", light = TRUE) { rebase <- solarized_rebase(light) ret <- (theme_bw(base_size = base_size, base_family = base_family) + theme(text = element_text(colour = rebase["rebase01"]), title = element_text(color = rebase["rebase0"]), line = element_line(color = rebase["rebase01"]), rect = element_rect(fill = rebase["rebase03"], color = rebase["rebase01"]), axis.ticks = element_line(color = rebase["rebase01"]), axis.line = element_line(color = rebase["rebase01"], linetype = 1), legend.background = element_rect(fill = NULL, color = NA), legend.key = element_rect(fill = NULL, colour = NULL, linetype = 0), panel.background = element_rect(fill = rebase["rebase03"], colour = rebase["rebase01"]), panel.border = element_blank(), panel.grid = element_line(color = rebase["rebase02"]), panel.grid.major = element_line(color = rebase["rebase02"]), panel.grid.minor = element_line(color = rebase["rebase02"]), plot.background = element_rect(fill = NULL, colour = NA, linetype = 0))) ret } #' @rdname theme_solarized #' @export theme_solarized_2 <- function(base_size = 12, base_family = "", light = TRUE) { rebase <- solarized_rebase(light) ret <- (theme_foundation(base_size = base_size, base_family = base_family) + theme(text = element_text(color = rebase["rebase01"]), title = element_text(color = rebase["rebase0"]), line = element_line(color = rebase["rebase01"]), rect = element_rect(fill = rebase["rebase03"], color = NA), axis.ticks = element_line(color = rebase["rebase01"]), axis.line = element_line(color = rebase["reabase01"], linetype = 1), axis.title.y = element_text(angle = 90), legend.background = element_rect(fill = NULL, color = NA), legend.key = element_rect(fill = NULL, colour = NULL, linetype = 0), panel.background = element_rect(fill = rebase["rebase02"], colour = NA), panel.border = element_blank(), panel.grid = element_line(color = rebase["rebase03"]), panel.grid.major = element_line(color = rebase["rebase03"]), panel.grid.minor = element_line(color = rebase["rebase03"], linewidth = 0.25), plot.background = element_rect(fill = NULL, colour = NULL, linetype = 0))) ret } ggthemes/R/wsj.R0000644000176200001440000001022714561300571013210 0ustar liggesusers#' Wall Street Journal theme #' #' Theme based on the plots in \emph{The Wall Street Journal}. #' #' This theme should be used with \code{\link{scale_color_wsj}()}. #' #' @references #' #' \url{https://twitter.com/WSJGraphics} #' #' \url{https://pinterest.com/wsjgraphics/wsj-graphics/} #' #' @inheritParams ggplot2::theme_grey #' @param color The background color of plot. One of \code{'brown', #' 'gray', 'green', 'blue'}. #' @param title_family Plot title font family. #' @family themes wsj #' @example inst/examples/ex-theme_wsj.R #' @export #' @importFrom ggplot2 element_line element_rect element_text element_blank rel theme_wsj <- function(base_size = 12, color = "brown", base_family = "sans", title_family = "mono") { colorhex <- ggthemes::ggthemes_data$wsj$bg[color] theme_foundation(base_size = base_size, base_family = base_family) + theme(line = element_line(linetype = 1, colour = "black"), rect = element_rect(fill = colorhex, linetype = 0, colour = NA), text = element_text(colour = "black"), title = element_text(family = title_family, size = rel(2)), axis.title = element_blank(), axis.text = element_text(face = "bold", size = rel(1)), axis.text.x = element_text(colour = NULL), axis.text.y = element_text(colour = NULL), axis.ticks = element_line(colour = NULL), axis.ticks.y = element_blank(), axis.ticks.x = element_line(colour = NULL), axis.line = element_line(), axis.line.y = element_blank(), legend.background = element_rect(), legend.position = "top", legend.direction = "horizontal", legend.box = "vertical", panel.grid = element_line(colour = NULL, linetype = 3), panel.grid.major = element_line(colour = "black"), panel.grid.major.x = element_blank(), panel.grid.minor = element_blank(), plot.title = element_text(hjust = 0, face = "bold"), plot.margin = unit(c(1, 1, 1, 1), "lines"), strip.background = element_rect()) } #' Wall Street Journal color palette (discrete) #' #' The Wall Street Journal uses many different color palettes in its #' plots. This collects a few of them, but is by no means exhaustive. #' Collections of these plots can be found on the WSJ Graphics #' \href{https://twitter.com/WSJGraphics}{Twitter} feed and #' \href{https://pinterest.com/wsjgraphics/wsj-graphics/}{Pinterest}. #' #' @section Palettes: #' #' The following palettes are defined, #' #' \describe{ #' \item{rgby}{Red/Green/Blue/Yellow theme.} #' \item{red_green}{Green/red two-color scale for good/bad.} #' \item{green_black}{Black-green 4-color scale for 'Very negative', #' 'Somewhat negative', 'somewhat positive', 'very positive'.} #' \item{dem_rep}{Democrat/Republican/Undecided blue/red/gray scale.} #' \item{colors6}{Red, blue, gold, green, orange, and black palette.} #' } #' #' @param palette \code{character} The color palette to use: . #' \Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$wsj$palettes))} #' #' @family colour wsj #' @export wsj_pal <- function(palette = "colors6") { palettes <- ggthemes::ggthemes_data[["wsj"]][["palettes"]] if (palette %in% names(palettes)) { colors <- palettes[[palette]][["value"]] max_n <- length(colors) f <- manual_pal(unname(colors)) attr(f, "max_n") <- max_n f } else { stop(sprintf("palette %s not a valid palette.", palette)) } } #' Wall Street Journal color and fill scales #' #' Colour and fill scales which use the palettes in \code{\link{wsj_pal}()}. #' These scales should be used with \code{\link{theme_wsj}()}. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams wsj_pal #' @family colour wsj #' @rdname scale_wsj #' @export scale_colour_wsj <- function(palette = "colors6", ...) { discrete_scale("colour", "wsj", wsj_pal(palette), ...) } #' @rdname scale_wsj #' @export scale_color_wsj <- scale_colour_wsj #' @rdname scale_wsj #' @export scale_fill_wsj <- function(palette = "colors6", ...) { discrete_scale("fill", "wsj", wsj_pal(palette), ...) } ggthemes/R/ggthemes-package.R0000644000176200001440000000056314561250635015610 0ustar liggesusers#' @keywords internal "_PACKAGE" #' @importFrom ggplot2 ggplot theme ggproto aes draw_key_path #' @importFrom grid grobTree grobName gTree gList segmentsGrob gpar #' @importFrom scales manual_pal div_gradient_pal seq_gradient_pal #' @importFrom graphics abline axis text points #' @importFrom methods hasArg as #' @importFrom graphics par NULL globalVariables(".data") ggthemes/R/pander.R0000644000176200001440000002263714561051016013663 0ustar liggesusers#' A ggplot theme originated from the pander package #' #' The \pkg{pander} ships with a default theme when the 'unify plots' option is #' enabled via \code{panderOptions}, which is now also available outside of \pkg{pander} internals, like \code{evals}, \code{eval.msgs} or \code{Pandoc.brew}. #' @inheritParams ggplot2::theme_bw #' @param nomargin suppress the white space around the plot (boolean) #' @param ff font family, like \code{sans}. Deprecated: use \code{base_family} instead. #' @param fc font color (name or hexa code) #' @param fs font size (integer). Deprecated: use \code{base_size} instead. #' @param gM major grid (boolean) #' @param gm minor grid (boolean) #' @param gc grid color (name or hexa code) #' @param gl grid line type (\code{lty}) #' @param boxes to render a border around the plot or not #' @param bc background color (name or hexa code) #' @param pc panel background color (name or hexa code) #' @param lp legend position #' @param axis axis angle as defined in \code{par(les)} #' @export #' @example inst/examples/ex-theme_pander.R theme_pander <- function(base_size = 12, base_family = "sans", nomargin = TRUE, ff = NULL, fc = "black", fs = NULL, gM = TRUE, gm = TRUE, gc = "grey", gl = "dashed", boxes = FALSE, bc = "white", pc = "transparent", lp = "right", axis = 1) { if (hasArg(ff)) { base_family <- ff warning("Argument `ff` deprecated. Use `base_family` instead.") } if (hasArg(fs)) { base_size <- fs warning("Argument `fs` deprecated. Use `base_size` instead.") } if (requireNamespace("pander", quietly = TRUE)) { if (missing(nomargin)) nomargin <- pander::panderOptions("graph.nomargin") if (missing(base_family)) base_family <- pander::panderOptions("graph.fontfamily") if (missing(fc)) fc <- pander::panderOptions("graph.fontcolor") if (missing(base_size)) base_size <- pander::panderOptions("graph.fontsize") if (missing(gM)) gM <- pander::panderOptions("graph.grid") if (missing(gm)) gm <- pander::panderOptions("graph.grid.minor") if (missing(gc)) gc <- pander::panderOptions("graph.grid.color") if (missing(gl)) gl <- pander::panderOptions("graph.grid.lty") if (missing(boxes)) boxes <- pander::panderOptions("graph.boxes") if (missing(bc)) bc <- pander::panderOptions("graph.background") if (missing(pc)) pc <- pander::panderOptions("graph.panel.background") if (missing(lp)) lp <- pander::panderOptions("graph.legend.position") if (missing(axis)) axis <- pander::panderOptions("graph.axis.angle") } ## DRY tc <- ifelse(pc == "transparent", bc, pc) # 'transparent' color ## default colors, font and legend position res <- theme(text = element_text(family = base_family), plot.background = element_rect(fill = bc, colour = NA), panel.grid = element_line(colour = gc, linewidth = 0.2, linetype = gl), panel.grid.minor = element_line(linewidth = 0.1), axis.ticks = element_line(colour = gc, linewidth = 0.2), plot.title = element_text(colour = fc, face = "bold", size = base_size * 1.2), axis.text = element_text(colour = fc, face = "plain", size = base_size * 0.8), legend.text = element_text(colour = fc, face = "plain", size = base_size * 0.8), legend.title = element_text(colour = fc, face = "italic", size = base_size), axis.title.x = element_text(colour = fc, face = "plain", size = base_size), strip.text.x = element_text(colour = fc, face = "plain", size = base_size), axis.title.y = element_text(colour = fc, face = "plain", size = base_size, angle = 90), strip.text.y = element_text(colour = fc, face = "plain", size = base_size, angle = -90), legend.key = element_rect(colour = gc, fill = "transparent"), strip.background = element_rect(colour = gc, fill = "transparent"), panel.border = element_rect(fill = NA, colour = gc), panel.background = element_rect(fill = pc, colour = gc), legend.position = lp) ## disable box(es) around the plot if (!isTRUE(boxes)) { res <- res + theme(legend.key = element_rect(colour = "transparent", fill = "transparent"), strip.background = element_rect(colour = "transparent", fill = "transparent"), panel.border = element_rect(fill = NA, colour = tc), panel.background = element_rect(fill = pc, colour = tc)) } ## disable grid if (!isTRUE(gM)) { res <- res + theme(panel.grid = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) } ## disable minor grid if (!isTRUE(gm)) res <- res + theme(panel.grid.minor = element_blank()) ## margin if (nomargin) res <- res + theme(plot.margin = unit(c(0.1, 0.1, 0.1, 0), "lines")) ## axis angle (TODO: DRY with ifelse in the default color etc. section) if (axis == 0) res <- res + theme(axis.text.y = element_text(colour = fc, family = base_family, face = "plain", size = base_size * 0.8, angle = 90)) if (axis == 2) res <- res + theme(axis.text.x = element_text(colour = fc, family = base_family, face = "plain", size = base_size * 0.8, angle = 90, hjust = 1)) if (axis == 3) res <- res + theme(axis.text.y = element_text(colour = fc, family = base_family, face = "plain", size = base_size * 0.8, angle = 90), axis.text.x = element_text(colour = fc, family = base_family, face = "plain", size = base_size * 0.8, angle = 90, hjust = 1)) res } #' Color palette from the pander package #' #' The \pkg{pander} ships with a default colorblind and printer-friendly #' color palette borrowed from \verb{https://jfly.iam.u-tokyo.ac.jp/color/}. #' #' @param n number of colors. This palette supports up to eight colors. #' @param random_order if the palette should be reordered randomly before #' rendering each plot to get colorful images #' @export #' @family colour pander #' @example inst/examples/ex-palette_pander.R palette_pander <- function(n, random_order = FALSE) { ## default (colorblind and printer-friendly) colors cols <- c("#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#999999", "#E69F00") if (requireNamespace("pander", quietly = TRUE)) { cols <- pander::panderOptions("graph.colors") } if (isTRUE(random_order)) cols <- sample(cols) if (length(cols) < n) cols <- rep(cols, length.out = n) cols[1:n] } #' Color scale from the pander package #' #' The \pkg{pander} ships with a default colorblind and printer-friendly color #' palette borrowed from \verb{https://jfly.iam.u-tokyo.ac.jp/color/}. #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams palette_pander #' @family colour pander #' @rdname scale_pander #' @seealso \code{\link{theme_pander}()} #' @export scale_color_pander <- function(...) { discrete_scale("colour", "pander", palette_pander, ...) } #' @rdname scale_pander #' @export scale_colour_pander <- scale_color_pander #' @rdname scale_pander #' @export scale_fill_pander <- function(...) { discrete_scale("fill", "pander", palette_pander, ...) } ggthemes/R/tableau.R0000644000176200001440000002441214561266444014035 0ustar liggesusers#' Tableau Color Palettes (discrete) #' #' Color palettes used in \href{https://www.tableau.com/}{Tableau}. #' #' @details Tableau provides three types of color palettes: #' \code{"regular"} (discrete, qualitative categories), #' \code{"ordered-sequential"}, and \code{"ordered-diverging"}. #' #' \describe{ #' \item{\code{"regular"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["regular"]]))}} #' \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} #' \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} #' } #' #' @export #' @param palette Palette name. See Details for available palettes. #' @param type Type of palette. One of \code{"regular"}, \code{"ordered-diverging"}, or \code{"ordered-sequential"}. #' @param direction If 1, the default, then use the original order of #' colors. If -1, then reverse the order. #' #' @references #' \url{http://vis.stanford.edu/color-names/analyzer/} #' #' Maureen Stone, 'Designing Colors for Data' (slides), at the #' International Symposium on Computational Aesthetics in Graphics, #' Visualization, and Imaging, Banff, AB, Canada, June 22, 2007. #' #' Heer, Jeffrey and Maureen Stone, 2012 'Color Naming Models for #' Color Selection, Image Editing and Palette Design', ACM Human #' Factors in Computing Systems (CHI) #' \url{http://vis.stanford.edu/files/2012-ColorNameModels-CHI.pdf}. #' #' @family colour tableau #' @example inst/examples/ex-tableau_color_pal.R tableau_color_pal <- function(palette = "Tableau 10", type = c("regular", "ordered-sequential", "ordered-diverging"), direction = 1) { type <- match.arg(type) palettes <- ggthemes::ggthemes_data[["tableau"]][["color-palettes"]][[type]] if (!palette %in% names(palettes)) { stop("`palette` must be one of ", paste(names(palettes), collapse = ", "), ".") } values <- palettes[[palette]][["value"]] max_n <- length(values) f <- function(n) { check_pal_n(n, max_n) values <- values[seq_len(n)] if (direction < 0) { values <- rev(values) } values } attr(f, "max_n") <- length(values) f } #' Tableau color scales (discrete) #' #' Categorical (qualitative) color scales used in Tableau. #' Use the function \funclink{scale_colour_gradient_tableau} for the sequential #' and \funclink{scale_colour_gradient2_tableau} for the diverging continuous #' color scales from Tableu. #' #' @param palette Palette name. See \funclink{tableau_color_pal} #' for available palettes. #' @param type Palette type. One of \code{"regular"}, \code{"sequential"}, #' or \code{"diverging"}. See \funclink{tableau_color_pal}. #' @inheritParams tableau_color_pal #' @param ... Other arguments passed on to \funclink{discrete_scale}. #' @family colour tableau #' @rdname scale_color_tableau #' @export #' @seealso \code{\link{tableau_color_pal}()} for references. #' @example inst/examples/ex-scale_color_tableau.R scale_colour_tableau <- function(palette = "Tableau 10", type = "regular", direction = 1, ...) { discrete_scale("colour", "tableau", tableau_color_pal(palette, type, direction), ...) } #' @export #' @rdname scale_color_tableau scale_fill_tableau <- function(palette = "Tableau 10", type = "regular", direction = 1, ...) { discrete_scale("fill", "tableau", tableau_color_pal(palette, type, direction), ...) } #' @export #' @rdname scale_color_tableau scale_color_tableau <- scale_colour_tableau #' Tableau Shape Palettes (discrete) #' #' Shape palettes used by #' \href{https://www.tableau.com/}{Tableau}. #' #' Not all shape palettes in Tableau are supported. Additionally, these #' palettes are not exact, and use the best unicode character for the shape #' palette. #' #' Since these palettes use unicode characters, their look may depend on the #' font being used, and not all characters may be available. #' #' Shape palettes in Tableau are used to expose images for use a markers in #' charts, and thus are sometimes groupings of closely related symbols. #' #' @export #' @param palette Palette name. #' @family shape tableau #' @example inst/examples/ex-tableau_shape_pal.R tableau_shape_pal <- function(palette = c("default", "filled", "proportions")) { palette <- match.arg(palette) shapes <- ggthemes::ggthemes_data$tableau[["shape-palettes"]][[palette]] f <- manual_pal(shapes[["pch"]]) attr(f, "max_n") <- nrow(shapes) f } #' Tableau shape scales #' #' See \code{\link{tableau_shape_pal}()} for details. #' #' @export #' @inheritParams tableau_shape_pal #' @inheritParams ggplot2::scale_x_discrete #' @family shape tableau #' @example inst/examples/ex-scale_shape_tableau.R scale_shape_tableau <- function(palette = "default", ...) { discrete_scale("shape", "tableau", tableau_shape_pal(palette), ...) } #' Tableau colour gradient palettes (continuous) #' #' Gradient color palettes using the diverging and sequential continous color #' palettes in Tableau. See \funclink{tableau_color_pal} for discrete color #' palettes. #' #' @param palette Palette name. #' \describe{ #' \item{\code{"ordered-sequential"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-sequential"]]))}} #' \item{\code{"ordered-diverging"}}{\Sexpr[results=rd]{ggthemes:::rd_optlist(names(ggthemes::ggthemes_data$tableau[["color-palettes"]][["ordered-diverging"]]))}} #' } #' @param type Palette type, either \code{"ordered-sequential"} or #' \code{"ordered-diverging"}. #' @param ... Arguments passed to \code{tableau_gradient_pal}. #' @family colour tableau #' #' @export #' @example inst/examples/ex-tableau_seq_gradient_pal.R tableau_gradient_pal <- function(palette = "Blue", type = "ordered-sequential") { type <- match.arg(type, c("ordered-sequential", "ordered-diverging")) pal <- ggthemes::ggthemes_data[[c("tableau", "color-palettes", type, palette)]] scales::gradient_n_pal(colours = pal[["value"]]) } #' @export #' @rdname tableau_gradient_pal tableau_seq_gradient_pal <- function(palette = "Blue", ...) { tableau_gradient_pal(palette = palette, type = "ordered-sequential", ...) } #' @export #' @rdname tableau_gradient_pal tableau_div_gradient_pal <- function(palette = "Orange-Blue Diverging", ...) { tableau_gradient_pal(palette = palette, type = "ordered-diverging", ...) } #' Tableau sequential colour scales (continuous) #' #' Continuous color scales using the sequential color palettes in Tableau. #' See \funclink{scale_colour_tableau} for Tableau discrete color scales, #' and \funclink{scale_colour_gradient2_tableau} for diverging color #' scales. #' #' @export #' @inheritParams tableau_seq_gradient_pal #' @inheritParams ggplot2::scale_colour_hue #' @param guide Type of legend. Use \code{'colourbar'} for continuous #' colour bar, or \code{'legend'} for discrete colour legend. #' @family colour tableau #' @rdname scale_colour_gradient_tableau #' @example inst/examples/ex-scale_colour_gradient_tableau.R #' @importFrom ggplot2 continuous_scale scale_colour_gradient_tableau <- function(palette = "Blue", ..., na.value = "grey50", guide = "colourbar") { continuous_scale("colour", "tableau", tableau_seq_gradient_pal(palette), na.value = na.value, guide = guide, ...) } #' @export #' @rdname scale_colour_gradient_tableau scale_fill_gradient_tableau <- function(palette = "Blue", ..., na.value = "grey50", guide = "colourbar") { continuous_scale("fill", "tableau", tableau_seq_gradient_pal(palette), na.value = na.value, guide = guide, ...) } #' @export #' @rdname scale_colour_gradient_tableau scale_color_gradient_tableau <- scale_colour_gradient_tableau #' @export #' @rdname scale_colour_gradient_tableau scale_color_continuous_tableau <- scale_colour_gradient_tableau #' @export #' @rdname scale_colour_gradient_tableau scale_fill_continuous_tableau <- scale_fill_gradient_tableau #' Tableau diverging colour scales (continuous) #' #' Continuous color scales using the diverging color scales in Tableau. #' See \funclink{scale_colour_tableau} for Tabaleau discrete color scales, #' and \funclink{scale_colour_gradient_tableau} for sequential color scales. #' #' @inheritParams tableau_div_gradient_pal #' @inheritParams ggplot2::scale_colour_hue #' @param guide Type of legend. Use \code{'colourbar'} for continuous #' colour bar, or \code{'legend'} for discrete colour legend. #' @family colour tableau #' @export #' @rdname scale_colour_gradient2_tableau #' @example inst/examples/ex-scale_colour_gradient2_tableau.R scale_colour_gradient2_tableau <- function(palette = "Orange-Blue Diverging", ..., na.value = "grey50", guide = "colourbar") { continuous_scale("colour", "tableau2", tableau_div_gradient_pal(palette), na.value = na.value, guide = guide, ...) } #' @export #' @rdname scale_colour_gradient2_tableau scale_fill_gradient2_tableau <- function(palette = "Orange-Blue Diverging", ..., na.value = "grey50", guide = "colourbar") { continuous_scale("fill", "tableau2", tableau_div_gradient_pal(palette), na.value = na.value, guide = guide, ...) } #' @export #' @rdname scale_colour_gradient2_tableau scale_color_gradient2_tableau <- scale_colour_gradient2_tableau ggthemes/R/scales.R0000644000176200001440000001466514561020226013665 0ustar liggesusers# Much of this code is copied from the labeling package. .simplicity <- function(q, Q, j, lmin, lmax, lstep) { eps <- .Machine$double.eps * 100 n <- length(Q) i <- match(q, Q)[1] v <- ifelse( (lmin %% lstep < eps || lstep - (lmin %% lstep) < eps) && lmin <= 0 && lmax >= 0, 1, 0) 1 - (i - 1) / (n - 1) - j + v } .simplicity.max <- function(q, Q, j) { n <- length(Q) i <- match(q, Q)[1] v <- 1 1 - (i - 1) / (n - 1) - j + v } .coverage <- function(dmin, dmax, lmin, lmax) { range <- dmax - dmin 1 - 0.5 * ( (dmax - lmax) ^ 2 + (dmin - lmin) ^ 2) / ( (0.1 * range) ^ 2) } .coverage.max <- function(dmin, dmax, span) { range <- dmax - dmin if (span > range) { half <- (span - range) / 2 1 - 0.5 * (half ^ 2 + half ^ 2) / ( (0.1 * range) ^ 2) } else { 1 } } .density <- function(k, m, dmin, dmax, lmin, lmax) { r <- (k - 1) / (lmax - lmin) rt <- (m - 1) / (max(lmax, dmax) - min(dmin, lmin)) 2 - max( r / rt, rt / r ) } .density.max <- function(k, m) { if (k >= m) { 2 - (k - 1) / (m - 1) } else { 1 } } .legibility <- function(lmin, lmax, lstep) { 1 } #' Pretty axis breaks inclusive of extreme values #' #' This function returns pretty axis breaks that always include the extreme values of the data. #' This works by calling the extended Wilkinson algorithm (Talbot et. al, 2010), constrained to solutions interior to the data range. #' Then, the minimum and maximum labels are moved to the minimum and maximum of the data range. #' #' \code{extended_range_breaks} implements the algorithm and returns the break values. #' \code{scales_extended_range_breaks} uses the conventions of the \pkg{scales} package, and returns a function. #' #' @param dmin minimum of the data range #' @param dmax maximum of the data range #' @param n desired number of breaks #' @param Q set of nice numbers #' @param w weights applied to the four optimization components (simplicity, coverage, density, and legibility) #' @return For \code{extended_range_breaks}, the vector of axis label locations. #' For \code{scales_extended_range_breaks}, a function which takes a single argument, a vector of data, and returns the vector of axis label locations. #' @references #' Talbot, J., Lin, S., Hanrahan, P. (2010) An Extension of Wilkinson's Algorithm for Positioning Tick Labels on Axes, InfoVis 2010. #' @author Justin Talbot \email{jtalbot@@stanford.edu}, Jeffrey B. Arnold, Baptiste Auguie #' @rdname range_breaks #' @export extended_range_breaks_ <- function(dmin, dmax, n = 5, Q = c(1, 5, 2, 2.5, 4, 3), w = c(0.25, 0.2, 0.5, 0.05)) { eps <- .Machine$double.eps * 100 if (dmin > dmax) { temp <- dmin dmin <- dmax dmax <- temp } if (dmax - dmin < eps) { #if the range is near the floating point limit, #let seq generate some equally spaced steps. return(seq(from = dmin, to = dmax, length.out = n)) } n <- length(Q) best <- list() best$score <- -2 j <- 1 while (j < Inf) { for (q in Q) { sm <- .simplicity.max(q, Q, j) if ( (w[1] * sm + w[2] + w[3] + w[4]) < best$score) { j <- Inf break } k <- 2 while (k < Inf) { dm <- .density.max(k, n) if ( (w[1] * sm + w[2] + w[3] * dm + w[4]) < best$score) break delta <- (dmax - dmin) / (k + 1) / j / q z <- ceiling(log(delta, base = 10)) while (z < Inf) { step <- j * q * 10 ^ z cm <- .coverage.max(dmin, dmax, step * (k - 1)) if ( (w[1] * sm + w[2] * cm + w[3] * dm + w[4]) < best$score) break min_start <- floor(dmax / (step)) * j - (k - 1) * j max_start <- ceiling(dmin / (step)) * j if (min_start > max_start) { z <- z + 1 next } for (start in min_start:max_start) { lmin <- start * (step / j) lmax <- lmin + step * (k - 1) lstep <- step s <- .simplicity(q, Q, j, lmin, lmax, lstep) c <- .coverage(dmin, dmax, lmin, lmax) g <- .density(k, n, dmin, dmax, lmin, lmax) l <- .legibility(lmin, lmax, lstep) score <- w[1] * s + w[2] * c + w[3] * g + w[4] * l if (score > best$score && lmin >= dmin && lmax <= dmax) { best <- list(lmin = lmin, lmax = lmax, lstep = lstep, score = score) } } z <- z + 1 } k <- k + 1 } } j <- j + 1 } breaks <- seq(from = best$lmin, to = best$lmax, by = best$lstep) if (length(breaks) >= 2) { breaks[1] <- dmin breaks[length(breaks)] <- dmax } breaks } #' @rdname range_breaks #' @param ... other arguments passed to \code{extended_range_breaks_()} #' @return A function which returns breaks given a vector. #' @export extended_range_breaks <- function(n = 5, ...) { function(x) { extended_range_breaks_(min(x), max(x), n, ...) } } # from scales package zero_range <- function(x, tol = 1000 * .Machine$double.eps) { if (length(x) == 1) return(TRUE) if (length(x) != 2) stop("x must be length 1 or 2") if (any(is.na(x))) return(NA) if (x[1] == x[2]) return(TRUE) if (all(is.infinite(x))) return(FALSE) m <- min(abs(x)) if (m == 0) return(FALSE) abs( (x[1] - x[2]) / m) < tol } # from scales package precision <- function(x) { rng <- range(x, na.rm = TRUE) span <- if (zero_range(rng)) abs(rng[1]) else diff(rng) 10 ^ floor(log10(span)) } #' Format numbers with automatic number of digits #' #' @param x A numeric vector to format #' @param ... Parameters passed to \code{\link{format}()} #' #' @references Josh O'Brien, #' \url{https://stackoverflow.com/questions/23169938/select-accuracy-to-display-additional-axis-breaks/23171858#23171858}. #' @author Josh O'Brien, Baptise Auguie, Jeffrey B. Arnold #' @return A character vector. #' \code{smart_digits_format()} returns a function with a single argument #' \code{x}, a numeric vector, that returns a character vector. #' #' @rdname smart_digits #' @export smart_digits <- function(x, ...) { if (length(x) == 0) return(character()) accuracy <- precision(x) x <- round(x / accuracy) * accuracy format(x, ...) } #' @rdname smart_digits #' @export smart_digits_format <- function(x, ...) { function(x) smart_digits(x, ...) } ggthemes/R/economist.R0000644000176200001440000002147714561276224014425 0ustar liggesusers#' Economist color palette (discrete) #' #' The hues in the palette are blues, grays, and greens. Red is not #' included in these palettes and should be used to indicate #' important data. #' #' @param fill Use the fill palette. #' @family colour economist #' @export #' @example inst/examples/ex-economist_pal.R economist_pal <- function(fill=TRUE) { colors <- deframe(ggthemes::ggthemes_data[["economist"]][["fg"]]) if (fill) { max_n <- 9 f <- function(n) { check_pal_n(n, max_n) if (n == 1L) { i <- "dark blue" } else if (n == 2L) { i <- c("blue", "dark blue") } else if (n == 3L) { i <- c("blue-gray", "dark blue", "blue") } else if (n == 4L) { i <- c("blue-gray", "dark blue", "blue", "gray") } else if (n %in% 5:6) { ## 20120901_woc904 i <- c("blue-gray", "dark blue", "light blue", "blue", "light green", "dark green") } else if (n == 7L) { # 20120818_AMC820 i <- c("blue-gray", "dark blue", "blue", "light blue", "dark green", "light green", "gray") } else if (n >= 8L) { # 20120915_EUC094 i <- c("blue-gray", "dark blue", "blue", "light blue", "dark green", "light green", "dark red", "pink", "gray") } unname(colors[i][seq_len(n)]) } } else { max_n <- 9 f <- function(n) { check_pal_n(n, max_n) if (n <= 3) { # 20120818_AMC20 # 20120901_FBC897 i <- c("dark blue", "blue", "light blue") } else if (n %in% 4:5) { # i <- c("dark blue", "blue", "light blue", "red", "gray") i <- c("dark blue", "blue", "light blue", "blue-gray", "gray") } else if (n == 6) { # 20120825_IRC829 i <- c("light green", "dark green", "gray", "blue-gray", "light blue", "dark blue") } else if (n > 6) { # 20120825_IRC829 i <- c("light green", "dark green", "gray", "blue-gray", "light blue", "dark blue", "dark red", "pink", "brown") } unname(colors[i][seq_len(n)]) } } attr(f, "max_n") <- max_n f } #' Economist color scales #' #' Color scales using the colors in the Economist graphics. #' #' @inheritParams ggplot2::scale_colour_hue #' @inheritParams economist_pal #' @family colour economist #' @rdname scale_economist #' @seealso \code{\link{theme_economist}()} for examples. #' @export scale_colour_economist <- function(...) { discrete_scale("colour", "economist", economist_pal(), ...) } #' @rdname scale_economist #' @export scale_color_economist <- scale_colour_economist #' @rdname scale_economist #' @export scale_fill_economist <- function(...) { discrete_scale("fill", "economist", economist_pal(), ...) } #' ggplot color theme based on the Economist #' #' A theme that approximates the style of \emph{The Economist}. #' #' \code{theme_economist} implements the standard bluish-gray #' background theme in the print \emph{The Economist} and #' \href{https://www.economist.com/}{economist.com}. #' #' \code{theme_economist_white} implements a variant with a while #' panel and light gray (or white) background often used by \emph{The Economist} #' blog \href{https://www.economist.com/blogs/graphicdetail}{Graphic Detail}. #' #' Use \code{\link{scale_color_economist}()} with this theme. #' The x axis should be displayed on the right hand side. #' #' \emph{The Economist} uses "ITC Officina Sans" as its font for graphs. If #' you have access to this font, you can use it with the #' \pkg{extrafont} package. "Verdana" is a good substitute. #' #' @inheritParams ggplot2::theme_grey #' @param horizontal \code{logical} Horizontal axis lines? #' @param dkpanel \code{logical} Darker background for panel region? #' @param gray_bg \code{logical} If \code{TRUE}, use gray background, else #' use white #' background. #' #' @return An object of class \code{\link[ggplot2]{theme}()}. #' #' @export #' @family themes economist #' #' @references #' \itemize{ #' \item \href{https://www.economist.com/}{The Economist} #' \item \href{https://spiekermann.com/en/itc-officina-display/}{Spiekerblog, "ITC Officina Display", January 1, 2007.} #' } #' #' @example inst/examples/ex-theme_economist.R theme_economist <- function(base_size = 10, base_family = "sans", horizontal = TRUE, dkpanel = FALSE) { bgcolors <- deframe(ggthemes::ggthemes_data[["economist"]][["bg"]]) ## From measurements ## Ticks = 1 / 32 in, with margin about 1.5 / 32 ## Title = 3 / 32 in (6 pt) ## Legend Labels = 2.5 / 32 in (5pt) ## Axis Labels = 2 ## Axis Titles and other text ~ 2 ## Margins: Top / Bottom = 6 / 32, sides = 5 / 32 ret <- theme_foundation(base_size = base_size, base_family = base_family) + theme(line = element_line(colour = "black"), rect = element_rect(fill = bgcolors["ebg"], colour = NA, linetype = 1), text = element_text(colour = "black"), ## Axis axis.line = element_line(linewidth = rel(0.8)), axis.line.y = element_blank(), axis.text = element_text(size = rel(1)), axis.text.x = element_text(vjust = 0, margin = margin(t = base_size, unit = "pt")), axis.text.x.top = element_text(vjust = 0, margin = margin(b = base_size, unit = "pt")), axis.text.y = element_text(hjust = 0, margin = margin(r = base_size, unit = "pt")), ## I cannot figure out how to get ggplot to do 2 levels of ticks ## axis.ticks.margin = unit(3 / 72, "in"), axis.ticks = element_line(), axis.ticks.y = element_blank(), axis.title = element_text(size = rel(1)), axis.title.x = element_text(), axis.title.y = element_text(angle = 90), # axis.ticks.length = unit( -1/32, "in"), axis.ticks.length = unit( -base_size * 0.5, "points"), legend.background = element_rect(linetype = 0), legend.spacing = unit(base_size * 1.5, "points"), legend.key = element_rect(linetype = 0), legend.key.size = unit(1.2, "lines"), legend.key.height = NULL, legend.key.width = NULL, legend.text = element_text(size = rel(1.25)), legend.title = element_text(size = rel(1), hjust = 0), legend.position = "top", legend.direction = NULL, legend.justification = "center", ## legend.box = element_rect(fill = palette_economist['bgdk'], ## colour=NA, linetype=0), ## Economist only uses vertical lines panel.background = element_rect(linetype = 0), panel.border = element_blank(), panel.grid.major = element_line(colour = "white", linewidth = rel(1.75)), panel.grid.minor = element_blank(), panel.spacing = unit(0.25, "lines"), strip.background = element_rect(fill = bgcolors["ebg"], colour = NA, linetype = 0), strip.text = element_text(size = rel(1.25)), strip.text.x = element_text(), strip.text.y = element_text(angle = -90), plot.background = element_rect(fill = bgcolors["blue-gray"], colour = NA), plot.title = element_text(size = rel(1.5), hjust = 0, face = "bold"), plot.margin = unit(c(6, 5, 6, 5) * 2, "points"), complete = TRUE) if (horizontal) { ret <- ret + theme(panel.grid.major.x = element_blank()) } else { ret <- ret + theme(panel.grid.major.y = element_blank()) } if (dkpanel == TRUE) { ret <- ret + theme(panel.background = element_rect(fill = unname(bgcolors["dark blue-gray"])), strip.background = element_rect(fill = unname(bgcolors["dark blue-gray"]))) } ret } #' @rdname theme_economist #' @export theme_economist_white <- function(base_size = 11, base_family = "sans", gray_bg = TRUE, horizontal = TRUE) { if (gray_bg) { bgcolor <- get_colors(c("economist", "bg"), "light gray") } else { bgcolor <- "white" } theme_economist(base_family = base_family, base_size = base_size, horizontal = horizontal) + theme(rect = element_rect(fill = bgcolor), plot.background = element_rect(fill = bgcolor), panel.background = element_rect(fill = "white"), panel.grid.major = element_line(colour = get_colors(c("economist", "bg"), "dark gray")), strip.background = element_rect(fill = "white")) } ggthemes/R/banking.R0000644000176200001440000000767714561020226014031 0ustar liggesusers## 45 degrees in radians FORTY_FIVE <- base::pi / 4 calc_slopes <- function(x, y, cull = FALSE) { dx <- abs(diff(x)) dy <- diff(y) s <- dy / dx touse <- if (cull) { abs(s) > 0 & is.finite(s) } else { is.finite(s) } list(s = s[touse], dx = dx[touse], dy = dy[touse], Rx = diff(range(x)), Ry = diff(range(y))) } #' Bank Slopes to 45 degrees #' #' Calculate the optimal aspect ratio of a line graph by banking the #' slopes to 45 degrees as suggested by W.S. Cleveland. This #' maximizes the ability to visually differentiate differences in #' slope. This function will calculate the optimal aspect ratio for #' a line plot using any of the methods described in Herr and Argwala #' (2006). In their review of the methods they suggest using median #' absolute slope banking ('ms'), which produces aspect ratios which #' are generally the median of the various methods provided here. #' #' @param x x values #' @param y y values #' @param cull \code{logical}. Remove all slopes of 0 or \code{Inf}. #' @param method One of 'ms' (Median Absolute Slope) or 'as' (Average #' Absolute Slope). Other options are no longer supported, and will use #' 'ms' instead with a warning. #' @param weight No longer used, but kept for backwards compatibility. #' @param ... No longer used, but kept for backwards compatibility. #' #' @section Methods: #' #' As written, all of these methods calculate the aspect ratio (x #' /y), but \code{bank_slopes} will return (y / x) to be compatible #' with \code{link[ggplot2]{coord_fixed()}}. #' #' \strong{Median Absolute Slopes Banking} #' #' Let the aspect ratio be \eqn{\alpha = \frac{w}{h}}{alpha = w / h} #' then the median absolute slop banking is the #' \eqn{\alpha}{alpha} such that, #' \deqn{ #' median \left| \frac{s_i}{\alpha} \right| = 1 #' }{ #' median |s_i / alpha| #' } #' #' Let \eqn{R_z = z_{max} - z_{min}}{R_z = z_max - z_min} for \eqn{z = x, y}, #' and \eqn{M = median \| s_i \|}{M = median | s_i |}. Then, #' \deqn{ #' \alpha = M \frac{R_x}{R_y} #' }{ #' alpha = M R_x / R_y #' } #' #' \strong{Average Absolute Slope Banking} #' #' Let the aspect ratio be \eqn{\alpha = \frac{w}{h}}{alpha = w/h}. #' then the mean absolute slope banking is the #' \eqn{\alpha}{alpha} such that, #' \deqn{ #' mean \left| \frac{s_i}{\alpha} \right| = 1 #' }{ #' mean |s_i / alpha| = 1 #' } #' #' Heer and Agrawala (2006) and Cleveland discuss several other methods #' including average (weighted) orientation, and global and local orientation resolution. #' These are no longer implemented in this function. In general, either the #' median or average absolute slopes will produce reasonable results without #' requiring optimization. #' #' @references #' Cleveland, W. S., M. E. McGill, and R. McGill. The Shape Parameter #' of a Two-Variable Graph. Journal of the American Statistical #' Association, 83:289-300, 1988 #' #' Heer, Jeffrey and Maneesh Agrawala, 2006. 'Multi-Scale Banking to 45' #' IEEE Transactions On Visualization And Computer Graphics. #' #' Cleveland, W. S. 1993. 'A Model for Studying Display Methods of Statistical #' Graphs.' Journal of Computational and Statistical Graphics. #' #' Cleveland, W. S. 1994. The Elements of Graphing Data, Revised Edition. #' #' @return \code{numeric} The aspect ratio (x , y). #' #' @seealso \code{\link[lattice]{banking}()} #' @export #' @example inst/examples/ex-bank_slopes.R bank_slopes <- function(x, y, cull = FALSE, weight = NULL, method = c("ms", "as"), ...) { method <- match.arg(method) FUN <- bank_slopes_funs[[method]] # Heer produces functions with the target alpha = w/h = x/y xyrat <- FUN(calc_slopes(x, y, cull = cull), ...) # but coord_fixed ratio is the aspect ratio y/x 1 / xyrat } bank_slopes_funs <- list() bank_slopes_funs[["ms"]] <- function(slopes, ...) { median(abs(slopes$s)) * slopes$Rx / slopes$Ry } bank_slopes_funs[["as"]] <- function(slopes, ...) { mean(abs(slopes$s)) * slopes$Rx / slopes$Ry } ggthemes/R/theme-solid.R0000644000176200001440000000127114561051016014613 0ustar liggesusers#' Theme with nothing other than a background color #' #' Theme that removes all non-geom elements (lines, text, etc), #' This theme is when only the geometric objects are desired. #' #' @param base_size Base font size. #' @param base_family Ignored, kept for consistency with \code{\link{theme}()}. #' @param fill Background color of the plot. #' @family themes #' @example inst/examples/ex-theme_solid.R #' @export theme_solid <- function(base_size = 12, base_family = "", fill = NA) { theme_foundation() + theme(line = element_blank(), text = element_blank(), rect = element_rect(fill = fill, linewidth = base_size, colour = NA, linetype = 0)) } ggthemes/R/theme-foundation.R0000644000176200001440000000301214561020226015641 0ustar liggesusers#' Foundation Theme #' #' This theme is designed to be a foundation from which to build new #' themes, and not meant to be used directly. \code{theme_foundation()} #' is a complete theme with only minimal number of elements defined. #' It is easier to create new themes by extending this one rather #' than \code{\link[ggplot2]{theme_gray}()} or \code{\link[ggplot2]{theme_bw}()}, #' because those themes define elements deep in the hierarchy. #' #' This theme takes \code{\link[ggplot2]{theme_gray}()} and sets all #' \code{colour} and \code{fill} values to \code{NULL}, except for the top-level #' elements (\code{line}, \code{rect}, and \code{title}), which have #' \code{colour = "black"}, and \code{fill = "white"}. This leaves the spacing #' and-non colour defaults of the default \pkg{ggplot2} themes in place. #' #' @inheritParams ggplot2::theme_grey #' #' @family themes #' @export #' @importFrom ggplot2 theme_grey theme_foundation <- function(base_size=12, base_family="") { thm <- theme_grey(base_size = base_size, base_family = base_family) for (i in names(thm)) { if ("colour" %in% names(thm[[i]])) { thm[[i]]["colour"] <- list(NULL) } if ("fill" %in% names(thm[[i]])) { thm[[i]]["fill"] <- list(NULL) } } thm + theme(panel.border = element_rect(fill = NA), legend.background = element_rect(colour = NA), line = element_line(colour = "black"), rect = element_rect(fill = "white", colour = "black"), text = element_text(colour = "black")) } ggthemes/R/canva.R0000644000176200001440000000435614561020226013477 0ustar liggesusers#' 150 Color Palettes from Canva #' #' 150 four-color palettes by the #' \href{https://www.canva.com/learn/}{canva.com} design school. #' These palettes were derived from photos and "impactful websites". #' #' @format A named \code{list} of character vector. #' The names are the palette names. The values of the character vectors #' are hex colors, e.g. \code{"#f98866"}. #' #' @references #' \itemize{ #' \item{Janie Kliever, \href{https://www.canva.com/learn/100-color-combinations/}{100 Brilliant Color Combinations and How to Apply Them to Your Designs}, #' \emph{Canva.com}, June 20, 2015.} #' \item{Mary Stribley, \href{https://www.canva.com/learn/website-color-schemes/}{Website Color Schemes: The Palettes of 50 Visually Impactful Websites to Inspire You}, #' \emph{Canva.com}, January 26, 2016.} #' \item{Schwabish, Jonathan. #' \href{https://policyviz.com/2017/01/12/150-color-palettes-for-excel/}{150+ Color Palettes for Excel}, #' \emph{PolicyViz}, January 12, 2017.} #' } #' @example inst/examples/ex-canva_pal.R "canva_palettes" #' Canva.com color palettes #' #' 150+ color palettes from canva.com. See \code{\link{canva_palettes}()}. #' #' @param palette Palette name. See the names of \code{\link{canva_palettes}()} #' for valid names. #' @return A function that takes a single value, the number of colors to use. #' @export #' @example inst/examples/ex-canva_pal.R canva_pal <- function(palette = "Fresh and bright") { if (!palette %in% names(ggthemes::canva_palettes)) { stop("Palette ", sQuote(palette), " not a valid name.", call. = FALSE) } manual_pal(unname(ggthemes::canva_palettes[[palette]])) } #' Discrete color scale using canva.com color palettes #' #' Color scale for canva.com color palettes described in #' \code{\link{canva_palettes}()}. #' #' @param ... Arguments passed to \code{\link{discrete_scale}()}. #' @inheritParams canva_pal #' @export scale_colour_canva <- function(..., palette = "Fresh and bright") { discrete_scale("colour", "canva", canva_pal(palette), ...) } #' @export #' @rdname scale_colour_canva scale_color_canva <- scale_colour_canva #' @export #' @rdname scale_colour_canva scale_fill_canva <- function(..., palette = "Fresh and bright") { discrete_scale("fill", "canva", canva_pal(palette), ...) } ggthemes/R/tufte.R0000644000176200001440000000312114561020226013523 0ustar liggesusers#' Tufte Maximal Data, Minimal Ink Theme #' #' Theme based on Chapter 6 'Data-Ink Maximization and Graphical #' Design' of Edward Tufte *The Visual Display of Quantitative #' Information*. No border, no axis lines, no grids. This theme works #' best in combination with \code{\link{geom_rug}()} or #' \code{\link{geom_rangeframe}()}. #' #' @note #' The default font family is set to 'serif' as he uses serif fonts #' for labels in 'The Visual Display of Quantitative Information'. #' The serif font used by Tufte in his books is a variant of Bembo, #' while the sans serif font is Gill Sans. If these fonts are #' installed on your system, then you can use them with the package #' \bold{extrafont}. #' #' @inheritParams ggplot2::theme_grey #' @param ticks \code{logical} Show axis ticks? #' #' @references Tufte, Edward R. (2001) The Visual Display of #' Quantitative Information, Chapter 6. #' #' @family themes tufte #' @example inst/examples/ex-theme_tufte.R #' @export #' @importFrom ggplot2 theme_bw theme_tufte <- function(base_size = 11, base_family = "serif", ticks = TRUE) { ## TODO: start with theme_minimal ret <- theme_bw(base_family = base_family, base_size = base_size) + theme(legend.background = element_blank(), legend.key = element_blank(), panel.background = element_blank(), panel.border = element_blank(), strip.background = element_blank(), plot.background = element_blank(), axis.line = element_blank(), panel.grid = element_blank()) if (!ticks) { ret <- ret + theme(axis.ticks = element_blank()) } ret } ggthemes/R/shapes.R0000644000176200001440000001400314561051016013661 0ustar liggesusers#' Shape palette from Cleveland "Elements of Graphing Data" (discrete). #' #' Shape palettes for overlapping and non-overlapping points. #' #' @param overlap \code{logical} Use the scale for overlapping points? #' #' @note #' #' In the \emph{Elements of Graphing Data}, W.S. Cleveland suggests #' two shape palettes for scatter plots: one for overlapping data and #' another for non-overlapping data. The symbols for overlapping data #' relies on pattern discrimination, while the symbols for #' non-overlapping data vary the amount of fill. This palette #' attempts to create these palettes. However, I found that these #' were hard to replicate. Using the R shapes and unicode fonts: the #' symbols can vary in size, they are dependent of the fonts used, #' and there does not exist a unicode symbol for a circle with a #' vertical line. If someone can improve this palette, please let me #' know. #' #' Following Tremmel (1995), I replace the circle with a vertical #' line with an encircled plus sign. #' #' The palette \code{cleveland_shape_pal()} supports up to five values. #' #' @example inst/examples/ex-cleveland_shape_pal.R #' @references #' Cleveland WS. \emph{The Elements of Graphing Data}. Revised Edition. Hobart Press, Summit, NJ, 1994, pp. 154-164, 234-239. #' #' Tremmel, Lothar, (1995) "The Visual Separability of Plotting Symbols in Scatterplots", \emph{Journal of Computational and Graphical Statistics}, #' \url{https://www.jstor.org/stable/1390760} #' #' @family shapes #' @export cleveland_shape_pal <- function(overlap = TRUE) { shapes <- if (overlap[[1]]) { ggthemes::ggthemes_data$shapes$cleveland$overlap$pch } else { ggthemes::ggthemes_data$shapes$cleveland$default$pch } max_n <- length(shapes) f <- manual_pal(shapes) attr(f, "max_n") <- max_n f } #' Shape scales from Cleveland "Elements of Graphing Data" #' #' @inheritParams ggplot2::scale_x_discrete #' @inheritParams cleveland_shape_pal #' @export #' #' @family shapes #' @seealso \code{\link{cleveland_shape_pal}()} for a description of the palette. #' @references #' Cleveland WS. The Elements of Graphing Data. Revised Edition. #' Hobart Press, Summit, NJ, 1994, pp. 154-164, 234-239. #' scale_shape_cleveland <- function(overlap = TRUE, ...) { discrete_scale("shape", "cleveland", cleveland_shape_pal(overlap), ...) } #' Filled Circle Shape palette (discrete) #' #' @description #' `r lifecycle::badge("deprecated")` #' #' This function was deprecated because unicode glyphs used for the circles #' vary in size, making them unusable for plotting. #' #' Shape palette with circles varying by amount of fill. This uses #' the set of 3 circle fill values in Lewandowsky and Spence (1989): #' solid, hollow, half-filled, with two additional fill amounts: #' three-quarters, and one-quarter. #' #' This palette supports up to five values. #' #' @references #' Lewandowsky, Stephan and Ian Spence (1989) #' "Discriminating Strata in Scatterplots", Journal of #' the American Statistical Association, \url{https://www.jstor.org/stable/2289649} #' @family shapes #' @importFrom lifecycle deprecate_soft #' @export circlefill_shape_pal <- function() { deprecate_soft("5.0.0", "circlefill_shape_pal()") values <- ggthemes::ggthemes_data[["shapes"]][["circlefill"]][["pch"]] max_n <- length(values) f <- manual_pal(values) attr(f, "max_n") <- max_n f } #' Filled Circle Shape palette (discrete) #' #' @description #' `r lifecycle::badge("deprecated")` #' #' @export #' #' @inheritParams ggplot2::scale_x_discrete #' @family shapes #' @importFrom lifecycle deprecate_soft #' @seealso #' \code{\link{circlefill_shape_pal}()} for a description of the palette. scale_shape_circlefill <- function(...) { deprecate_soft("5.0.0", "scale_shape_circlefill()") discrete_scale("shape", "circlefill", circlefill_shape_pal(), ...) } #' Shape palette from Tremmel (1995) (discrete) #' #' Based on experiments Tremmel (1995) suggests the following shape palettes: #' #' If two symbols, then use a solid circle and plus sign. #' #' If three symbols, then use a solid circle, empty circle, and an #' empty triangle. However, that set of symbols does not satisfy the #' requirement that each symbol should differ from the other symbols #' in the same feature dimension. A set of three symbols that #' satisfies this is a circle (curvature), plus sign (number of #' terminators), triangle (line orientation). #' #' This palette supports up to three values. #' If more than three groups of data, then separate the groups into #' different plots. #' #' @param overlap use an empty circle instead of a solid circle when #' \code{n == 2}. #' @param alt If \code{TRUE}, then when \code{n == 3}, #' use a solid circle, plus sign and #' empty triangle. Otherwise use a solid circle, empty circle, and empty #' triangle. #' @family shapes #' @references #' Tremmel, Lothar, (1995) "The Visual Separability of Plotting Symbols in Scatterplots" #' Journal of Computational and Graphical Statistics, #' \url{https://www.jstor.org/stable/1390760} #' @export tremmel_shape_pal <- function(overlap = FALSE, alt = FALSE) { max_n <- 3L palettes <- ggthemes::ggthemes_data$shapes$tremmel f <- function(n) { check_pal_n(n, max_n) if (n == 1) { palettes[["1"]]$pch } else if (n == 2) { if (overlap[[1]]) { palettes[["2-overlap"]]$pch } else { palettes[["2"]]$pch } } else if (n >= 3) { out <- rep(NA_integer_, n) out[1:3] <- if (alt) { palettes[["3-alternate"]]$pch } else { palettes[["3"]]$pch } out } } attr(f, "max_n") <- max_n f } #' Shape scales from Tremmel (1995) #' #' @inheritParams ggplot2::scale_x_discrete #' @inheritParams tremmel_shape_pal #' #' @seealso \code{\link{tremmel_shape_pal}()} for a description of the palette. #' @example inst/examples/ex-scale_shape_tremmel.R #' @family shapes #' @export scale_shape_tremmel <- function(overlap=FALSE, alt=TRUE, ...) { discrete_scale("shape", "tremmel", tremmel_shape_pal(overlap = overlap, alt = alt), ...) } ggthemes/R/gdocs.R0000644000176200001440000000722114561020226013500 0ustar liggesusers#' Theme with Google Docs Chart defaults #' #' Theme similar to the default look of charts in Google Docs. #' #' @inheritParams ggplot2::theme_grey #' @export #' @family themes gdocs #' @example inst/examples/ex-theme_gdocs.R theme_gdocs <- function(base_size = 12, base_family="sans") { ltgray <- "#cccccc" dkgray <- "#757575" dkgray2 <- "#666666" theme_foundation(base_size = base_size, base_family = base_family) + theme(rect = element_rect(colour = "black", fill = "white"), line = element_line(colour = "black"), text = element_text(colour = dkgray), # title is aligned left, 20 point Roboto Font, plain plot.title = element_text(face = "plain", size = rel(20 / 12), hjust = 0, colour = dkgray), # No subtitle or captions, so treat like other text plot.subtitle = element_text(hjust = 0, size = rel(1), face = "plain", colour = dkgray), plot.caption = element_text(hjust = 0, size = rel(1), face = "plain", colour = dkgray), panel.background = element_rect(fill = NA, colour = NA), panel.border = element_rect(fill = NA, colour = NA), # no strips in gdocs, so make similar to axis titles strip.text = element_text(hjust = 0, size = rel(1), colour = dkgray2, face = "plain"), strip.background = element_rect(colour = NA, fill = NA), # axis titles: Roboto 12pt, plain. axis.title = element_text(face = "plain", colour = dkgray2, size = rel(1)), # axis text: Roboto 12pt, plain axis.text = element_text(face = "plain", colour = dkgray, size = rel(1)), # only axis line on the x-axis. black. axis.line = element_line(colour = "black"), axis.line.y = element_blank(), # no axis ticks axis.ticks = element_blank(), # grid lines on both x and y axes. light gray. no minor gridlines panel.grid.major = element_line(colour = ltgray), panel.grid.minor = element_blank(), # legend has no border legend.background = element_rect(colour = NA), # legend labels: Roboto 12, dark gray legend.text = element_text(size = rel(1), colour = dkgray), # no legend title - use same as legend text legend.title = element_text(size = rel(1), colour = dkgray2, face = "plain"), legend.key = element_rect(colour = NA), legend.position = "right", legend.direction = "vertical" ) } #' Google Docs color palette (discrete) #' #' Color palettes from Google Docs. #' This palette includes 20 colors. #' #' @family colour gdocs #' @export #' @example inst/examples/ex-gdocs_pal.R gdocs_pal <- function() { values <- ggthemes::ggthemes_data$gdocs$colors$value f <- manual_pal(values) attr(f, "max_n") <- length(values) f } #' Google Docs color scales #' #' Color scales from Google Docs. #' #' @inheritParams ggplot2::scale_colour_hue #' @family colour gdocs #' @rdname scale_gdocs #' @export #' @seealso See \code{\link{theme_gdocs}()} for examples. scale_fill_gdocs <- function(...) { discrete_scale("fill", "gdocs", gdocs_pal(), ...) } #' @export #' @rdname scale_gdocs scale_colour_gdocs <- function(...) { discrete_scale("colour", "gdocs", gdocs_pal(), ...) } #' @export #' @rdname scale_gdocs scale_color_gdocs <- scale_colour_gdocs ggthemes/R/ggthemes_data.R0000644000176200001440000000033014561020226015167 0ustar liggesusers#' Palette and theme data #' #' The \code{ggthemes} environment contains various values used in #' themes and palettes. This is undocumented and subject to change. #' #' @format A \code{list} object. "ggthemes_data" ggthemes/R/stat-fivenumber.R0000644000176200001440000000666314561050522015527 0ustar liggesusers#' Calculate components of a five-number summary #' #' The five number summary of a sample is the minimum, first quartile, #' median, third quartile, and maximum. #' #' @param na.rm If \code{FALSE} (the default), removes missing values with #' a warning. If \code{TRUE} silently removes missing values. #' @param probs Quantiles to use for the five number summary. #' @inheritParams ggplot2::stat_identity #' @return A data frame with additional columns: #' \item{width}{width of boxplot} #' \item{min}{minimum} #' \item{lower}{lower hinge, 25\% quantile} #' \item{middle}{median, 50\% quantile} #' \item{upper}{upper hinge, 75\% quantile} #' \item{max}{maximum} #' @seealso \code{\link[ggplot2]{stat_boxplot}()} #' @export stat_fivenumber <- function(mapping = NULL, data = NULL, geom = "boxplot", probs = c(0, 0.25, 0.5, 0.75, 1), na.rm = FALSE, position = "identity", show.legend = NA, inherit.aes = TRUE, ...) { layer( data = data, mapping = mapping, stat = StatFivenumber, geom = geom, position = position, show.legend = show.legend, inherit.aes = inherit.aes, params = list( probs = probs, na.rm = na.rm, ... ) ) } # From ggplot2:::NO_GROUP NO_GROUP <- -1 # Copied from ggplot2:::has_groups has_groups <- function(data) { data$group[1L] != NO_GROUP } #' @export #' @format NULL #' @usage NULL #' @rdname stat_fivenumber #' @importFrom ggplot2 resolution remove_missing StatFivenumber <- ggplot2::ggproto("StatFivenumber", ggplot2::Stat, required_aes = "y", non_missing_aes = "weight", setup_data = function(data, params) { data$x <- data$x %||% 0 data <- remove_missing( data, na.rm = FALSE, vars = "x", name = "stat_fivenumber" ) data }, setup_params = function(data, params) { params$width <- params$width %||% (resolution(data$x %||% 0) * 0.75) if (is.double(data$x) && !has_groups(data) && any(data$x != data$x[1L])) { warning( "Continuous x aesthetic -- did you forget aes(group=...)?", call. = FALSE) } params }, compute_group = function(data, scales, width = NULL, na.rm = FALSE, probs = c(0, 0.25, 0.5, 0.75, 1)) { if (length(probs) != 5) { stop("'probs' should contain 5 quantiles.") } probs <- sort(probs) if (!is.null(data$weight)) { if (!requireNamespace("quantreg", quietly = TRUE)) { stop("Package 'quantreg' is required for compute_group() with weights.") } mod <- quantreg::rq(y ~ 1, weights = weight, tau = probs, data = data) stats <- as.numeric(stats::coef(mod)) } else { stats <- as.numeric(quantile(data$y, probs = probs)) } names(stats) <- c("ymin", "lower", "middle", "upper", "ymax") df <- as.data.frame(as.list(stats)) if (is.null(data$weight)) { n <- sum(!is.na(data$y)) } else { # Sum up weights for non-NA positions of y and weight n <- sum(data$weight[!is.na(data$y) & !is.na(data$weight)]) } df$x <- if (is.factor(data$x)) data$x[1] else mean(range(data$x)) df$width <- width df$relvarwidth <- sqrt(n) df } ) ggthemes/NEWS.md0000644000176200001440000002347014561310337013164 0ustar liggesusers# ggthemes 5.1.0 - Updated `scale_color_gdocs` and `gdocs_pal` to use current colors. Palette extended from 10 to 24 colors. - Updated tests to be compatible with ggplot 3.5.0 (#153) - Removed `legend.title.align` and `legend.text.align` from themes. (#153) # ggthemes 5.0.0 - Deprecate `circlefill_shape_pal` and `scale_shape_circlefill` - Bugfix: Fix failing CRAN tests. Shape scales and palettes could fail if glyphs unavailable in graphics devices. - Bugfix: Add alias to `ggthemes-package` - Add `quantreg` to suggested packages # ggthemes 4.2.3 - Fixing URLs for CRAN submission again. # ggthemes 4.2.2 - Fixing URLs for CRAN submission. # ggthemes 4.2.1 - Conditionally use the vdiffr package in tests so it complies with suggested package policy (#124) - Fix error in `expect_equal` functions (#123) - Fix errors in `geom_tufteboxplot` and `stat_fivenumber` due to missing imported objects from ggplot2 (#117, #121) - Fix text labels in top axis in `theme_economist` (#115) - Update documentation on `geom_rangeframe`; it should be used with `coord_cartesian(clip="off")`. (#120) # ggthemes 4.2.0 - Add `theme_clean()` (Thanks @konradzdeb, #105) - Add `direction` argument to `scale_color_tableau()` and `scale_fill_tableau()` (Thanks @vadimus202, #112) # ggthemes 4.1.1 - Fix bugs in `geom_rangeframe` and `geom_tufteboxplot` caused by failing to import `alpha`. (Thanks @flying-sheep, #110) # ggthemes 4.1.0 - Add `type` argument to `scale_color_tableau` so that sequential and diverging palettes can be used in discrete scales. (Thanks @onesandzeroes, #108) - Fix colors in "Purple" and "Blue-Teal" palettes in `tableau_color_pal()`. (Thanks @leonawicz, #109) # ggthemes 4.0.1 - Fix bugs in `tableau_color_pal()`. Wrong colors in "Tableau 20" theme (Thanks @friskin, #95), and incorrect order of classic color palettes (Thanks @luca-scr, #96). - Fix fatal bug in `theme_solarized()` and `solarized_rebase()`. (Thanks @mdodrill-usgs, #97) # ggthemes 4.0.0 - Added palettes and based on current versions of Excel: `excel_pal_new()`, `scale_colour_excel_new()`, and `scale_fill_excel_new()`. Excel '97 based scales keep the same names. - Added `theme_excel_new()` which is based on the chart defaults of current versions of Excel. - Added Tableau 10 palettes and renamed old palettes in `tableau_color_pal()`, `scale_color_tableau()`, `scale_fill_tableau()`, and others. The continuous sequential and diverging palettes are improved by including more intermediate steps. - Updated `theme_gdocs()` to current look. - Updated `scale_color_gdocs()` and `fill_color_gdocs()` to current color. - Added `scale_shapes_few()` and `few_shape_pal()` with a shape scale and palette from Stephen Few's "Show Me the Numbers". - Removed `stata` argument from `scale_*_economist()` and `theme_economist()`. - Changed the format of the `ggthemes_data` object. - Changed behavior of `few_pal()`. If `n = 1`, use gray. If `n > 1` use non-gray colors. - Changed `tremmel_shape_scale()` to use `alt = TRUE` by default - Deprecated `tremmel_shape_scale()` argument `n3alt`. Use the `alt` argument instead. - Added a pkgdown site. - Removed vignette. Move all examples to man pages. - Bugfix: Fix `theme_few()` (#91) - Bugfix: Update themes to be consistent with `ggplot>=3.2.0` # ggthemes 3.5.0 - Bugfix: Fix RGB colors in `scale_color_few()`, `scale_fill_few()`, and `few_pal()` (#89, @bpbraun) - Update documentation to include mentions of the maximum number of values that discrete scales support (#85) # ggthemes 3.4.2 - Bugfix: Fix example code in `theme_economist()`. Thanks @carlganz #81. - Remove suggests dependencies: `reshape2`, `plyr`, `tidyverse` # ggthemes 3.4.1 - Bugfix: Resolve duplicate palette names in `canva_palettes()`. Thanks @Eluvias (#78) # ggthemes 3.4.0 - Add color palettes from canva.com: `canva_palettes()`, `canva_pal()`, `scale_colour_canva()`. - Use `NEWS.md` instead of `NEWS` - Update Economist examples to put y-axis on the right side. # ggthemes 3.3.0 - Update themes to changes in ggplot 2.1.0.9000. Thanks @juliasilge (#71) - `tufte_boxplot()` uses `position="dodge"` by default. Thanks @jgellar (#68) - Bugfix: Fix errors in `geom_rangeframe()` in new version of ggplot2. Thanks @coulmont (#70) # ggthemes 3.2.0 - Bugfix: In function `bank_slopes()`, remove methods `ao`, `gor`, and `lor`. These methods were not producing reliable results, and should not produce results much different than `ms` or `as`. If used, they will produce a warning, and `ms` will be used instead. (#68) # ggthemes 3.1.0 - Add `ptol_pal()`, `scale_colour_ptol()`, and `scale_file_ptol()` based on Paul Tol's qualitative color palettes. Thanks @jmlondon. (#65) # ggthemes 3.0.4 - Fix panel.grid.major.y colors for `theme_hc()`. Thanks @flying-sheep! (#64) # ggthemes 3.0.3 - Bugfix: remove `lintr` tests that broke with new `testthat`. # ggthemes 3.0.2 - Bugfix: export `ggthemes_data()` # ggthemes 3.0.1 - Bugfix: Remove border around legends in `theme_gdocs()`. Thanks SandyMuspratt! Pull request #53. - Bugfix: Remove border around legends in `theme_calc()`. - Bugfix: Add colour and fill values to `theme_foundation()`. This restores its behavior to version 2.2.1. Fixes Issue #56. # ggthemes 3.0.0 - For `geom_tufteboxplot()` and `GeomTufteboxplot`, option `median.type` supports only `line` and `point` options. Added option `whisker.type` which allows for whiskers to be specified by lines or points. - Changed default stat for `geom_tufteboxplot()` to `stat_fivenumber()`. - Added `theme_base()` and `theme_par()` - Removed `scale_(x|y)_tufte()`. See issue #49 - `theme_foundation()` rewritten. Removed `use_sizes` argument. - Import rather than depend on `ggplot2` - Update geoms, scales, and themes to ggplot >= 2.0.0 # ggthemes 2.2.1 - bugfix: fix R CMD check notes due to change in how it handles non-base default packages: - bugfix: fix bad URLs # ggthemes 2.2.0 - Added `theme_map()` from @hrbrmstr # ggthemes 2.1.1 - bugfix: use title case in package title; refer to ggplot2 in title - bugfix: fix non-escaped URLs in colorblind.R - bugfix: fix broken URL in few.R - bugfix: remove non-ascii characters in shapes.R - bugfix: use `requireNamespace()` instead of `require()` # ggthemes 2.1.0 - New theme and scale based on Highcharts JS: `scale_*_hc()`, `theme_hc()`. Thanks jbkunst! # ggthemes 2.0.0 - New options for `geom_tufteboxplot()`. `median.type` takes values "point", "box", or "line". Option `usebox` is no longer supported, and equivalent to `median.type="box"`. Thanks weitzner! Issue #13, PR #19. - All theme functions have `base_size` and `base_family` as first two arguments. This affects `theme_economist_white()`, `theme_excel()`, `theme_pander()`, `theme_solid()`, and `theme_tufte()`. Thanks ptoche! Issue #25. - `theme_pander()`: Options `ff` and `fs` are deprecated; use `base_family` and `base_size` options instead, respectively. # ggthemes 1.9.0 - added vignette - added themes / scales based on factory defaults of pander package: `pander_palette()`, `scale_color_pander()`, `scale_fill_pander()`, `theme_pander()`. Thanks daroczig. - added additional fill and gradient color scales: `scale_fill_fivethirtyeight()`, `scale_colour_gradient_tableau()`, `scale_fill_gradient_tableau()`, `scale_fill_continuous_tableau()`, `scale_colour_gradient2_tableau()`, `scale_fill_gradient2_tableau()`. Thanks bowerth. # ggthemes 1.8.0 - added themes and color scale from fivethirtyeight.com: `theme_fivethirtyeight()`, `fivethirtyeight_pal()`, `scale_color_fivethirtyeight()` # ggthemes 1.7.0 - added a new breaks algorithm: `scales_extended_range_breaks()`, `extended_range_breaks()` - added scales which implement the breaks algorithm: `scale_x_tufte()`, `scale_y_tufte()` - added new label format: `smart_digits()`, `smart_digits_format()` # ggthemes 1.6.1 - fix bug in `theme_wsj()` (issue #17) # ggthemes 1.6.0 - added `theme_solid()` # ggthemes 1.5.1 - fix failures in R CMD check # ggthemes 1.5.0 - added alternative Solarized theme: `theme_solarized_2()` - `theme_solarized()`: adjusted the colors - added LibreOffic Calc themes and palettes: `theme_calc()`, `calc_pal()`, `scale_fill_calc()`, `scale_colour_calc()`, `cacl_shape_pal()`, `scale_shape_calc()` - added Google Docs themes and palettes: `theme_gdocs()`, `gdocs_pal()`, `scale_fill_gdocs()`, `scale_colour_gdocs()` - fixed some examples # ggthemes 1.4.0 - fix bug in default palettes of `scale_colour_excel()` and `scale_fill_excel()`. # ggthemes 1.3.4 - added Tableau sequential colour palettes: `tableau_seq_gradient_pal()`, `scale_colour_gradient_tableau()`, `scale_fill_gradient_tableau()`. - added Tableau diverging colour palettes: `tableau_div_gradient_pal()`, `scale_colour_gradient2_tableau()`, `scale_fill_gradient2_tableau()`. - `tableau_colour_pal()`: added palette "cyclical # ggthemes 1.3.3 - fix issue #11: error with fonts and `theme_wsj()` in Windows # ggthemes 1.3.1 - `bank_slopes()` returns y/x aspect ratio to be compatible with `coord_fixed()` - improved documentation # ggthemes 1.3.0 - renamed `theme_excel2003()` to `theme_excel()` - replace `scale_fill_excel2003()` and `scale_fill_excel10()` with `scale_fill_excel()` - replaced `scale_colour_excel2003()` and `scale_colour_excel10()` with `scale_colour_excel()` - replaced `excel2003_pal()` and `excel10_pal()` with `excel_pal()` - renamed `theme_base()` to `theme_foundation()` # ggthemes 1.2.0 - added colorblind scales: `colorblind_pal()`, `scale_*_colorblind()`. # ggthemes 1.1.0 - added Wall Street Journal themes, palettes, scales: `theme_wsj()`, `wsj_pal()`, `scale_colour_wsj()`, and `scale_fill_wsj()`. - added function `bank_slopes()` : methods for determining the optimal slope ratio. - added `theme-foundation()`: a theme designed to be easy to extend into new themes. - added NEWS file ggthemes/MD50000644000176200001440000003023514561541612012375 0ustar liggesusers0502e3a867eb05188db8276d91541b95 *DESCRIPTION 06445354ca5195932ea23adf7ab09015 *NAMESPACE 47f7b6bbc41f60cd174f6e374c1ec76b *NEWS.md ef516b8bef0b0cfb0e8313a4f44241cc *R/banking.R abe225f04cef62574aa796a87acc6d7a *R/base.R 39c326e5f5d0f2d2f797f2cb59021c20 *R/calc.R 6d58f9d27ee03b10e71b6aadc59cee00 *R/canva.R ab8d7d48fedaef923171f86f017ce5dd *R/clean.R 0485a184a9967335125fe078814d77e7 *R/colorblind.R f2554c34d85d2150fdf700a14e5d6fb1 *R/economist.R 8729443d7d497387aed50ec1de1752e9 *R/excel.R 2c3815848555d1c8458f824481c31000 *R/few.R bb143a2b152faad20f7ee87b1515ad02 *R/fivethirtyeight.R c054a122435d62bff93348629be61efc *R/gdocs.R 5254222701bd595f8d7864c0d6c05337 *R/geom-rangeframe.R c0101757d4a274ddd6727b1d6fd050de *R/geom-tufteboxplot.R cbdcec08a2412b2bd88ad2366e0ddec2 *R/ggthemes-package.R a37b58e707a70274853206ae66f7f668 *R/ggthemes_data.R 0d70c04ae5900d81e591bc28e4c92ad8 *R/hc.R 4671a00350588698c2397fb5622489be *R/igray.R 5bcb392fe615952e3a77e7623cb34c6a *R/pander.R 5944e858a54e36f5d5cf667cab206876 *R/ptol.R 1646edbd4899123fc58ce049d0e32d8b *R/scales.R 601f316d9f4a9620b2f6ea0c51424637 *R/shapes.R 45df0b7b6b4a5f22a41bb9cfbba87bf5 *R/show.R 1b0d44110bc4ca35e1b4adc7c4ef2af4 *R/solarized.R 598b6df2304584767598847806bcf02a *R/stat-fivenumber.R b517a9e60f3c5fa41b793aaba2bf1dab *R/stata.R 4f1ece7d15d5ed635ccab6b0fe1247a3 *R/tableau.R 84f8fb05368fbb8427d690aa3febb792 *R/theme-foundation.R f27ae450272f12528e07ffc653a92923 *R/theme-map.R 2b5209e16c11327aa68ba6859f2f93ad *R/theme-solid.R f8b67fe51e8d31bd2ab03efb70147dd7 *R/tufte.R 2d0ef6891848fdaa3880f18e80a61ab1 *R/utils.R d12020036d22364e6553b54097138429 *R/wsj.R 963510dad060aded6747873ff2b47366 *build/ggthemes.pdf 4452688862ab4170f345d241225ae07e *build/stage23.rdb 0ca3d6ffdc8f782e707f4c5e4e7779da *data/canva_palettes.rda 7dd53bfb17a6c9e2da330db96d475985 *data/ggthemes_data.rda e16801d4581e61f4dd25ee1a49617901 *inst/WORDLIST d217a660e1cf584f0a311bc7a79fe5a7 *inst/examples/ex-bank_slopes.R 8a7aa608a3f27bf71ee394e6904072d6 *inst/examples/ex-calc_pal.R e0d8396e5c078661c917db2416b0ad01 *inst/examples/ex-calc_shape_pal.R f951d6ad8e88cc808ce92bbfb9fb78f9 *inst/examples/ex-canva_pal.R b5a60817ad9d91b9e299ecea995c37a8 *inst/examples/ex-cleveland_shape_pal.R 7c4e68cf5eaa4a7fc1682a3181fafe0f *inst/examples/ex-colorblind.R b898bc5dce52c5825d16f46cc726fbf6 *inst/examples/ex-economist_pal.R b7fc2896898242ae68eb972ece9e5cf5 *inst/examples/ex-excel_new_pal.R 4953d0c35f4bda05bfd2e042d9cbdf20 *inst/examples/ex-excel_pal.R d4e6105c9128ac31dfaa5c895dbffc2d *inst/examples/ex-few_pal.R 97916233fd580dfdb6a472114b64d620 *inst/examples/ex-few_shape_pal.R 92e42499c32654ce543da988e6f1ab56 *inst/examples/ex-fivethirtyeight_pal.R 9905e88fe37aaef84840d77449679b07 *inst/examples/ex-gdocs_pal.R 1d2870d18db408889d3320565c522fa6 *inst/examples/ex-geom_rangeframe.R 98cfc73aa420e5d48e99072c2cf2a89c *inst/examples/ex-geom_tufteboxplot.R 8c5d0c33430555668fe9d0ceb37bf981 *inst/examples/ex-palette_pander.R aa47cf7e65727cf425fe694dd017bafa *inst/examples/ex-ptol_pal.R a63f2e674398a4f47f7d2f2d44be7db6 *inst/examples/ex-scale_color_tableau.R 88388911ca9e7570d4ef2b8ec587d631 *inst/examples/ex-scale_colour_excel_classic.R b895f8190ea94e4d742cddecf494dcc9 *inst/examples/ex-scale_colour_excel_new.R ebf66ca09cb9fbcb9d7ade32f1dcb450 *inst/examples/ex-scale_colour_gradient2_tableau.R 1c349e0e1a4de87536d534df4da6f417 *inst/examples/ex-scale_colour_gradient_tableau.R a9d71c1910ed43d147f1ff9a0d047856 *inst/examples/ex-scale_colour_ptol.R cb35e002caab3906e7870e36c0042aaa *inst/examples/ex-scale_linetype_stata.R aab0dfe35a113ebb095893f7a2ece1e5 *inst/examples/ex-scale_shape_stata.R bc9448ea74b6b85034ba6befdf495a28 *inst/examples/ex-scale_shape_tableau.R 1b7f685f9eb20fa89b89a11f26e3771e *inst/examples/ex-scale_shape_tremmel.R 8b69eac5a6521f259dd3beef33a29246 *inst/examples/ex-scale_solarized.R 088fbcb5ac12612aa1bf093a4a83e254 *inst/examples/ex-show_linetypes.R 7c24ec130d3ab12da38f38ef0b95029c *inst/examples/ex-show_shapes.R 1c8bbf7be026119b96a1beff3cc89770 *inst/examples/ex-solarized_pal.R 060f798e1f83b45edd335f086cbe86cd *inst/examples/ex-stata_pal.R 83c80b7ac0f626e90e0855ff37034b7f *inst/examples/ex-tableau_color_pal.R 5d0896a26893659962f21351c097dde6 *inst/examples/ex-tableau_div_gradient_pal.R 48a883f834c056dd2fc042cf2afe6965 *inst/examples/ex-tableau_seq_gradient_pal.R d9f66a4f7f05ccfc167334b8ebf2f204 *inst/examples/ex-tableau_shape_pal.R 463dff9392582f08b1ed1f9ec7b95c13 *inst/examples/ex-theme_base.R 06be20c3b39b5b3d561dd8eba3570266 *inst/examples/ex-theme_calc.R 3ade873b0052af4200cbe9030ff3df91 *inst/examples/ex-theme_clean.R 481e5524c372685f54b6f5b42592fa3a *inst/examples/ex-theme_economist.R 266b6768ac3d3240fd7f2286d9340b66 *inst/examples/ex-theme_excel.R 74540b17ce58c703d97a712028363f45 *inst/examples/ex-theme_excel_new.R 6b6d641d02c15fd7e12816cfb91183b8 *inst/examples/ex-theme_few.R aa03aa46f2357ef15ac4f3916862d575 *inst/examples/ex-theme_fivethirtyeight.R 15ec52ca9064f1a111dc7657840d30cc *inst/examples/ex-theme_gdocs.R e9a21478409254c049a0d78cf7a8c0e0 *inst/examples/ex-theme_hc.R 7631a1a8b1865c38ee2e98d882f2a1a1 *inst/examples/ex-theme_igray.R 9d9707fa0b12796f369c1141d5e41308 *inst/examples/ex-theme_map.R 4e313ef3a94e870f355a3ede6062e2d5 *inst/examples/ex-theme_pander.R e55e80fd4386a55ccd39bf136d862e26 *inst/examples/ex-theme_par.R aa7ef9cf6c3fb7370bb2a118018341c0 *inst/examples/ex-theme_solarized.R fe0a2ab5ab68487e3da919cce21a7fa7 *inst/examples/ex-theme_solid.R ff6faf71ef038d04cb311d088a86736d *inst/examples/ex-theme_stata.R 120d1aebef9f949845312aeb48c30494 *inst/examples/ex-theme_tufte.R 4a71389ed478d2986c9e7f247b868018 *inst/examples/ex-theme_wsj.R 192dab02abc6871bc2ae70432d23a0f5 *man/bank_slopes.Rd 4665ed6b93074c33ef0c24bc3c22a510 *man/calc_pal.Rd 90d4fb232e6385e492f9787a676e67a2 *man/calc_shape_pal.Rd 83a58dae32829b9f039e0be9e2f9d11d *man/canva_pal.Rd a1a64b1f9b02d3c6d07100d4341e3ebb *man/canva_palettes.Rd 029de3fcb37cc5c62d2cbc8864b8c112 *man/circlefill_shape_pal.Rd 2f23b96c01d38179da896c1e777d9052 *man/cleveland_shape_pal.Rd 9d4c890d48f41a9954313b74297c4ee3 *man/colorblind.Rd 77bf3324885a7eb667842738543a19c6 *man/economist_pal.Rd adf94a2243ba293d6b04d759ee4c988f *man/excel_new_pal.Rd d82f2a1e69c1edf414358ddf0b510a0c *man/excel_pal.Rd 2fd73a9d05d2f7ff369ad9c9dc8b9ed2 *man/few_pal.Rd 60ec6986bca1c54772229e5f31ae504e *man/few_shape_pal.Rd db2ec1462e0af723999952c03256d4b0 *man/fivethirtyeight_pal.Rd 966208907e3036e8b41f7f5bc667de94 *man/gdocs_pal.Rd cf3bed5828823e612c63a47ebe70ed90 *man/geom_rangeframe.Rd 91b1b61a685e96be703995eabc78edb1 *man/geom_tufteboxplot.Rd 32c44a8d133dddc34b382297c6d44da0 *man/ggthemes-package.Rd 3f3add9a59bd391152ccd6ae85513407 *man/ggthemes_data.Rd 4a9d6256e3ff347bc1db5deb24659be0 *man/hc_pal.Rd 13eb7ead192e3cd93e0f852c377422af *man/macros/funclink.Rd 347f4d4ddfc92021c3b845b375bb35cd *man/palette_pander.Rd 796fec73ccd2deb1af81831458d39801 *man/ptol_pal.Rd f0c606a80d9e3750246aa228dfea171a *man/range_breaks.Rd fe2a6d80e7913ffe5770e493305f9c57 *man/scale_calc.Rd e40402aa94fc46a585cb9a573bfd5664 *man/scale_color_tableau.Rd 03bf2d2ddf186c9991458f90ee22b80c *man/scale_colour_canva.Rd 87d10ad942fb77705bdca1fb2208f1a8 *man/scale_colour_gradient2_tableau.Rd 001030eb7492a8927ca49d467eff077f *man/scale_colour_gradient_tableau.Rd 7e2be6eac553280e4492de4a7d28ab61 *man/scale_economist.Rd df0008f985b39f807185d2db4211edf2 *man/scale_excel.Rd d73a7c486a0be22b811c71567a0f7523 *man/scale_excel_new.Rd 1ddcb729dc08af696b643788c193d606 *man/scale_few.Rd 7ef73e0cc2ad8f7ebf261aa88c2d79b6 *man/scale_fivethirtyeight.Rd 7ac1fa3058c0df49f2c4faaf3c0b7f9c *man/scale_gdocs.Rd fe811f31fb942e1a1ea2046865deabbc *man/scale_hc.Rd a1bc2f06ced7ab79cedfc9eb1280d05b *man/scale_linetype_stata.Rd 018ee48bb11fadd84f4a6dc674d9973a *man/scale_pander.Rd 207b360d8f90445adaacff66668e988d *man/scale_ptol.Rd c17c3a6acb9d5050feb51a87a9e29888 *man/scale_shape_calc.Rd 3db0a4e48cb65f549f48d2e1345484c4 *man/scale_shape_circlefill.Rd d19967b8c2abbd6b501ffbb16f19301b *man/scale_shape_cleveland.Rd a76894abc7faa02cce3cce483c58677c *man/scale_shape_few.Rd d42d2aaf70ceb7f29a0200ec867f6a6d *man/scale_shape_stata.Rd b543ff5d1e3246c31fc055333cb7009c *man/scale_shape_tableau.Rd 57de60a41353088c99a8d0887cffd2d5 *man/scale_shape_tremmel.Rd e4c5ac9e2667ae6a52751cd82eec8490 *man/scale_solarized.Rd cd5de862c4084f8208912574395989cd *man/scale_stata.Rd b58cff53eba3225627e568ee453af14e *man/scale_wsj.Rd 8f9069298329562e94c1bae6bdd64eba *man/show_linetypes.Rd 1693af21e63e3cff1b1fad2a5476de96 *man/show_shapes.Rd 3d0300f50600ec732ba2c18b94239b0b *man/smart_digits.Rd d33399382841aa5af8921a345e372a41 *man/solarized_pal.Rd 0461d57ce0b53527edc7df5589f2b80a *man/solarized_rebase.Rd 9afd024763f179a4a7ce1ea24e703927 *man/stat_fivenumber.Rd 4e481cc395024ec2950a8007663dcaeb *man/stata_linetype_pal.Rd b7f5e86788895fcae0bfac81a357bb46 *man/stata_pal.Rd 7502b35031401389a5e9da0b31c134f6 *man/stata_shape_pal.Rd d835081aac7ed7c4ed48f122104ef942 *man/tableau_color_pal.Rd d68bf0af11a746af0e8bcaa55cdbae0b *man/tableau_gradient_pal.Rd e692c711ef3af89b476a1cc1c12d3dfd *man/tableau_shape_pal.Rd 5c986cfa4e5ecd97b8ffb8db7452812a *man/theme_base.Rd 2f8aa087d58db7554510247a00be6334 *man/theme_calc.Rd 0d28040934ca95411b23aea586a61e4d *man/theme_clean.Rd 06e71d7a47bb7d5a398957f625dd45f1 *man/theme_economist.Rd d40f6fc22963351a7ac8af5bcd3bf061 *man/theme_excel.Rd 82440e4ed2591a6264692bd1ac0c2123 *man/theme_excel_new.Rd 7e058a7109f02d5f8ad1d8694f7eb84c *man/theme_few.Rd 44a523c058911c2dcd84e11a2b344cff *man/theme_fivethirtyeight.Rd 9d31458efaa17fed661a55c5f2c9483a *man/theme_foundation.Rd cbdfab37e751195aaada5daa6a0913a4 *man/theme_gdocs.Rd b626458e0c582193f1174cfee9a06c71 *man/theme_hc.Rd 47ae5c3efb2ca013fbd32205b60407fa *man/theme_igray.Rd 2a75b4d697f1daba7322f405d8df9257 *man/theme_map.Rd 1964fe9e1514d9e1145136d422a6feef *man/theme_pander.Rd 1dd3da786a5bd96ff289ee3e6e0278b5 *man/theme_par.Rd a2b530a7065bc0b6d9d618464b10f763 *man/theme_solarized.Rd cae14ced45c7de5e2ea01b2c2c9d0933 *man/theme_solid.Rd 5001b9fcdecc71fa32e26873dbc39f5a *man/theme_stata.Rd 94a94f89d4c2027394e04f3c62727e70 *man/theme_tufte.Rd f39a19c2f2cdbea98cb9122e00c842ff *man/theme_wsj.Rd da8c654244e381a5f2d4dbd352a7e7f5 *man/tremmel_shape_pal.Rd 0541b9d6c28bbc6d1277e6372156ecba *man/wsj_pal.Rd b0ab17eb094c0a55dc40999f1f0c666a *tests/figs/deps.txt 1638d9c9f506b9751d57a6602061eacc *tests/figs/few/theme-few.svg 0622a97a2aaa3c342f09636052c2d7f5 *tests/spelling.R c908b4274b1f5d2f7de933100504e3fa *tests/testthat.R 437d31c764eba376e2f277add7235f40 *tests/testthat/_snaps/few/theme-few.svg d3707b7d1498a0f2bd9423a5a319ccce *tests/testthat/_snaps/shapes.md 0887bfeb6df3f80057b3a19163e4eedb *tests/testthat/helper-utils.R 59b196c4b04ff45aaa54bd92c5eee473 *tests/testthat/helper-vdiffr.R 03aeb864c28e5a5359c2297e23325692 *tests/testthat/test-banking.R 8f2bec7bbca8f480ac1e9099509b026b *tests/testthat/test-base.R feadec5327804ddbfcd5719fb93c31c1 *tests/testthat/test-calc.R 30e05b1cadedd650a72b88bb0a8b925d *tests/testthat/test-canva.R 5b79d94fdc12a54bc9507b4b50c831e7 *tests/testthat/test-colorblind.R 371c90468702e05b46b7893f561d1212 *tests/testthat/test-economist.R 5bbe302de95b957f1131e4ad80af435e *tests/testthat/test-excel.R 6acd954e748a19132f83c8208f0bda4a *tests/testthat/test-few.R 41583f883ee87ba98b3a474b1d20c43a *tests/testthat/test-fivethirtyeight.R 8e4813a69f879b08d5038a1147aad741 *tests/testthat/test-gdocs.R 3a58f3ed0c78649f2609a69d38d772f0 *tests/testthat/test-geom-rangeframe.R 246f467758dac41b79593e2183584442 *tests/testthat/test-hc.R a7858ec0154be4dcff3bf3151102e2b1 *tests/testthat/test-igray.R be1309314f643952fae48a19d440e807 *tests/testthat/test-pander.R 0d9e5dc7b3f0e9a965bc12e38bbc0c41 *tests/testthat/test-ptol.R b65486706aed8a038b2d2c49211ff789 *tests/testthat/test-shapes.R 29ffe7411e6c9a7e422b1fa7e84b83a3 *tests/testthat/test-show.R 0e9ca3f149df289210b654164d405b0f *tests/testthat/test-solarized.R 316d10249af4e34406044c3c84b2f84e *tests/testthat/test-stat_fivenumber.R a99a9d746a33d804043ae78126cb869d *tests/testthat/test-stata.R 885dc367a4500e2541652978613f3381 *tests/testthat/test-tableau.R ba7dff72d36f2f11ebe866c01977dbf4 *tests/testthat/test-theme_map.R c87a24c24dd2b7637e6a241e5c18c572 *tests/testthat/test-theme_solid.R 17ce06aea7f53cd59e9e331d38ad3bb3 *tests/testthat/test-tufte.R 2f67253a6e0e972dc91ec8bc97972b81 *tests/testthat/test-tufteboxplot.R 155dff9726d756f4ca62df7de6b07484 *tests/testthat/test-wsj_pal.R ggthemes/inst/0000755000176200001440000000000014561051016013031 5ustar liggesusersggthemes/inst/examples/0000755000176200001440000000000014561304451014653 5ustar liggesusersggthemes/inst/examples/ex-theme_tufte.R0000644000176200001440000000054314561020227017717 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() + scale_x_continuous(breaks = extended_range_breaks()(mtcars$wt)) + scale_y_continuous(breaks = extended_range_breaks()(mtcars$mpg)) + ggtitle("Cars") p + geom_rangeframe() + coord_cartesian(clip="off") + theme_tufte() p + geom_rug() + theme_tufte(ticks = FALSE) ggthemes/inst/examples/ex-theme_stata.R0000644000176200001440000000107714561020227017707 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~ am) + labs(title = "Graphs by car type", x = "Weight (lbs.)", y = "MPG") # s2color p + theme_stata() + scale_colour_stata("s2color") # s2mono p + theme_stata(scheme = "s2mono") + scale_colour_stata("mono") # s1color p + theme_stata(scheme = "s2color") + scale_colour_stata("s1color") # s1rcolor p + theme_stata(scheme = "s1rcolor") + scale_colour_stata("s1rcolor") # s1mono p + theme_stata(scheme = "s1mono") + scale_colour_stata("mono") ggthemes/inst/examples/ex-theme_par.R0000644000176200001440000000040314561020227017345 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_par() # theme changes with respect to values of par par(font = 2, col.lab = "red", fg = "white", bg = "black") p + theme_par() ggthemes/inst/examples/ex-theme_gdocs.R0000644000176200001440000000024014561243271017667 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_gdocs() + scale_color_gdocs() ggthemes/inst/examples/ex-ptol_pal.R0000644000176200001440000000013414561020227017214 0ustar liggesuserslibrary("scales") show_col(ptol_pal()(6)) show_col(ptol_pal()(4)) show_col(ptol_pal()(12)) ggthemes/inst/examples/ex-tableau_color_pal.R0000644000176200001440000000036114561020227021053 0ustar liggesuserslibrary("scales") palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["regular"]] for (palname in names(palettes)) { pal <- tableau_color_pal(palname) max_n <- attr(pal, "max_n") show_col(pal(max_n)) title(main = palname) } ggthemes/inst/examples/ex-theme_wsj.R0000644000176200001440000000046114561020227017372 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + ggtitle("Diamond Prices") p + scale_colour_wsj("colors6", "") + theme_wsj() # Use a gray background instead p + scale_colour_wsj("colors6", "") + theme_wsj(color = "gray") ggthemes/inst/examples/ex-show_shapes.R0000644000176200001440000000013214561020227017723 0ustar liggesuserslibrary("scales") show_shapes(shape_pal()(5)) show_shapes(shape_pal()(3), labels = TRUE) ggthemes/inst/examples/ex-theme_map.R0000644000176200001440000000051414561020227017343 0ustar liggesuserslibrary("maps") library("ggplot2") us <- fortify(map_data("state"), region = "region") gg <- ggplot() + geom_map(data = us, map = us, aes(x = long, y = lat, map_id = region, group = group), fill = "white", color = "black", size = 0.25) + coord_map("albers", lat0 = 39, lat1 = 45) + theme_map() gg ggthemes/inst/examples/ex-calc_shape_pal.R0000644000176200001440000000010514561301156020321 0ustar liggesusers\dontrun{ library("ggplot2") show_shapes(calc_shape_pal()(13)) } ggthemes/inst/examples/ex-economist_pal.R0000644000176200001440000000015014561020227020234 0ustar liggesuserslibrary("scales") show_col(economist_pal()(6)) ## fill palette show_col(economist_pal(fill = TRUE)(6)) ggthemes/inst/examples/ex-theme_fivethirtyeight.R0000644000176200001440000000034414561020227022005 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + facet_wrap(~am) + geom_smooth(method = "lm", se = FALSE) + scale_color_fivethirtyeight() + theme_fivethirtyeight() p ggthemes/inst/examples/ex-scale_shape_tableau.R0000644000176200001440000000024314561277505021364 0ustar liggesusers\dontrun{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) p + scale_shape_tableau() } ggthemes/inst/examples/ex-fivethirtyeight_pal.R0000644000176200001440000000006614561020227021460 0ustar liggesuserslibrary("scales") show_col(fivethirtyeight_pal()(3)) ggthemes/inst/examples/ex-solarized_pal.R0000644000176200001440000000015714561020227020237 0ustar liggesuserslibrary("scales") show_col(solarized_pal()(2)) show_col(solarized_pal()(3)) show_col(solarized_pal("red")(4)) ggthemes/inst/examples/ex-theme_few.R0000644000176200001440000000054514561020227017353 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_few() + scale_colour_few() p + theme_few() + scale_colour_few("Light") p + theme_few() + scale_colour_few("Dark") ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + theme_few() + scale_shape_few() ggthemes/inst/examples/ex-scale_colour_excel_new.R0000644000176200001440000000025014561020227022104 0ustar liggesuserslibrary("ggplot2") ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + ggtitle("Cars") + theme_excel_new() + scale_colour_excel_new() ggthemes/inst/examples/ex-theme_base.R0000644000176200001440000000035714561020227017505 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_base() # Change values of par par(fg = "blue", bg = "gray", col.lab = "red", font.lab = 3) p + theme_base() ggthemes/inst/examples/ex-scale_color_tableau.R0000644000176200001440000000063114561020227021366 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + theme_igray() palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["regular"]] for (palette in head(names(palettes), 3L)) { print(p + scale_colour_tableau(palette) + ggtitle(palette)) } # the order of colour can be reversed p + scale_color_tableau(direction = -1) ggthemes/inst/examples/ex-theme_pander.R0000644000176200001440000000065414561020227020044 0ustar liggesusersrequire("ggplot2") if (require("pander")) { p <- ggplot(mtcars, aes(x = mpg, y = wt)) + geom_point() p + theme_pander() panderOptions("graph.grid.color", "red") p + theme_pander() p <- ggplot(mtcars, aes(wt, mpg, colour = factor(cyl))) + geom_point() p + theme_pander() + scale_color_pander() ggplot(mpg, aes(x = class, fill = drv)) + geom_bar() + scale_fill_pander() + theme_pander() } ggthemes/inst/examples/ex-gdocs_pal.R0000644000176200001440000000005514561250635017347 0ustar liggesuserslibrary("scales") show_col(gdocs_pal()(24)) ggthemes/inst/examples/ex-theme_economist.R0000644000176200001440000000157214561020227020573 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + # Economist puts x-axis labels on the right-hand side scale_y_continuous(position = "right") ## Standard p + theme_economist() + scale_colour_economist() # Change axis lines to vertical p + theme_economist(horizontal = FALSE) + scale_colour_economist() + coord_flip() ## White panel/light gray background p + theme_economist_white() + scale_colour_economist() ## All white variant p + theme_economist_white(gray_bg = FALSE) + scale_colour_economist() \dontrun{ ## The Economist uses ITC Officina Sans library("extrafont") p + theme_economist(base_family="ITC Officina Sans") + scale_colour_economist() ## Verdana is a widely available substitute p + theme_economist(base_family="Verdana") + scale_colour_economist() } ggthemes/inst/examples/ex-geom_rangeframe.R0000644000176200001440000000055214561020227020524 0ustar liggesuserslibrary("ggplot2") ggplot(mtcars, aes(wt, mpg)) + geom_point() + geom_rangeframe() + coord_cartesian(clip="off") + theme_tufte() # In the example above, # `coord_cartesian(clip="off")`` ensures that the full width of the line is drawn. # if you know a better way to fix this, # please open an issue or PR on github https://github.com/jrnold/ggthemes/issue ggthemes/inst/examples/ex-show_linetypes.R0000644000176200001440000000014614561020227020461 0ustar liggesuserslibrary("scales") show_linetypes(linetype_pal()(3)) show_linetypes(linetype_pal()(3), labels = TRUE) ggthemes/inst/examples/ex-scale_colour_excel_classic.R0000644000176200001440000000041014561020227022732 0ustar liggesuserslibrary("ggplot2") ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + ggtitle("Cars") + theme_excel() + scale_colour_excel() ggplot(diamonds, aes(x = clarity, fill = cut)) + geom_bar() + scale_fill_excel() + theme_excel() ggthemes/inst/examples/ex-tableau_div_gradient_pal.R0000644000176200001440000000045614561020227022401 0ustar liggesusersx <- seq(-1, 1, length = 100) r <- sqrt(outer(x ^ 2, x ^ 2, "+")) palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-diverging"]] for (palname in names(palettes)) { col <- tableau_div_gradient_pal(palname)(seq(0, 1, length = 12)) image(r, col = col) title(main = palname) } ggthemes/inst/examples/ex-scale_colour_gradient2_tableau.R0000644000176200001440000000076014561020227023515 0ustar liggesuserslibrary("ggplot2") df <- data.frame( x = runif(100), y = runif(100), z1 = rnorm(100), z2 = abs(rnorm(100)) ) p <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z2)) palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-diverging"]] for (palette in head(names(palettes))) { print(p + scale_colour_gradient2_tableau(palette) + ggtitle(palette)) } # If you need to reverse a palette, use a transformation p + scale_colour_gradient2_tableau(trans = "reverse") ggthemes/inst/examples/ex-colorblind.R0000644000176200001440000000032714561020227017535 0ustar liggesuserslibrary("ggplot2") library("scales") show_col(colorblind_pal()(8)) p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_igray() + scale_colour_colorblind() ggthemes/inst/examples/ex-geom_tufteboxplot.R0000644000176200001440000000141714561061663021166 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars, aes(factor(cyl), mpg)) # with a point for the median and lines for whiskers p + geom_tufteboxplot() # with a line for the interquartile range and points for whiskers p + geom_tufteboxplot(median.type = "line", whisker.type = "point", hoffset = 0) # with a wide line for the interquartile range and lines for whiskers p + geom_tufteboxplot(median.type = "line", hoffset = 0, width = 3) # with an offset line for the interquartile range and lines for whiskers p + geom_tufteboxplot(median.type = "line") # combined with theme_tufte p + geom_tufteboxplot() + theme_tufte() + theme(axis.ticks.x = element_blank()) # traditional boxplot with whiskers only out to 1.5 IQR, outlier points p + geom_tufteboxplot(stat="boxplot", outlier.shape = 5) ggthemes/inst/examples/ex-excel_new_pal.R0000644000176200001440000000017014561020227020207 0ustar liggesuserslibrary("scales") for (i in names(ggthemes::ggthemes_data$excel$palettes)) { show_col(excel_new_pal(theme = i))(6) } ggthemes/inst/examples/ex-theme_calc.R0000644000176200001440000000045514561301530017473 0ustar liggesuserslibrary("ggplot2") ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) + theme_calc() + scale_color_calc() \dontrun{ ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) + theme_calc() + scale_shape_calc() } ggthemes/inst/examples/ex-theme_excel_new.R0000644000176200001440000000025714561020227020543 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel_new() + scale_colour_excel_new() ggthemes/inst/examples/ex-palette_pander.R0000644000176200001440000000004314561020227020370 0ustar liggesusers\dontrun{ palette_pander(TRUE) } ggthemes/inst/examples/ex-scale_colour_ptol.R0000644000176200001440000000047714561020227021124 0ustar liggesuserslibrary("ggplot2") p2 <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + geom_smooth(method = "lm", se = FALSE) + scale_color_ptol("cyl") + theme_minimal() + ggtitle("Cars") ggplot(diamonds, aes(x = clarity, fill = cut)) + geom_bar() + scale_fill_ptol() + theme_minimal() ggthemes/inst/examples/ex-scale_colour_gradient_tableau.R0000644000176200001440000000063514561020227023434 0ustar liggesuserslibrary("ggplot2") df <- data.frame( x = runif(100), y = runif(100), z1 = rnorm(100), z2 = abs(rnorm(100)) ) p <- ggplot(df, aes(x, y)) + geom_point(aes(colour = z2)) + theme_igray() palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-sequential"]] for (palette in head(names(palettes))) { print(p + scale_colour_gradient_tableau(palette) + ggtitle(palette)) } ggthemes/inst/examples/ex-theme_solid.R0000644000176200001440000000027614561020227017705 0ustar liggesuserslibrary("ggplot2") ggplot(mtcars, aes(wt, mpg)) + geom_point() + theme_solid(fill = "white") ggplot(mtcars, aes(wt, mpg)) + geom_point(color = "white") + theme_solid(fill = "black") ggthemes/inst/examples/ex-stata_pal.R0000644000176200001440000000023514561020227017354 0ustar liggesuserslibrary("scales") show_col(stata_pal("s2color")(15)) show_col(stata_pal("s1rcolor")(15)) show_col(stata_pal("s1color")(15)) show_col(stata_pal("mono")(15)) ggthemes/inst/examples/ex-scale_linetype_stata.R0000644000176200001440000000054214561020227021601 0ustar liggesusersrequire("ggplot2") if (require("tidyr") && require("dplyr")) { rescale01 <- function(x) { (x - min(x)) / diff(range(x)) } gather(economics, variable, value, -date) %>% group_by(variable) %>% mutate(value = rescale01(value)) %>% ggplot(aes(x = date, y = value, linetype = variable)) + geom_line() + scale_linetype_stata() } ggthemes/inst/examples/ex-cleveland_shape_pal.R0000644000176200001440000000046214561267461021374 0ustar liggesusers### (discrete). \dontrun{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) + theme_bw() # overlapping symbol palette p + scale_shape_cleveland() # non-overlapping symbol palette p + scale_shape_cleveland(overlap = FALSE) } ggthemes/inst/examples/ex-theme_solarized.R0000644000176200001440000000074614561020227020571 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) # Light version with different main accent colors for (accent in names(ggthemes::ggthemes_data[["solarized"]][["accents"]])) { print(p + theme_solarized() + scale_colour_solarized(accent)) } # Dark version p + theme_solarized(light = FALSE) + scale_colour_solarized("blue") # Alternative theme p + theme_solarized_2(light = FALSE) + scale_colour_solarized("blue") ggthemes/inst/examples/ex-calc_pal.R0000644000176200001440000000005414561020227017141 0ustar liggesuserslibrary("scales") show_col(calc_pal()(12)) ggthemes/inst/examples/ex-theme_hc.R0000644000176200001440000000257314561020227017167 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_hc() + scale_colour_hc() p + theme_hc(bgcolor = "darkunica") + scale_colour_hc("darkunica") dtemp <- data.frame(months = factor(rep(substr(month.name, 1, 3), 4), levels = substr(month.name, 1, 3)), city = rep(c("Tokyo", "New York", "Berlin", "London"), each = 12), temp = c(7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6, -0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5, -0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0, 3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8)) ggplot(dtemp, aes(x = months, y = temp, group = city, color = city)) + geom_line() + geom_point(size = 1.1) + ggtitle("Monthly Average Temperature") + theme_hc() + scale_colour_hc() ggplot(dtemp, aes(x = months, y = temp, group = city, color = city)) + geom_line() + geom_point(size = 1.1) + ggtitle("Monthly Average Temperature") + theme_hc(bgcolor = "darkunica") + scale_fill_hc("darkunica") ggthemes/inst/examples/ex-tableau_seq_gradient_pal.R0000644000176200001440000000047614561020227022411 0ustar liggesuserslibrary("scales") x <- seq(0, 1, length = 25) r <- sqrt(outer(x ^ 2, x ^ 2, "+")) palettes <- ggthemes_data[["tableau"]][["color-palettes"]][["ordered-sequential"]] for (palname in names(palettes)) { col <- tableau_seq_gradient_pal(palname)(seq(0, 1, length = 12)) image(r, col = col) title(main = palname) } ggthemes/inst/examples/ex-bank_slopes.R0000644000176200001440000000064614561020227017712 0ustar liggesuserslibrary("ggplot2") # Use the classic sunspot data from Cleveland's original paper x <- seq_along(sunspot.year) y <- as.numeric(sunspot.year) # Without banking m <- ggplot(data.frame(x = x, y = y), aes(x = x, y = y)) + geom_line() m ## Using the default method, Median Absolute Slope ratio <- bank_slopes(x, y) m + coord_fixed(ratio = ratio) ## Using culling ## Average Absolute Slope bank_slopes(x, y, method = "as") ggthemes/inst/examples/ex-excel_pal.R0000644000176200001440000000012114561020227017332 0ustar liggesuserslibrary("scales") show_col(excel_pal()(7)) show_col(excel_pal(line = FALSE)(7)) ggthemes/inst/examples/ex-theme_excel.R0000644000176200001440000000050514561020227017666 0ustar liggesuserslibrary("ggplot2") # Line and scatter plot colors p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_excel() + scale_colour_excel() # Bar plot (area/fill) colors ggplot(mpg, aes(x = class, fill = drv)) + geom_bar() + scale_fill_excel() + theme_excel() ggthemes/inst/examples/ex-theme_clean.R0000644000176200001440000000027014561020227017647 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) + geom_point() + facet_wrap(~am) + geom_smooth(method = "lm", se = FALSE) + theme_clean() p ggthemes/inst/examples/ex-scale_solarized.R0000644000176200001440000000026114561020227020546 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_solarized() + scale_colour_solarized() ggthemes/inst/examples/ex-scale_shape_stata.R0000644000176200001440000000026114561304451021052 0ustar liggesusers\dontrun{ library("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, shape = factor(gear))) + facet_wrap(~am) p + theme_stata() + scale_shape_stata() } ggthemes/inst/examples/ex-few_pal.R0000644000176200001440000000014514561020227017021 0ustar liggesuserslibrary("scales") show_col(few_pal()(7)) show_col(few_pal("Dark")(7)) show_col(few_pal("Light")(7)) ggthemes/inst/examples/ex-scale_shape_tremmel.R0000644000176200001440000000031314561020227021375 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars, aes(x = mpg, y = hp, shape = factor(cyl))) + geom_point() p + scale_shape_tremmel() p + scale_shape_tremmel(alt = TRUE) p + scale_shape_tremmel(overlap = TRUE) ggthemes/inst/examples/ex-canva_pal.R0000644000176200001440000000162714561020227017336 0ustar liggesusersrequire("ggplot2") require("tibble") if (require("purrr") && require("scales") && require("dplyr")) { canva_df <- map2_df( canva_palettes, names(canva_palettes), ~ tibble( colors = .x, .id = seq_along(colors), palette = .y ) ) ggplot(canva_df, aes( y = palette, x = .id, fill = colors )) + geom_raster() + scale_fill_identity(guide = FALSE) + theme_minimal() + theme(panel.grid = element_blank(), axis.text.x = element_blank()) + labs(x = "", y = "") show_col(canva_pal("Fresh and bright")(4)) show_col(canva_pal("Cool blues")(4)) show_col(canva_pal("Modern and crisp")(4)) } ggthemes/inst/examples/ex-theme_igray.R0000644000176200001440000000021614561020227017700 0ustar liggesuserslibrary("ggplot2") p <- ggplot(mtcars) + geom_point(aes(x = wt, y = mpg, colour = factor(gear))) + facet_wrap(~am) p + theme_igray() ggthemes/inst/examples/ex-tableau_shape_pal.R0000644000176200001440000000014114561020227021031 0ustar liggesusers\dontrun{ # need to set a font containing these values show_shapes(tableau_shape_pal()(5)) } ggthemes/inst/examples/ex-few_shape_pal.R0000644000176200001440000000013714561020227020202 0ustar liggesusers\dontrun{ # need to set a font containing unicode values show_shapes(few_shape_pal()(5)) } ggthemes/inst/WORDLIST0000644000176200001440000000155514561303243014233 0ustar liggesusersACM Agrawala al Analytics AppVeyor Argwala Banff Beamer behaviour Bembo blosxom bowerth bugfix Bugfix calc Calc canva Canva cartesian cgi charactger CMD colores colour Colour continous coord cran daroczig de devtools et extrafont fivethirtyeight FiveThirtyEight gdocs geoms Geoms glyphs ggplot github grey Hanrahan hc Heer hexa Highcharts http https impactful Impactful InfoVis Irizarry's ITC jbkunst JS Kliever Lewandowsky LibreOffic lifecycle linepattern linetype Linetype linetypes Lothar lty Maneesh McGill nd Officina orcid paletas paul Pinterest pkgdown plotmath PolicyViz ptoche ptol pts quartile rcolor rlang rstudio Saenz SandyMuspratt Schoonover's Schwabish sj solarized Solarized Spiekerblog SRON stata Stata Stribley Tabaleau Tableu Tejeda thatn tol Tol Tol's tradeblotter Tremmel tufte Tufte Tufte's unica unicode vdiffr Verdana weitzner wordpress WS wsj WSJ Zdeb