Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) by hub.org (8.8.8/8.8.8) with ESMTP id DAA09197 for ; Mon, 28 Sep 1998 03:59:24 -0400 (EDT) (envelope-from wieck@sapserv.debis.de) Received: by dsh.de; id KAA14687; Mon, 28 Sep 1998 10:01:45 +0200 (MET DST) Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) id xma013495; Mon, 28 Sep 98 09:59:02 +0200 Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id JAA07197 for ; Mon, 28 Sep 1998 09:56:18 +0200 (MET DST) Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id JAA00655 for ; Mon, 28 Sep 1998 09:58:17 +0200 Received: from orion.SAPserv.Hamburg.dsh.de by mars.SAPserv.Hamburg.dsh.de with smtp for <> id m0zNYFw-000B85C; Mon, 28 Sep 98 10:02 MET DST Received: by orion.SAPserv.Hamburg.dsh.de for pgsql-hackers@postgreSQL.org id m0zNYFN-000EBPC; Mon, 28 Sep 98 10:01 MET DST Message-Id: From: jwieck@debis.com (Jan Wieck) Subject: rewrite rules patch To: pgsql-hackers@postgreSQL.org (PostgreSQL HACKERS) Date: Mon, 28 Sep 1998 10:01:28 +0200 (MET DST) Reply-To: jwieck@debis.com (Jan Wieck) X-Mailer: ELM [version 2.4 PL25] Content-Type: text Bruce, this is a partial new rewrite system. Could you please apply the patch? Changes: The order how rules get applied has changed. All non RIR rules are applied first recursively (resulting in parsetree splitting for insert/update/delete rules). All RIR rules are then applied on the list of querytrees managing for view rules. Aggregate columns of views used in a queries qualification are rewritten into sublinks. All RIR rules are also applied on queries other than SELECT. Enhancements: INSERT ... SELECT view ... works now. Views can have at least one aggregate column. The aggregate column of a view can be used in the qualification. But there are some limitations on it. The aggregate column must be on the right side in the qual expression. Views can have computed columns. Example: Let's have two tables table part (part_name char(8), unit char(4), size float); table unit (unit_name char(4), unit_factor float); The parts size is given in different units (cm, inch, ...). The table unit contains factors to compute centimeters from any unit. Now one can setup a view CREATE VIEW part_v1 AS SELECT P.part_name, (P.size * U.unit_factor) AS size_in_cm from part P, unit U where U.unit_name = P.unit; What's next: Make multiple action and non INSTEAD rules on SELECT work. I'll give the some weeks ago mentioned function code to wrap around aggregates in qualification a try. Limitations: The rewrite system is located between the parser and the planner/optimizer. This requires (up to now), that it outputs something the parser could have produced and this implies some limitations to what the rewrite system can do. I don't know much about the planner/optimizer, so I would need some help to improve the rule system more and more for 6.5. Outer joins aren't implemented yet. But SQL functions could be used to get around many of the limitations we currently have. Someone can setup SQL functions that cover aggregates and use them in a view. This view would behave as if we have outer joins (return count(*) of zero) and can have multiple aggregate columns without any grouping. These columns can be used as if they are regular value columns with no limits. Views of UNION and DISTINCT views are another beast. It's not such a big problem to rewrite a simple SELECT into a SELECT UNION or DISTINCT. But I don't know how to apply such a views rule on an INSERT ... SELECT view ... or an UPDATE ... SET col = view.attr WHERE ... Is it possible at all? And what about joins of tables where one is a union? Maybe I don't see the simple solutions because I'm thinking too complex. But all this could be impossible with our implementation of views over rewrite rules. At least we would need to extend the planner to be able to create plans for things that the parser never could produce. Jan -- #======================================================================# # It's easier to get forgiveness for being wrong than for being right. # # Let's break this rule - forgive me. # #======================================== jwieck@debis.com (Jan Wieck) # begin 644 rewrite.diff M9&EF9B`M8W(@2`J<&%RPH@(`E296QA M=&EO;@EE=E]R96P["BTM+2`Q-CDL,32`J<&%RPH@(`E296QA=&EO;@EE=E]R96P["F1I M9F8@+6-R('-R8RYO"P@:6YT(')E;&%T:6]N7VQE=F5L M+`HM(`D)"0D@(%)E;&%T:6]N(')E;&%T:6]N+"!I;G0@*FUO9&EF:65D*3L* M+2!S=&%T:6,@3&ES="`J9FER95)U;&5S*%%U97)Y("IP87)S971R964L(&EN M="!R=%]I;F1E>"P@0VUD5'EP92!E=F5N="P*+2`)"2`@8F]O;"`J:6YS=&5A M9%]F;&%G+"!,:7-T("IL;V-K2`J<&%R2A1=65R>2`J M<&%R2`J4F5W7-C86-H M92YH(@H@("-I;F-L=61E(")U=&EL7-C86-H92YH(@H@("-I;F-L=61E M(")U=&EL7!E+F@B"BL@"BL@"BL@"BL@ M2`J M<&%R"P@:6YT(&%T=&YO+"!I;G0@"P@:6YT M('-U8FQE=F5L'!R("IO2`J<&%R M2`J<&%R2`J<&%R2!L96UM:6YG(&ES(&-O=6YT960@9F]R+@H@("`J M+PHA('-T871I8R!,:7-T("H*(2!OPHA(`D)"6EF("AR=6QE7VQO8VLM/G%U86P@/3T@3E5, M3"D*(2`)"0D):6YS=&5A9%]R=6QEPHA(`E,:7-T"2`@("IN.PH@(`HA M(`EF;W)E86-H*&XL(&%C=&EO;G,I"B$@"7L*(2`)"5%U97)Y"2`@("IP="`] M(&QF:7)S="AN*3L*("`*(2`)"2\J"B$@"0D@*B!I;B!T:&4@;VQD('!O7!E(&ES(&$* M(2`)"2`J(&-O;G-P(&]F("7!E*2X@8G5T('=E)W9E M(&YE=F5R('-U<'!O2`Q,"\Y-"X*(2`)"2`J+PHA(`D):68@*'!T M+3YC;VUM86YD5'EP92`A/2!#341?4T5,14-4*0HA(`D)"7)E='5R;B!F86QS M93L*(2`)?0HA(`ER971U2A1=65R>2`J<&%RPHA(`E,:7-T"2`@("II+`HA(`D)"2`@("IL M;V-KPHA(`D)"0DJ:6YS=&5A M9%]F;&%G(#T@5%)513L*(2`)"0D)%)EPHA(`D) M:68@*&QE;F=T:"AR=6QE+3YA8W1I;VYS*2`^(#$I"2\J(#\_/R!B96-A=7-E M('=E(&1O;B=T(&AA;F1L90HA(`D)"0D)"0D)"0D@*B!R=6QE"P@,"D["B`@"B$@"6EF("AR96QA=&EO;E]L979E M;"D*(2`)>PHA(`D)2&%N9&QE5FEE=U)U;&4H<&%R"P*(2`)"0D)"2`@ M(&UO9&EF:65D*3L*(2`)?0HA(`EE;'-E"B$@"7L*(2`)"4AA;F1L95))4D%T M=')I8G5T95)U;&4H<&%R"P@0HA(`D)("H@=&AE(&9O;&QO=VEN9R!GPHA(`E,:7-T"2`@("IR=#L*(2`)3&ES=`D@("`J M<')O9'5C=%]Q=65R:65S(#T@3DE,.PHA(`EI;G0)"0ER=%]I;F1E>"`](#`[ M"B`@"B`@"B$@"69OPHA(`D)4F%N9V54 M8FQ%;G1R>2`J2`](&QF:7)S="AR="D["BT@"0E296QA=&EO;@ER=%]E;G1R>5]R96QA=&EO M;B`]($Y53$P["BT@"0E2=6QE3&]C:R`@("IR=%]E;G1R>5]L;V-K3H*(2`)"0E["B$@"0D)"51A"P*(2`)"0D)"0ES=6)L979E;'-?=7`I.PHA(`D)"7T*(2`) M"0EBPHA(`D)"0E! M9V=R96<)*F%G9R`]("A!9V=R96<@*BEN;V1E.PH@(`HA(`D)"0ER971U"P*(2`)"0D)"0ES=6)L979E;'-?=7`I.PHA(`D)"7T*(2`)"0EB M'!R.@HA(`D)"7L*(2`)"0D)17AP<@DJ M97AP(#T@*$5X<'(@*BEN;V1E.PH@(`HA(`D)"0ER971U5]U'!R*2P*(2`)"0D)"0ER=%]I;F1E>"P*(2`)"0D)"0ES=6)L979E;'-? M=7`I.PH@(`D)"7T*(2`)"0EB5)E M9CH*(2`)"0E["B$@"0D)"4%R5]U M5]U'!R*2P*(2`)"0D) M"0ER=%]I;F1E>"P*(2`)"0D)"0ES=6)L979E;'-?=7`I*0HA(`D)"0D)5]UPHA(`D)"0E1=65R M>0DJ<7)Y(#T@*%%U97)Y("HI;F]D93L*(2`*(2`)"0D):68@*')A;F=E5&%B M;&5%;G1R>5]U2T^=&%R9V5T3&ES M="DL"B$@"0D)"0D)"P*(2`)"0D)"0ES=6)L979E;'-?=7`I*0HA(`D)"0D)5]U2T^9W)O=7!#;&%U5]U0H@("`J+PHA('-T871I8R!B;V]L"B$@871TPHA(`EI9B`H;F]D92`]/2!.54Q,*0HA(`D)PHA(`D)8V%S92!4 M7U1A2`J*6YO9&4["B`@"B$@"0D)"7)E='5R;B!A='1R:6)U M=&5?=7-E9"@*(2`)"0D)"0DH3F]D92`J*2AT;&4M/F5X<'(I+`HA(`D)"0D) M"7)T7VEN9&5X+`HA(`D)"0D)"6%T=&YO+`HA(`D)"0D)"7-U8FQE=F5LPHA(`D)"0E'PHA(`D)"0E%>'!R"2IE>'`@/2`H17AP'`M/F%R9W,I+`HA(`D)"0D)"7)T7VEN9&5X+`HA(`D) M"0D)"6%T=&YO+`HA(`D)"0D)"7-U8FQE=F5LPHA(`D)"0E)=&5R M"2II=&5R(#T@*$ET97(@*BEN;V1E.PH@(`HA(`D)"0ER971U5)E M9B`J*6YO9&4["B`@"B$@"0D)"6EF("AA='1R:6)U=&5?=7-E9"@*(2`)"0D) M"0DH3F]D92`J*2AR968M/G)E9G5P<&5R:6YD97APPHA(`D)"0E687()*G9A#L*(2`) M"0D)96QS90HA(`D)"0D)PHK(`D)"0E,:7-T"2IL.PHK(`HK(`D)"0EF M;W)E86-H("AL+"`H3&ES="`J*6YO9&4I('L**R`)"0D)"6EF("AA='1R:6)U M=&5?=7-E9"@**R`)"0D)"0D)*$YO9&4@*BEL9FER"P**R`) M"0D)"0EA='1N;RP**R`)"0D)"0ES=6)L979E;'-?=7`I*0HK(`D)"0D)3H**R`)"0E["BL@ M"0D)"5%U97)Y"2IQ"P**R`)"0D)"0EA='1N;RP**R`)"0D) M"0ES=6)L979E;'-?=7`I*0HK(`D)"0D)2T^:&%V M:6YG475A;"DL"BL@"0D)"0D)PHA(`D)"0E487)G M971%;G1R>0DJ=&QE(#T@*%1A'!R("HI;F]D93L*(2`* M(2`)"0D);V9FPHA(`D)"0E)=&5R"2II=&5R(#T@*$ET97(@*BEN;V1E.PHA(`HA(`D)"0EO M9F9S971?=F%R;F]D97,H"B$@"0D)"0D)*$YO9&4@*BDH:71E5)E9CH*(2`) M"0E["B$@"0D)"4%R'!R*2P*(2`)"0D)"0EO M9F9S970L"B$@"0D)"0D)'!R*2P* M(2`)"0D)"0EO9F9S970L"B$@"0D)"0D)PHA(`D)"0E,:7-T"2IL.PHA M(`HA(`D)"0EF;W)E86-H("AL+"`H3&ES="`J*6YO9&4I"B$@"0D)"0EO9F9S M971?=F%R;F]D97,H"B$@"0D)"0D)"2A.;V1E("HI;&9IPHA(`D) M"0E3=6),:6YK"2IS=6(@/2`H4W5B3&EN:R`J*6YO9&4["B$@"B$@"0D)"6]F M9G-E=%]V87)N;V1E2`]("A1=65R>2`J*6YO9&4[ M"B$@"B$@"0D)"6]F9G-E=%]V87)N;V1E2T^:&%V:6YG475A;"DL"B$@"0D)"0D);V9F"P@:6YT(&YE=U]I;F1E>"P@:6YT('-U8FQE=F5LPHA(`D)"0E487)G971%;G1R>0DJ=&QE(#T@*%1A'!R("HI;F]D93L*(2`*(2`)"0D)8VAA;F=E7W9A MPHA(`D)"0E)=&5R"2II=&5R(#T@*$ET97(@*BEN;V1E.PHA(`HA M(`D)"0EC:&%N9V5?=F%R;F]D97,H"B$@"0D)"0D)*$YO9&4@*BDH:71E"P*(2`)"0D)"0ES=6)L979E;'-?=7`I.PHA(`D)"7T*(2`)"0EB5)E9CH*(2`)"0E["B$@"0D)"4%R"P*(2`)"0D) M"0ES=6)L979E;'-?=7`I.PHA(`D)"0EC:&%N9V5?=F%R;F]D97,H"B$@"0D) M"0D)*$YO9&4@*BDH"P*(2`)"0D)"0ES=6)L979E;'-? M=7`I.PHA(`D)"0EC:&%N9V5?=F%R;F]D97,H"B$@"0D)"0D)*$YO9&4@*BDH M'!R*2P*(2`)"0D)"0ER=%]I;F1E>"P*(2`)"0D)"0EN97=? M:6YD97@L"B$@"0D)"0D)'!R*2P* M(2`)"0D)"0ER=%]I;F1E>"P*(2`)"0D)"0EN97=?:6YD97@L"B$@"0D)"0D) M"D@>PHA(`D)"0D) M=F%R+3YV87)N;R`](&YE=U]I;F1E>#L*(2`)"0D)"79APHA(`D)"0E3=6),:6YK M"2IS=6(@/2`H4W5B3&EN:R`J*6YO9&4["B$@"B$@"0D)"6-H86YG95]V87)N M;V1E"P*(2`)"0D)"0EN97=?:6YD97@L"B$@"0D)"0D)"P*(2`) M"0D)"0EN97=?:6YD97@L"B$@"0D)"0D)2`]("A1=65R>2`J*6YO9&4["B$@"B$@"0D)"6-H M86YG95]V87)N;V1E"P*(2`) M"0D)"0ES=6)L979E;'-?=7`I.PHA(`HA(`D)"0EC:&%N9V5?=F%R;F]D97,H M"B$@"0D)"0D)*$YO9&4@*BDH<7)Y+3YQ=6%L*2P*(2`)"0D)"0ER=%]I;F1E M>"P*(2`)"0D)"0EN97=?:6YD97@L"B$@"0D)"0D)2T^:&%V:6YG475A;"DL"B$@"0D)"0D)"P*(2`)"0D)"0EN97=?:6YD97@L"B$@"0D) M"0D)3H*(2`)"0E["B$@"0D)"51APHA(`D)"0E!9V=R96<)*F%G M9R`]("A!9V=R96<@*BEN;V1E.PHA(`HA(`D)"0EM;V1I9GE!9V=R96=5<&QE M=F5L*`HA(`D)"0D)"2A.;V1E("HI*&%G9RT^=&%R9V5T*2D["B$@"0D)?0HA M(`D)"6)R96%K.PHA(`HA(`D)8V%S92!47T5X<'(Z"B$@"0D)>PHA(`D)"0E% M>'!R"2IE>'`@/2`H17AP4%G9W)E M9U5P;&5V96PH"B$@"0D)"0D)*$YO9&4@*BDH97AP+3YAPHA(`D) M"0E)=&5R"2II=&5R(#T@*$ET97(@*BEN;V1E.PHA(`HA(`D)"0EM;V1I9GE! M9V=R96=5<&QE=F5L*`HA(`D)"0D)"2A.;V1E("HI*&ET97(M/FET97)E>'!R M*2D["B$@"0D)?0HA(`D)"6)R96%K.PHA(`HA(`D)8V%S92!47T%R5)E9B`J*6YO M9&4["B$@"B$@"0D)"6UO9&EF>4%G9W)E9U5P;&5V96PH"B$@"0D)"0D)*$YO M9&4@*BDH'!R*2D["B$@ M"0D)?0HA(`D)"6)R96%K.PHA(`HA(`D)8V%S92!47U9A4%G9W)E9U5P;&5V96PH"B$@"0D)"0D)"2A.;V1E("HI;&9I4%G9W)E9U5P M;&5V96PH"B$@"0D)"0D)*$YO9&4@*BDH4%G9W)E9U5P;&5V96PH"B$@"0D)"0D)*$YO9&4@*BDHPHA(`D)"0E1=65R>0DJ<7)Y(#T@*%%U97)Y("HI;F]D M93L*(2`*(2`)"0D);6]D:69Y06=G"P@:6YT(&YE=U]I;F1E>"P@:6YT('-U8FQE=F5L3H*(2`)"0E["B$@"0D)"51A"P*(2`)"0D)"0EN97=?:6YD97@L M"B$@"0D)"0D)"P*(2`)"0D)"0EN97=?:6YD97@L"B$@"0D)"0D) MPHA(`D)"0E'2DI+`HA(`D)"0D)"7)T7VEN9&5X+`HA(`D)"0D)"6YE=U]I;F1E>"P*(2`) M"0D)"0ES=6)L979E;'-?=7`I.PHA(`D)"7T*(2`)"0EB'!R.@HA(`D)"7L*(2`)"0D)17AP<@DJ97AP(#T@*$5X<'(@ M*BEN;V1E.PHA(`HA(`D)"0EM;V1I9GE!9V=R96=#:&%N9V5687)N;V1E'`M/F%R9W,I*2P*(2`)"0D)"0ER=%]I M;F1E>"P*(2`)"0D)"0EN97=?:6YD97@L"B$@"0D)"0D)4%G9W)E9T-H86YG959A'!R*2DL"B$@"0D)"0D)5)E9B`J*6YO9&4["B$@"B$@"0D) M"6UO9&EF>4%G9W)E9T-H86YG959A'!R*2DL"B$@"0D)"0D)4%G9W)E9T-H86YG959A'!R*2DL"B$@"0D)"0D)4%G9W)E9T-H86YG959A"P*(2`)"0D)"0ES=6)L979E;'-?=7`I.PHA(`D) M"0EM;V1I9GE!9V=R96=#:&%N9V5687)N;V1E"P*(2`)"0D)"0ES=6)L979E;'-?=7`I.PHA(`D) M"7T*(2`)"0EBPHA(`D) M"0E687()*G9A#L*(2`)"0D)"79A"P*(2`)"0D)"0D)"P* M(2`)"0D)"0ES=6)L979E;'-?=7`I.PHA(`HA(`D)"0EM;V1I9GE!9V=R96=# M:&%N9V5687)N;V1E"P*(2`)"0D)"0EN97=?:6YD97@L"B$@"0D) M"0D)"P*(2`)"0D)"0EN97=?:6YD97@L"B$@"0D) M"0D)2`]("A1 M=65R>2`J*6YO9&4["B$@"B$@"0D)"6UO9&EF>4%G9W)E9T-H86YG959A2T^=&%R9V5T3&ES="DI+`HA M(`D)"0D)"7)T7VEN9&5X+`HA(`D)"0D)"6YE=U]I;F1E>"P*(2`)"0D)"0ES M=6)L979E;'-?=7`I.PHA(`HA(`D)"0EM;V1I9GE!9V=R96=#:&%N9V5687)N M;V1E"P*(2`)"0D)"0EN97=?:6YD97@L"B$@"0D)"0D)4%G9W)E9T-H86YG959A2T^9W)O=7!#;&%U"P*(2`)"0D)"0EN97=?:6YD97@L"B$@"0D)"0D)'!R*0HA('L*(2`) M3F]D90DJ;F]D92`]("IN;V1E4'1R.PHA(`HA(`EI9B`H;F]D92`]/2!.54Q, M*0HA(`D)PHA M(`D)8V%S92!47U9APHA(`D)"0E!9V=R96<)*F%G9R`]("A!9V=R96<@*BEN;V1E M.PHA(`D)"0E!9V=R96<)*F]A9V<@/2`H06=G4%G9W)E9T1R;W!1=6%L*`HA(`D)"0D)"2A.;V1E("HJ M*2@F*&%G9RT^=&%R9V5T*2DL"B$@"0D)"0D)*$YO9&4@*BDH;V%G9RT^=&%R M9V5T*2P*(2`)"0D)"0EE>'!R*3L*(2`)"0E]"B$@"0D)8G)E86L["B$@"B$@ M"0EC87-E(%1?4&%R86TZ"B$@"0D)8G)E86L["B$@"B$@"0EC87-E(%1?0V]N M'!R("HI;F]D93L*(2`)"0D)17AP<@DJ;W)I M9U]E>'!R(#T@*$5X<'(@*BEO'!R*2!["B$@"0D)"0E#;VYS=`DJ8W1R=64["B$@"B$@"0D) M"0EI9B`H97AP79A M;"`](%12544["B$@"B$@"0D)"0DJ;F]D95!T'!R+3YA'!R+3YA'!R M*3L*(2`)"0E]"B$@"0D)8G)E86L["B$@"B$@"0EC87-E(%1?271E5)E9CH*(2`)"0E["B$@"0D)"4%R5)E9@DJ;W)E9B`]("A!5)E M9B`J*6]R:6=N;V1E.PHA(`HA(`D)"0EM;V1I9GE!9V=R96=$4%G9W)E9T1R;W!1=6%L*`HA(`D)"0D) M"2A.;V1E("HJ*2@F*')E9BT^'!R*2DL"B$@"0D)"0D) M*$YO9&4@*BDH;W)E9BT^'!R*2P*(2`)"0D)"0EE>'!R M*3L*(2`)"0D);6]D:69Y06=G'!R*2DL"B$@"0D)"0D)*$YO9&4@*BDH;W)E9BT^ M4%G9W)E9T1R M;W!1=6%L*`HA(`D)"0D)"2A.;V1E("HJ*2@F*')E9BT^'!R M*2DL"B$@"0D)"0D)*$YO9&4@*BDH;W)E9BT^'!R*2P*(2`) M"0D)"0EE>'!R*3L*(2`)"0E]"B$@"0D)8G)E86L["B$@"B$@"0EC87-E(%1? M3&ES=#H*(2`)"0E["B$@"0D)"4QI3H*(2`) M"0E["B$@"0D)"5%U97)Y"2IQ0DJ;W%R>2`]("A1=65R>2`J*6]R:6=N;V1E.PHA(`HA(`D)"0EM;V1I M9GE!9V=R96=$'!R*3L*(2`*(2`)"0D);6]D:69Y06=G2T^:&%V:6YG475A;"DL"B$@"0D)"0D)97AP4]B:F5C="AO6]P(#T@,#L*(2`)4]B:F5C="AP87)S971R964M/G%U86PI.PHA(`EM;V1I9GE!9V=R96=$'`I.PHA(`HA(`ES=6)L:6YK(#T@;6%K94YO9&4H4W5B3&EN M:RD["B$@"7-U8FQI;FLM/G-U8DQI;FM4>7!E"3T@15A04E]354),24Y+.PHA M(`ES=6)L:6YK+3YU4]B:F5C="AL9FER0D)/2!M86ME3F]D92A1=65R>2D["B$@"7-U8FQI;FLM/G-U M8G-E;&5C=`D]("A.;V1E("HI2T^=71I;&ET M>5-T;70)"3T@3E5,3#L*(2`)2T^=6YI;VYA;&P)"3T@1D%,4T4["B$@"7-U8G%U M97)Y+3YU;FEQ=65&;&%G"0D]($Y53$P["B$@"7-U8G%U97)Y+3YS;W)T0VQA M=7-E"0D]($Y53$P["B$@"7-U8G%U97)Y+3YR=&%B;&4)"3T@;&%P<&5N9"A. M24PL(')T92D["B$@"7-U8G%U97)Y+3YT87)G971,:7-T"0D](&QA<'!E;F0H M3DE,+"!T;&4I.PHA(`ES=6)Q=65R>2T^<75A;`D)"3T@2T^=6YI;VY#;&%U'!R97-S:6]NPHA(`D)"0E''!R("HI;F]D93L* M(2`)"0D)4W5B3&EN:PDJPHA(`D)"0D);6]D:69Y06=G'`M/F%R9W,I*2P*(2`)"0D)"0EP87)S971R M964I.PHA(`D)"0D)8G)E86L["B$@"0D)"7T*(2`*(2`)"0D):68@*&YO9&54 M86'`M/F%R9W,I*2`A/2!47T%G9W)E9RD@>PHA(`HA M(`D)"0D);6]D:69Y06=G'`M/F%R9W,I*2P*(2`)"0D)"0EP87)S971R964I.PHA(`D)"0D)8G)E86L[ M"B$@"0D)"7T*(2`*(2`)"0D)5)E9B`J*6YO9&4["B$@"B$@"0D) M"6UO9&EF>4%G9W)E9U%U86PH"B$@"0D)"0D)*$YO9&4@*BHI*"8H'!R*2DL"B$@"0D)"0D)<&%R'!R*2DL M"B$@"0D)"0D)<&%R4%G9W)E M9U%U86PH"B$@"0D)"0D)"2A.;V1E("HJ*2@F*&QF:7)S="AL*2DI+`HA(`D) M"0D)"0EP87)S971R964I.PHA(`D)"7T*(2`)"0EB2`] M("A1=65R>2`J*6YO9&4["B$@"B$@"0D)"6UO9&EF>4%G9W)E9U%U86PH"B$@ M"0D)"0D)*$YO9&4@*BHI*"8H<7)Y+3YQ=6%L*2DL"B$@"0D)"0D)<&%R4%G9W)E M9U%U86PH*2(L(&YO9&5486PHA(`E,:7-T"2`@("II.PHA(`HA(`EF;W)E86-H*&DL('1L:7-T*0HA M(`E["B$@"0E487)G971%;G1R>2`J=&QE(#T@;&9I7!E*0HA('L*(2`)0V]N7!E*3L*(2`)8RT^8V]N5]225)? M=FEE=RA.;V1E("HJ;F]D95!TPHA(`D)8V%S92!47U1A2`J*6YO M9&4["B$@"B$@"0D)"6%P<&QY7U))4E]V:65W*`HA(`D)"0D)"2A.;V1E("HJ M*2@F*'1L92T^97APPHA(`D)"0E!9V=R96<)*F%G9R`]("A!9V=R96<@ M*BEN;V1E.PHA(`HA(`D)"0EA<'!L>5]225)?=FEE=R@*(2`)"0D)"0DH3F]D M92`J*BDH)BAA9V5]2 M25)?=FEE=R@*(2`)"0D)"0DH3F]D92`J*BDH)BAGPHA(`D) M"0E%>'!R"2IE>'`@/2`H17AP"P*(2`)"0D)"0ER=&4L"B$@"0D)"0D)=&QIPHA(`D)"0E!5)E9@DJ"P*(2`)"0D) M"0ER=&4L"B$@"0D)"0D)=&QI"P*(2`)"0D)"0ER=&4L"B$@"0D)"0D)=&QI'!R M*2DL"B$@"0D)"0D)'!R*2DL"B$@"0D)"0D)'`["B$@"B$@"0D)"0EE>'`@/2!&:6YD36%T8VAI;F=43$5N M=')Y*`HA(`D)"0D)"0ET;&ES="P*(2`)"0D)"0D)9V5T7V%T=&YA;64H'`@/3T@3E5,3"D@>PHA(`D)"0D)"2IN;V1E4'1R(#T@;6%K95]N M=6QL*'9APHA(`D)"0D)"65X<"`](&-O<'E/ M8FIE8W0H97AP*3L*(2`)"0D)"0DH*%9A"P*(2`)"0D)"0D)PHA(`D) M"0E3=6),:6YK"2IS=6(@/2`H4W5B3&EN:R`J*6YO9&4["B$@"B$@"0D)"6%P M<&QY7U))4E]V:65W*`HA(`D)"0D)"2A.;V1E("HJ*2@F*'-U8BT^;&5F=&AA M;F0I*2P*(2`)"0D)"0ER=%]I;F1E>"P*(2`)"0D)"0ER=&4L"B$@"0D)"0D) M=&QI"P*(2`)"0D) M"0ER=&4L"B$@"0D)"0D)=&QI2`]("A1 M=65R>2`J*6YO9&4["B$@"B$@"0D)"6%P<&QY7U))4E]V:65W*`HA(`D)"0D) M"2A.;V1E("HJ*2@F*'%R>2T^=&%R9V5T3&ES="DI+`HA(`D)"0D)"7)T7VEN M9&5X+`HA(`D)"0D)"7)T92P*(2`)"0D)"0ET;&ES="P*(2`)"0D)"0EM;V1I M9FEE9"P*(2`)"0D)"0ES=6)L979E;'-?=7`I.PHA(`HA(`D)"0EA<'!L>5]2 M25)?=FEE=R@*(2`)"0D)"0DH3F]D92`J*BDH)BAQ"P*(2`)"0D)"0ER=&4L"B$@"0D)"0D)=&QI2T^9W)O=7!#;&%U"P*(2`)"0D)"0ER=&4L"B$@"0D)"0D)=&QI5]225)?=FEE=R@I(BP@;F]D951A9RAN;V1E M*2D["B$@"0D)96QO9RA.3U1)0T4L(").;V1E(&ES.B`E5)E=')I979E4G5L92A1=65R>2`J<&%R MPHA(`D@($AA;F1L95))4D%T M=')I8G5T95)U;&4H<&%RPHA(`D@($%D9%%U86PH<&%RPHA(`D)"0E487)G971%;G1R>0DJ=&QE(#T@*%1APHA(`D)"0E!9V=R96<) M*F%G9R`]("A!9V=R96<@*BEN;V1E.PHA(`HA(`D)"0EF:7)E4DE2;VY3=6)S M96QE8W0H"B$@"0D)"0D)*$YO9&4@*BDH86=G+3YT87)G970I*3L*(2`)"0E] M"B$@"0D)8G)E86L["B$@"B$@"0EC87-E(%1?1W)O=7!#;&%UPHA(`D)"0E''!R("HI M;F]D93L*(2`*(2`)"0D)9FER95))4F]N4W5B'!R*2D["B$@"0D)?0HA(`D)"6)R96%K M.PHA(`HA(`D)8V%S92!47T%R5)E9B`J*6YO9&4["B$@"B$@"0D)"69IPHA(`D)"0E,:7-T"2IL.PHA(`HA M(`D)"0EF;W)E86-H("AL+"`H3&ES="`J*6YO9&4I"B$@"0D)"0EF:7)E4DE2 M;VY3=6)S96QE8W0H"B$@"0D)"0D)"2A.;V1E("HI*&QF:7)S="AL*2DI.PHA M(`D)"7T*(2`)"0EB0DJ<7)Y.PHA(`HA(`D)"0EF:7)E4DE2;VY3=6)S96QE8W0H"B$@ M"0D)"0D)*$YO9&4@*BDH2D["B$@"B$@"0D)"7-U8BT^3H*(2`)"0E[ M"B$@"0D)"5%U97)Y"2IQ2T^:&%V:6YG475A;"DI.PHA M(`HA(`D)"0EF:7)E4DE2;VY3=6)S96QE8W0H"B$@"0D)"0D)*$YO9&4@*BDH M<7)Y+3YG#L*(2`)4F%N9V548FQ%;G1R>0DJ M3L*(2`):6YT"0EM;V1I9FEE9#L*(2`):6YT"0EI.PHA M(`E,:7-T"0DJ;#L*(2`*(2`)"`\(&QE;F=T:"AP87)S971R964M/G)T86)L92DI('L*(2`)"2LK5]U"P@,"DI"B$@"0D)8V]N=&EN=64["B$@ M"0D*(2`)"7)T92`](&YT:"AR=%]I;F1E>"`M(#$L('!APHA(`D)"7)U;&4@/2!R=6QEPHA(`D)"7)U;&4@/2!L9FER2YE=F5N=`D](')U;&4M/F5V96YT.PHA(`D)"5))4F]N M;'DN871T2YA8W1I;VYS"3T@5)E=')I979E4G5L92AP87)S971R964L"B$@ M"0D)"0DF4DE2;VYL>2P*(2`)"0D)"7)T7VEN9&5X+`HA(`D)"0D)4DE2;VYL M>2YA='1R;F\@/3T@+3$L"B$@"0D)"0ER96PL"B$@"0D)"0DF;6]D:69I960I M.PH@(`D)?0HA(`HA(`D):&5A<%]C;&]S92AR96PI.PHA(`E]"B$@"B$@"69I M2`J"B`@0V]P>4%N9$%D9%%U86PH475E2AP87)S971R964L"B$@"0D) M"0D)"2!P87)S971R964M/G)T86)L92P*(2`)"0D)"0D)(&ENPHA(`D)PHM(`DO*B`M+2TM+2TM+2TM"BT@"2`J(&EF('1H92!Q=65R M>2!H87,@82!R97-U;'1296QA=&EO;BP@2X*+2`)("H@+2TM+2TM+2TM+0HM(`D@ M*B\*+2`):68@*'!APHM(`D)"71L92`]("A487)G971%;G1R>2`J*2!L9FER2!F:7)E9"!I;B!B>0HM("`J"71H92!R97=R:71E('-Y2`J<&%R2`](&QF:7)S="AR="D["BT@"0E296QA M=&EO;@ER=%]E;G1R>5]R96QA=&EO;B`]($Y53$P["BT@"0E2=6QE3&]C:R`@ M("IR=%]E;G1R>5]L;V-K"LK.PHM(`D)PHM(`D)"69OPHM(`D)"0ER=6QE(#T@*%)E=W)I=&52=6QE M("HI(&QF:7)S="AL;V-K*3L*+2`)"0D):68@*')U;&4M/FES26YS=&5A9"D* M+2`)"0D)"6EN5]R96QA=&EO;BD[ M"BT@"7T*+2`*+2`)PH@(`E#;614>7!E"0EE M=F5N=#L*(2`)3&ES=`D@("`)*G!R;V1U8W1?<75E&5C=71E9`HK(`D@*B\**R`) M:68@*&5V96YT(#T]($--1%]314Q%0U0I"BL@"0ER971U5]R M96QA=&EO;B`](&AE87!?;W!E;G(H5]R96QA=&EO;BT^PHA M(`D)"4QI2`J M*2!L9FER0D@ M("`J;W1H97(["B`@"B$@"0DO*@HA(`D)("H@07!P;'E2971R:65V95)U;&4@ M8VAA;F=E0H@("`J(&-A;B!B92!R97=R:71T96XN M($1E=&5C=&EN9R!C>6-L97,@:7,@;&5F="!F;W(@=&AE(')E861E&-E2`](')T7V9E=&-H*')E5]R96QA=&EO;B`](&AE87!?;W!E;G(H M5]L;V-K5)E=W)I=&4@2!R971U0HM("`J"2`@<75E2`J<&%R2AP87)S971R964I.PHM(`HM(`E1=65R>5)E=W)I=&53 M=6),:6YK*'!A5)E=W)I=&53=6), M:6YK*$YO9&4@*FYO9&4I"BT@>PHM(`EI9B`H;F]D92`]/2!.54Q,*0HM(`D) M3H*+2`)"0EB5)E=W)I=&53=6),:6YK*"A.;V1E("HI(&5X<'(M/F%R9W,I.PHM(`D) M"7T*+2`)"0EB0D@("`J<75E M5)E=W)I=&53=6),:6YK*"A. M;V1E("HI('%U97)Y+3YQ=6%L*3L*+2`*+2`)"0D)475E2T^:&%V:6YG475A;"D["BT@"BT@"0D)"7)E M="`](%%U97)Y4F5W2D["BT@"0D)"6EF("@A'0H2`J<&%R2`J<&%R M7-T96T* M*R`@*@ED97!E;F1S(&]N"BL@("H@+2TM+2TM+2TM+0HK("`J+PHK('-T871I M8R!V;VED"BL@4F5W2A1=65R>2`J<&%R$YE=R@I(&1E<&5N9',@ M;VX@:70@=VAE;B!R97!L86-I;F<**R`)("H@*FYE=RH@'!R97-S:6]NPHK M(`D)4F%N9V548FQ%;G1R>2`J2!R97=R:71E('-Y2`J<&%R0D)*G%U97)Y.PHK(`HK(`DO*@HK(`D@*B!3 M=&5P(#$**R`)("H**R`)("H@5&AE2AP87)S971R964I.PHK(`HK(`DO*@HK(`D@*B!3=&5P(#(**R`) M("H**R`)("H@07!P;'D@86QL(&YO;BU314Q%0U0@2!A;&P@=&AE(%))4B!R=6QE6QIPHK(`D)"0E)=&5R"2`@ M("II=&5R(#T@*$ET97(@*BD@;F]D93L**R`**R`)"0D)3V9F5)E9B`J*2!N;V1E.PHK(`HK(`D) M"0E/9F9S971687).;V1E'!R+3YA5)E9B`J*2!N;V1E.PHK(`HK(`D)"0E#:&%N9V5687).;V1E'!R+"!O;&1?=F%R;F\L(&YE=U]V87)N M;RP@'!R+"!O;&1?=F%R;F\L(&YE=U]V87)N;RP@PH@(`D)"0E687()"2`@("IV87(@/2`H5F%R("HI(&YO9&4["BHJ*BHJ*BHJ M*BHJ*BHJ*@HJ*BH@,S4S+#,U."`J*BHJ"BTM+2`S.#'!R*2DL"BL@"0D)"0D@("!S=6)L979E;'-?=7`I.PHK M(`D)"6)R96%K.PHK(`D)8V%S92!47T%R5)E9B`J M*2!N;V1E*2T^PHK(`D)"0E!5)E9@D@("`J'!R*2DL(')T86)L M92P**R`)"0D)"0D)"0D)("`@=&%R9V5T;&ES="P@'!R*2DL(')T86)L M92P**R`)"0D)"0D)"0D)("`@=&%R9V5T;&ES="P@"P@ M871T'!R("HI(&YO9&4["B`@"B`@"0D)"6YO9&5(86YD;&56 M:65W4G5L92@H3F]D92`J*BD@*"8H97APPHK(`D)"0E!5)E9@D@("`J'!R*2DL"B`@"0D)"0D)"0D@("!R=&%B;&4L('1A"P@;6]D:69I960L('-U8FQE=F5L'1E7!E(&5V96YT+"!2=6QE3&]C:R`J2`J<&%R'1E2!8+F$L(%@N8CL**R!1545263H@8W)E871E(&9U;F-T:6]N(')T M97-T7W9I97=F=6YC,2AI;G0T*2!R971U'0L"BL@"75N:70)8VAA2!S:7IE7VEN7V-M('5S:6YG(#X["BL@<&%R='QS M:7IE7VEN7V-M"BL@+2TM+2LM+2TM+2TM+2TM"BL@<#$@('P@("`@("`@-3`P M"BL@<#(@('P@("`@("`@,S`P"BL@<#4@('P@("`@(#$W+C'0L('8@8F]O M;"D["BL@8W)E871E('1A8FQE(')T97-T7W9I97'0I.PHK(&-R M96%T92!T86)L92!R=&5S=%]V:65W-"`H82!I;G0T+"!B('1E>'0L(&,@:6YT M-"D["BL@8W)E871E('9I97<@F4@*B!9+F9A8W1O2!S:7IE7VEN7V-M('5S:6YG(#X["@`` ` end