pg.ddx.io pgsql-hackers@postgresql.org mailing list archive
help / color / mirror / Atom feedforeign key locks
74+ messages / 13 participants
[nested] [flat]
* foreign key locks
@ 2012-06-14 16:41 Alvaro Herrera <alvherre@alvh.no-ip.org>
0 siblings, 1 reply; 74+ messages in thread
From: Alvaro Herrera @ 2012-06-14 16:41 UTC (permalink / raw)
To: pgsql-hackers
Hi,
This is v12 of the foreign key locks patch.
I gave a talk about this patch at PGCon:
http://www.pgcon.org/2012/schedule/events/483.en.html
There is an article there that explains this patch.
I described the original goal of this in the thread starting here:
http://archives.postgresql.org/message-id/1290721684-sup-3951@alvh.no-ip.org
The patch itself was first submitted here:
http://archives.postgresql.org/message-id/1320343602-sup-2290@alvh.no-ip.org
There were many problems that we had to shake off during the 9.2
development cycle; this new version covers most of them. There is a
github clone here: http://github.com/alvherre/postgres branch fklocks
If you see the "compare" view, changes in this submission that weren't
present in v11 start with commit 19dc85f1, here:
https://github.com/alvherre/postgres/compare/master...fklocks
I know of one significant issue left, possible cause of nasty bugs,
which is the way this patch interacts with EvalPlanQual. I mentioned
erroneously in my PGcon talk that the way we handle this is by shutting
off EPQ recursion -- this was wrong. What I did was shut off
heap_lock_tuple from following the update chain, letting it walk only in
the cases where it comes from high-level callers. Others such as EPQ,
which do their own update-chain walking, do not request locks to follow
update. I believe this is correct. This was changed in this commit:
https://github.com/alvherre/postgres/commit/e00e6827c55128ed737172a6dd35c581d437f969
There is also a matter of a performance regression we measured in stock
pgbench. I have profiled this to come from GetMultiXactMembers and
AFAICS the way to fix it is to improve multixact.c's cache of old
multis. Right now we ditch the cache at end of transaction, which was
already considered wrong in comments in the code but never fixed. I am
going to make the cache entries live until the oldest Xid in each multi
is below its visibility horizon (so RecentXmin for multis that only
contain locks, and something like FreezeLimit for multis that contain
updates).
I apologize for the size of this patch. I am not really sure that there
are pieces to split out for separate review.
--
Álvaro Herrera <alvherre@alvh.no-ip.org>
Attachments:
fklocks-12.patch.gz (application/x-gzip, 88.4K) download
^ permalink raw reply [nested|flat] 74+ messages in thread
* Re: foreign key locks
@ 2012-06-20 14:28 Jaime Casanova <jaime@2ndquadrant.com>
parent: Alvaro Herrera <alvherre@alvh.no-ip.org>
0 siblings, 1 reply; 74+ messages in thread
From: Jaime Casanova @ 2012-06-20 14:28 UTC (permalink / raw)
To: Alvaro Herrera <alvherre@alvh.no-ip.org>; +Cc: pgsql-hackers
On Thu, Jun 14, 2012 at 11:41 AM, Alvaro Herrera
<alvherre@alvh.no-ip.org> wrote:
> Hi,
>
> This is v12 of the foreign key locks patch.
>
Hi Álvaro,
Just noticed that this patch needs a rebase because of the refactoring
Tom did in ri_triggers.c
--
Jaime Casanova www.2ndQuadrant.com
Professional PostgreSQL: Soporte 24x7 y capacitación
^ permalink raw reply [nested|flat] 74+ messages in thread
* Re: foreign key locks
@ 2012-06-20 16:54 Tom Lane <tgl@sss.pgh.pa.us>
parent: Jaime Casanova <jaime@2ndquadrant.com>
0 siblings, 1 reply; 74+ messages in thread
From: Tom Lane @ 2012-06-20 16:54 UTC (permalink / raw)
To: Jaime Casanova <jaime@2ndquadrant.com>; +Cc: Alvaro Herrera <alvherre@alvh.no-ip.org>; pgsql-hackers
Jaime Casanova <jaime@2ndquadrant.com> writes:
> On Thu, Jun 14, 2012 at 11:41 AM, Alvaro Herrera
> <alvherre@alvh.no-ip.org> wrote:
>> This is v12 of the foreign key locks patch.
> Just noticed that this patch needs a rebase because of the refactoring
> Tom did in ri_triggers.c
Hold on a bit before you work on that code --- I've got one more bit of
hacking I want to try before walking away from it. I did some oprofile
work on Dean's example from
<CAEZATCWm8M00RA814o4DC2cD_aj44gQLb0tDdxMHA312qg7HCQ@mail.gmail.com>
and noticed that it looks like ri_FetchConstraintInfo is eating a
noticeable fraction of the runtime, which is happening because it is
called to deconstruct the relevant pg_constraint row for each tuple
we consider firing the trigger for (and then again, if we do fire the
trigger). I'm thinking it'd be worth maintaining a backend-local cache
for the deconstructed data, and am going to go try that.
regards, tom lane
^ permalink raw reply [nested|flat] 74+ messages in thread
* Re: foreign key locks
@ 2012-06-21 19:47 Alvaro Herrera <alvherre@commandprompt.com>
parent: Tom Lane <tgl@sss.pgh.pa.us>
0 siblings, 0 replies; 74+ messages in thread
From: Alvaro Herrera @ 2012-06-21 19:47 UTC (permalink / raw)
To: Tom Lane <tgl@sss.pgh.pa.us>; +Cc: Jaime Casanova <jaime@2ndquadrant.com>; pgsql-hackers
Excerpts from Tom Lane's message of mié jun 20 12:54:24 -0400 2012:
> Jaime Casanova <jaime@2ndquadrant.com> writes:
> > On Thu, Jun 14, 2012 at 11:41 AM, Alvaro Herrera
> > <alvherre@alvh.no-ip.org> wrote:
> >> This is v12 of the foreign key locks patch.
>
> > Just noticed that this patch needs a rebase because of the refactoring
> > Tom did in ri_triggers.c
>
> Hold on a bit before you work on that code --- I've got one more bit of
> hacking I want to try before walking away from it. I did some oprofile
> work on Dean's example from
> <CAEZATCWm8M00RA814o4DC2cD_aj44gQLb0tDdxMHA312qg7HCQ@mail.gmail.com>
> and noticed that it looks like ri_FetchConstraintInfo is eating a
> noticeable fraction of the runtime, which is happening because it is
> called to deconstruct the relevant pg_constraint row for each tuple
> we consider firing the trigger for (and then again, if we do fire the
> trigger). I'm thinking it'd be worth maintaining a backend-local cache
> for the deconstructed data, and am going to go try that.
I had merged already when I got your email, but merging that additional
change did not cause any conflicts. So here's the rebased version.
--
Álvaro Herrera <alvherre@commandprompt.com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Attachments:
fklocks-13.patch.gz (application/x-gzip, 88.4K) download
^ permalink raw reply [nested|flat] 74+ messages in thread
* Re: foreign key locks
@ 2012-06-23 22:38 Kevin Grittner <Kevin.Grittner@wicourts.gov>
0 siblings, 1 reply; 74+ messages in thread
From: Kevin Grittner @ 2012-06-23 22:38 UTC (permalink / raw)
To: alvherre@commandprompt.com; +Cc: pgsql-hackers
Alvaro Herrera wrote:
> So here's the rebased version.
I found a couple problems on `make check-world`. Attached is a patch
to fix one of them. The other is on pg_upgrade, pasted below.
+ pg_upgrade -d
/home/kevin/pg/master/contrib/pg_upgrade/tmp_check/data.old -D
/home/kevin/pg/master/contrib/pg_upgrade/tmp_check/data -b
/home/kevin/pg/master/contrib/pg_upgrade/tmp_check/install//home/
kevin/pg/master/Debug/bin -B
/home/kevin/pg/master/contrib/pg_upgrade/tmp_check/install//home/
kevin/pg/master/Debug/bin
Performing Consistency Checks
-----------------------------
Checking current, bin, and data directories ok
Checking cluster versions ok
Checking database user is a superuser ok
Checking for prepared transactions ok
Checking for reg* system OID user data types ok
Checking for contrib/isn with bigint-passing mismatch ok
Creating catalog dump ok
Checking for presence of required libraries ok
Checking database user is a superuser ok
Checking for prepared transactions ok
If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.
Performing Upgrade
------------------
Analyzing all rows in the new cluster ok
Freezing all rows on the new cluster ok
Deleting files from new pg_clog ok
Copying old pg_clog to new server ok
Setting next transaction ID for new cluster ok
Deleting files from new pg_multixact/offsets ok
Copying old pg_multixact/offsets to new server ok
Deleting files from new pg_multixact/members ok
Copying old pg_multixact/members to new server ok
Setting next multixact ID and offset for new cluster sh:
/home/kevin/pg/master/contrib/pg_upgrade/tmp_check/install//home/
kevin/pg/master/Debug/bin: Permission denied
*failure*
Consult the last few lines of ""%s/pg_resetxlog" -O %u -m %u,%u "%s"
> /dev/null" for the probable cause of the failure.
Failure, exiting
make[2]: *** [check] Error 1
make[2]: Leaving directory `/home/kevin/pg/master/contrib/pg_upgrade'
make[1]: *** [check-pg_upgrade-recurse] Error 2
make[1]: Leaving directory `/home/kevin/pg/master/contrib'
make: *** [check-world-contrib-recurse] Error 2
I'm marking it as "Waiting for Author" since this seems like a "must
fix", but I'll keep looking at it,
-Kevin
Attachments:
fklocks-13a.diff (application/octet-stream, 719B) download
diff --git a/contrib/file_fdw/output/file_fdw.source b/contrib/file_fdw/output/file_fdw.source
index 6f906e1..c01f8d8 100644
--- a/contrib/file_fdw/output/file_fdw.source
+++ b/contrib/file_fdw/output/file_fdw.source
@@ -191,7 +191,7 @@ ERROR: cannot change foreign table "agg_csv"
DELETE FROM agg_csv WHERE a = 100;
ERROR: cannot change foreign table "agg_csv"
SELECT * FROM agg_csv FOR UPDATE OF agg_csv;
-ERROR: SELECT FOR UPDATE/SHARE cannot be used with foreign table "agg_csv"
+ERROR: SELECT FOR UPDATE/SHARE/KEY UPDATE/KEY SHARE cannot be used with foreign table "agg_csv"
LINE 1: SELECT * FROM agg_csv FOR UPDATE OF agg_csv;
^
-- but this should be ignored
^ permalink raw reply [nested|flat] 74+ messages in thread
* Re: foreign key locks
@ 2012-06-25 03:24 Alvaro Herrera <alvherre@commandprompt.com>
parent: Kevin Grittner <Kevin.Grittner@wicourts.gov>
0 siblings, 1 reply; 74+ messages in thread
From: Alvaro Herrera @ 2012-06-25 03:24 UTC (permalink / raw)
To: Kevin Grittner <kevin.grittner@wicourts.gov>; +Cc: pgsql-hackers
Excerpts from Kevin Grittner's message of sáb jun 23 18:38:10 -0400 2012:
> Alvaro Herrera wrote:
>
> > So here's the rebased version.
>
> I found a couple problems on `make check-world`. Attached is a patch
> to fix one of them. The other is on pg_upgrade, pasted below.
Ah, I mismerged pg_upgrade. The fix is trivial, AFAICS -- a function
call is missing a log file name to be specified. Strange that the
compiler didn't warn me of a broken printf format specifier. However,
pg_upgrade itself has been broken by an unrelated commit and that fix is
not so trivial, so I'm stuck waiting for that to be fixed. (We really
need automated pg_upgrade testing.)
Thanks for the patch for the other problem, I'll push it out.
> I'm marking it as "Waiting for Author" since this seems like a "must
> fix", but I'll keep looking at it,
Great, thanks.
--
Álvaro Herrera <alvherre@commandprompt.com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
^ permalink raw reply [nested|flat] 74+ messages in thread
* Re: foreign key locks
@ 2012-06-25 03:47 Alvaro Herrera <alvherre@commandprompt.com>
parent: Alvaro Herrera <alvherre@commandprompt.com>
0 siblings, 0 replies; 74+ messages in thread
From: Alvaro Herrera @ 2012-06-25 03:47 UTC (permalink / raw)
To: Kevin Grittner <kevin.grittner@wicourts.gov>; +Cc: pgsql-hackers
Excerpts from Alvaro Herrera's message of dom jun 24 23:24:47 -0400 2012:
> Excerpts from Kevin Grittner's message of sáb jun 23 18:38:10 -0400 2012:
> > Alvaro Herrera wrote:
> >
> > > So here's the rebased version.
> >
> > I found a couple problems on `make check-world`. Attached is a patch
> > to fix one of them. The other is on pg_upgrade, pasted below.
>
> Ah, I mismerged pg_upgrade. The fix is trivial, AFAICS -- a function
> call is missing a log file name to be specified. Strange that the
> compiler didn't warn me of a broken printf format specifier. However,
> pg_upgrade itself has been broken by an unrelated commit and that fix is
> not so trivial, so I'm stuck waiting for that to be fixed. (We really
> need automated pg_upgrade testing.)
Well, I ended up pushing the pg_upgrade fix anyway even though I
couldn't test it, because I had already committed it to my tree before
your patch. If it still doesn't work after the other guys fix the
outstanding problem I'll just push a new patch.
In the meantime, here's fklocks v14, which also merges to new master as
there were several other conflicts. It passes make installcheck-world
now.
--
Álvaro Herrera <alvherre@commandprompt.com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
Attachments:
fklocks-14.patch (application/octet-stream, 89.1K) download
ÓÞçO ì<kwÚH²áWt;17Ư<¼KlpÇ6^ÀÏIruÔMÄHÂMüß·ªº%$!pöܳçÜëð议ꮮgw Ý4VNL©uͱ}××
Óâ¡ßÕ
?_øá÷ç,\³ñ¦yÓÖù=Û7û¼Y«i¦q¨²f£±ßnç«ÕêæTóåryÊÿ;«6VoÐÐú×iªm;>Ó¦ª=áÌp\nNlæ«c³:(w[ȳÓîywÔegþì÷ÝA©ì®áM~[C@y2b¯âHÏúv}uÚbý³ õM¾ £`õáÇLCs¶ð¸ÎîLIº¼Yý·îA~Ü;ï]vYóõvdÛüýOd>ó§¦Ç¼©³°tÌf¥çõ4q«nÚÞk~}ÊÕ¹±°5¯¦E)Bok¿¡iQ«éG#}.¾Y8âbEâºß"q¥7hÀ~(¦Ïg^ñêrv}y2êõ/Îàðg¹\Î_̧ºYüð£ÅÜâðAçn]ÁØÜïÁè"â©0S/ËiÜj-¸÷¹ý^÷l· §ª¿%AûÍÌ´R 0Tã÷6¯ÞGÆ·?Pï("KØßÅ3©¶ÞÓxXýêÂ}«jìU=þ Ñ_9¦íÿ¥ÀP=öÍ\]8LÐÞ´
g¦zßZ0(]^'Êb>qaޢɱtÕWãܱað½vf¨»Ö!ÏØ,$ ÍCÝ=ªì³2¼¢ÄN8°CÀ(T<±°Kf¯4ñ¥ÂÆc1˼å6åÚ7c0n4üÕ9 ¹ÜÄñ{S^ªåñxí(G:fË73ºî`w*:Ë(Y¤°ÏãôNßC´ZmdI«µ_iý$Sr9Ù[=q~úmnû}ï&x¾ÛZxçRüñÝÍ7÷:ÇaÌ4X±8Ãà_q¼0L»Â
çªÏ=ô`@|Ò¾ã±K~ï_ ?oTÍï鯥{ñ]^áwÒdLºÅy
í¼ÞA
§¤½bûñÁ,nÃDÙ[ð ÆOÅdÞ:£Î9ÌåWý5¬¹$v±¹ë×}±¦(èq%$7/ß BÐiÏ[ÓàtÐ+»¨Ôåõ
¤'ÆÓr..Z«åæjß0<îÿ_àªT¼t®ÊÎWÙ®^¨÷æl1c´Õï?ãvÉ2)LWÝm»y(ÜíóõXm¸-MqÏOëI7<»å®i<@À¢úì3X1ÌØï¡3R}Ç}`Ak¶Vi_F¶ùE ×?~ è
´ßË0XR|±?{ùR XZ0yØ?øm7hùÚ»{fë'-_¸:X0
Kyt¯úcVR½
ÊÅú½SeÚrqD¨Ç6Ø"P`-DZ"g«°æ`íÙ;Í
Ã-aÐÎ0b½S¦ÀaPÛ [r,?fEQ D>0CC«ÕöZûíÖÚ##3ÞAÎ6[V|ßGÓ\üUl~§8ã?!¬ö·BfQóåú«|rSnqÚMµ6ócÝta êÒâ1ÃufY(¡ § 2G-æ
ù 3Ø`~
á ô|Õ75sÊW¢á>ÞÓ©ËÉ©GLI!äEa^E¬æ;
r@Là«þôóEçæêÃUgôñëQàÈìÄá+°5#.Ðr!6IØ<FvåÙ
ë5wù\ÁÕ/¼b¸Ø*â=úØqدx'É1Ï»Àn£c ÿäN¢µÐCÂ&À$ziÏjó Îg!ÎXë
NÑ»Úùè#hÑéJPúk²[Ì¿u!¼Kyýt¿È_Çgܱe
#GWùár9ÎV$2 ,ÉÊ?ǹ|L%Àh*η¢pü¢lEDXʰÇ]pØ)Røk<ºH¿ç1Õ¤K«ì ®G½óÞèå¼ëëw+yöiý4Øï½ËÝvÆGÝ\÷G]d¬\gðv||j¿l¢Ða"w +ï¶&Å5Fg=¹/ë
{2uÎêðú«G`mÜ_Cg%44¡IÎÈèP[ÈNl{ù}tÔô³Mïwòç[Ø6°+Öºeà>Wzðö¾«Ú8{Ó±Äht2âÐ!&rCîK@ ÝpÜèèBÓî5(ßß´÷7Øü4}MáoR©]ð°g@øæOi.è%}ªËeàkÆPÜuÎG+Ou<.° ï;N!æÀµ
-c¦ÇÆOE0-q!ÕPàhD{m½uÇÞñMÕ~ð§È[<K¼ÃÁ\ǦH){ÀFãd ÷£êû|6÷ÅxUg´\gN,Pm¨-|6:'ªÑçº4Q3K¢T_AbÇïØÅõù¨wÓ9)gýÁEgtò±sù¡«tFʧî ÂDTè>bÊ@Ó
<Ü˺Cq«ôàk¡g|6æn -çKYÁð%Ȥ |9'Ä9
{8ÇÍ¡ôJHÛDh6ÚA°_ÂðrAb'}röaa$u´áäf¸å. Ò¦51Òà¤Ý¯«fòóåý"# @ÔU0¸Õ>ûuÁª3xÀÀ@¨ÚýDÉÌK´Q CxnºaW¦Å3õmàq»*¬J=P>¢æNÂÿß'²©bå
Ñ'é÷ÀVb"Äɴަ¢;GÓaây9;®¯Ú~h%$g):x[ÁÉD -)!q³2~XZ»Ó¬"LOh{@r]î/\ÔÅÈz Ææ¯wM®¯ÆõB÷¿*nÏácmçNÚläÞjóѦßÉÍZçb8¤ä÷Îy8øÆÚ¼EB=]æNeB}8n5ö[ÍZíPßS
}ozºQB=wN]ðÙÀ,!G!£ìSÜ
{þ@bá/±6gzÃÞ{ÁÎr2è?;gKÔj4Æn3ÇÂàYèÉõ~ù ÷:¯E]H®q@ÙÖ@Â|YWÕ¦ # r{yðÔ<©Zx'
T<3±æ@°æà@\nøs±º ÁÌÝÊ&³ooV[AÈ!èJïp°£ÒAÊèBEGÇѱåhß¼F,ÕplÊU×¹£Aõõ§³£ñS½RF½ýÝãqfðÃF»µ%£«ãò¹
Açt<+g/ú§×ç]elNrïØr@õßÿ÷0k«9¸ûÝQ÷rØë_²|õËXSµÚ¬5jÞ_V¬maÏUíXn=ìÏSÇ6WÆ|zGRªi X]»ÊÕaAú{Ò¿<ë} ZædíÖeÎ ÑYÐy´$3Gï
Å~7ÄÞjúa6º®óÛº½°¬ìMͤ
ܨ4@ÇDªFm³44
ù2̹¥ýxÂÓ\¢qô¸T
BveàæBÄä·¦ÊN]¬Ge%_þµ©Ã®!2)$;#[Y@Gn9ª.ìò«Æ¾üµ0}Oç|¶(m;ô¯Xpé(ú`wѵ³Jé]¢)³Õ$H
>k&ú×#ý\W z§\X&¿$\v àwô7Q q©'öH|¿-aÀÞyøòùkÆàéòh+PL8g#ÆÞå¨û¡;øüµN»~Ö¸²üAwt=¸²awÔ?n@¬!ÛO3/;Ý
ÛY²n'_>GrÝùÐe'l8ôNFëe
ÙDHöÅq¥kêQãh|ЮդÒeÕ4ä¨KÅ$gViî±2*¨Yu#54¬J´ÿ]Výi
ùl£ÕM ¤ §g#ÖRÈû'peèJu]©n +Õm¥¿*ýÕ
¤¿úÓÒ¿±«ÙÜË´GFûy^fÕÁìmì`þ}Ëÿÿÿ@ó¸(M
.JcÎõVÆÛê±Q
cá¥{T¯ÍÝÔÜÈ·mͱ3Û\á]<BºMÇ»2ÝÊå:¾½)¾©çræûzË5WÚM63×ZËí®´8ärí9
ØÃtÊèòQO©ü.]ó rpZßjÞ7O£ãzMÔ¹"ÜMÑL±~Þß¢Ì ÷ñȰc*ìÌqïTWÂSºÁñJ:ú8^+îorSß[йÆhy¬ßÓr1qkîçrA ¬iÒñåÙÙxa ²Â?96[°Ï0¹w=×UË¢Æs}OÃhòÕc×S4ÀSaï¯Ïκå¼òBÅ¿òúN§³°
¶`U#ÝÐeøc¸²p]ȳetVÅfQª¦Ö{öGÐÑéz¹ÆÞe.19rH%÷Ôd"`ñÉÐNàDi¦¤.1Á®aQS´7Zý)«HÂ3GU¢kæÝ
<öóX¢$ À8É~çB}xÏ%¬æ'oUËÔi(¢ yW}¶ð¢Ç¸ÝÑ[!Êr¹U¨mqc/!;^²ÝÎrsѹQz:ç½ÓÒZ¸¡B>KÀ¢Øw iQÏèØÅü°ª¨¤¦¯^]QÃ,¬ /ÆRjqüõªÄæ SV=ý&0ZÞÈR ,9¬lÄ*¤Írùëg q¶°i¾'@ Yë,üJj±[F¢t:4΢ºÐ¾õôäª@(2E9¶_d:NÉÇÙ0¤/æÅª®²/ïÞã)®yËA]º<âÃøÞåêaC
TY¨¤(yK|s$àÕ½CIÞ`þåùG$rÎrͤPð¿ÖÇÑ+ôÖb±A¸°Òògìé}BsC¥Ç7ä¯TûA¬SäxÃïMÏ÷þ&sË'öOÜíÄi}¤ ïB\+>ñÈAdë*ì%" 0ÒÝÀúY7"¨Ù+ys)p"Þ(ÊÁEù]XÈ*ºbÛ%#£ÔEJø sæJqwa!LVÏÃ
Ä¢p
5s&Ez%èn¸ë:ÁÍD]ÊRq)LÝsÒxö#bbXDÜ~ëþ1ü(R)p OX}BúçJ¥ 66wÓB¦§70,,I\°EÐ>ØzÜÂ÷ÆcáMÅ¥ê/Lð5L^ È<%cä<6áQ ©+]¼
tÅÕ!Í4ØQ Y5×c
ôü!´`6
ß0 xu+¥ð¥
ٹݰùzbqx!Züû½ëå²ôEBGò>l_Âq>DgFXÝz¸y8©W<ñzöëL\Èm8Ï~
uae9K%i×*@hC}JãAÐG
zdÏlKt´(Õ R%¤Õþ@*K¶$aâ|^rz-ä<R.ä1hèR)ÿIøPÉñpU«)¸ޫÏÛÈ{°¸W¦¾ÜÎ,ìea²Ü~ÀY»§ÑÊÙ,\ãë©MY1GX·PX¾lÆâ¥ØoüAý¯ö?c¾ Êltïrc«ßÞ<IdS
ÏÃIü« höüÀèm=
ØëiØóøµ!dÕ:*O m ñjÄȪö%åimGµ
5è6CA >&(ÖUoléiÖó1æSLç Bä¨oÉ2¡qi@×ÀÍWÐѳYòHúÅ7Âl¶ËÛ¾ÿª?n¹m3Ná³B-+i\M®!HÛRh¦NѨM71OÓøKÃþe UTM
Þ^³ P×ÙØ´ÃÕ¤
§§äPDß|þ#>TDêµëÛj@94bS[2h[ZK³ a´ÍMºqúÆè vf;[ËcäbmÜÏð;;ïY¬´æ©#VÀ)ñ¸3Ê û©ÿ[÷ôY;ó$·6EDò¸IFö|«µâ63c©v,+IÚÜ,ÍSÍR©¯F±h¯dXý(OP7»^¸¾$¥ÏË7XzXnÉÄ5w5âDý&æ§æøÐOi,fÁÏ7¸tÕ=»þÅCèN,®Ú áâÑ5`£\fB<ÿ
Ö0§Ó³¿¡H¶J¾³~<¤·ðcw²Ä6ÏßÒb0*þÌëWñP#}Ç}ðPmû½lwjÐZ{1)âBT¹ìÞøS#_a1%ù» Û\sÊ"Ö^A
¸ e¬6÷Ûµn¨{úVWÓFV»ìá¥?Ýù³_¢XXßjciiBAÃöí ïðJ¼jñ[n
wßh¬°BÀwòU*0Nµ©8®YkìäË©Í<^s/,NÏ-ѽ<tüeâ3õèí3^9â¶ÓêóÃø¶èV÷\ø?YÑ%ãwàËSÝrvÚÚÕöÛß'Þ? BÕm|ê»ÜÆ_¿+1®
çà#¸¿ëó¶Á}8&%Åòüâo L^
ª·u#¼C[ø
>Wc¸Þ«nÃä~Võ¼GC¡y³~[§YpésWµÅUÆÛú1UäËAæ¸Á `©Á ðB#·tÝ84AS®·Y/{z½ÜÍX,KY,¤Éµ&¶&þøY°5.®0þhx}úy`-Är²¿T&´-'±ÉxËÙx¬8ÏÙ`;yÚdJë%©ü|I*§0W¹$ùDÇ)¡Ö/¦]M%@0TÙª°¸Æ&¶§áZöÆñíµÄ$CËÁ×uÂqÇ¢î®24|%Ë"òAÏû(f;AɶÅ.7ê·¸æ§ÚâD·´Åüè𨱽§ëÆþÞ¶8 Å'AÈïQéü¨¿ÇöuðçbØio8ê]RCÿaøÜR5NÞG³TÏ{W«.ø+|4êßã㩱þÌÎ{½û¾=P% cÎå}
põÏÎÝÑ:Tz¸ITÙ ÿ; ×!ûºÄxÖ|ÙõÃôc??gº_OÊ#äHU%©þ äÛý?÷H«ZG|¾ÁArYö/öþ¼»äHÿ¦>Eµæt7(î¢%ÿ(êækmCRf<><E HÖ4Q(zÜ÷³¿ùÄK- HªmϽöiI¨¬¬\"#c}¢ÝnùnÞ½ÿt`VÚüâ¥ßuÀ}æÛ
Aü-rX~¿åÄù»ñõ$Î7È\ô:ª]á#ÁºHèDfÏ~÷Tú4ýsFÎ.ä?(#çìàå#"cìÆýgf$ið½|Ù+]Ø«ÿøÒãÑðwOõ7\AZ{÷\9l±·þ\ñæR_(Ä×TX&ÂYÇI/5Ü·OéÒö8Zê³ß=Õ !éÅj¨bÌ
X\˵ø*NG¿ÉF=Ö1jn¼ES£ûüî«aaÑ 1?ÿeÐ2âP[µHz,pë@6 çÞo³ý²×÷d3µDæ®PY»ßFþÌ]-A®«ÖITB+äH~1ËpvMY ¸§æn<u·ÀÄôY:ðÙû;$Hêl>QG¶EºÑ2Hñ¹Us£7Q"´Q¢"o6
÷:2£a
+Ï,©®¶iÛò¾Èv»À2\ÛÝè0ËÓ^¸2IYéßÌ©I Tk¤?ZxÑçÏí!*PäÇwí.Ý×I|~·fTOóÛQ6ÎÓüÅÃÊñFpÏ2<ÁÙv
·§ïO^0[}ù!Ó#Áb>¨ÚÕ\²3³3Þf¾¸ä§îĹçych.Eû:PZÚF¸P<p
Ý,]oÍx:5DÎf¥{ÉgN~xQÃíQoå½)_'9qäO¼Sü¶÷®
<133g¾9
צÇ[ÍoÓ[vÉGj{×öîöîCwNùªö/fÜÖìUaå¼-zá0yëºZ$j®fúzxDàwN/äHÌüÄß<÷t¥
9éh<Ãâ+Þi«I[´Û!®·»ùãzHð89ÔTþÅùþ¯ä|!Ë«<Ý Î½ÎøÇ^gû_üãüãB{Üæ3%÷êËd¯.¿¶·ÑýÇq£ÏGþÅFþÅFB6²EbÈÞöú¿ØÈ·c#|ÖîÊCì[eÒélrÕÎæv³KÉ{ߨÇ*ß$¹ÌÍíÊ>þNÿ¥ýçOÿýMË,MW´E«ó7ùwÓt
s©¢E¿KñOç·C¢æß=¥Øs.E)#)üÐ.w£ãññþUÓÖ}É»+8ÒG
¾3/ÔÖßÓ¡¾ØVrÅf#øzKéY0`Á²ÀoÞ³i × ¿dJ`¨Ô[^
Wj£À_£kú R¾³ÉðÙ£µßÙ»æÑZøî·7ä¯=õ>WÇä¢ÊI-9!>Ü[»ªT%NM¶;þfUÏ¢iKNÓa:'à«ÓªÝ)Ü)KíÊ·þRPZT:tå
a¥Ts¶ ÿ[Ü9éc AÄ(øºåii²ÙÕâ>+]1En¾ù`µÍ7|v.I
O'ß*æ¦P$[MÞÞ!é®o4»ëÿ ©g`fô0çQî¨(ùÚKÆúÖFØRl}²¯O'Ùè*<cb¢ÈE¶¡¸öI÷#çy°£ò%ù,÷q6{¸lzÁý~Jns¼d¾n{¼-5P^;ÿöö?
?6wÖA¹¥¸¸
e^®±
7)ÔÉSé-j,ãÑܧh¶%×ôÔK&`ØbaËÉSÜ!;,ÈL¢9½½l§ýÃCì¡üY
ÉwåEË=£ Qd£ô/3¤Á×Ë»0ÄZ¶ÓÍÄòÛRZ¿k¦a&lpÆY;t ¦ÎÜùzã^mºâXÃøVõ´;ÑåîîÀNòÉCõPö<§6
ñ!RÂhë<±û0ô`öîÀ©aR5»Ì}9½@Å Xµá2ÂNv·t·ûÍNìy¾7Iáè©cHS{¢"¸ÐJÕ«þñ>