You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. =================================================================== ChangeSet@1.1422.1.2, 2003-11-12 01:05:28-02:00, acme@conectiva.com.br o LLC: add sysctl support for the LLC timeouts Also make the HZ multiply only when changing the socket timeout values, not every time we set the actual kernel timers. include/linux/sysctl.h | 26 ++++++++ include/net/llc.h | 7 ++ net/llc/Makefile | 1 net/llc/af_llc.c | 53 +++++++++++++----- net/llc/llc_c_ac.c | 12 ++-- net/llc/llc_conn.c | 13 +++- net/llc/llc_conn.h | 10 +-- net/llc/llc_station.c | 11 ++- net/llc/sysctl_net_llc.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 236 insertions(+), 33 deletions(-) diff -Nru a/include/linux/sysctl.h b/include/linux/sysctl.h --- a/include/linux/sysctl.h Sat Nov 15 17:02:27 2003 +++ b/include/linux/sysctl.h Sat Nov 15 17:02:27 2003 @@ -176,7 +176,8 @@ NET_TR=14, NET_DECNET=15, NET_ECONET=16, - NET_SCTP=17, + NET_SCTP=17, + NET_LLC=18, }; /* /proc/sys/kernel/random */ @@ -452,6 +453,29 @@ NET_IPX_FORWARDING=2 }; +/* /proc/sys/net/llc */ +enum { + NET_LLC2=1, + NET_LLC_STATION=2, +}; + +/* /proc/sys/net/llc/llc2 */ +enum { + NET_LLC2_TIMEOUT=1, +}; + +/* /proc/sys/net/llc/station */ +enum { + NET_LLC_STATION_ACK_TIMEOUT=1, +}; + +/* /proc/sys/net/llc/llc2/timeout */ +enum { + NET_LLC2_ACK_TIMEOUT=1, + NET_LLC2_P_TIMEOUT=2, + NET_LLC2_REJ_TIMEOUT=3, + NET_LLC2_BUSY_TIMEOUT=4, +}; /* /proc/sys/net/appletalk */ enum { diff -Nru a/include/net/llc.h b/include/net/llc.h --- a/include/net/llc.h Sat Nov 15 17:02:27 2003 +++ b/include/net/llc.h Sat Nov 15 17:02:27 2003 @@ -104,4 +104,11 @@ #define llc_proc_init() (0) #define llc_proc_exit() do { } while(0) #endif /* CONFIG_PROC_FS */ +#ifdef CONFIG_SYSCTL +extern int llc_sysctl_init(void); +extern void llc_sysctl_exit(void); +#else +#define llc_sysctl_init() (0) +#define llc_sysctl_exit() do { } while(0) +#endif /* CONFIG_SYSCTL */ #endif /* LLC_H */ diff -Nru a/net/llc/Makefile b/net/llc/Makefile --- a/net/llc/Makefile Sat Nov 15 17:02:27 2003 +++ b/net/llc/Makefile Sat Nov 15 17:02:27 2003 @@ -22,3 +22,4 @@ llc_sap.o llc_s_ac.o llc_s_ev.o llc_s_st.o af_llc.o llc_station.o llc2-$(CONFIG_PROC_FS) += llc_proc.o +llc2-$(CONFIG_SYSCTL) += sysctl_net_llc.o diff -Nru a/net/llc/af_llc.c b/net/llc/af_llc.c --- a/net/llc/af_llc.c Sat Nov 15 17:02:27 2003 +++ b/net/llc/af_llc.c Sat Nov 15 17:02:27 2003 @@ -867,22 +867,22 @@ case LLC_OPT_ACK_TMR_EXP: if (opt > LLC_OPT_MAX_ACK_TMR_EXP) goto out; - llc->ack_timer.expire = opt; + llc->ack_timer.expire = opt * HZ; break; case LLC_OPT_P_TMR_EXP: if (opt > LLC_OPT_MAX_P_TMR_EXP) goto out; - llc->pf_cycle_timer.expire = opt; + llc->pf_cycle_timer.expire = opt * HZ; break; case LLC_OPT_REJ_TMR_EXP: if (opt > LLC_OPT_MAX_REJ_TMR_EXP) goto out; - llc->rej_sent_timer.expire = opt; + llc->rej_sent_timer.expire = opt * HZ; break; case LLC_OPT_BUSY_TMR_EXP: if (opt > LLC_OPT_MAX_BUSY_TMR_EXP) goto out; - llc->busy_state_timer.expire = opt; + llc->busy_state_timer.expire = opt * HZ; break; case LLC_OPT_TX_WIN: if (opt > LLC_OPT_MAX_WIN) @@ -932,17 +932,17 @@ goto out; switch (optname) { case LLC_OPT_RETRY: - val = llc->n2; break; + val = llc->n2; break; case LLC_OPT_SIZE: - val = llc->n1; break; + val = llc->n1; break; case LLC_OPT_ACK_TMR_EXP: - val = llc->ack_timer.expire; break; + val = llc->ack_timer.expire / HZ; break; case LLC_OPT_P_TMR_EXP: - val = llc->pf_cycle_timer.expire; break; + val = llc->pf_cycle_timer.expire / HZ; break; case LLC_OPT_REJ_TMR_EXP: - val = llc->rej_sent_timer.expire; break; + val = llc->rej_sent_timer.expire / HZ; break; case LLC_OPT_BUSY_TMR_EXP: - val = llc->busy_state_timer.expire; break; + val = llc->busy_state_timer.expire / HZ; break; case LLC_OPT_TX_WIN: val = llc->k; break; case LLC_OPT_RX_WIN: @@ -989,6 +989,13 @@ extern void llc_sap_handler(struct llc_sap *sap, struct sk_buff *skb); extern void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb); +static char llc_proc_err_msg[] __initdata = + KERN_CRIT "LLC: Unable to register the proc_fs entries\n"; +static char llc_sysctl_err_msg[] __initdata = + KERN_CRIT "LLC: Unable to register the sysctl entries\n"; +static char llc_sock_err_msg[] __initdata = + KERN_CRIT "LLC: Unable to register the network family\n"; + static int __init llc2_init(void) { int rc; @@ -997,12 +1004,29 @@ llc_station_init(); llc_ui_sap_last_autoport = LLC_SAP_DYN_START; rc = llc_proc_init(); - if (!rc) { - sock_register(&llc_ui_family_ops); - llc_add_pack(LLC_DEST_SAP, llc_sap_handler); - llc_add_pack(LLC_DEST_CONN, llc_conn_handler); + if (rc) { + printk(llc_proc_err_msg); + goto out; + } + rc = llc_sysctl_init(); + if (rc) { + printk(llc_sysctl_err_msg); + goto out_proc; } + rc = sock_register(&llc_ui_family_ops); + if (rc) { + printk(llc_sock_err_msg); + goto out_sysctl; + } + llc_add_pack(LLC_DEST_SAP, llc_sap_handler); + llc_add_pack(LLC_DEST_CONN, llc_conn_handler); +out: return rc; +out_sysctl: + llc_sysctl_exit(); +out_proc: + llc_proc_exit(); + goto out; } static void __exit llc2_exit(void) @@ -1012,6 +1036,7 @@ llc_remove_pack(LLC_DEST_CONN); sock_unregister(PF_LLC); llc_proc_exit(); + llc_sysctl_exit(); } module_init(llc2_init); diff -Nru a/net/llc/llc_c_ac.c b/net/llc/llc_c_ac.c --- a/net/llc/llc_c_ac.c Sat Nov 15 17:02:27 2003 +++ b/net/llc/llc_c_ac.c Sat Nov 15 17:02:27 2003 @@ -658,7 +658,7 @@ if (!llc->remote_busy_flag) { llc->remote_busy_flag = 1; mod_timer(&llc->busy_state_timer.timer, - jiffies + llc->busy_state_timer.expire * HZ); + jiffies + llc->busy_state_timer.expire); } return 0; } @@ -937,7 +937,7 @@ llc_conn_set_p_flag(sk, 1); mod_timer(&llc->pf_cycle_timer.timer, - jiffies + llc->pf_cycle_timer.expire * HZ); + jiffies + llc->pf_cycle_timer.expire); return 0; } @@ -1213,7 +1213,7 @@ { struct llc_opt *llc = llc_sk(sk); - mod_timer(&llc->ack_timer.timer, jiffies + llc->ack_timer.expire * HZ); + mod_timer(&llc->ack_timer.timer, jiffies + llc->ack_timer.expire); return 0; } @@ -1222,7 +1222,7 @@ struct llc_opt *llc = llc_sk(sk); mod_timer(&llc->rej_sent_timer.timer, - jiffies + llc->rej_sent_timer.expire * HZ); + jiffies + llc->rej_sent_timer.expire); return 0; } @@ -1233,7 +1233,7 @@ if (!timer_pending(&llc->ack_timer.timer)) mod_timer(&llc->ack_timer.timer, - jiffies + llc->ack_timer.expire * HZ); + jiffies + llc->ack_timer.expire); return 0; } @@ -1281,7 +1281,7 @@ } if (unacked) mod_timer(&llc->ack_timer.timer, - jiffies + llc->ack_timer.expire * HZ); + jiffies + llc->ack_timer.expire); } else if (llc->failed_data_req) { u8 f_bit; diff -Nru a/net/llc/llc_conn.c b/net/llc/llc_conn.c --- a/net/llc/llc_conn.c Sat Nov 15 17:02:27 2003 +++ b/net/llc/llc_conn.c Sat Nov 15 17:02:27 2003 @@ -40,6 +40,11 @@ /* Offset table on connection states transition diagram */ static int llc_offset_table[NBR_CONN_STATES][NBR_CONN_EV]; +int sysctl_llc2_ack_timeout = LLC2_ACK_TIME * HZ; +int sysctl_llc2_p_timeout = LLC2_P_TIME * HZ; +int sysctl_llc2_rej_timeout = LLC2_REJ_TIME * HZ; +int sysctl_llc2_busy_timeout = LLC2_BUSY_TIME * HZ; + /** * llc_conn_state_process - sends event to connection state machine * @sk: connection @@ -801,22 +806,22 @@ llc->dec_step = llc->connect_step = 1; init_timer(&llc->ack_timer.timer); - llc->ack_timer.expire = LLC_ACK_TIME; + llc->ack_timer.expire = sysctl_llc2_ack_timeout; llc->ack_timer.timer.data = (unsigned long)sk; llc->ack_timer.timer.function = llc_conn_ack_tmr_cb; init_timer(&llc->pf_cycle_timer.timer); - llc->pf_cycle_timer.expire = LLC_P_TIME; + llc->pf_cycle_timer.expire = sysctl_llc2_p_timeout; llc->pf_cycle_timer.timer.data = (unsigned long)sk; llc->pf_cycle_timer.timer.function = llc_conn_pf_cycle_tmr_cb; init_timer(&llc->rej_sent_timer.timer); - llc->rej_sent_timer.expire = LLC_REJ_TIME; + llc->rej_sent_timer.expire = sysctl_llc2_rej_timeout; llc->rej_sent_timer.timer.data = (unsigned long)sk; llc->rej_sent_timer.timer.function = llc_conn_rej_tmr_cb; init_timer(&llc->busy_state_timer.timer); - llc->busy_state_timer.expire = LLC_BUSY_TIME; + llc->busy_state_timer.expire = sysctl_llc2_busy_timeout; llc->busy_state_timer.timer.data = (unsigned long)sk; llc->busy_state_timer.timer.function = llc_conn_busy_tmr_cb; diff -Nru a/net/llc/llc_conn.h b/net/llc/llc_conn.h --- a/net/llc/llc_conn.h Sat Nov 15 17:02:27 2003 +++ b/net/llc/llc_conn.h Sat Nov 15 17:02:27 2003 @@ -18,14 +18,14 @@ #define LLC_EVENT 1 #define LLC_PACKET 2 -#define LLC_P_TIME 2 -#define LLC_ACK_TIME 1 -#define LLC_REJ_TIME 3 -#define LLC_BUSY_TIME 3 +#define LLC2_P_TIME 2 +#define LLC2_ACK_TIME 1 +#define LLC2_REJ_TIME 3 +#define LLC2_BUSY_TIME 3 struct llc_timer { struct timer_list timer; - u16 expire; /* timer expire time */ + unsigned long expire; /* timer expire time */ }; struct llc_opt { diff -Nru a/net/llc/llc_station.c b/net/llc/llc_station.c --- a/net/llc/llc_station.c Sat Nov 15 17:02:27 2003 +++ b/net/llc/llc_station.c Sat Nov 15 17:02:27 2003 @@ -50,6 +50,10 @@ struct sk_buff_head mac_pdu_q; }; +#define LLC_STATION_ACK_TIME (3 * HZ) + +int sysctl_llc_station_ack_timeout = LLC_STATION_ACK_TIME; + /* Types of events (possible values in 'ev->type') */ #define LLC_STATION_EV_TYPE_SIMPLE 1 #define LLC_STATION_EV_TYPE_CONDITION 2 @@ -218,7 +222,8 @@ static int llc_station_ac_start_ack_timer(struct sk_buff *skb) { - mod_timer(&llc_main_station.ack_timer, jiffies + LLC_ACK_TIME * HZ); + mod_timer(&llc_main_station.ack_timer, + jiffies + sysctl_llc_station_ack_timeout); return 0; } @@ -687,7 +692,8 @@ init_timer(&llc_main_station.ack_timer); llc_main_station.ack_timer.data = (unsigned long)&llc_main_station; llc_main_station.ack_timer.function = llc_station_ack_tmr_cb; - + llc_main_station.ack_timer.expires = jiffies + + sysctl_llc_station_ack_timeout; skb = alloc_skb(0, GFP_ATOMIC); if (!skb) goto out; @@ -695,7 +701,6 @@ llc_set_station_handler(llc_station_rcv); ev = llc_station_ev(skb); memset(ev, 0, sizeof(*ev)); - llc_main_station.ack_timer.expires = jiffies + 3 * HZ; llc_main_station.maximum_retry = 1; llc_main_station.state = LLC_STATION_STATE_DOWN; ev->type = LLC_STATION_EV_TYPE_SIMPLE; diff -Nru a/net/llc/sysctl_net_llc.c b/net/llc/sysctl_net_llc.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/net/llc/sysctl_net_llc.c Sat Nov 15 17:02:27 2003 @@ -0,0 +1,136 @@ +/* + * sysctl_net_llc.c: sysctl interface to LLC net subsystem. + * + * Arnaldo Carvalho de Melo + */ + +#include +#include +#include +#include + +#ifndef CONFIG_SYSCTL +#error This file should not be compiled without CONFIG_SYSCTL defined +#endif + +extern int sysctl_llc2_ack_timeout; +extern int sysctl_llc2_busy_timeout; +extern int sysctl_llc2_p_timeout; +extern int sysctl_llc2_rej_timeout; +extern int sysctl_llc_station_ack_timeout; + +static struct ctl_table llc2_timeout_table[] = { + { + .ctl_name = NET_LLC2_ACK_TIMEOUT, + .procname = "ack", + .data = &sysctl_llc2_ack_timeout, + .maxlen = sizeof(long), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies, + }, + { + .ctl_name = NET_LLC2_BUSY_TIMEOUT, + .procname = "busy", + .data = &sysctl_llc2_busy_timeout, + .maxlen = sizeof(long), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies, + }, + { + .ctl_name = NET_LLC2_P_TIMEOUT, + .procname = "p", + .data = &sysctl_llc2_p_timeout, + .maxlen = sizeof(long), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies, + }, + { + .ctl_name = NET_LLC2_REJ_TIMEOUT, + .procname = "rej", + .data = &sysctl_llc2_rej_timeout, + .maxlen = sizeof(long), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies, + }, + { 0 }, +}; + +static struct ctl_table llc_station_table[] = { + { + .ctl_name = NET_LLC_STATION_ACK_TIMEOUT, + .procname = "ack_timeout", + .data = &sysctl_llc_station_ack_timeout, + .maxlen = sizeof(long), + .mode = 0644, + .proc_handler = &proc_dointvec_jiffies, + .strategy = &sysctl_jiffies, + }, + { 0 }, +}; + +static struct ctl_table llc2_dir_timeout_table[] = { + { + .ctl_name = NET_LLC2, + .procname = "timeout", + .mode = 0555, + .child = llc2_timeout_table, + }, + { 0 }, +}; + +static struct ctl_table llc_table[] = { + { + .ctl_name = NET_LLC2, + .procname = "llc2", + .mode = 0555, + .child = llc2_dir_timeout_table, + }, + { + .ctl_name = NET_LLC_STATION, + .procname = "station", + .mode = 0555, + .child = llc_station_table, + }, + { 0 }, +}; + +static struct ctl_table llc_dir_table[] = { + { + .ctl_name = NET_LLC, + .procname = "llc", + .mode = 0555, + .child = llc_table, + }, + { 0 }, +}; + +static struct ctl_table llc_root_table[] = { + { + .ctl_name = CTL_NET, + .procname = "net", + .mode = 0555, + .child = llc_dir_table, + }, + { 0 }, +}; + +static struct ctl_table_header *llc_table_header; + +int __init llc_sysctl_init(void) +{ + llc_table_header = register_sysctl_table(llc_root_table, 1); + + return llc_table_header ? 0 : -ENOMEM; +} + +void llc_sysctl_exit(void) +{ + if (llc_table_header) { + unregister_sysctl_table(llc_table_header); + llc_table_header = NULL; + } +} =================================================================== This BitKeeper patch contains the following changesets: 1.1422.1.2 ## Wrapped with gzip_uu ## M'XL( $1XMC\ ^U;>W/;-A+_F_P4F/BF8Z>61(!ON;SK0S=F+3(G9_V%U@'UC2!^A#2I.AY'HS M*A^@G^,T&TI>'%$O"S^Y?2^>]<<)#%S',0P,)O&,#ACM8'Q/!A'->J1O]+$, M%%=NYDW0)YJD0PGWU=6=[&%.A]+U^4\?WIY>R_)HA,XF;G1';VB&1B,YBY-/ M[M1/7[K99!I'_2QQHW1&,S[WMC'V-4P]16B M688F,]%>UL6OHJ@8OA15)PI>*A@;IOP:X3[6".GC/D&*.L!X@.$7/%3T(;%Z M"ADJ"FI%1M_;J*?(K]"WU>),]E",WKX]&R+7]U'ZD'K9%*6+^3Q.,A3$")&EP #_3Z=IC&;N/>7C/_\;S1;3+)Q/'U < M)(V]>UB&' 6!"@N:'@-2%&>(PEH^\#'T&4@9';"X7K9PI^B>)A&=\M$D[07[99>PEX;3*<>^W9F;ACU/6%,787%A-74EBK1 M"%YBWPU(H/@Z,7W%IV0'N#1SLS#.$=GV((H*.X,LB8ZQNI-$,-@F$=8-=1E8 MMHL#XFJ*K;J^9NT%MQ8'+S5=4XW=Q'%>Y8U-DV"5^F,3N]LL4P8KBP*_&7CGI9K!:K>LE(FUI67K?@#>98U=DXY= M;S?$^D*!0*9EFB#0YKA9P$S#:/%E(,)@(9D(HK:F@*5L8BY-8^S9%O8@AKK$ M4\=;)&M"EL53B$ZV.[[@=N!CVP: W:A:V%RZV,-XK/BPIQ2/DFU+N!E4A2AG MZ)BGT:8[L'SZ[;VQ [+3&Q5;T51-49:*:2LVSZZDEE?Q$)/->55'/?TIKT)> MY1'M/>HEG_E_2)-7+2O_B&3[FF"DR1=$@Y\'/H2-B*M.G"OG]N+=.:I^D2K- MZ=F;)A6NTER?_Z-)HU9I7GVX^:5!I()L%J!=\)_2(DK#NXCZ"#; G800_3(/ M$WHB#9X+,^4WA$6?#[AO- +0[JZQ1_3;#;'%,<"=+>$8N.$8>+-CF$\%9UYP M\A12\XR&Z1_A&!=8,9 I'X0![%1T]O[RQXN?G)M?;LYNW\KT2P9RP#09XE6$ M"-9A%&:'G^+0/SHI*-BG,@G]LB8YH-.4KOR@CG.$#I6CME$.<83\&/V&OH)M M(<]S2AKY88# &RJB%IY0+PVZ'>%Q%8"HKSP!0U0S(#99FY">O?5T /[E M[@*\K.M(#H7E'^,!D!2P#""D][?#RJXZ0NC[$:K5*'&S'.$'ANU;;=^SREYP MY8BK024BMIO:+$6V;#<#]8RG[0;;31SX-M4BW/:/J44, [.$+RZ2)*%?PR ( M:8J^9Q&P]V*\2!_X.9TZ7)Z^R/D03%_#$8"QB@MPUEGG@>,]>-,F(R;88)SY M59K%OJ Y_(XSNMY]SL-_'M>!U^-E3*(+3'YM$2>AOSHIC;(65C47AU^E%M[V M&2U-L/&KM"-?ZP%B5X_=H]FQ%US98PDQ#85[K+9W@K!13WOR6.:QO&.T[?3P M&(^]T C2958'Y;J)GSU.A7IXQV#AXX M:BSK0X?@^2B_MA3N1.(BM3J-) XGHRZ%3QB*+5#L%4IK])$:./,R"A:RX+4L MK4&CB5(R#\<1TN"U-!UA5&K1K&RX9KA8M4QWBQC[-&QW@*LW;%=! X,?BXZ# M9NW;<;!03WT*&A T1-=[0]!8F?\Q<4,GU7Z#GOQ_G(=* Y5[I='X)=5 M;RXF;H:9!@AW:D)X4<$NI)[>^99<:;+R]>-:RMX\.-YEF=%X- %A[[F:$UG M-39+3&25)FK-7W4V,9M5FJTC7549;94SBHLD@?%AG+-'Y(2[USBA[CVG- 6E MV:#$=4I;4-IURH;)!DR*$J>&Q6D$USG;3==@5P6[6F=O-V=A":]BBRY0" M(.>_L&V,3)G'((]M\83WG^9)[#DT29Q9>O>?_R*']ZE\-W/12"YZMF_.KR^= ML^N+6_2,.]R'R!U/P8%BE-"[,,VH<#8.%:0(%$D@ GZ,GITTIBO:7=]DPMSI M-\X'WON-9@-'_1PG]RAP9^'T@<\&>0@K$/HTUE=45&3)4AB@P\0[0K_!$LT3 MR''WAW4S0V:1I+L8\'D"D+[*4N*)M:PV"T\ZX:IFK #RJ4ZX0!H3B$-S,Q3: MB!RY"!VAB1//TTU3E2Q8G4@((11@E!"'G3GXT"%+VJ_/;VZ=F].K8Z&6.W<@ MJ/I3FC",=NJS]Y>7@IR=7$KT,-F0*Z3#L60]\U 53JHG)B;(!\5AL_'2E8' MN%4-7H+2N!5>./Z7/_"%L:S,J?(W<4&@TC[V_)"TC_JB$/GLN0J.MXPR(N M0PBA2>!Z/)2R2@Q(H$(;PW!&9WW&R[Y/DP@L$*,SEYEB$B.?HG=T&J,?6HWW M0F9//S[*!_GC(/2#>-P/=$%XUY^\:(S,9FUW68AMNU^\-O""SQ%$S>=$!Q - MH;Z\G82IV/'I)%Y,?5X0CBD",>=PUT>?PVS"2L;JHQMQ.O+S1SLP2>FQ4V?W MH8.F>H[O()IOI:BT%EIIVH\N'XMTFV;)PLL0(\YX[N2P.9VX!=6IX7R#>O._A&Y%.[)-._"A M#?J5/.Q/H2%2$%R_;G'AE=?OXL&--DV'(Q=VZ+166ZSY"QF-.'Z8[!?[&F:J MF&BEFZ[K_(8W":<^N].,LL?%H6:O97ZSH&5VD'J[49;0>;_9[%3.)XR[:#*L0!^1JR07FV MBVPKW7>WF3.AK@^.^'RE6W[G).\#BW-Y^VLW\F_BD%9!&JW.Y@4#'SZL6N 8 MX2,VA930; %%30/F[R#[$/7.+]^_.W]W(G\%VNZ7>Y@@[)!<1Q%'YD74+5&% M^D1TP.KZ7'YX^Y:?I;]67G*K%J7;_ZCB][Q6*]_'TP?WY0P*8^HO-KY.JQ"; M*-A6E:6&-56\[Z;O_2R7Z*B'GUK#_+D,:3R6:;?_8_K#V.0M3W8ALL1B$QQ% MKD;8/!:?P!8C;!W+%QJL(0@R>(X&+#*P28OC.SMUT6@Q8YN]R DCO 8H(O6( MY+&@#81]DS:DHF)@B-W<>[3Q6QDC;U UVU=_C_#:%L=M34