Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Apr 2011 10:21:22 +0200
From:      Quentin Narvor <quentin.narvor@gmail.com>
To:        freebsd-net@freebsd.org
Cc:        nicolas.greneche@univ-orleans.fr
Subject:   [PATCH] New feature in Packet Filter
Message-ID:  <BANLkTi=fMCfzJrTavK3Pe0zUXHbQgpPE=Q@mail.gmail.com>

next in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
Hello,

My name is Quentin Narvor and I am currently working on intrusion detection.
I use Freebsd 8.2 and I recently needed pf to be able to dynamically fill in
tables according pass rule.

For performances reasons, I didn't want to do it with a script and pfctl.
Then, with the help of Mr Nicolas Greneche, I made this patch named "add".
It enables pf to add src ip or dst ip in a table when a match occurs on a
pass rule.

I submit this patch to your attention. Is this feature is of interest to be
added in PF mainstream ?

You will find the patch and its documentation in attachment.
Let me know if you think that some modifications are needed.

Best regards,

Quentin Narvor

[-- Attachment #2 --]
%PDF-1.4
%äüöß
2 0 obj
<</Length 3 0 R/Filter/FlateDecode>>
stream
xS0W\H*ٲcClvzxBK#9ɣmLҌzv?/?c/;݂~g͋~y'OᲬ?!$>p΀H(R2L7|
t2θB
\l&I}
<26W0hntcYWaρxLD<xi`<hHJAXn1]3J0l9ci*zG@`!DO7S|AeꆑT3Yh*nٲ4WJ
R.kl/5(
&bMتnVRDmx_8uGKƳ5 :Et?Øݠ3kUSdmzhGEVt:OD)8CmokZ[2=ۡ(ۦ=L/5ĜjBg;懷l7~mH	S>s-uQi9ԡv:+oM*Dd8~rA
endstream
endobj

3 0 obj
523
endobj

5 0 obj
<</Length 6 0 R/Filter/FlateDecode>>
stream
xO0>jF,0dz[0PzC{dﶫ6M1[q2/oZh~l7*:u4CM-~XvGb3|jޞ?
׽B{e"
VI:r<t.ݿ\ŏûqKp!./p*(@@Z	hЂSM}.X@?W	,oT
[:Wt55nUz'q:K4ݳ*뜱EXI~MZʬV?7)4Qb`Hq #ӰΑ+%ߢgj͡cSYZ"B:@kEY	;Sf(
&nٜȫLE+JuઃSh2N0
'47aH8y	δ.z҂BOJS?CGi4C(ң{	ŖVB:C<
CDe*hMJ(;.RɺJ˺Z)$etۤy-e(/WicjvAȷ	)h/u.jx[\SXoz6I'è7bKRѥw{^^rb Wh@'Qs̼S2.ʖp!jm~
8Nx1Z^BJ$_JuXru,`o~ъ1
endstream
endobj

6 0 obj
714
endobj

8 0 obj
<</Length 9 0 R/Filter/FlateDecode>>
stream
xZ˪#7߯:`j4}ۋ.d$E *^-{f`c[Rթ;i:'83b~|?G_o75_IO^l?uz_:]y㗷S!@3;C[cW6gyel!mL؇7)>:g௛-VcNʼnYQ<<f?-H‹˪qC~0Wa0kfS%L?~0n~tw_[[}a	&,/FSc'	mq%杮nzVRfKx΢Dw: 5 (a$T{,`Csn1/!f=InWݓOJrWd`*o9Q8	0]+
d"j_]DѿwJH>ژHIvK8w(YE	Y!.sDv}ԩ
X#CtY%Y'̳EE {S?1bL
"G'e)3&!$*fn9T#\2êXi^,['H>ݞX5ta?LE*yU`Lk,/ lIe0FS{HRYEEӥigPmg%Dn^ fq*iVf֭HxvMWU͋ЛjVAuleh#F
RM;QDI<_~5j"7F<bbHlSY[
}nfrOTRa58
̒P6eX8v+T…,#?1Sj[(Cs̨4xňŝ<1u#Ck1h49㼊0YxE>
3ٷo`D20CMYQ0U!B=	(()*to#%/:TIpeKM@6"kB	B?*$R1rrJhd7rg
kTdI
ٶG:K@DAOrBp]qtGuX!
uhZZ<B\D{DZ꠼+ '{bX(^EŅՀt,
,&6>@͊1t<-4K6F[qVdE}'sƧHnp?)X5VH=-c
4qA;0if,F.5cSRbᝐrn)VQ/?PDK+dE,$9O<Pds&9LT"2' I>ɒ|`:1`yp>`SUDI;T
XiU*;Guۇ5KPUJ>Gj}%P+,fvƂm򠾬7vꪀI">
]}rZVTX=<龗ӷhtE*Ҟ<^lvQa{'Ɗwc#V8D0EA2|gfyMr
ks<F$xO٩{~]s_c
Ϸ^PW7}S{NffdBž-n
agT>:ӡm
VS|7ѝyᝡGmib;wLߗsCob9OP,1ҍƃ/ꗷX&RNu{l;>/V7z?Yc[x0˞PcO0Bӑ\{3=A@)8FCurn}nxuhى-D<9\U9&\2\ʎ!{ٻ5do)VB@+'|fBY/?tƥ{%+	75{}A-
jQA=JL)2
KSFf&LI1_%"@(1U7 Li7kan(7]yv=J:/2k!7TvPsќ#'f	j^W)УG;aV'^}/G`G"U?;M6Ws[f9&%$xM'C8a3'	#0NM)?Dv9+Fj(i4di0 0?k̽|!9L8yjՠ/-ЋK#2sBq<*gn9X9eM6]eD<%?W+rv+.5\K~J
Cx" 1Z{J[LBQjsJ~m=`5Hf.Kn%c-<ʮ NMҟNG&
endstream
endobj

9 0 obj
2426
endobj

11 0 obj
<</Length 12 0 R/Filter/FlateDecode>>
stream
xZYF~>gm@¾"lٗTWQ}I!KS#៣8[˯ǟ>EN/rr"^֓Ws$/bZ?p>VT=O]*Ka
OO9{xƇ^z2Heģ-EEr(ji)g*2#T=!Sh2U7Z-l7
o<srb"@!IwaVMoE}x39r|P?r`ȫLu{`=~v1gCQ"/]	; 3%?idc@A 8r$Gq	{50&[+ƻ]W8JrWB\ߡSpCoHg >R,OVONd̍G-	}
Ih>	?(\cmYqL>	gLXr|;lM	z|.]Ys)%8!)f"V;̂Q&Ҵ(-EAY1li	M2aN\r/+fE3k2txh-{y\)鵫-{DJEwс9ۅHm|3嵊o
8*|k5g	g`,}}eޮ[\
2 emMI/C|rj}6viˡm*,1:26`!F\HU5΢Edh_fCnC-;cArgw4箩*AomT쒌A8)$EJ	,5NN8P eŅ(E,L
5~d	g|:VJz/eÒ$(w;
K'?1gsMu7_ϺW`E)mVa{l{,
ʆgmCl˧.|̈c㣶яN.ziW
(W?~=+=C3uMHj߰TP4q8MWt)Y\O}"d4^۬
Ț8	KbS hDF9ՀLSݒz3fϴr7j0?	?̚zn`hrЇ$Ŭ}`#dZEu)΅t<Ie[Ji<2o3&sw(&,/<W =`<%ZְoQ
ԕKWiE\s,|e3fU*V[o8ᖛv[6lyUb&nmQyOª*L٥OZXfsaۂ'{)<dnF`:uд ZcQtUE	)LZSb9zv\G:{mg#tf/;li:!hѝMRZh5 jXB_^]Mnp#BO)YU>\"z'󢙼'9לLC.g?qKvnpm$Ҵ5(ՍI
jd9	3}ftf<:3Ow)xj}B壊oRwUWisIjl)"](Ўm4lT7bQc	vڳj%
ox&zfmǵs2i;n![	4QQoNaa*q36bm!{nMj*+k`r'g)Iyr_VmO,W
/zfⰥ.coA.,vG]l9.)i0@}!iGJ
<H6~@qG<-SkxL{Vޥ4%Jlm]svq:tjrFF:V-
endstream
endobj

12 0 obj
1993
endobj

14 0 obj
<</Length 15 0 R/Filter/FlateDecode>>
stream
xZ˪6Wx=%Ccg 	%!LM~?%%no:	vK<u;vl35\ՎGm
V;8~($N{~d:\wx'}䜟榽:;A*.kP]^KWn
bZKaMUv"DAlJe
!%Y͓޾vHJr&wԞčD{Hm,:~R5`\iI&DSGCU7!. .%`)䯃T"yP]:5?t$%($1YgQ)r9	%uLJPH`U52b}<OB%aJ5ϔm.	ᦦJbc::)/"5Y ƒbJ΂һ"8lbHhK_4m]D
گmE,sN2<PUAPT@M\V-ɨX,1k-xͨoc

KT"B+g*6%
υqW"

֐"M^r*m1obfzEZM)մmW5X
 U
A)i3氘zBJԐ͹Iaig7"ձ_9c˭4KUktg8\s!V}e~4A=4vݻd(sLS]ssSO6U&4[(KC;msː4A-0E,;wӕc[qV-TD-وbg92z@L$·4wYI8;?ɦ-kبöQ^ْE`l,3u!"
Gk\?]',AC;L#^Z
Jv[VۓR%3q]GYrt
srj"Ӂibg2'`AJѭ!-];nޯ85i8PC@~Lٷ
4}#CFi,F^S9BpϑM<Pc7BIN-oxȗb=?AAQ!d_y&Тrc?*!==1z`ĩ^Ws8炆1*|^υ(Ss:4)|]rL95AEIZOA?+<bOem=E(Q<N=G8pʓ9-5kg]xc]$[OTVb?Xği AڸqJPkΞ\0\jˬ-vH{0ݡR* ~/Ip>E	ݓn߈&XJDm3-qy7n5S
Chi1]Vuܝ13{)j#QD)꒿y1
)[
w8w#B(Al3ڔy0r##ݠ23lryavŸFqc1^]"n>Cz:siRIGgkͣ~-v:u<iEZϥ.)<Y
(3F2{C@^xۤs>96t}
	mwVmNtm%*3-Ihzvk(5Ÿ~meR>vZ"SܨzY
ٓ$2JK- 3Iil2ڇ-L	q9$@W]fdGkD	>u{~TRC}27
endstream
endobj

15 0 obj
1814
endobj

17 0 obj
<</Length 18 0 R/Filter/FlateDecode>>
stream
xYI6yz{&4rF2"ɲeu{d€rK>U^vDw꤂|KÛ/pӽҽ?w߼N돣0tTQ9tpޮ١ם+Y"J'3sKTU
<XU-luІ0Q+<h,&O
~Y'6X*	5,F
W4pZٸ?E-̀L`)@M\Q	xe
ԋFVZDÍ$}J-H]й'1¡qrPeplЄYuW/c7?I8\N9d|>uJS44b\(8D:֯uƧ}lSOk6LH1;\@az~1Ua"؇P	h3q@aC5٥b#;[Q*8V5 m鬄@SF%BE&5obǙef%h6.-nӲo$d6(
1Ĺt%t6e^poKyd3
falU(K
nGgCoJ?f&7)KHXaӤ_cp[X0bJ^4ezYxҀ|y>wA,d|HQJw0Nv"hx5ID*PƿCOr3FZ_RcaK{J8XFBda_
"!'p@^*GiRsҢVf!kEKԋ8F.C$X
IO1(9[l|Нg>$6`2m4iɓPbF8eJf(sٗ5)rmM]u.ea4GMn8e;uertE-CjfNQuͻ}?,Zd}GS"r7KK]*eUa66āg#.y}S잭W'nbuGG$.U܊NՓ\iLAًL3%le)i⎩]I}K"fi2)jbW`&EWÿCp UP.3~WdռyױhE=AbtJ:-[t4D]кj%ac
zF’R`,SP3W4iZ͆U9!^jA.]8>euLHdyYL
,[KV;;UV1	#ui&^}_uuD^"ːtaj͞?Egrs}nC8ܝ!?pɇCy1᱁AnuWW=T;=|JPDHMӘivއY܃	=ePk+䁥PNb9i4y`!4YR_,Xp%8֖ZJ9kSkj0,r
'EiP($],XVf6GRbU)6Mbi'vP	
endstream
endobj

18 0 obj
1577
endobj

20 0 obj
<</Length 21 0 R/Filter/FlateDecode>>
stream
xWK0W伐3ݙ)e[_m{߯dŎg2v'Y-j(KQV?-Hl]K]O[q(LSҁ|<|؉`+;Sm@@j#t_AlC[OJiCݐb[MѢtxWTmjx[;v	[ؐY/4%87MhF~dg\mٹĀjb[Ǯ1cMnc`Y&8b%&@	GV0z}ZyYvu2O|F0DPz~Nu6C.֐g1&q>v:qxaۢNy,l\'ĕ~=f(=2y.*D\lWMmА2HiEӶ?XuS&O!{4{'|/>IJIj$~r X6
~/.АhqWIқ&m	vOqapI9Jy܃sMmO\OfJJ|FB
9FJdR޲c<ePT#LU#z*D*DJY|.-byf<cLJ̍VyF$kEA&? L("Vrhr5Y/lmά,Ј@ՙk2׏%S¬PkB/Bskrj9
hήA/_9AsY}Q跨Q-W+n55-dm
&#Cam~.aBtƛlKU93x6 䡺5']߿->*\Aџܱ@|*sleb{qWcߋF){*XUP.MjeTw
zrL:z୧	ɶesI
ZB'((͙Dnnq/MHR=kГ[:/-7/
endstream
endobj

21 0 obj
1035
endobj

23 0 obj
<</Length 24 0 R/Filter/FlateDecode>>
stream
xZK6y;zˆ0a [^$T%%Kw!mU}TG\Ag?TpS~i'>~9]O]^xqoYW",_x洼>ndAeK֋ZS&yϠLW)08_/X|2_{/G	sx4U2BJ\7yEWpv}`pI)^R]ٿTZoZzBkm 7'a!>Wv`OH3c"柚f4¹Nx)rW
	!F2=wFҐB"(\Ӕ'7ؤ	 u7i2=lmػHSҡa6FS'z|DZR:/4>O*:Jns:Q<]~-(ƕ_:BϷG^iU|Wf?0xnooaWH=(NLLjdPiE9*A?zU"&=#
\RmE(CfTI/j\[Hv ;q%^ad:Nó£3L.mdexuD2ci-2C",yG-Sxxуն
UI/+}*x	$r
yIKd>49U1MڲmMLy-~6/Nño*'.S#SdM3ښ:҃'lC3X$ʳcQc6NC}ax_aƌucp|]q9SrqYGTaiܷǖ{T/Me
;T23tNN2-(Ȯo)66zr ?Rll<O;k(G˝!o<k*	!Zۘ}΋y	Y9b]<Ja<=0{OV9JMUXv#Z\ZnحFMP		c5 *jF> sEculqKî:fX]3$4bUjm֭VEUd=\U/GbbEn	=tŌ/k9(9(봀A#'UY@H*Z΄CNE뷶:a꺚lwvLʼn8^N5NW`fv6 i7w\xJMu{!cYZ'\xKC.L=^<#2
+b0Wtn܅SV9)h>'4>4Mlgad?xp$xe#}r}G,61DDFD2*vD!,>m$gkӕUK&|"
/Jr>pZ]xICq4U/3fm=SYQ7Zp^*-rio@Z)LIL?ɋ>/[RzЛ=lVk^34Xבphr7iA+Z}Yd3u$9m5yooJަfWBA$T<C7/*&+!nCc
#ż[֥JW;wcsnOI*7wV(/TM*E-lFvs%嚬GZҝ76ɨJ&/YM(*Yhm7R䶩?WOCteLzn0-ok\f)[xJ)σk<x?hG1>PgI뇓Sk8Zl٭6'IM㨚YV9AgEH$.S&e%Q`Q%;c^$FY?!.
endstream
endobj

24 0 obj
1978
endobj

26 0 obj
<</Length 27 0 R/Filter/FlateDecode>>
stream
xY[6~ϯ
dC[oBK~53=8-R-f}rvv۫tAk>;vbn?v_=C~찇#hF`<>V1=qz}Eƃ|tB+@CXW(;;
ngհx8?}<=]P+C_ey)M&͡8f6IAwޫ䁹N4
h9eH,P&!P%t_=˷2uq}wj]Ap
է|ds臐¨+1/%gPPՐ@~g<
~*ul5{XӚcuP9s"2o.=2xb;e/LTIHBdyeݞF5,MSۨ;#qO2Hultb%JY@&kqP)hatr3/:_VbYV5s\J9A4MAIgg~.I<8
D7'Kz3k.:_:kҲ;w9-KEf'̐]~P2.ӿ}y1\`)Y7+hTbN)%Ԥ@JsReZx*-lTt1*Q`&/z	d5i &WJBX1j 6VƉȐeY2}`P:eP:1꫉Cĺ3""azz'y#u*mIxb1+蒜|xEllru<X#cP*3l&J#76.Ŧɰ7&7jʆ(!̘ٖ),'o%RV%=aQޔ)li+{m3gW
Yϵq/9ņc꾢ٛAhۃnXB'U,:
ZfcAۆ	1ՆS9REy=vXϗǭ=v_=8#CsDDg7Ϡʅ&$kwe917MJ04	il~jtcϝn4&s5cDŽ<~ `yTCCGzLÚfZm||֦W4!?Y8}:lśA|t^iLBc$n/xi>GG:MwKum;^kMJ!
O"o|to?ct
eyp`nx96k	ޛxЍMx{0
mאxP!oL|	bosx׻Q(¯:?4qaɊidQ$}ڱ"\gI&Rj&v4zgrX${eg£(tVFxԬ:U39Q`S3Qbo\
endstream
endobj

27 0 obj
1473
endobj

29 0 obj
<</Length 30 0 R/Filter/FlateDecode>>
stream
xYI6y;*	6Aܲ&%?R텼-Y*tDwՂO_ur.sR]Ls{_?^0BpWuf8Unp4J@pW݇_sw
çNϗӇe~ .@9HUsE\iQdR}Ib{[h#+LcW%.So.v>#Y#99U反V\l0;~p
J<|@x	3Fɠha0EGr/jtf
縖>l4ȫ{aGWaO*GSxEIn!ԓY@N~-?Rg7&S'ÉJҏADSæ]upM-h21D,G`bR2mP&V%{X'qs͐AR7M.
苩i:Ũ{JJ'$E7BY,,S=sf<exӛ&w
/dmL,/
V5`=#KZ'sZ2͓NcҒ|1|j-bt+;E1{qK-skt /}ˉ$$*,>g!Y،-y}бenN[$PhX"&]u$ʙ&#+G# F btSEʙyHMt|̫32̀Ѱ5	keҐRQla}L(/=@s'C/x/2oyxԲ>32МPj=XU5Qc	uAp*|Tt:a+ISb€C懴|K"ٕLay`;hC!A5-,oS|D1.BӛѪz HyxwX8
7;*o~TVGI>OoRFz-y;ZJ5u,y54mp [zePP["tեJΑ]DzhG*)$DS<AJrOY*N
4Łͤi`"MIwm\,y'-BgZ$-(X;[ÔƵy.nZ8tFRC\:k8ǻk.J꾭!ˏ;K'(:zkX5sPGZTbZQc&n잔Ro]WoTx!4:coopGiz8tMsSuӫ$/
Ww¬
vpkL
a XkrZ$K7=QbT d^I##b?~ڝ7m|B~	~M;O{C^#Y-p D_8toL2H?a*OnQjtT(}OD*Jf/tkJdf'ts2M]d<`*dh8QѨ˥`&tkHTlβ򙥟ӢD#y
_,BSQvMoF[e^\k"
endstream
endobj

30 0 obj
1656
endobj

32 0 obj
<</Length 33 0 R/Filter/FlateDecode>>
stream
xZI6y;e1Mh!䖍0	d.E%Yx`$WST8ߝ~:|~]MA*Wd7/{(hi˟=f:Q0+
x7aFqa8*urO2X)NC֐(xQIN
G7*Ho	vCR3q'=Zo+7~tw]Y]jx)`-!@
D+H(m>$7Uek`JM|B%!tos`	-0y8m&SWO~T(C:ܠ<u͇{6^[bxXE4XӵZj:0NBO)Ɉٴu_%g0,2`h>ͣ߀Vmt5W=
Ip5
=qC-yכ'f;P:5i6G*&AI>0,u#Xd{\j{됬;Csaa2&ŶfI(
Q:<Ea2ќa8Dy`xd֗vUz&.HbpL%djQ05b_e4ADqCV52k#ŭ&WMRƵ٤hv
^qUC6;KM)(lX-2}}r^f ]RL>]$a6l]ViԇL79,ljA.Xf"\3Z}),Ŕ%˅"Pj0$B̨*[]}9 *(3
C3[pU42X6[	-Giy2^mԂ'ʧEլɃ,r&{X9Ȅ1iPEhVr4'=\(L	iKd7AOwktZPUsYrtC{S,GlxTM$.:@V7CNl=#d.RF"!KeIH>yEb/mIĈ﹝
/!iRaCݜICLK"TV'XJ#SM*7a\pPTmh-t?>uo kaGj33
TG;pa-%ϥך̎o2o3Js1Y	+0''dI{<!`:ˆ[{bԽ܆0J…itt3uubt(ԙjq>cQ]QR}WlA1w~${A4SE;⬴MkI]J\YrsӦVo:Ԋ
7]qk{@sTZ;OkXt7:}ZR+uS7(
xC¹P'YVOhg*[Zԍ`7cfZjgk͇/ndÚm+¾ڝ}n_B5EmQ1g$Hm}ոg4ۯǑMY+ڟjSAKdzxRLW~oG-pɄ5
jK_#'Z%1D%VkPI%I߇U(
R崈\dm;cv:ZBAISTTTՀƘjxKL4Z~&G>[r?+A'3_R"Q((!*9$|5lAL5%ëF9-"YBH>*ȉ|RB=IQ̈$)CUʡEN귍{z=
endstream
endobj

33 0 obj
1866
endobj

35 0 obj
<</Length 36 0 R/Filter/FlateDecode/Length1 2380>>
stream
xUoU?wfETi*wP`gmcEeI)Hm̘FCwf]B Fk0!A#殚1A%>`
~~$@bLx0Rۅ`gw~sgS4Ȑ:Vkҙ=Z4ɯ8ܗ+'>;$>/N.gȗ0>]`֡uPѾ'D>S9v|ڱb)km4Bc"uLPΡM]a~
?_+J^h
ze^FD(㌀DBE8
0o	)taAT8[ނg%:px'x5ta:jrжuHj&U=INt#_HrI1vhnwS6T6\уTUS_fy|Tޒ0xLZ$yD%':=9>2Q.tARIުA/QryFr.F,{jk5ҰݵUTI߅Y&
Jwj05衃
"ie,FkZXNy8,00geXi\\
&
b7DojHk5:'kF
'44ZiVH	nI<ᎎ&W@+<dX\`+l$cڡ0B!LKUrQ)If'.f̔ͪ"_w3ڶ\5p^UͥH~Eϟn޸w%`FlhCjjHo҂YK^k$-"A`)ym`qG50Ct2v\㩄`
8x?5f
F>Y)je =!ql@	qeXE+8J_XN2r>'CB@&+%M`}+wݒ)pG6d7:Zu;IٞeN:K-<.w{H&˥gvfUzm@X3@qPIȔl}Zi^0VVOsţ*+Òllv0
sSܐO1U7[*y&/SuMlY#:VTE"k1@[uD'0onĚaEU.}x⺞p#ea#Po(T1A	|8xYr1҃>3&1rEAO`aR|㡶VPq\+q&kdiNN
uB7+5`ڼ
OqÄMp
endstream
endobj

36 0 obj
1322
endobj

37 0 obj
<</Type/FontDescriptor/FontName/EAAAAA+OpenSymbol
/Flags 4
/FontBBox[-179 -312 1082 916]/ItalicAngle 0
/Ascent 799
/Descent -200
/CapHeight 916
/StemV 80
/FontFile2 35 0 R>>
endobj

38 0 obj
<</Length 222/Filter/FlateDecode>>
stream
x]j0z= ۹CI	diX}֊Bf>iVܾ`;L0xrsX"8zRe۴D9Zxs.;;dO#Νn'jp8=&	uۧ(_sU壊
h,U]
ԗK?o'KdUO7j
؅YsqO=1č~my
endstream
endobj

39 0 obj
<</Type/Font/Subtype/TrueType/BaseFont/EAAAAA+OpenSymbol
/FirstChar 0
/LastChar 1
/Widths[500 555 ]
/FontDescriptor 37 0 R
/ToUnicode 38 0 R
>>
endobj

40 0 obj
<</Length 41 0 R/Filter/FlateDecode/Length1 11656>>
stream
xzkxSו#H%ٖXG߲-Yem	Ml-?xX% RL %;-I`:3y"&zImH&ma&-_l Νs^{^k>"8ыb0ܵh_:Nv.
8BݐWzy)[z^kRzzBR(Doa%@;oC4۠huyRQ-BBhyxhwC[lv2hn}Ǩ`m?~98	
eRk$}rJj%ΣH=?%M~A[wjÞ8
g:~>Dop75{8]E7лI*3%.wɿ@GЋ6N8?
U˸y	p~5ނMֲoU'8h$GOZ4.4y= @ed?&<a
GL@Dg;X[r
&N9t5cOߞT!cns1¾pop#:R^	E1ԂtiycCK[ZtT/TV̟7w0/7';˜i2&鴚8JQ*#:N)s.Wm=܅IrK:t/=ߠ#4%JPrfi7&&|kAdɑW+p978:kAިZUc
ѨJ
P?`<ǼQb!.54:j
&S[QPu&2	)HJFiњNKl۳5yws,|sm(T7Thu,TjqCB,D0b<Q"[{Q	q%HglrxYҚGFccG0jh7B}m!mgsy](qekd;>`lc0ڦhR7C9&1Fh5Җq$[-m!I{M[hT4{Y:w`㽞fm(Oy$A'͵1Z	Z/0pBYFkfC8̎ߦT \[Cr-'#Ǩ
NpQ-s_jj9ZK-TB]QQKG#,scT:9>:K2^fZJ\qi	;
ݰzV)$̭6h`qFֺ&s]c{뜨"*v|C!ɎZkB- $'
x1pkKCBj4E
j%6JGh8ո)hԸ6S**$-EjTT
p0e*y5JFì5yW2	{ArZw7ot/FbuM#T9*C<Gg`gV4[#Lr]##
F
!V:VuE̪GQ?zvJ,k=#!$3,X
6Јa32BìgÈbpuN;##8^JCvH?F:hd6/b
\MU_+(^	qQ|3֫[h[G1VWQ/9 (ZJKu&]Ig%R8?Zz(FS]	oռj/o@3<}xs XMJr{ɛ=`'IAbP%rG
&ɓڵN|P$"O)Dr?M:O$HB9db7H=*
D<N"~R+E\+bh	/ߢNtZ ]hw8K䮂N䜈vdtnLi"=PYb-KnPe1+jt["(⟈H-D2XDy{E/։OI@^e19 ^%&E^xAZU5aǫ;:C^nދL!-wṺ,8U%6qe*39!Ix.Vի,^+&e"wϩT1-1M^ET*ђrڙy.b>tuz'N^BC!_JIX$qZ0{J^eL&oO>''ӵUv+JFUvjڡKkVAyC;a,p	ŤlRfsf<Qf/JDK xΜkljxN\j_@e(	>}4!|9V<e9]H+XU)ʬE[+3,M[ulv}y~Q+𦜊|YJy~"0W]ZW\xNSYs.]cAr*r^LI`׳\-'tIG:^%qJ'Vt)N$Ҵ?Jt&fPa%=ϯup͠[	p^/=iOqAKsu^lY$/<ӜT|_4/ƼExT9#lz-6ל9
y$yr!۰,~@dA G@SF_0 	z{!Ѥw	翚XrQ4N-Xnťͷ},"A<++ٸ\MnD4bFRD$&OiXSQE6"-s
0S1&m|siX`RWT޷:		mR7;1I8p裝ڎ\S:̪nΝy<HDf%'%-Bٝl2c*^5S!.7O)ȼ8up|g8k`vV;lex3IƶjZ䅇tsSok}K>3H59.Uhٙxx&6Ѥa'Q7ŵDIl>M`R|!@KR^KlBӌ4rӨKg/ں֑P[:3ܶwq\пP8ZDjy<p@x壮3(o'cgSȰjab6-kjVr
=/	6HBpDp!:3XUjՂX4̙Y9`,jZUiKDO_w:|XK+Xy|3]=d?.,,yO8M+5ɹ}wG׃_<g"f&~
e_eX8M"-ĺ
38찯FG[c3&]4u5eph%J*L!8b羲y+(j
8nŹՔŖr6v#KcQRG}놌wrJN978N)t0'C&Qht-h<s-𐐙SF#kvToT_۾WT(1+{۷?Qӱ2k=M~&`[3inuiwFjVg2Uz'K *CDJvzژ/k)(jZRssawD2HVE;e1hN38Q7sS EIe7.v"_,h*5Uf+/Z}QYe΂ʺbٶ9*$Ę|-K
,[..h-u#'Ttɂ_f]I%\c׎Ia	hfPd_؃s_mg:4VX4'	BoMDP47  hS'YHH*xkR HR;RQ$\[MѠYG$K#ZH<6CUep$?5apحnGq»k{說ڞUB'V	;ă-xԔ}F2
fDUg8Al"(|[ sE
LIt4!轇oCr[!~jxU>[J4>#--hϷӵ`T%*uFeTի*JP%څ"w=u9ZfџȢ4;&,짢~:iЗGb^y!D^'~¾_~ϭ3cxv
O}uG&;z+g~xSO?ҾV벹ƕy$M|FO-\e(̜USd* ry|C/!ݰKXF:FgJ]g`)Öq$K%^K_c)|lB%>3AqڠAHzsJB&l;MӴP:g?
BzgBkP
~(W+b 옿ᐧ~gC{;]w.Is5J7x')ۥ[Qx+)I9%;DtgN)iumw#[vpU;jwUO+_|xiZh߆3:Pn>r&xs&_u%VHOV2}$<.|[ߙ?瓌Tئ4*ͭnlCvf}pzӥ.
+N
횱?x[I,
OX=oYe}k#?aݩz
yc2{t4T!Ps!nՅ
N=뉤yMn@U8rU=XHؕ\g-iB%6NNN0bv~{p#Q+œּ,FAq;W
w Wx<)BG5 vD#a8.r[$N+5qR䎈W%DC3aH(1k"H]CEik=}ijpR0A:JH&W	7.rNΊt}D0V:63.^RK\LQĔ8zᨒB]Бx*a|XNta9Y'Z&04d(l~?a';#8V`)<%r;h
g#Ah
rFd:h:b"~
k&<#y1DkД4%zB?֠xܼ,5|4Zl?M#ܚh.DQ8^'-[e|;wA+ЬY+VlAG""p
‚E/[:N/̭2i'FPtbHg&YeVga>%{)'q:=yq8M`oo˜n}j/zL*<;'77
,Kɦ4KMѿ_ի]z_o:}̂GW;njY#"s8Na{4B5c,Ǘ0c묎OHz8D.ݶ?5%Wo߂B"ZGa,eʉAhق9.ZP 1RA5s
]WX8C7ܚM-/sdx6FpEH 	a/P-[Pw
Fn /!S^Bi炾=7~`\Laxf6V!n_?9[O?
3ϔ˕?ɌWomΉ@lEP3[Kd爑Q GasSQߍ
[J0
Ǡ$l"ǥQX
:,Ÿ#
ǡxoGB>Eh
(Q9%Fa- 0(,TnaV-
+
n{Ay,tPV9(Vעp
uQ8P,ovKݞGzQl.@wH
}C`oXZ~4HCހwhxIo_j}뻧oJp+C()o$t{7xIi9]ŠXo dRT,5xށ薚{z
zntwfwWZ	@_0gn޼%._n{{q_p'sk=>P>	ny׬vhzzz
tƛ-E(_\ה]?4E{+n8v#=R
h!
.
/,B	~0>-fx*7*FK
`{@^tq":4[h%
mSEQԖAC!p>Qg!@ّZI	2~&(U	UX#?.&<"p_kFPR`lD41612|Ec-?mf^]QU m/laQ:j=M-`A|5p
XG%r)?z@'M6Ӎwx3ӧ}3v%VeHwlqvM梏ѷ\gQ01ˋm}|<xM^/3ZNװkW	*w\+W*J_p
ugd-<%es8CKKw7iD?Ə~n9K/WKf:}*Ωɲ};()&|҈itZ>yZ/~ZÒ'ɑO(O㝚d蜆Ǵ8Oy9N1뱪ccX>D_~ʌ/5`ufš[8'
dzywCC~CYg3Ǟ!O;ˌ'O',x`7rĽ߷?1ũه}jSǸ|.0Jl;w|?617I1nQ}.nS[JS[\Nvq3׸cĘhOh0۹5\GMXn+tMHLu.o36֧Nϯ'md'lbg4#dE5-Z`ԂѤqDxiJxkwVA2~oTiܚ^j5>ͤF^>'xmnXƔBʆ!h(>ji_:ߴ=?Y7:gՅ)0vh2n%')D b)2EЁ@0D%,Kp#@;@ɩOho(JR!b#RaoSK
endstream
endobj

41 0 obj
7722
endobj

42 0 obj
<</Type/FontDescriptor/FontName/CAAAAA+LiberationSans-Bold
/Flags 4
/FontBBox[-184 -303 1061 1033]/ItalicAngle 0
/Ascent 905
/Descent -211
/CapHeight 1033
/StemV 80
/FontFile2 40 0 R>>
endobj

43 0 obj
<</Length 340/Filter/FlateDecode>>
stream
x]n0yCEBBh8Gc{i(o8fKbQYkѫU3zL)Wɘ^*ZffjӍy΢76nᛓ7e/\:Sk?eS<kI*j0Vk
X.D*,(کPCHs8;9!.S9=W8!hx[3/t}ꏹSt䟢$$' wB^ȫy䟔k8?o[/Towh1+<H

endstream
endobj

44 0 obj
<</Type/Font/Subtype/TrueType/BaseFont/CAAAAA+LiberationSans-Bold
/FirstChar 0
/LastChar 26
/Widths[365 610 556 610 277 556 277 610 333 722 610 333 556 277 333 722
666 666 722 666 777 722 333 610 610 610 610 ]
/FontDescriptor 42 0 R
/ToUnicode 43 0 R
>>
endobj

45 0 obj
<</Length 46 0 R/Filter/FlateDecode/Length1 13808>>
stream
xzy\[םiJH,d]!bXeA&ىnNf$$'ͼ/nmLimqi~kxs%$i~_{u[?%dp$8d߻Hy0+5XHmݻ	B$aԡqB^B_^@'%B5X/f KёzmGn5&֕[	Yg!D1;IB*wז`0!+"SDI32
FdβXm9kyN~	/	/ۅ;R]b!7dm왼,4o(%Y+8@"oWȳ$A^:_P5&y=rf3O^%#D&#_$~=QB!eu&Mgy}9
`QP`+EE B%OߐswO㌿Ct߻2b<ENKp|$}Wi:$8j_|VR~bd/#/Gw89P "?$~r;}	&BC[zá-=7mhokmi65Pf}uE[T)p络9l4duZ$
<G;Dp/twu{FiN(q=MBVɔ)H9.`2xd4(n%6rbh{HI\R=j/T+XqpҞ3Ѧ$`XiOtXjnC~VwkTWZBNXc)uϞo#mpM&{m󴏌%½mvkdcnSH2!&$2ɦNSN[L2c#;]ڗ$LD-Q|k9(y4QnkO+JH٭,EP7oI-Šޥұ44rveq[K32fQ$<ή<{=qPB
ia;Y;ӡL`~ܮZ4Jk@\L${Su챟!Ao(AYϹY\2|؍\Jcv}#=O)rg˽d6)u!VYmTB!G];=
YՊϩKv|AɬԹ
nNN $K~`"؆HF8bdM4٦/w&,+djT%,	2<𷷱7+Km)0^gH`*dT6FlkE*l_O8ciʠݕ܃!h:m:>XH=bؠ%42Hؠt`Ҁτ-V-
 fUjFXiX:s֮Un"".kȕJK(v+
SjjLm٨ML9Aw=P GrZӶz]eW+LZ&:j׻7v+KwwcN3$8	\8Xk1A`%Ʊ%w`Jv]f
[[JK0v=pOgd^l<C.g\+VZY#(8aE۟	jZ=DmӬ=KSmj6>T؅Vʙ@cnWƘ}M,
1'6~ FԎ4P1#sG[zwkobMvK`Ғ[v[9l}
c"eo8#KE
g8Erck>#ki8=`r<.*DrBmw w'b3$h@b1!.<(pAhBʹ`[aIna.
nArtI2a	'r$aDXE|cTWXڵ@ h	hq1OL0p\Efg(_FhH^>~VE~_'y9ݑLPp_TEjtEALtrT0?i"!#T?|7.įMGƃl
AC@#Isp"A(VDQCc$gAReS󓎯꽜L^]GهT3y"WPqq.ȓɻp?~
%>?IS
Nht9:r
l}DwhZhj"dRI81N(2/A>sF~?}@QB݂΄<ä.UDs@j|ȹs#Z#;B,p_?O=ݹp˴"eCJV?,RJb*eQ–㖓Wp:ίk҅t.7dCmph~141G.ED.UG"`pF\K27PVZlj5v'F{ぃOjLԱd{ok^\Z:nKMxHԉ[ZvY[n+(h4(!qT{{;TtoZ;ڵɰ@2ݙdvI[ntN=@&@"q//?,Xz	,dV;II$>oXA'[b4僘ߑO'PbmR$+K-Ur1{
bd1ܭ=[,A|T'#MفJ9|vj?#_Ş|^AQa&TYTm+W?QM1ہfB!Þ	Pk}v|^ey߰A{-?j?ő_PhYCS		n,<NP!Oy>įc[9he-\I-R)=	CL>
3Lir/r__~mܸm2,'y hl3ٌ&[a3~AL陙ZcW^<>#/Y3BF(^uA*qJd`S^7W,wM& $7g\_C=<zaA#&0­gԖةd-uuŒdF[q[P`EF	n1d!YӬhxM9\twNY5dkd.$	e4qG]X24De((w6r5.'9_UEpGrI-np8r5܀{$h,;/д<{zaI@XG:&.Kl١u80CyVf&.k˵avV{\+j3%7*0]̄P&3ӪA
E^RE&3EXdEwDs^.NRpi$
~-"ȂNn^z	8ܾ<Ƶ&u, zlr׀~
H`+cV'Y()E\Q\J}wxj=ZepJil尭|Z` +E
^ol
`=׃R!Qzdn~~4.\Wa"?fUDU]rXլ"SNQeKAk9w|mۺ
.{@]w%#j|۴g]8=[,ycnUU;3̕=7o=Thu7܊ϙ)m܇ymZS`դ&=&4gj:xr2]FxCAM	ZPC$_*$[
kӕj@InaOz$,Cn7h畋组 lasP-b1,V6Fs5zPy9x/'/OzQ/,z){o~O/BA!A^clEh"4.@ʈsWy:頻 X>,iW'VA\)C5J?#*+-|}oyc$Zq:{^Q}1c;v֮b{UlU/hV鈌)
˚.k)43r
-8n3֞
mBDK*z8WeV*Z3%6<,b=sZ]M"o:mIȊz(jV.Ǵi @Ck6HOx
DR(8yPj2Fbv'Xho4N#4q!qBZj3qGd-#>.%'Q1+2_`	!
xXf̱Ekq<Rͭ~WG44L'J"]Yjg;סUI"j;
:̕5qJpX
zL=՜9TU]ʳByЫ!XQCJ{\{d	Y,,,uz{BtmL<*/X&o
8Ȑ8酋)$cfhBǪ.$S|	))Jܘgxao
8RXKy6BuUոYqV!p_uJǦ(w`_-F5%w?oȚNNY#r9p$[pt72dqk%WowVOZ6F:ճ#sn&69k2p[
askQ]){F]|>A &d&kjk,uurm]mM(vKҢ6jXݶl-ۚ-dbMmlsj<dE+1˽\nxfZ Jh -`)WpK̈́*~A}qC?
҈9~r$ݰZǬ3
W5.\<Sʖ}վ(֕63oN~`e?/eNdQ9gs
JֽK,&_qvO6/&{
]oj^~n-zsus[Y*^1S`{וW7u&MPbSh~V[[OZ9k&rgT+]J<@j6غLZUִ!d@	92Cluƀ4b36Åf7ch6xaxTQ5XAoRG1v1g1ueFҵF?7Y4ZG@K$޴m:}!
fm8?IZ,^}=%]ʖCn+:ʝw6<;oصn,9"+qޓ-DK8&FE@,P&$;2	nq]$V\Ż5!ȮkҮ-_LDE.mU᥿Tml@p?	n@J" L.:^tBXT:..8?FqH/b6zɆ\YXY~R͗jS}%aU]͛0sZo<ďfԿAa4?d[SX)88أS;|Gk7GCd}'bz,QOuDB
|cŠ@%
zSE0W3I*1B^`2]9\J"B㺊rVf#Blu=Ieu?P6h*j8-MuM%
r]wU:?л
^<rÇ:׏*l-6)=ȯV?G
Q#u>#|*?~ep]T)`0Bl2ݲ"&Y6"26/dQVV=31=qܑs0kܻ;҇t,ez8oyFؼٿTNŭ'dn>O	hVYYqfSwdpkMGeņXZ0"vՒ"#vS6a(SJX.ŰI"հ^ӥ4TtH8c?_۪wZ$zpbi}dy,'Nn~mmD8M%bg<-`Fc.GEJ 7L0Iz
!L?\H!m,Ra:%9-CRkT!+! Qo3=åm}!S;͵Mm*ҋO#nPieHP_EV=#2Xdsa6SP4֢->
)=2-E|Ad3тUY33!.!a="]QM@dQ\}\1~-K|
t2W'/|#4@askkں:aOeX
5Lzbj22sMUiY="FOS1GsL>[iȅU9+ x@RXT$

٤ŒBkvcZ9=%T΄]{t0>r}5C:uz|]
հKɛe]Q`aggȐq񾵰8dG1Y?:..82pZ@*W(G9GBZ[v=n*#yau)[_('BA
.w4JcNm_ZI۳{:~sMMֈׄ` H/Oݹq]]3m,6nkcwaRZZl:4{{VD޵DO*+^(][Oe<E;dpʁ@%}i&0&3,yYfKV

z<> e=(Ƞ"pXyĜ8Z@G<nj%ӥBt5ĵ6'X|j3wn/,4WX
y?w'ۮ6$ۙ\#%u7޳R=r>?iWnj]-𖪏_`<CKn`;&Jj7%m~H=ݔ{Y"RUA/aan[D""0o)L\G:/Էh\%Ѥ劋;—xKO0q~{ǿ{7/TxqRcriӨwZE mH-z~&HXGFƾmXc+mH[<$W=֛7a}6	)!_$/Sn=sObxP*h4.?XŌgg<[
?PuBL*'qՌQ'7ZeO#	˔I(]H!Oy\wedHre܊)U ߐ.kz+,[LO
G=lƼk4.YK/˔elt'UzpJER}&]ț*
e-HVФdL3IRx(]6m&N'o)c#KJeyyNE֙ٙt<5Oǔh,:0:VyrO4կLZfƔ+<Jw)Pmk(+\%cT='cʈIWPxqzw2c2P_G22=l204>>9UG$O O&Gbe泥x`Tǣx|v7GltfoFǢɽӨX@x|'<2e+*4;gPg|rh22:F_\&;ue:Sd/qo%QW
#Xҗ$Wf#H3Q2-dgc{T)SZ7{P}Wٌ{Ԗҏil:ꌦb}Q^ߨm
ޗ*+Of=L=On¶2Ͼԑ%cYZ{U.qwrR=*UXW6Rm}7|P,)3XH[d9>lܪl1|;Gm&,ـܬ!G|~{!Gi(SyG{j7|LǙZu5U8Τ2=o9n6=poV3Oe>6fT1jvs.5;>oSʛx'apS+2<2̼
a-  ;k_o_^
_3
Nٹ>xs+ ;9|[+osf糡13+γOٜY|䧕OsO>g<=58ς%D3؊dӓ'cOB)S⍧ x`x	2=Xp3'>q>791|.|>ܽ4>|uK?z:_|oQQх+GѬpwg+E 2?wCMBs\\9)
8x?Lait<gPeQn=ܮN3cŹsG_l`y < 7Wr3&`#ؿ6Y9}^go(;7T­dۓ8ς

4N$zp=f|Q7ޛ:Ε*[u8@Aˁ=
-	lWY;46w73cW+F)#?C`7EpuVRxGIx3ػ=!ޓ wx`GI;Q?vu'ưdE,Ȏ62bq_,}KX̷Pվ/Ձ$j6c>ҽ*?j!WX%.$`o&.
endstream
endobj

46 0 obj
9263
endobj

47 0 obj
<</Type/FontDescriptor/FontName/DAAAAA+LiberationSans-BoldItalic
/Flags 68
/FontBBox[-208 -303 1127 1029]/ItalicAngle -30
/Ascent 905
/Descent -211
/CapHeight 1029
/StemV 80
/FontFile2 45 0 R>>
endobj

48 0 obj
<</Length 366/Filter/FlateDecode>>
stream
x]n0<Eݡ
(-hl@F@x6ۤ@_/sea]oZxnd(^/ۊzh&w:/0T޼UvƒlonbQn]ߧ0,-tS3=7TZ/ޕ%֒U<5lcnA,3Lo/
ƺTR >fCG9x|GdEJ8I9N=s9'͑/̔_2|tSB	:KW2++_]?V쯈7b)N&·[O
ioT
endstream
endobj

49 0 obj
<</Type/Font/Subtype/TrueType/BaseFont/DAAAAA+LiberationSans-BoldItalic
/FirstChar 0
/LastChar 32
/Widths[365 277 333 556 277 722 610 777 277 333 389 556 556 333 556 666
556 556 889 610 277 556 556 610 610 333 556 277 610 556 556 556
500 ]
/FontDescriptor 47 0 R
/ToUnicode 48 0 R
>>
endobj

50 0 obj
<</Length 51 0 R/Filter/FlateDecode/Length1 31640>>
stream
xԼ{|י7~33Fݲ,[|ldKb,Ɨs c[!B$!i m
,	݈K)$mlI-IM.ioJJ$l{H??a46g9\s7@F4$/_th!lOLSDŽCw-!BUwm^9`!uYb	#t)G*Rp8YK&yiڍ-us]/]U#n'Ϯ]z+
ҵ+պDu6"ijC|CGo$e@я$54hu`4-fw8]<OWXR<jj6Mk[gwt*3gu͞3w^b95#R?a!Nߙ9
]r=NW/WсN19)Aϡ]c϶K}i@@'ѿ})	=@=+F?%}:z)fRM$ލfK$s9M'=o${cӾ ^V{HZp&zB[a%?V"ZYOc<|
A/2w8ܾ{Qrys5Sho:]n7OkP_W[]RYQVZ@Q*X&i5`@bGʟ.IQQ*i^\J
RJIQۤ)-erZٖ ivџ~M$M\O_Vs4[fL$;yiH՞j#7g3V++q$
$.CY.kz#>6ۗۼʊiئVji͌V':?^1k-KۻRr.}׮ik8].ᅯGf"]!ô׮7u悂1"/%Ks%1vu]]KL,Ѹk0JtLۛس$-Vd;t{8_1
XLIjD,Y@N|-#lޏyO 9^)Z36Y\DkF&knܞZؽ+gdw/M,#
QH?]61Dm'9x?͕e!wzz.A͘?^.{J6H=HʊξdwZn#	yi;+M}}8v7'V[r3(<wW:Foߕj%>b'c-i]3]\.Jy	w{iy	yKK(*HP3]Ů=
d+hwl݈l7ҺߍP [6#j)%indr\;\%do%P%짲j]Te	I@0F-kGi-i9MFG]bk{WnY,L(@'3t1aוֹT7gNVwĮhbCDF>3(	
VŎ	G,S^^Ev8sp{ښHgPt%[++0k=.£žMvgZH]Y?BZi)-?ОNm=+#4ֲj_~Z,qL,ä͖j1A~dծJEVA8Y1~Ƙ֋+Zlk	e*+%UjAnAZ48ȴZVw9z\ý;Igh1GOh5i'Ǭk0`
aFCUܢϞoc_Wu
~S޲}ZxLF
,0
ơ%9X
D G kZu8p3c'z-)y㊃QZw20ۦD+c5S6BuF-kЃ
.GіX#9ᾁpxx𳁾>kcs$<#O]1vꪠ3P[1p+`	C;ύ+;`^k:/̃Mtݚ&sNP	ONn&;^3Ǭep#3`ދ'̨*Ce"F.1ڞxQĢ4I01%|	^^'r?}__)8B&ctiqm=l?U1K~L?#\fo*=v~/]{c-Ss` *!6@kDtT~sE=|y{N161"D."H$&INZi-EQӚ{vR&K9\>`%cmW^
gW'6XL#-dF2ǟkGg{*]L:K^?|z
k/\phc7ğa(7nlv]7X҆60YX`L\}UtNMH4$Q(lP7+.6_oqi8AP:wdHX^xFuU_N~-{4Q[g[,XX8h]=\;Q)[bԶº
eڴ`_(㼩˻Ʒ{*-eb^ixKchAsfg)x(Թd2RV.ibQ
n/-GGGϗ_)U	U*/ž>S6w>/9J,	TW>P!xc8ub̈́
1zfn`I]3Z6P>qvpCˋ;g4>~M#gm3=̏>k+8ި%+%<BX&[i<ˀCL$oRlU]^#d2YàvQ*AZl6Y4ĪN֡#
e͛F1ӁtE:Wx'w{ѫii/U = 'c@2yI^,^kիlW+$tdtNZ^`s*NWCq&,Ȭeݩcɾ,D{:
S+F	)B8,vtcUtT#rSg7ho26tC`U^ٲ8y`0P
oe;J<#$8*W.;]n(Wt!"-b>ϓWw8Օ(ECQHhŕ
.ЌY
%ʣ.pD0'<fեrmRZ')TLUU7(9Iu1¼>J±:[vWn7^ں15l35
$͟|T=̞b3dBt܈tV^Bw͝L‘r`C3a	^
5X,{#Lp_,.GKjbmĜ1hu!󃹩\_6UgYZUVr|VfagIN9;w,)h51NcXkd<v"'fn73l,VpI@[A_*$ŧ
rH58]*=T &wQ˛*c@9'N](q8 S<2Ѩ9դO/~@T<z"'P%ƨVEOQ$<c>l{w`wQssdR9e^a`磙	M	a۸Ȏ|B4ˠR@MA48u<`i%G[(W`DhQhOR~e^UL-	I z
cޥ2`ҹ37YkaUZh\eV?d<!̾wk)ium>eh賓4SN.9̣rF`@0A'%(%biy
`hPDkhR#`HF
iØA$CnjC#/C'\!;p(䬄#ޜ::QE|Ƞ<$|f?oQE|'2fy||Ѭљ+a
F<Yxs8(LiF$IBH[;YnrC{ƻ}}Jnɦo\MBBkl&M@Uh`b3AsTDq#I$C+Q.`E!b:Q@.(Hz$P|PVPDiK=,S;'1=7IW\RZr
$B agc묒=b5ugl8FWhFOoZ[ZvSYo9wφ[;cQE"yܕ{CVaܪQe-BP,2	Jс?gE

	8!R*%!FBC8YT
v:G$@ 1tQ`9)a/vrgbȘ53.ӵJBH*wULG,0NmnrDRS"~dnzg<8QAKζ%3x2e&A*?H	/\q-Os97XJep@YO.˸4wL7{oqx5w?9`Jx&^Ya^lf5zDϸ%ZLhR"8,>`L˰]Fh2gXfRgEtz2*m:㙉3'
fҋlhEFLKL3cF]F12$W+b.8£.hsmtmspU.\t
QKƤi.#.8Ot%
^刷HyCרpEF jĘL#+,YMbDQEx+'oQVQB0Ժ*bٿ}aG-&wr
vptDY8煘WMq32/&Y}a|~B)x7C$M)Nc m<mszح{R:>bm:B+XTk>K9ȁT`$0`SP)KXM0YPYƹa~Q*kT Ҫrx?}קgJ5\
Y3᝿L_?wyx'46y"EG"K\2|Hn,Yِ0trx$<fᔚ`êOQ<8w"iOPiB/s	?UmMf
S 9j
L_ 	αJm,
E%-Om)hۘ4SlK5M[۾Cmzik`WWYU~vS	߹I[ot0P<zy'.$o3r$\y%yTL1XVr
+t|.XP+tn7
}	b|B,.G/ itYb$HR$隄Kߑ~*1%X,?o	JHY#aO$;<)^	v]^rMJlN#W6={R%1	&}H%Cw$S	NћJHL	$pH5Ș%(mbiIpA$ҫI+!!$Z%<y*ҿH_uRؤb)*1W S9	?6&i^bj6%LȉvEyU)	OvI[b]	<g7|BG÷I^ώBGvE%!!y	4"Dyriu~cQ62FcrXv')7܂f|`0}U>f\,P8VXp2c5ԍJ\;7La*Uvp**|sC9[_YvKy[FQTR|jO@ZZshkIN/W;#pGS+?D
N|;Mp%
3Ju1US\@VwD΋Y#ՁBE4>0`!x4l<dq<Apa,HL GL0FFw#"O.itEhE	Aȱ@jP*:
$"ZVI}<u/	&bi<d1/ZT{s`-5qkC)|Pz\f).L>(V_.{.\-\$X°AD: cpknM7v=5~hOdPU0jXAN=q\G4qR=8qeqHx	(̉8C]|q|%`qx;8>q-aIjmq\'dw!<>8`qh'.۔}.8ĩpqpBY_mt:BMtD\$0㰍6G$^8nc2?dO&83O.bTtSEKqfՕ\qXt,8cq<?gQar%qد)&ٮqk*>U)ʽȤ.ů6ϬW퓼8`!G8g:5@CcbŞ'ǸDI&EY&RBb2)(!o-C?/som'"`'*7?ٿTArMq1
,HJ|%u-̢=][ֽ݋47fޞ)5RseNob̫sCE2`I(Dz6`LܐiĴĴA#&̚	23]01&PUm2ћ[p	X$&Tcj#l4mSodϛ.0ViԔ6t#弉5ht3.
DϚ5[Ʃt;guOrD֢Y]Q'ߵr1g,cJ|Vu޸yRGtSPJ0h@z"c^@LeGP`B@MI[	.)	B1j"G,6B$.$FG,B4;(kvdiT!^ښ)ɝgvCCK#s*{[[h
mO{bڻonήrEl
_aɴ`h7֝hT^/ov
vSBd Ngɳ`3C.+4UgPXW*F*pP)_Xٱ
6^T9t|`M8j"az'BP]9 9srq&ؾ).j;!@Cs^럆zJ݋,oԍu`Uf<1_GcQ(c7n<7ux cxxy^x`MC`zMRx!71o@MOyQ۷P-ӗI.y7x֑v/xX&pzhH,W_C}9l)·,(ޣH{Uyp[0U4ssd{VIk9`L]!ψe'N:NGi㘑5~2&lB<I'@B0V"?~9yeŒjF}
{r&jw;Am^[go
Дy笆cf吗oC%n(#?F4Y4_a(-^reAUE2IsrQh(]Ĉנt{T#aM6?,f2$ItA8ٰUg65xV5Tcע|%n떨
pXOx*g;JO'Bs(/&^єk("kה"Ԉml/ī";$%I!K6
AgWD86e{i=stl{G'oY''E(nZPsm"/@Q"&kh"޵*kK"> BX-"%MilD8EƈGED:jwADUbBixE	dD6d*dQ/$(?x,?`U/YU^FoR`MJvnj}@U4(J@kv7]]ں6t?7Mf'}A,Cߑg*(`UL<&6ƖOWiw+akFfqq91Gcn0æT`&
1du9ACcb}VsؗDiEXxJ؈{p@e:rY_8Oep
ޅc/b$2k-SY_`2s.7=媭'yѢ$HAƂ+~V=֛@
qj#Bp@3?CQoCv`q0ry_
Ԍ("LmvDX2Fc]*"VUnQN*ջ`W3MnGLhf
`V{cwBwo{SHE
yy.PQ?{[ocszS{~d#߳wZ[}g63~bo
n VhZVt`9`owКʑ<mk:m۴UQDNhw¨󢓆}Dn$ڦoO6tN&TXl恷8eva֎ZJc9r4
߈	6YVBv)鱥_Q>~H5{7H+m,=ma\أ_ߥgzjV"f
b1O{]L$<uJ$z]yx]n_
jCɪ<7 /
#	+)	IӲC()pA`FPKk}Ŋ *a8J*@VQ0:=$EWcVo@D[6Lpa^diiJR'.)32.4t"_q/ޭzT;A'Of=h.k:A/tvngx,{hd]$^'~kvOoSa`R&f0d§—W:!éPbVd"d"uҀH	SRR0-`ڏdr߀
lЧ'6LX
IN\kWYc7~ĩ,Ezk6}3naiEc%5= }gk㮩&G̯i	mp1h)_\mFbNq0Nu.UF8/9hpX憸uqdb#p~T
./FuL`6vÇoĩ<HdD9Ӈ)o1u-ƦiEL8J3gq$"l-4ՕT9XXw*PX9"-hxeP.^N\hI1QC[$k@uƘ@ӱ[IVrQ wwX[~4d7|yJNC:nBO;"`04mxd
8NC9zg`[RXTBcOu3jW1j>ߌeraz*L8Yse$`kSɊ
W`pBE2RC"dpmQ:0arZV[V0wOmo=4Sj^_]<mwZ~kX1y[77n}{p{l?rJ-}s,ʷf?
O_\iݚ;7KFdp>ƙ[tC
:r)IBI\	Ua=#JzhUJ.Yٳєa5+@mN)M)0L#Ž)ڭ_9>>tN~p&t8nkOw٦ϼ=g	AO26}P=W({#փV*OG05Γ#pDR3R&\6Tv	8/8P*X(Eccsa-o@r48;.,P51)Qߗ㎵454:rϠǕ`2/gvdչxvѾmlYφwkn~٠Rt<gI ^XbJ/ût3H q-r	أ8/|}nc:p=amv[.M$dN\{n#|z?1<~My[yQ#M3:T.iʁ\٤\XY\,S/3UDrf<]&68!~IAOBDѫ.'W9(X칅Qw:Q7Y
~!<<fWx+vrd
V_ܬU+`Y-.Dt]t܀[<4Lz/?>giBgP#PCq"J~"b@OtMSGjv΋qV0s=>(.=qp1*^&gwCAAT@a!V7-9
h#)@w&P6e{E#>K]4^eB`_2Vڦ,컷=bM
7&տxXY71XۻoyMwX)7ͽ𚑇/Ů?
ڧmYl48MBvNAz&!0qȘ6^1nY H7ʥ9NiGm`T/5ȋ'ZȞ
G+z;mT//V	tFBᮞ^+X۬k
WC>9YQ>	ߐow1K<8EGxhw&]I}}I׼5f),=_O;M-yʸvIYY}nyQ83
llmNY0.8_B,aYJIE	Pe21gdlf3nkoGz:M QɕCmn<k+cŌ=6Ee~l	'68>O<C{<==7zmd$~$8Hpwο?|uVݝdjN%HBoe<y|FGkn0_^;Ҙ9maG&3gt$eא`xcOI2]0\I;2:FN309|w~McE瓗*Ym%TxwrҢSOHKk|}Rm
@*X`},XJ}ؾ(FFg;sBc:X[ NމZI\$Rq~FGRI24 !<@wz9qIE
P_voʐ
To
y(k6se<?|ꬬtÜqr|@ Wg9B;ԉ^ٽW~b+իfb[6fHe(m,Y(9B2BYYH	_`rOR^Bo&{A^B^^8{9Ie^ha{ezYZr5Q0xVbW3}Uy6$_)5bP30#a/ȝhTQP"CD
Wj(^u;a'@)L'wbQT?OajK&5Mu!z+@jȬZ\wlϚ!Oe\EBO=ULw;:3n\6gɵ9.WlgxVkᶍ\$Tk5P}Yy~F3K6\QEjj=RS(OlY7pZ_K@Ke/rmDיC`lpдki"hI8!	il&@:۬AX~"x4鰎3oBJf»j&Z'˼$AC,Lu%B@-Ĭ1'`BƟ6<e>f~ۙCc}&d>e~QSQmF<CT`OW@/+;%IǠc),X>^YF]ۂbzR@R"P܀Th(NOhQȔ6>Rť,!8E[Q6s@!Q-7ΧнRܠ;}Hx$4T@u3*W>8
Jh=%]ux۲pe]O[E[$sw/hf]cYEm`tCS?&;
wm%U3E[G<J={{QsZf6UAEcsJlŶ6Ulvi۫6.iZ߶zSvV6[҆6
TCVc]]]iIX16*^ez%2ͦF
I/L8OCyLJoQțbnFG;,ac~u3$o
m' h˿ʬwfK.2^ F<`;V0Z;BED#ꈚ=;HSLtDPgJ'[nS7L^Y8=Av8ro
;

@(_Pa/琹*:<Tyzɡ1ɆLSC8C߹߿V/;0/V;x|~n̏ǓQ'݇mfh?By١u꭮yh\9<lYóf㷛uu.kjJwmru:1^>3
J|¾z6Gp	XKqɳ/-ӽ^6y{ij-,-!1uW\;OՙQtLdy	r!](zb7ݮSC	禶R?ߐçD).E`67V[bO%xngW2? kWx,h	w1dGdOJ?EY_+,6)ޡoZ[Tj6g۟;楗s/Yp9|;9:8Lc0I;ɧN~m0yO9v<vrp=~V~Og~zq271wS$0g㰜cSZunr>׏/rW8I=JY9F]
&<
&/LgLɍ5"lt6ݿglVHq+Y\s4zGde9	O}oey”RDhS)Z[.JyyL~/7ńXUL%bkjߌhs|3LiK34C-jVfnМWm/6kRk.zR
&%2B
Æ/7%BNʐԅ;ic=tqUl}޳Gŗ[s;}wVTʔhxUub{|i]VWɗJ;uysw߲b=`̖UjM|}F
As3"O7T	
RTh=n2;@}.<ikU/;}[37.](m5yMg%m,kt7SBi[y]<<<_T\|	_3ë<la%xsnwxyNx<q
?oAi#?_\xjKx𘴆=1È%etK%z_OƋވƄR
!"	Sȴ~?;V" Ҡ*ً5-,k4@B,l}`m!/{uȋĨkn%J_2x_޺#9*o`!2pK`'0~_=n	@^Ŕ~ϾxwdѬ/$3iJu:},U&YѢ&y	V~Rsn9o]9뮮G^*[_ydx[>L~[o?!xLgr|BJƔP4Gmruz]L%
L{ϲX0cB2D@F:eFաuǮ:[hLd!z[U۷
odxxG'9;=̯3K|8gF		:RLbJ'
$unާ{0C"ebJcɺQo0h}(ϝrv-nsҩ-}	󜨽az»g<Mgs:f\G\?94Y|Z|Ok϶,'$

j'L$$T
SSqb+SYb8zz#/K$l"rY=4#A8m~nőe/Nx:ɞŁjtK-Im}vpVYiCY[[ڱt}mE{$VSϵ>$gE=xhsu[`2G''ֶYϛ
\Ӷ_
VVO~gNBq RdY\SG'_5<#i)nh{83ΤP	dQQf8&"fp~y1!#<Q3,0tfASz[-dcy:pWV
Y9u\zFԘFu"Ba<=f5K@
S&ΐD]8i*$p"|p_}"K޺#;,w
3Ϲ
J[p%4vǡdՙtXJ>Fò%!7԰b<H:/a4R	ZF*WtJU"[u-}>Ɨ**)eJ'-@Nehh(8ՀXooh/.vJ<F[q:}r܆5bxT<jd_*Ou%m@Ic<ndy
Qx,wsxH@U-
$y(T<vr'xfM|_?Qx~7-z3D&?Om굴ٝWy{i_>j"5']:<#{_xuRHȸe<ߣ+@q$0c*;T8'A֜Zz?5$<?3jD?GԽ.
8}'Μ0ӣWP[,4mب)`@OVESH@AcAݪ=tPrCҽ}Т=ZU[An~w;f/҃C{d4	]EρwؽJH^4B!1r!Àfs4ɅGLڇtMBO´\
pVWd\sHT϶3_7@^`k^;_@kk([sT>8*[XyLF0hUw>YxBJ9WŦE*A?*dr췿Si"49X',<CYBDO<	ĔLkO#E=J%i8%\>9Fbqyp>eR)gT:<{<
j/x_ǿ3xcGxLY&E1`S1;c1djr-
_Lm
Xg~%#_#A<ygOif%vفU;mRg-Pv[aXcp~ɎjgXtp~~F6;V[vچ9E*0UYgȞYgf#Z5>tbd^
fZ'f;Ted4g}nUm~M|YݍM˚᰽cbLmm.ڹMoFYΜr_#g^Aatfhﲥ{y	ݷxﷇVr$4ڇ`|SSL
\ k$8},l7Au;2ӣCx}KPK(k	Wa"QpygG?kk/	U]
scD("j̯@%&p%󫶻Пx%3v+eP.Bc\PzHk`p2!kBv)χ	C/!0phMSBSi71O}@Zs!
uziӚP[6jP'C\HPjh!wB4M!~.PU(iThdTV)O$e@)fg.w$1!i0}aPӗ~@)=]={X;InI𼵭r0
Dؗ~SKmmW0co3F=uϫ=SysÞVQ~CՓySisnK	v<LJh2*ag$=j9'{S?=:;!:W6e
/$
yRg@]/ǻ0Ԧ1/uq/O+t+YyVstU?)<Y.X9HF)"5-҂h_(C۾˪CF
Z-ɜމ+Wt(8C3-[g=6,:雦YS{bT'չJ[Axz w
6hk*q뙼ƩA6Vv
7u)!5<?7,$CI\lK&?	I<$&7&q"	r5?PF$ޖ<CI
&$IGRJ2/ڻ^}SI'ǒ@h/%&Ze=#k!&o^PƒXJA1OgOƕ%-q)8K$H KDvˉ''31&ęlIդrfƵ٩$3[ad={dwwwhAnSOCf0wI@v#8=	93~[6VL=û,g9~kŭ4iD4RfO35g	k5E>sd/iLLo+[{HNM6Y+o_|(ff
lfh
Slצ٨F`IfXo/ȞT2gB9 {[>no w(qTgSϽPZl֞B婿uiR{`϶F˿L:/_7ɔ*T
'n_~.pY+wli]jcS-moT(woqk{6ʶl]9Oy	}+!l}h"Q|jZN%qoF'Dmg)Q۫yXs`F'Meސ~;ktFzeTKE,Po<۔	GOSr#~=xzEV樍)9Y@PgOh4^c8WS\$|	ckdF#ӑh4q&2Y2p\-Z,X",Yd2`*vm[tW00HI6
%.-!VF6[e_㌎v\1oNzq5HEhN]3zm>mMWY8M!6^Cx,
_rx&+Y0oɱpsQQSiˌEDB8i+\kKJ
L6*bPNfFUv*+*v}FIۂj-/'=S꿨[E`lsm/Rw_W}F:?>ަCӉǷ?4zO;m69hӺ{>G$ԟ	k1F~-
G9&K>f}N^Kz'y=n/㴞H	=AsA-|NV;,-j31B	"sXZ16y'npDTZͲٻU:\2s;e?p][wGz\W>y+>ǡOAƠ/?`e^=@$_
~|U	F;'~^fDˊas/x rlN;//OSޯqcObԇQĎ0SveTh#	_
,{
:\"5t}L_]ZxS~F!6-kK/1[9aR [x$瓗5GcOSh).ҘHbl
^^dO^IS"N
ЋrSu۟_u(7_FXЭŜlyWE_uLcGkYíZݽՄ4]vj5uNU9Yq4=ufCG4ilm:-thsbg{;FRliWDsU9^.Oys*EMΛ2"OaAEhDz5GI>S^fȥXȚ?LE5j(Ջd+`'=`غޕ[-`&	-B
CvyL?mJDrJ{[_0pk3-+ΦofKC]uz{Y-pKj[l+ܠc/SR%e5qzF[֕0MYu;<P
  VՊ5cgEtTDZ4e~^Zq~!Hz)'2@9K}k5V{Zs|WZOWTЗKp`1f6E;W?ru	~'(92tcǎ}HV媥KX^tUe|ر}Q9B8o9xXrԛg^BS ɇ0]xxX$!븕+ tUaMi>RcWeUN6TQ--5o4rjD@*ZFXXc-u-xi`;.h\H;xU==oQ96]k'ȇ_N=b|sU/ݱ&C*F]pc!!,nOO,_.|kG)e8%Ԗy;Z_7Z-r ,h9yy!l5l`N +-(1_!CENu394Zi"x<Q;_M2
4}/
@8@ȂB%9m:7[&GW](a遰RJߡ!?<h7$Ͽ)?i2mƇ!ZCs;؍&W? œjcuR@vv"#+ӓyF"~f?̺/;=LN]g3z4eg{/T<$hG{E3I,-7d
K*K%ӥ^.K}QFX&+oWeɚI{cK,͂n0*ݫI$[7-@V`O	6+04qPSUp|HvkPS4X[Xuh^X8X|Mp5
ĽW`
#X@&TUU`5DXsfNC0'dX
S`J	.DTKWG#!i(JKNg"1ҪX|,&#]Z1:*##Ʉ%B]!{Gd $P<

HߦP<AOڝWq&$B;[XX:{jimt$8$FRm|d(!ɿGC,q0O8GCAZZ~Nvd2EGɱeݻAxh탱%BpmI
$B=h5-ǠX8;'vR2!ip<I[:j{$28"퉍KXzo9ۿLh5aIB zB-r¯(&
!$X c #X;4%YbʻeG`)W%igu4! @<AER}=5I.0;YoIM;-KsIe;݌8i?$YiQFNPbi]dy1s<8[h[J΀nV],=FFZ~v˜|	-_'l*mgy`ra|h_x1|q$&A6V㟀>9Ɣ|)ͨ2Q ԉrq[kx7 %hKpg1zvu=;z){^kFdq`%Vv<yV<s
`7x_r_;;u^E⼈ŋXfٱYU@
4?q]|(.}&.L] tsA\$1Ҵszlzbܴf́3/p7op擝'$a9spa,1q!l+6?q<sp EA8Ïpc&G&9pҮjEmh[9e
]$"C$*=}ns4YٮP$fJ:I<LWla7Ns}+n֍XGzfo[Yl39~I6U_>
<g=:<nOS]0rz0
`
8y>qH?`~_UwOi|7OʺѽgJu
ܼezσES[O
hD"ɶfp6IrdP'(6c &ʃs{	?-S
endstream
endobj

51 0 obj
22280
endobj

52 0 obj
<</Type/FontDescriptor/FontName/BAAAAA+LiberationSerif
/Flags 4
/FontBBox[-176 -303 1005 981]/ItalicAngle 0
/Ascent 891
/Descent -216
/CapHeight 981
/StemV 80
/FontFile2 50 0 R>>
endobj

53 0 obj
<</Length 574/Filter/FlateDecode>>
stream
x]ώ@yL+!$Cl $TBo>n+c{~qksHS~vL}lR~LϜmLRb=<nSu4>u{=Oئӏa^+]R?EZm:y>×onz<!>CE׎(͵MnX-b/wUaͮEjBX@եDj]RAWEuy^UY3	FW
zX~}^f
+h;h8בB~gƿ&PW#	G9_qG9Q+G璿?_/?<Blb߯/8W5lBz
rߣz{?ѓ#'6O~ANo8ד_4nj7~˓_4?3^0m0~䏪`x`j'v?_}/U [0~QAGA"o_93Z>XAY7\D7M+
endstream
endobj

54 0 obj
<</Type/Font/Subtype/TrueType/BaseFont/BAAAAA+LiberationSerif
/FirstChar 0
/LastChar 82
/Widths[365 722 722 556 443 443 500 443 277 250 556 277 277 333 500 500
722 500 500 500 500 777 333 389 500 610 500 333 889 722 722 500
722 333 610 556 666 666 722 277 250 500 500 722 500 500 500 500
500 500 610 500 443 180 666 250 408 563 563 333 333 500 500 277
479 277 333 610 333 500 479 277 333 563 777 722 500 722 722 200
500 833 500 ]
/FontDescriptor 52 0 R
/ToUnicode 53 0 R
>>
endobj

55 0 obj
<</F1 54 0 R/F2 44 0 R/F3 49 0 R/F4 39 0 R
>>
endobj

56 0 obj
<</Font 55 0 R
/ProcSet[/PDF/Text]
>>
endobj

1 0 obj
<</Type/Page/Parent 34 0 R/Resources 56 0 R/MediaBox[0 0 612 792]/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 2 0 R>>
endobj

4 0 obj
<</Type/Page/Parent 34 0 R/Resources 56 0 R/MediaBox[0 0 612 792]/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 5 0 R>>
endobj

7 0 obj
<</Type/Page/Parent 34 0 R/Resources 56 0 R/MediaBox[0 0 612 792]/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 8 0 R>>
endobj

10 0 obj
<</Type/Page/Parent 34 0 R/Resources 56 0 R/MediaBox[0 0 612 792]/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 11 0 R>>
endobj

13 0 obj
<</Type/Page/Parent 34 0 R/Resources 56 0 R/MediaBox[0 0 612 792]/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 14 0 R>>
endobj

16 0 obj
<</Type/Page/Parent 34 0 R/Resources 56 0 R/MediaBox[0 0 612 792]/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 17 0 R>>
endobj

19 0 obj
<</Type/Page/Parent 34 0 R/Resources 56 0 R/MediaBox[0 0 612 792]/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 20 0 R>>
endobj

22 0 obj
<</Type/Page/Parent 34 0 R/Resources 56 0 R/MediaBox[0 0 612 792]/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 23 0 R>>
endobj

25 0 obj
<</Type/Page/Parent 34 0 R/Resources 56 0 R/MediaBox[0 0 612 792]/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 26 0 R>>
endobj

28 0 obj
<</Type/Page/Parent 34 0 R/Resources 56 0 R/MediaBox[0 0 612 792]/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 29 0 R>>
endobj

31 0 obj
<</Type/Page/Parent 34 0 R/Resources 56 0 R/MediaBox[0 0 612 792]/Group<</S/Transparency/CS/DeviceRGB/I true>>/Contents 32 0 R>>
endobj

57 0 obj
<</Count 12/First 58 0 R/Last 66 0 R
>>
endobj

58 0 obj
<</Count 3/First 59 0 R/Last 61 0 R
/Title<FEFF0049002D0020004400450053004300520049005000540049004F004E0020003A>
/Dest[7 0 R/XYZ 56.7 723.3 0]/Parent 57 0 R/Next 62 0 R>>
endobj

59 0 obj
<</Count 0/Title<FEFF0049002D003100200048006F007700200069007400200077006F0072006B00730020003A>
/Dest[7 0 R/XYZ 56.7 585.5 0]/Parent 58 0 R/Next 60 0 R>>
endobj

60 0 obj
<</Count 0/Title<FEFF0049002D00320020004500780061006D0070006C006500730020003A0020>
/Dest[7 0 R/XYZ 56.7 349 0]/Parent 58 0 R/Prev 59 0 R/Next 61 0 R>>
endobj

61 0 obj
<</Count 0/Title<FEFF0049002D003300200049006E007300740061006C006C006100740069006F006E0020003A>
/Dest[7 0 R/XYZ 56.7 175.8 0]/Parent 58 0 R/Prev 60 0 R>>
endobj

62 0 obj
<</Count 3/First 63 0 R/Last 65 0 R
/Title<FEFF00490049002D0020004300680061006E0067006500730020006F006E0020005000460020003A>
/Dest[10 0 R/XYZ 56.7 723.3 0]/Parent 57 0 R/Prev 58 0 R/Next 66 0 R>>
endobj

63 0 obj
<</Count 0/Title<FEFF00490049002D0031002000460069006C0065002000700066007600610072002E00680020003A>
/Dest[10 0 R/XYZ 56.7 607.5 0]/Parent 62 0 R/Next 64 0 R>>
endobj

64 0 obj
<</Count 0/Title<FEFF00490049002D0032002000460069006C0065002000700066002E0063003A>
/Dest[10 0 R/XYZ 56.7 190.9 0]/Parent 62 0 R/Prev 63 0 R/Next 65 0 R>>
endobj

65 0 obj
<</Count 0/Title<FEFF00490049002D0033002000460069006C0065002000700066005F0069006F00630074006C002E00630020003A>
/Dest[16 0 R/XYZ 56.7 492.6 0]/Parent 62 0 R/Prev 64 0 R>>
endobj

66 0 obj
<</Count 3/First 67 0 R/Last 69 0 R
/Title<FEFF004900490049002D0020004300680061006E0067006500730020006F006E00200050004600430054004C0020003A>
/Dest[22 0 R/XYZ 56.7 723.3 0]/Parent 57 0 R/Prev 62 0 R>>
endobj

67 0 obj
<</Count 0/Title<FEFF004900490049002D0031002000460069006C0065002000700061007200730065002E00790020003A>
/Dest[22 0 R/XYZ 56.7 620.2 0]/Parent 66 0 R/Next 68 0 R>>
endobj

68 0 obj
<</Count 0/Title<FEFF004900490049002D0032002000460069006C006500200070006600630074006C005F006F007000740069006D0069007A0065002E00630020003A>
/Dest[31 0 R/XYZ 56.7 388.4 0]/Parent 66 0 R/Prev 67 0 R/Next 69 0 R>>
endobj

69 0 obj
<</Count 0/Title<FEFF004900490049002D0033002000460069006C006500200070006600630074006C005F007000610072007300650072002E00630020003A>
/Dest[31 0 R/XYZ 56.7 224.8 0]/Parent 66 0 R/Prev 68 0 R>>
endobj

34 0 obj
<</Type/Pages
/Resources 56 0 R
/MediaBox[ 0 0 612 792 ]
/Kids[ 1 0 R 4 0 R 7 0 R 10 0 R 13 0 R 16 0 R 19 0 R 22 0 R 25 0 R 28 0 R 31 0 R ]
/Count 11>>
endobj

70 0 obj
<</Type/Catalog/Pages 34 0 R
/OpenAction[1 0 R /XYZ null null 0]
/Outlines 57 0 R
/Lang(en-US)
>>
endobj

71 0 obj
<</Author<FEFF005100750065006E00740069006E0020>
/Creator<FEFF005700720069007400650072>
/Producer<FEFF004F00700065006E004F00660066006900630065002E006F0072006700200033002E0032>
/CreationDate(D:20110406175143+02'00')>>
endobj

xref
0 72
0000000000 65535 f 
0000063055 00000 n 
0000000019 00000 n 
0000000613 00000 n 
0000063199 00000 n 
0000000633 00000 n 
0000001418 00000 n 
0000063343 00000 n 
0000001438 00000 n 
0000003935 00000 n 
0000063487 00000 n 
0000003956 00000 n 
0000006022 00000 n 
0000063633 00000 n 
0000006044 00000 n 
0000007931 00000 n 
0000063779 00000 n 
0000007953 00000 n 
0000009603 00000 n 
0000063925 00000 n 
0000009625 00000 n 
0000010733 00000 n 
0000064071 00000 n 
0000010755 00000 n 
0000012806 00000 n 
0000064217 00000 n 
0000012828 00000 n 
0000014374 00000 n 
0000064363 00000 n 
0000014396 00000 n 
0000016125 00000 n 
0000064509 00000 n 
0000016147 00000 n 
0000018086 00000 n 
0000066984 00000 n 
0000018108 00000 n 
0000019516 00000 n 
0000019538 00000 n 
0000019729 00000 n 
0000020021 00000 n 
0000020182 00000 n 
0000027991 00000 n 
0000028013 00000 n 
0000028215 00000 n 
0000028625 00000 n 
0000028896 00000 n 
0000038246 00000 n 
0000038268 00000 n 
0000038479 00000 n 
0000038915 00000 n 
0000039216 00000 n 
0000061583 00000 n 
0000061606 00000 n 
0000061802 00000 n 
0000062446 00000 n 
0000062937 00000 n 
0000063000 00000 n 
0000064655 00000 n 
0000064712 00000 n 
0000064900 00000 n 
0000065070 00000 n 
0000065238 00000 n 
0000065408 00000 n 
0000065621 00000 n 
0000065796 00000 n 
0000065967 00000 n 
0000066154 00000 n 
0000066371 00000 n 
0000066550 00000 n 
0000066777 00000 n 
0000067153 00000 n 
0000067268 00000 n 
trailer
<</Size 72/Root 70 0 R
/Info 71 0 R
/ID [ <2D8B88586E0A15E772B12F0BB0E408A8>
<2D8B88586E0A15E772B12F0BB0E408A8> ]
/DocChecksum /6936EC5CBDD2BA684538C7F32AC964CF
>>
startxref
67501
%%EOF

[-- Attachment #3 --]
diff -rupN src/sys/contrib/pf/net/pf.c src_add/sys/contrib/pf/net/pf.c
--- src/sys/contrib/pf/net/pf.c	2010-12-21 18:09:25.000000000 +0100
+++ src_add/sys/contrib/pf/net/pf.c	2011-03-30 10:46:17.000000000 +0200
@@ -312,6 +312,7 @@ struct pf_state		*pf_find_state_recurse(
 			    struct pf_state_cmp *, u_int8_t);
 int			 pf_src_connlimit(struct pf_state **);
 int			 pf_check_congestion(struct ifqueue *);
+void			 pf_save_addrs(struct pf_rule**, struct pf_pdesc*);
 
 #ifdef __FreeBSD__
 int in4_cksum(struct mbuf *m, u_int8_t nxt, int off, int len);
@@ -832,6 +833,61 @@ pf_src_connlimit(struct pf_state **state
 	return (1);
 }
 
+void pf_save_addrs( struct pf_rule **rule, struct pf_pdesc *pd)
+{
+
+	if ((*rule)->add.check_add != 0) {
+		
+
+		struct pf_src_node sn;
+		struct pf_src_node sn2;
+
+		PF_ACPY(&sn.addr, pd->src, pd->af);
+		PF_ACPY(&sn2.addr, pd->dst, pd->af);
+		sn.af = pd->af; 
+		sn.af = pd->af; 
+
+		struct pfr_addr p;
+		struct pfr_addr p2;
+		bzero(&p, sizeof(p));
+		bzero(&p2, sizeof(p2));
+		p.pfra_af = pd->af;
+		p2.pfra_af = pd->af;
+		
+
+		switch (pd->af) {
+
+#ifdef INET
+		case AF_INET:
+			p.pfra_net=32;
+			p2.pfra_net=32;
+			p.pfra_ip4addr = sn.addr.v4;
+			p2.pfra_ip4addr = sn2.addr.v4;
+			break;
+#endif
+
+#ifdef INET6
+		case AF_INET6:
+			p.pfra_net=128;
+			p2.pfra_net=128;
+			p.pfra_ip6addr = sn.addr.v6;
+			p2.pfra_ip6addr = sn2.addr.v6;
+			break;
+#endif
+		}
+
+	
+		if ((*rule)->add.src.check_src != 0) {
+			pfr_insert_kentry((*rule)->add.src.src_tbl, &p, time_second);
+		}
+			
+		if ((*rule)->add.dst.check_dst != 0) {
+			pfr_insert_kentry((*rule)->add.dst.dst_tbl, &p2, time_second);
+		}
+	}
+}
+
+
 int
 pf_insert_src_node(struct pf_src_node **sn, struct pf_rule *rule,
     struct pf_addr *src, sa_family_t af)
@@ -3421,6 +3477,10 @@ pf_test_tcp(struct pf_rule **rm, struct 
 
 	REASON_SET(&reason, PFRES_MATCH);
 
+	if (r->add.check_add != 0) {
+		pf_save_addrs (&r, pd);
+	}
+
 	if (r->log || (nr != NULL && nr->natpass && nr->log)) {
 		if (rewrite)
 #ifdef __FreeBSD__
@@ -3843,6 +3903,10 @@ pf_test_udp(struct pf_rule **rm, struct 
 
 	REASON_SET(&reason, PFRES_MATCH);
 
+	if (r->add.check_add != 0) {
+		pf_save_addrs (&r, pd);
+	}
+
 	if (r->log || (nr != NULL && nr->natpass && nr->log)) {
 		if (rewrite)
 #ifdef __FreeBSD__
@@ -4183,6 +4247,10 @@ pf_test_icmp(struct pf_rule **rm, struct
 
 	REASON_SET(&reason, PFRES_MATCH);
 
+	if (r->add.check_add != 0) {
+		pf_save_addrs (&r, pd);
+	}
+
 	if (r->log || (nr != NULL && nr->natpass && nr->log)) {
 #ifdef INET6
 		if (rewrite)
@@ -4445,6 +4513,10 @@ pf_test_other(struct pf_rule **rm, struc
 
 	REASON_SET(&reason, PFRES_MATCH);
 
+	if (r->add.check_add != 0) {
+		pf_save_addrs (&r, pd);
+	}
+
 	if (r->log || (nr != NULL && nr->natpass && nr->log))
 		PFLOG_PACKET(kif, h, m, af, direction, reason, r->log ? r : nr,
 		    a, ruleset, pd);
@@ -7062,6 +7134,7 @@ pf_test(int dir, struct ifnet *ifp, stru
 			r = s->rule.ptr;
 			a = s->anchor.ptr;
 			log = s->log;
+
 		} else if (s == NULL)
 #ifdef __FreeBSD__
 			action = pf_test_tcp(&r, &s, dir, kif,
@@ -7103,6 +7176,7 @@ pf_test(int dir, struct ifnet *ifp, stru
 			r = s->rule.ptr;
 			a = s->anchor.ptr;
 			log = s->log;
+
 		} else if (s == NULL)
 #ifdef __FreeBSD__
 			action = pf_test_udp(&r, &s, dir, kif,
@@ -7138,6 +7212,7 @@ pf_test(int dir, struct ifnet *ifp, stru
 			r = s->rule.ptr;
 			a = s->anchor.ptr;
 			log = s->log;
+
 		} else if (s == NULL)
 #ifdef __FreeBSD__
 			action = pf_test_icmp(&r, &s, dir, kif,
@@ -7158,6 +7233,7 @@ pf_test(int dir, struct ifnet *ifp, stru
 			r = s->rule.ptr;
 			a = s->anchor.ptr;
 			log = s->log;
+
 		} else if (s == NULL)
 #ifdef __FreeBSD__
 			action = pf_test_other(&r, &s, dir, kif, m, off, h,
diff -rupN src/sys/contrib/pf/net/pf_ioctl.c src_add/sys/contrib/pf/net/pf_ioctl.c
--- src/sys/contrib/pf/net/pf_ioctl.c	2010-12-21 18:09:25.000000000 +0100
+++ src_add/sys/contrib/pf/net/pf_ioctl.c	2011-03-30 10:46:17.000000000 +0200
@@ -573,6 +573,10 @@ pf_rm_rule(struct pf_rulequeue *rulequeu
 			pf_tbladdr_remove(&rule->dst.addr);
 			if (rule->overload_tbl)
 				pfr_detach_table(rule->overload_tbl);
+			if (rule->add.src.src_tbl)
+				pfr_detach_table(rule->add.src.src_tbl);
+			if (rule->add.dst.dst_tbl)
+				pfr_detach_table(rule->add.dst.dst_tbl);
 		}
 		TAILQ_REMOVE(rulequeue, rule, entries);
 		rule->entries.tqe_prev = NULL;
@@ -598,6 +602,10 @@ pf_rm_rule(struct pf_rulequeue *rulequeu
 		pf_tbladdr_remove(&rule->dst.addr);
 		if (rule->overload_tbl)
 			pfr_detach_table(rule->overload_tbl);
+		if (rule->add.src.src_tbl)
+			pfr_detach_table(rule->add.src.src_tbl);
+		if (rule->add.dst.dst_tbl)
+			pfr_detach_table(rule->add.dst.dst_tbl);
 	}
 	pfi_kif_unref(rule->kif, PFI_KIF_REF_RULE);
 	pf_anchor_remove(rule);
@@ -1593,6 +1601,26 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
 				    PFR_TFLAG_ACTIVE;
 		}
 
+		if (rule->add.src.check_src != 0) {
+			if ((rule->add.src.src_tbl = pfr_attach_table(ruleset,
+			    rule->add.src.src_tblname)) == NULL) {
+				error = EINVAL;
+			}
+			else {
+				rule->add.src.src_tbl->pfrkt_flags |=
+				    PFR_TFLAG_ACTIVE;
+			}
+		}
+
+		if (rule->add.dst.check_dst != 0) {
+			if ((rule->add.dst.dst_tbl = pfr_attach_table(ruleset,
+			    rule->add.dst.dst_tblname)) == NULL)
+				error = EINVAL;
+			else
+				rule->add.dst.dst_tbl->pfrkt_flags |=
+				    PFR_TFLAG_ACTIVE;
+		}
+
 		pf_mv_pool(&pf_pabuf, &rule->rpool.list);
 		if (((((rule->action == PF_NAT) || (rule->action == PF_RDR) ||
 		    (rule->action == PF_BINAT)) && rule->anchor == NULL) ||
@@ -1859,6 +1887,28 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
 					    PFR_TFLAG_ACTIVE;
 			}
 
+			if (newrule->add.src.check_src != 0) {
+				if ((newrule->add.src.src_tbl = pfr_attach_table(
+				    ruleset, newrule->add.src.src_tblname)) ==
+				    NULL) {
+					error = EINVAL;
+				}
+				else {
+					newrule->add.src.src_tbl->pfrkt_flags |=
+					    PFR_TFLAG_ACTIVE;
+				}
+			}
+
+			if (newrule->add.dst.check_dst != 0) {
+				if ((newrule->add.dst.dst_tbl = pfr_attach_table(
+				    ruleset, newrule->add.dst.dst_tblname)) ==
+				    NULL)
+					error = EINVAL;
+				else
+					newrule->add.dst.dst_tbl->pfrkt_flags |=
+					    PFR_TFLAG_ACTIVE;
+			}
+
 			pf_mv_pool(&pf_pabuf, &newrule->rpool.list);
 			if (((((newrule->action == PF_NAT) ||
 			    (newrule->action == PF_RDR) ||
diff -rupN src/sys/contrib/pf/net/pfvar.h src_add/sys/contrib/pf/net/pfvar.h
--- src/sys/contrib/pf/net/pfvar.h	2010-12-21 18:09:25.000000000 +0100
+++ src_add/sys/contrib/pf/net/pfvar.h	2011-03-30 10:46:17.000000000 +0200
@@ -603,6 +603,20 @@ struct pf_rule {
 	char			 match_tagname[PF_TAG_NAME_SIZE];
 
 	char			 overload_tblname[PF_TABLE_NAME_SIZE];
+	
+	struct add{
+	  u_int8_t check_add;
+	  struct {
+	    u_int8_t 	check_src;
+	    char	src_tblname[PF_TABLE_NAME_SIZE];
+	    struct pfr_ktable	*src_tbl;
+	  } src;
+	  struct {
+	    u_int8_t	check_dst;
+	    char	dst_tblname[PF_TABLE_NAME_SIZE];
+	    struct pfr_ktable	*dst_tbl;
+	  } dst;
+	} add;
 
 	TAILQ_ENTRY(pf_rule)	 entries;
 	struct pf_pool		 rpool;
diff -rupN src/contrib/pf/pfctl/parse.y src_add/contrib/pf/pfctl/parse.y
--- src/contrib/pf/pfctl/parse.y	2010-12-21 18:09:25.000000000 +0100
+++ src_add/contrib/pf/pfctl/parse.y	2011-03-30 10:52:10.000000000 +0200
@@ -132,6 +132,20 @@ enum	{ PF_STATE_OPT_MAX, PF_STATE_OPT_NO
 
 enum	{ PF_SRCTRACK_NONE, PF_SRCTRACK, PF_SRCTRACK_GLOBAL, PF_SRCTRACK_RULE };
 
+struct node_add_opt {
+	u_int8_t 		check_add;
+	struct {
+	    u_int8_t 	check_src;
+	    char	src_tblname[PF_TABLE_NAME_SIZE];
+	} src;
+	struct {
+	    u_int8_t	check_dst;
+	    char	dst_tblname[PF_TABLE_NAME_SIZE];
+	} dst;
+	struct node_add_opt	*next;
+	struct node_add_opt	*tail;
+};
+
 struct node_state_opt {
 	int			 type;
 	union {
@@ -357,6 +371,7 @@ typedef struct {
 		struct node_port	*port;
 		struct node_uid		*uid;
 		struct node_gid		*gid;
+		struct node_add_opt	*add_opt;
 		struct node_state_opt	*state_opt;
 		struct peer		 peer;
 		struct {
@@ -425,6 +440,7 @@ typedef struct {
 %token	STICKYADDRESS MAXSRCSTATES MAXSRCNODES SOURCETRACK GLOBAL RULE
 %token	MAXSRCCONN MAXSRCCONNRATE OVERLOAD FLUSH SLOPPY
 %token	TAGGED TAG IFBOUND FLOATING STATEPOLICY ROUTE
+%token	ADD IPSRC IPDST
 %token	<v.string>		STRING
 %token	<v.i>			PORTBINARY
 %type	<v.interface>		interface if_list if_item_not if_item
@@ -471,6 +487,7 @@ typedef struct {
 %type	<v.pool_opts>		pool_opts pool_opt pool_opts_l
 %type	<v.tagged>		tagged
 %type	<v.rtableid>		rtable
+%type	<v.add_opt>		add_opt add_list add_item
 %%
 
 ruleset		: /* empty */
@@ -1661,11 +1678,77 @@ qassign_item	: STRING			{
 		}
 		;
 
+add_opt	:	/* empty */ {
+		$$ = calloc(1, sizeof(struct node_add_opt));
+		$$->check_add = 0;
+		$$->src.check_src = 0;
+		$$->dst.check_dst = 0;
+		$$->next = NULL;
+		$$->tail = $$;
+		}
+		| ADD add_list { $$ = $2; }
+		;
+
+add_list	: add_item { $$ = $1; }
+		| add_list add_item {
+			$1->tail->next = $2;
+			$1->tail = $2;
+			$$ = $1;
+		}
+		;
+
+add_item	: IPSRC '<'STRING'>' {
+		if (strlen($3) >= PF_TABLE_NAME_SIZE) {
+			yyerror("table name '%s' too long", $3);
+			free($3);
+			YYERROR;
+		}
+		$$=calloc(1, sizeof(struct node_add_opt));
+		if ($$ == NULL) {
+			err(1, "state_opt_item: calloc");
+		}
+		if (strlcpy($$->src.src_tblname, $3,
+		    PF_TABLE_NAME_SIZE) >= PF_TABLE_NAME_SIZE) {
+			yyerror("state option: "
+			    "strlcpy");
+			YYERROR;
+		}
+		free($3);
+		$$->check_add = 1;
+		$$->src.check_src = 1;
+		$$->next = NULL;
+		$$->tail = $$;
+		}
+		| IPDST '<'STRING'>' {
+		if (strlen($3) >= PF_TABLE_NAME_SIZE) {
+			yyerror("table name '%s' too long", $3);
+			free($3);
+			YYERROR;
+		}
+		$$=calloc(1, sizeof(struct node_add_opt));
+		if ($$ == NULL) {
+			err(1, "state_opt_item: calloc");
+		}
+		if (strlcpy($$->dst.dst_tblname, $3,
+		    PF_TABLE_NAME_SIZE) >= PF_TABLE_NAME_SIZE) {
+			yyerror("state option: "
+			    "strlcpy");
+			YYERROR;
+		}
+		free($3);
+		$$->check_add = 2;
+		$$->dst.check_dst = 1;
+		$$->next = NULL;
+		$$->tail = $$;
+		}
+		;
+
 pfrule		: action dir logquick interface route af proto fromto
-		    filter_opts
+		    filter_opts add_opt
 		{
 			struct pf_rule		 r;
 			struct node_state_opt	*o;
+			struct node_add_opt	*a;
 			struct node_proto	*proto;
 			int			 srctrack = 0;
 			int			 statelock = 0;
@@ -1750,6 +1833,54 @@ pfrule		: action dir logquick interface 
 #endif
 			}
 
+			a = $10;
+			while (a) {
+				switch (a->check_add) {
+				case 0 :
+					r.add.check_add = 0;
+					r.add.src.check_src = 0;
+					r.add.dst.check_dst = 0;
+					break;
+				
+				case 1 :
+					r.add.check_add = 1;
+					r.add.src.check_src = 1;
+					if (r.add.src.src_tblname[0]) {
+					yyerror("multiple 'src' "
+					    "table definitions");
+					YYERROR;
+					}
+					if (strlcpy(r.add.src.src_tblname,
+					    a->src.src_tblname,
+					    PF_TABLE_NAME_SIZE) >=
+					    PF_TABLE_NAME_SIZE) {
+						yyerror("state option: "
+						    "strlcpy");
+						YYERROR;
+					 }
+					break;
+
+				case 2 :
+					r.add.check_add = 1;
+					r.add.dst.check_dst = 1;
+					if (r.add.dst.dst_tblname[0]) {
+					yyerror("multiple 'dst' "
+					    "table definitions");
+					YYERROR;
+					}
+					if (strlcpy(r.add.dst.dst_tblname,
+					    a->dst.dst_tblname,
+					    PF_TABLE_NAME_SIZE) >=
+					    PF_TABLE_NAME_SIZE) {
+						yyerror("state option: "
+						    "strlcpy");
+						YYERROR;
+					 }
+					break;
+				}
+				a = a->next;
+			}
+
 			r.tos = $9.tos;
 			r.keep_state = $9.keep.action;
 
@@ -4899,6 +5030,7 @@ lookup(char *s)
 	/* this has to be sorted always */
 	static const struct keywords keywords[] = {
 		{ "all",		ALL},
+		{ "add",		ADD},
 		{ "allow-opts",		ALLOWOPTS},
 		{ "altq",		ALTQ},
 		{ "anchor",		ANCHOR},
@@ -4936,6 +5068,8 @@ lookup(char *s)
 		{ "in",			IN},
 		{ "inet",		INET},
 		{ "inet6",		INET6},
+		{ "ipdst",		IPDST},
+		{ "ipsrc",		IPSRC},
 		{ "keep",		KEEP},
 		{ "label",		LABEL},
 		{ "limit",		LIMIT},
diff -rupN src/contrib/pf/pfctl/pfctl_optimize.c src_add/contrib/pf/pfctl/pfctl_optimize.c
--- src/contrib/pf/pfctl/pfctl_optimize.c	2010-12-21 18:09:25.000000000 +0100
+++ src_add/contrib/pf/pfctl/pfctl_optimize.c	2011-03-30 10:52:10.000000000 +0200
@@ -174,6 +174,8 @@ struct pf_rule_field {
     PF_RULE_FIELD(dst.port_op,		NOMERGE),
     PF_RULE_FIELD(src.neg,		NOMERGE),
     PF_RULE_FIELD(dst.neg,		NOMERGE),
+    PF_RULE_FIELD(add.src.src_tblname,	NOMERGE),
+    PF_RULE_FIELD(add.dst.dst_tblname,	NOMERGE),
 
     /* These fields can be merged */
     PF_RULE_FIELD(src.addr,		COMBINED),
@@ -196,6 +198,8 @@ struct pf_rule_field {
     PF_RULE_FIELD(tag,			DC),
     PF_RULE_FIELD(match_tag,		DC),
     PF_RULE_FIELD(overload_tbl,		DC),
+    PF_RULE_FIELD(add.src.src_tbl,	DC),
+    PF_RULE_FIELD(add.dst.dst_tbl,	DC),
 
     /* These fields should never be set in a PASS/BLOCK rule */
     PF_RULE_FIELD(natpass,		NEVER),
diff -rupN src/contrib/pf/pfctl/pfctl_parser.c src_add/contrib/pf/pfctl/pfctl_parser.c
--- src/contrib/pf/pfctl/pfctl_parser.c	2010-12-21 18:09:25.000000000 +0100
+++ src_add/contrib/pf/pfctl/pfctl_parser.c	2011-03-30 10:52:10.000000000 +0200
@@ -839,6 +839,16 @@ print_rule(struct pf_rule *r, const char
 				printf(" code %u", r->code-1);
 		}
 	}
+	
+	if (r->add.check_add != 0) {
+		if (r->add.src.check_src != 0 && r->add.dst.check_dst == 0) 
+			printf("add ipsrc <%s>", r->add.src.src_tblname);
+		if (r->add.src.check_src == 0 && r->add.dst.check_dst != 0) 
+			printf("add ipdst <%s>", r->add.dst.dst_tblname);
+		if (r->add.src.check_src != 0 && r->add.dst.check_dst != 0) 
+			printf("add ipsrc <%s> ipdst <%s>", r->add.src.src_tblname, r->add.dst.dst_tblname);
+	}
+	
 	if (r->tos)
 		printf(" tos 0x%2.2x", r->tos);
 	if (!r->keep_state && r->action == PF_PASS && !anchor_call[0])

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BANLkTi=fMCfzJrTavK3Pe0zUXHbQgpPE=Q>