From ea34ca768f5d2aff6ad23ec6169f5ac42db19716 Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Fri, 28 Feb 2014 10:37:21 +1100 Subject: [PATCH] image/jpeg: fix progressive decoding when the DC components are split over multiple scans. Previously, the Go code assumed that DC was synonymous with interleaved and AC with non-interleaved. Fixes #6767. The test files were generated with libjpeg's cjpeg program, version 9a, with the following patch, since cjpeg is hard-coded to output interleaved DC. $ diff -u jpeg-9a*/jcparam.c --- jpeg-9a-clean/jcparam.c 2013-07-01 21:13:28.000000000 +1000 +++ jpeg-9a/jcparam.c 2014-02-27 11:40:41.236889852 +1100 @@ -572,7 +572,7 @@ { int ci; - if (ncomps <= MAX_COMPS_IN_SCAN) { + if (0) { /* Single interleaved DC scan */ scanptr->comps_in_scan = ncomps; for (ci = 0; ci < ncomps; ci++) @@ -610,7 +610,7 @@ (cinfo->jpeg_color_space == JCS_YCbCr || cinfo->jpeg_color_space == JCS_BG_YCC)) { /* Custom script for YCC color images. */ - nscans = 10; + nscans = 14; } else { /* All-purpose script for other color spaces. */ if (ncomps > MAX_COMPS_IN_SCAN) LGTM=r R=r CC=golang-codereviews https://golang.org/cl/69000046 --- src/pkg/image/jpeg/reader_test.go | 27 +++++++++++------- src/pkg/image/jpeg/scan.go | 21 ++++++++------ .../video-001.separate.dc.progression.jpeg | Bin 0 -> 14288 bytes ...1.separate.dc.progression.progressive.jpeg | Bin 0 -> 14312 bytes 4 files changed, 29 insertions(+), 19 deletions(-) create mode 100644 src/pkg/image/testdata/video-001.separate.dc.progression.jpeg create mode 100644 src/pkg/image/testdata/video-001.separate.dc.progression.progressive.jpeg diff --git a/src/pkg/image/jpeg/reader_test.go b/src/pkg/image/jpeg/reader_test.go index e951e038c0..926bb04344 100644 --- a/src/pkg/image/jpeg/reader_test.go +++ b/src/pkg/image/jpeg/reader_test.go @@ -28,6 +28,7 @@ func TestDecodeProgressive(t *testing.T) { "../testdata/video-001.q50.444", "../testdata/video-005.gray.q50", "../testdata/video-005.gray.q50.2x2", + "../testdata/video-001.separate.dc.progression", } for _, tc := range testCases { m0, err := decodeFile(tc + ".jpeg") @@ -44,6 +45,12 @@ func TestDecodeProgressive(t *testing.T) { t.Errorf("%s: bounds differ: %v and %v", tc, m0.Bounds(), m1.Bounds()) continue } + // All of the video-*.jpeg files are 150x103. + if m0.Bounds() != image.Rect(0, 0, 150, 103) { + t.Errorf("%s: bad bounds: %v", tc, m0.Bounds()) + continue + } + switch m0 := m0.(type) { case *image.YCbCr: m1 := m1.(*image.YCbCr) @@ -84,18 +91,15 @@ func decodeFile(filename string) (image.Image, error) { // check checks that the two pix data are equal, within the given bounds. func check(bounds image.Rectangle, pix0, pix1 []byte, stride0, stride1 int) error { - if len(pix0) != len(pix1) { - return fmt.Errorf("len(pix) %d and %d differ", len(pix0), len(pix1)) - } - if stride0 != stride1 { - return fmt.Errorf("strides %d and %d differ", stride0, stride1) + if stride0 <= 0 || stride0%8 != 0 { + return fmt.Errorf("bad stride %d", stride0) } - if stride0%8 != 0 { - return fmt.Errorf("stride %d is not a multiple of 8", stride0) + if stride1 <= 0 || stride1%8 != 0 { + return fmt.Errorf("bad stride %d", stride1) } // Compare the two pix data, one 8x8 block at a time. - for y := 0; y < len(pix0)/stride0; y += 8 { - for x := 0; x < stride0; x += 8 { + for y := 0; y < len(pix0)/stride0 && y < len(pix1)/stride1; y += 8 { + for x := 0; x < stride0 && x < stride1; x += 8 { if x >= bounds.Max.X || y >= bounds.Max.Y { // We don't care if the two pix data differ if the 8x8 block is // entirely outside of the image's bounds. For example, this can @@ -108,8 +112,9 @@ func check(bounds image.Rectangle, pix0, pix1 []byte, stride0, stride1 int) erro for j := 0; j < 8; j++ { for i := 0; i < 8; i++ { - index := (y+j)*stride0 + (x + i) - if pix0[index] != pix1[index] { + index0 := (y+j)*stride0 + (x + i) + index1 := (y+j)*stride1 + (x + i) + if pix0[index0] != pix1[index1] { return fmt.Errorf("blocks at (%d, %d) differ:\n%sand\n%s", x, y, pixString(pix0, stride0, x, y), pixString(pix1, stride1, x, y), diff --git a/src/pkg/image/jpeg/scan.go b/src/pkg/image/jpeg/scan.go index a69ed17489..559235d512 100644 --- a/src/pkg/image/jpeg/scan.go +++ b/src/pkg/image/jpeg/scan.go @@ -141,25 +141,30 @@ func (d *decoder) processSOS(n int) error { for j := 0; j < d.comp[compIndex].h*d.comp[compIndex].v; j++ { // The blocks are traversed one MCU at a time. For 4:2:0 chroma // subsampling, there are four Y 8x8 blocks in every 16x16 MCU. + // // For a baseline 32x16 pixel image, the Y blocks visiting order is: // 0 1 4 5 // 2 3 6 7 // - // For progressive images, the DC data blocks (zigStart == 0) are traversed - // as above, but AC data blocks are traversed left to right, top to bottom: + // For progressive images, the interleaved scans (those with nComp > 1) + // are traversed as above, but non-interleaved scans are traversed left + // to right, top to bottom: // 0 1 2 3 // 4 5 6 7 + // Only DC scans (zigStart == 0) can be interleaved. AC scans must have + // only one component. // - // To further complicate matters, there is no AC data for any blocks that - // are inside the image at the MCU level but outside the image at the pixel - // level. For example, a 24x16 pixel 4:2:0 progressive image consists of - // two 16x16 MCUs. The earlier scans will process 8 Y blocks: + // To further complicate matters, for non-interleaved scans, there is no + // data for any blocks that are inside the image at the MCU level but + // outside the image at the pixel level. For example, a 24x16 pixel 4:2:0 + // progressive image consists of two 16x16 MCUs. The interleaved scans + // will process 8 Y blocks: // 0 1 4 5 // 2 3 6 7 - // The later scans will process only 6 Y blocks: + // The non-interleaved scans will process only 6 Y blocks: // 0 1 2 // 3 4 5 - if zigStart == 0 { + if nComp != 1 { mx0, my0 = d.comp[compIndex].h*mx, d.comp[compIndex].v*my if h0 == 1 { my0 += j diff --git a/src/pkg/image/testdata/video-001.separate.dc.progression.jpeg b/src/pkg/image/testdata/video-001.separate.dc.progression.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..107f0fa0cd25f5f4314eea453305db84db088b6f GIT binary patch literal 14288 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 gHq)$ literal 0 HcmV?d00001 diff --git a/src/pkg/image/testdata/video-001.separate.dc.progression.progressive.jpeg b/src/pkg/image/testdata/video-001.separate.dc.progression.progressive.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a1d493ef80980d72c08df0ca7b48a8a51b01e8f5 GIT binary patch literal 14312 zcmbt)V{|56v-X|jjwiP5Ol+GI+qSKVZQHiZiEZ1qGm}h`FVFM7=d5*pf7NSsuio9e zYWMD|uC;eneXf4)0uZIdB*g$AAOHZ!*8%w400@8G{r|~7O8);eeD(h92OvQK%m681 zAjAMrBoHtpkk3H?J^%oK0Q+aS|07^P2uLVs5KwRc%;!1)>fc8om3u5GBaOcz%|hy- zKm<3_0>hN|st3NUT96s|OdKu~-Q{FIbT!G3+wBhA>*(wDlA>~k3b=NvwP!pA6Q5%G z7owZcwg@z#NeOD3?r%ykL$SX!V1KvNl~Y${2=FWOQuTb4x5}<@+Yx(rT_R{Ohl$ay zLJY;$PKy(JxWXw4kXiO6Hc}yVw!y=>uF`BvrgIgTw=ULAcdY)yaWu+QU#{`Et9R11 zxJ~yXaXh1}+=TY1$kK|`Pi~&e7kvw9grck_iu;f0_S%&X0S&P+f$Tfp^iMBtuMP3s zpR6aK`aS+#Rp9@ao|ufYJr<* z+*-ZqwCYiTJ9egp4dS#2!cy+wiE5;bUJ#q4tI#JtaC`66{zw5f*p1|V*~0mct^fH& zU)O(Z{jVvoe@tCNs~f}xc#=x%mRA2+gQn7LY$;ips`9~tsmiu?ig@;>)mLFC>k;~K z8J)76Ui{cGUJP8bMePy_>!o(AQ?JcDEcr@~3g zO;3b}0>xVPwT0vWOc&haZzg6D$WsQGu$Pj7I^_h;tnNwShKmEi(slWz@&J^EVf!+% z7X)H|$Vw~kRYpF334rAUhBa!8uRrK2TUpco$SXx!O&UodFPI>kU zxWHcKSY53gRp|NxIL|z8nY1D#Lb3UX0p7 zHOiqnI3eOGZs>G69tr4FCBnsbIp#Ug$pshDG=70yYLij0PQeow43eCa+Vn%b2PyVK zqIc(DPJ>k~u1T^HvdI1YHGW72Ey4D73Vw6QeW46CTQDHS<>3piQE=^}k&DT%0mU2D zFl~1iR>XlpSz9BglDX;gq?1)-5Ng6fEbs% zoWcOXrez~U9Q;(HpejcH+IrVQy&$xK0tShSyTh>qM`cxJrgYqjnN4yd zS2AiaqrR@d9}gKd`Zkkk;Nrg!T5!+WMx(nTD9 z$q{sFh^}=qqXVE9nk!!moE7TC$Y~~-E&Y%skLGP$Movt&xMyq6wis_yq4|23h^o}G z0R_wx&}H$CIs+vTd60)S~eev9YbQ}aj~}CU8VAO zyD*~{|pb^6YIH*tNHiok0BMh zu?7iOe7h=S0KZ-hqtmgyu}g@U;J&)4$!{((9bZP<)q;r&>dJ1%E@hU5kqbt-3l|xx z=p2y<1G)n)ywPGP;)SC8U$RW=;betDQpb`7GU>(}@$5f-(&jL*GR6ux7X40oJd1YU zx@RBuCcFRH=kvspd$phaBnru^A9(u=9W^_i9%5;f(}2e$34WPqt`eTb@l@`kKqZyW_t15T>Qb;wMGksAQfynpQ ztn;wJW2C5(f(Gjk#Rc((umFa)Ks(2I$+8@%I1L{>F9h+PB*g?u3#&6}LHrVp1HKJ| z?3^253`SqYfOSocv@2%GVZH;zsdQDJANyX&PViy?rYpx|;k;zyx8<7b z!}#*N40GaW4;{vy4J@A34kVvfdn=Y?b7L2i>jW;}m;n0iZN2b8v{*S>r{2kg;T8Cj zNuFM|o2W=utP&+r^=Kzrs`lGt1(l)SzXYf18eDFo&Kt-IQ<5?zHNZt261~BMXrmqT zH{0jYkcfS>w34E+>a&mPPc*t+1T4E}43U8P!7-ToC1f_ZXE$JFU@q~RSW6P?Dig{?J8TOb&n{lv^KN5!j-6-)@n~BS$3zKsPbMTRVUJJ0g~Hidd?GG(^Q^g$#90oOV`k$6Qs}hS0$UTk_P->VW?p!+K?I^dK374q0`P!(w+k3o=QPE@*2mU#h;m2nDb<-8vpvG3|`g4J+`{DDyz92tUR;tO! zToj@=6%?nGl@!IRgmEO)w1bHCWSSZ4x@Q3Up=anhEg{qc$&13B3JTJ#IOGN;>XlSw ziZ`hvK+4Yj396Buo z+iChYRYV8B9?gd1js99+a5!4XvRjc~a@SQSePa?O$v-Hw;k(bFE3HK*$vjfdNmV^+ zQla3~^j>$L9vgSTyo7@FmYzlE;8TBH*q_?Q<~N!mK6DLs}8COtKg#4UF9aJfAxxUw;C? zO?AOx|3!#~{ZAD<5?RNse)M#`+1 zu#YZm>{u{2|6k??{fD_N)V2RO+WBwPe7K`XtTg|9ME@1m-NO45Qp?~R8i=y^xU=cn zHiG%SRo%|smsL)Pm*#czxX8ybabj9gjPvn_&!_RMHN4lzVY}`lM?Iy2BXEqQ${~`< zO|8{)9BMXoHTo04gWg;t8XZ=D9cK+f5W{iFw&j?{u`XTF^W2d@2dRhTu;{XC zSZ*NYJVy`LO!?iwg?L4!yR!o7SdQO^nS56n99&+S0DWaq(9UYqvJGrv%U_xPD)#Mn zZWsxEvO(kKhp*oAu$t1(;V}0_@!t~s1OvE+>YsqLw{`=Mn| zlm&hG^>o*k_!+c4!en{W_nmsY#}PA=h3?nyBP2F4toauoiC@DOBQH-kED_I9x*S2~ ziTdf+lj-r(eo;jljj|#-s1}zo(XMB%(#{uN>!JDepee~Cn@k+PCNWsHB2JV=Agw9# z_KBU$$q{N}06&5K23{BJ%#O!XqHX&f{`u}V=L1}m~KPW~|L`0o2q$j38Q{(IyxqqD$1k=wNex$4(h*S@W z7du9jH)cT%w6wg~jVZ9GE$^4ZOh)4mhT&S(ej0S1JS@suNqhJNOsXA~_aVua)1t{Y zj`-X+gnzTC=HlW)RQVt>hjz< z!BI0+Si)$+vXP-}2;Qo>J`Z)wBi?MR-_ZxZX;G5>gRdkBbQmEu_>qusD$OdKj+P^C za_U;gQ8ZOX4r04_vnWN&pZV%}ASEF@vaOdwJ~7z9k~3WZpQ*b6GJPyAqE){-NIDOsDvL8rYh8_aeE8?1l1~A4peH% ziU-*;gW5A3KJ9na$0aL-uOf{Twz@ZoKQEpJ)CRatwUVQAE{t=#31*T;C zCg%H*0vVut2x1pi8bf}A*-mW1PtFm1JLl9-;h$xu(EN}@noEaG}t=IoKp72r`Ok)4^<**q8~@`Y;9uew#uCH zKbS}!81{W+Zu@;sJ$(FW>&Ng!6vt5SreH@{Y{y6yp_QxZJCcp#ae88^VA{U1W7;l0 zr+DTou=!?5%0JGMC`+a(OEOBFN7dzfa0FGMc%Fi34^b{hMfWh1yA@d!#UCb=RMbu1 zv$ZDAi}0wqcEyrLlQhLl53QcBCc4SuP?Io~_4FRlU*D17kB=_n8~G04l^}is%pW!c zv16B;TVPB8p4Wllv0n_Xga`lu`*%AG1&#>&4~2t)fC2&FNXRGIrpRqvHGo zxQ=^w9QIwX7a@UOsW)4n zA$6uQ8eDG7+!0VTw4^*%_0nu6hDE>{j?(-SN$v+ z?X$(vI3E0$>Wng2AV+d@RSNccs5Q0owXce*um?-Bw=(DO1Op58dXm3aV7fHO@?>Zo zjrrt*)P~z^9kI#aEkNeTPsJ_2Ntf@C#u_e_*H_o6UqDSjc@=L0xz%^mY;ansh7$8b z@4MxD$&zt6<{xjTjvELg*lOCFo8!5_2iB9%6b&a; zEKvSbOj=-)4G(L$>Q4zqC1{RfbJuHiF?17szm7uw`+LD9V`Trt1ocawE8Wr2*tIv; zH$vPGb+l>JR;_I+I6?4wvSE6!UGx3Yc*uyEEpH{J`MSG!Z$2C;yd#}nzBEOe@ zJ@A}5%i)_Hs8<-~jDM4`Uet;Jf!db?4mRV_cJ6=u6KK_m$>c^Kranpf5AAo-Jt09~*Zku6<& zu|!kf_tUEK-lW!2J}KB7Li@@9?(B@2vq@uvJh%D@H4|Ow&(~I_=SK=XWqLLI9GBL5 zHE)Y>1ITI?&p~H#U5+9z9 z7KW<8!X}T#>y~Qz1T25_Zx?OiVoqYQ1svFh+MuMCSZz-jkdG(lo!p5Kwmr4sIa_Vd z&Ny#0ot_AF$tZ|^EidL`k%1-$@R+D+QAP)M>D-g)$fS#4yz4hKOxe@Z!@PSw>F_=~ zQhEod^U*Wzo6EN^+GQ~x6`-5ibF4=TP+PfF(Ho;LjhzGs7K6-LcUsRL@fqx{n1-7X z1NWXi?iM1j86&Kd?ptZrKC(Wt;_oJ64V$&C8v3~J=R3CP?#XnEtZqVvAvmKiv_Y76 zpmbDNZn;~iu1M)YcNUd8Gug3u3@|UoPV3QbM(SG>{7YX;MbpADvlooLND&} zPmX+4{aVwVlzX4O5!{U!Hl={hX2$Swl2dI<%s}t}Evqx=kXkGgE(Q{Wya#ivyjQ-c zRvU8*_YXyek_fP)ZRMpfclWjno4HMc!cly>LfEYY#-s0562@@`4(wwxcS z`|P~$IB6V(Cx7)GBU)pAQz2i4v+*Yz_Q#DnK@-3y7bHfQON@O2<_Pv!D52}oH@Ymo zdyq=Ex2;%cEvAZirp2_S)hKYri&qjdxpb{_ILibW)ECuXZngB`-ymN?A2oGVMYT#y zw~j&KG7(c@l%#fy6I&4~338{MDNJ6sLT1t%O__ope9Sj_>u(#?^OZ=B{>^pEsXx~| zSlLsbKUmDRN@de4j_>Yhww{VP=Ef!2hGaTm`%Q(jH80T^-PoiRAVHEvcx|sHgz2aI z5vHQ_=X#0{<;tN(OVn|#wC}!e#)TAm6iu;1M8YA>IkZOz=%XAvVM{(c zwdPBvV-U3wGrt+zgrOQY&T4JtM_>+KLhFCvpV3bjS+3O>N340Z0Q09h7F8q?PLC{l zT753(Nn-ugTG94Zh$#}6@jwj%U`utNWjh9TAcm8R`VKTCVb!eUoW;dS7<+i;5IUF=YuLDYKOsF(T@4| z6JW&4A)g)9uEg%nFL<)WCD&0-ZOFU74S+~09ep^&62A?7T_dfO7P^q?=WT<(zpzQj zSTrK`uYSN{w=qtp9bAf{4V?wRr|OK0`5_?BG^t5KAGTX3VxL(5R8N4kpQ9BeZW>5L zAd0Jq#8Oaj=(9XB^EYYJJ6Jnpjcr>a?l=oO1}~0iBo^2v)gqu~a7&IPq+ZhID)bl< z&`8NFBBxDreW1Pgx$)DrXV;+*zPxDI2&7CHw!4%fnbxw}DYJJam7Uqc!&ko&a+}sh z`C{^7;#Z#)hTdfs@A5X@2bzfC6l#_>{u1+fZdZ4QOn!gkIqAs{yy?TuFN}?fc z`IKSQa3m!-cKtU3w&*G{^wu)aisg~Mu8mm?9G@8*iOGRP-?-p*8)k`RyZG;k0eAl4 zn1P$NCUbjTV(`$xIeQMx8@B$a&*S$tS5hgR5#q5WD^d#WF&y9|5~Dm9xEnn;Bv7Lf zp&EB2IwmQ*9<)gt+3U-gah(Ps+$s$cMqE2s=R^lxRuZ9axD9v|I0>Vz6C7YooLQ=( zi_GAzVNr`SsA66ZlVQ_QyI880;OxQ6XD^N^S2iv^ug_;G7uH_-I>}mV+ZZGVI%50~ zGqGg3tQcC>bmU<%rpKeMmChRJ%!wSw$bw{IOb$;!qUGt9FS;ThEgJu3)tL_BdKh>G zk}FDD5ETx~v*yWD+wLi}PyHAgL2Z^xZ+ba(x^78Rnxq_Pv1OE|<0iGeig9m4{bwUMJkc>bv z{)THyS~Bz%3hJrQrl;9ICvz|4y89BTaLDC(B02{$qW>F z@Et3u`c0#W$padqK^W4bXE+;aWA1jeGAGmA({Ir>L+eBJ&)hcieB(Qi*!Dz)MdB-d z1{iK0Nf~xt_=4vM8?r}UYJ_XAs8|M6LiR`{z!2VjS_@DgdrS&bp>Kf{jwYf~(O_0Z zOdCEB3JtgEB)#n>rnJmC(=j{t6vJ_CLYaG=2OUjDJbszno+PZ3qF!1Pr#;mz@@Nf^ zW?}aeKPJZ$ZKa6oBYJ)tKq0)JC1W$%8hl@#UDndVVhyrD>Ybc3@pJS;M)l;gqYy>N zv#%nN%YX=0R}LTesm>H3Dp?Z@9uLKVgQGhW}S*=U1R`#2lx!nB)9GJ((L`!;_p zYM$O@Xwcaiyfu4_z8o=aSfk(W=(oH835l#NN@wZ8yMxkb581zW=)15-!>b2Sb}*wr zLSczxYMvlv?zGFuk=l0%v{tznHrwNy)9Ydn%@Gr)H)YWUBi-1)ld;7=g-l#!54%G@ zXp{6cZEK<&Az3&|alL{BCKjeyP%W%!NJhzJzN<%u@YxO77qPB2PPrsRC)+!vfI&%` z8S)9L1gGN_46Y@Ls#Cyr>dVVm&hIt4=1kP-pt-ThwF+1>T4WsLk)utXg=14bViD$2 zl+Q0;EUns4vIK1|Fl zb?gpIWqBZNl(85%4|c?BalBxTPR-Eu0OUEE$M!eaCBIzd8B3b=K#AzYp6_w z@6rO{krbId>q2#`sikfwv&F{vZD}8b?eLAgKT~*{fqQ-+U`}MlE-7!gO$c!jo&G>4iBqKL#Z__Itx- z`kXZ9B#j2KkmJxutsbz(iT9UiawIAL8SBjsk4i$W;Qnej?&^q!9qFZyk_r5stfH3y+gmANHN$pMb;`AMieo z`-7{$O=X9>MqNM-!_w1Pv|ZV)Ow&!BQu;ts3tuarLjZM4>NCU)u_}`(gDJU!XwzO74My zLVOh#{2L$s%IhNmh!}4L6%Y*^z5>I2dxZ6ObN`cg=O?;r!Mfey3_y=+y|%{ZY@3M< zD+RN?drpu2lXia%mrs@l{UC#^?m?L_g>um(*=ayXQIK>|ZZu~I^BM?9 z^(LGeLPG=AjbJJ7GF^cJ`;gJr#O#Rnp+G2LN0p}^&;`usbrvBYOxwGRPaP%@^C;Rd z-;Y_Dy~Ck)4{{8OO7Mzi!6C4?FvS=uP>r)!|5P+9g9=aAHcod##hbW8awo2q3hG9TWZ5SlJ$9pdjUp!Vq>vzrExU zhfIxTpQt`^3EqlIPF(5Od!yd6i>hm;4UW~bV`w7k_d$KrYVnvCIwWnFDP+{`>zKmwr@llJj(SZ+hQMPERNhRDJ+2S`nP+>APAl`>< zDX(X_hR>;7(;fG`$IDcP?B<_bh>$Tb^PoG$trpG z`~j1%>)cf!Kkanw-UW0AN0xdmJnu5(Sd4ipdb`Wd-EpAeoEPB)f!U%wtS5}NP z6~n)`f}_F4VLOF&HRBfL)jSs-6>fq>1K~=Fxv=~N4m#sHNOphp+izPd^Mo<A?PBci=zIzT{tK7gYG-^?bzmzPs<6uE~CH;RbTrQhCx{CfH5=8m351#Hq!5>cXDQxK5a%Z#CtGEI-b5 zbXfibBz4P;w_V%hux<+AM)gv$BO+0Q#(;qVk{$54b}nb-eMLS2?l!5ckL=Q7*18V> zCU~cL*4PL${>eqCop#fLJgO1>sQVLyal&5(hw8S_SZe-#7Kk*gt}l9{4}v_(g=$)= zd3~079;_~PzzMcuKdPz8O${9u8tF;}kpU$|WHkE<8`jOjTIKQP1j+3Ypdj?kP_gLj z>{xcj^*D%?Swhh!pmu0-;10ZOm@-*E&5u@@d@vZbzdqC%T{f=2x=?@qJ7Wm-`*t~s zZi^m6V~PR-=wL)XFkR2HbX=1I4hV|G_G0EWKf!#_2nc`V(-GkNZ_$RxhUYg#1Djt1}&gbklfGuBXPPZrD3|$MYqxq zRsffVZSot>-?Xq*up%NmTf$-pKn8roHH+nsSn;pe5$Ve7C7#28u#wt(HIL>pwNe{y z?#aQ%g9q{%k+bY0Z53X%V~g-x5a)Jle*F1hq50&YE}+&dEN@v@I;)zg zTJ|7Ql`yHQbDX`peidB`G%~cgH71j7h)`6ph%T)i3N3RTu?R6qDuy+(00J?X*>mD# zcOUubkh*G?ib5#Apa!j8t=Dn23zt&3CI6dWoq#flACyu9na)O>Q1GB^yM8h10HD=M zOIRp*kF#Y1QW3Cp1*WnqIG!RJ{ ztG@B^-5ZvbEAM8bL_<$#OoJ~(Be18KJ#xC1)oj;0rgRrc%u zcI~rYi-UTGCb?cO3K-p`SyoiOF$_g zNeVIq$*&L%N|I^ zx}kDCdmdY~iGyf*@IZ@k5rCp>tKbCz0cT<*bzrlyZFmK9W9%39!PzX(02Q$0uo2L7 z=zcMC%Gor=QA&RaL}xSwT~#3dF|{JI7a}w*L^hyu;V8S}Xtx(Xop^}Zf+IDf4ivMq zs#Skbg5xB^d76^+BspwK35OB>=JpN+SSRg6MR9b~+m(WLRHR&Y(DB#ga-YGHa$31i z4ICAlMLl2H!H*DN@<%OA@3`yZS7F@m4+^rDtYkV5HDi2ch`<%?-vMhAr!SYQqb)%} z9x$pB7lNv)7mroDHN$K}x$FGeuHObN$B90El@WZwo&@n<*ngeA&=2|#Q~xjQ{o@hq z`}Y1r(qFaR{D_*XC819`4--x#?jL=7vn_6Nab_M}1PxQt;^>vDrjT#hdm{ZpVU+^N zMO*OGQi@M}0n2?Q?cK*j10+5Epadjj%Lu-rg7&%A`5H26-0G?D~;|;QBY6sT(+y{*m#c+6F%e;vG?vH+nCEguMsSE zcAjyWY<&J|60Ea|3jt`J99|?T;;W*Qvr%wOF{Fa)ODosDO32AR0rD%qW6%~#J?12= z9m-z&7PXDJMSne>8Wx2U{6Jyk5CKWEyFMe>|uTd*2>OJqb!}HH>JQ=jYAr$xiJRuSBhB5 z;%*P)$makH5O24q)KJmq@MJ`NA*~1B%>=iuaeVUeUQ&xc@*Jh~$8fd{ zILr}uqSMPHqj#pVGN}ht@qXtX1wKS7x%T@T!J#QO++3HV7J(BUba3xNcVqRmx^~nk^v3PSR4bn_ zdCR?Hl62%eea=hU;CZB%obaFI;BRnu+yXV~#(A0O_$-dq{!zEyS$`vW1kwg~OK~FN zMPi`*pTli!?gpvduk|RmzO~M5UG8d`ktbP$WHY!ulu_IKn)<3wLa54h>Y$$|l;d}Z zt6MhK?dWw2lu_$_vC)3tTb&u;ik$zssdvMO!f=+^RP^AJb?N~KHQSH?yXoUxzSWxJ z)ftmZ>x2x=)x!3N5G(}?vI8NG{|hHd(pPWLCZEQN@5G;Fhb05icEL^I&`@d7O#lh{ z39$421Z?#E?54QC;*$!tzdEo9#y*#y^^y6Ni(d3Wk>bdra8$y#(|Yj95(T zQ4EXLSK@gY;geA#3!U!V5h|##PBmZPx*lWYSM;b|Ouv!ch+I;~1*Fk7^7ppWIX2F(sMAXlmgzU9h7k%W@J?&-6 z9vdw+AVjEJYsCp#nwIo4yWfFUWmEJRz+DKiR45;zIW@Vw%Z7d=LT%M(qyYJ@wX$J$ z;K8hdnX!)R`3xw2YG0K ze`tCpCs~*jNZC;orZ!Dy0^Hc4->q^w*5F-re!Xr=4`FXv2hrFII@z23S(eRPb}x~* zQ2g%9DgGl(n{QwID6d_X4olHguHxhJL8Ko+!}T-_BFl#UA%aI}G{DdK`c#q{D4v;N zIvb+AqOc?{85U&dr*B7s`>N%w0W@uU08xgq&8pg!#VA#q{o!fVb&Z@;K4*xa*;f*c z35n)d%@`(I3MmGa*WC@3j{_^KJdv1-mBSU>MJn08vm<49D81=F*(1;1eFlo=0-$T5 z9(+nzC&CM!JFtt3{Sj-JXv}kopr!2>&9vtW{|V?^I%=)IE&hJ>P|3%J%VNQUbN%Ah zUFK{!n$XjAmxwJmNM(cBE77UD3bm}uP=l>nr$YwDW!ft)Ni9nvIW%T}>Z}Zom&t_~ zo;U`+*C-jKe-001_GJ04U_=!I!jt#o050gGCBQ%01bq>%9?CF;bjHwKC4k7C^c2ng zZ%XGGUfx+%Qr0dr6O>B8`d9w_b>&XE-hk~dizP#!NJYiLC@a^|q&scQ2ZEczHNf}K z?`cJem-#$p3kSc~$BlvOo%fgYMdcf}KSK=x#h}{iTLb)e>vKJxZuEw%?nKS0P~^bx zKLOuybsf%7;@SOvvw>pMdI1kp57NcrYzzI;Wt<~O$@aJ#Bm#?>+8B&121ASNW9ta6 z7wh3s0c(qIlfE-q!m2v}b&bZ;#B$N;ETJ&s;VSI1M<#AUQWdJb(7oL{m>ueBsP%!P zoh<&JNu=&9sQC(fL7`pYY57pvpMVZyfEd(LY1InCf(cDSN(h(@rqoZRLbVMcdjS{D z(w+8Z1E#3GG*6+-7x^9y_5;t<$Z`onf}9HbBp(;|-c3PPT@{$xn4f`UcT#kf;}IS` zl&O=e_{F5nwTKe#g)jabh^E9~olL-8e}~qHW&&Ml6ys5Mn9Hbmnifvv^yof1RZgzBqx$@2ED0WST>qYOqLaf(Z}exKuZ$`(p0NwEOzC6xoCqbDc2$nr z@)*9Y#}B-@4!v1kf!N0679FQtBrUz}xttiAl6@o+Dn|ZZr+2Xu6d#P89q$ z9vxUsK1}ZFjhGeH#8E{hHoeZu6Z*ro0M!m*%DP2=?^32BsR;nVH@?MTgR}GkKAwX^ zbYQa>#rFWV9toS~$zR+JOmv{U#ZBLBsBmFDGh literal 0 HcmV?d00001 -- 2.48.1