From: Konstantin Osipov Date: October 21 2010 7:24pm Subject: bzr commit into mysql-5.5-runtime branch (kostja:3173) Bug#54673 List-Archive: http://lists.mysql.com/commits/121564 X-Bug: 54673 Message-Id: <20101021192424.04C781E6056@ibbur.local> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0973455425==" --===============0973455425== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///opt/local/work/5.5-rt-stage/ based on revid:dmitry.lenev@stripped 3173 Konstantin Osipov 2010-10-21 Update comments (Bug#54673, code review) modified: mysql-test/include/check_ftwrl_compatible.inc mysql-test/include/check_ftwrl_incompatible.inc mysql-test/r/flush_read_lock.result mysql-test/t/flush_read_lock.test === modified file 'mysql-test/include/check_ftwrl_compatible.inc' --- a/mysql-test/include/check_ftwrl_compatible.inc 2010-10-21 07:23:30 +0000 +++ b/mysql-test/include/check_ftwrl_compatible.inc 2010-10-21 19:24:20 +0000 @@ -5,10 +5,13 @@ # PARAMETERS # $con_aux1 Name of the 1st aux connection to be used by this script. # $con_aux2 Name of the 2nd aux connection to be used by this script. -# $statement Statement to be checked. -# $cleanup_stmt Statement to be run in order to revert effects of -# statement to be checked. -# $skip_3rd_chk Skip the 3rd stage of checking. +# $statement The statement to be checked. +# $cleanup_stmt The statement to be run in order to revert effects of +# the statement to be checked. +# $skip_3rd_chk Skip the 3rd stage of checking. The purpose of the third +# stage is to check that metadata locks taken by this +# statement are compatible with metadata locks taken +# by FTWRL. # # EXAMPLE # flush_read_lock.test === modified file 'mysql-test/include/check_ftwrl_incompatible.inc' --- a/mysql-test/include/check_ftwrl_incompatible.inc 2010-10-21 07:23:30 +0000 +++ b/mysql-test/include/check_ftwrl_incompatible.inc 2010-10-21 19:24:20 +0000 @@ -5,12 +5,15 @@ # PARAMETERS # $con_aux1 Name of the 1st aux connection to be used by this script. # $con_aux2 Name of the 2nd aux connection to be used by this script. -# $statement Statement to be checked. +# $statement The statement to be checked. # $cleanup_stmt1 The 1st statement to be run in order to revert effects # of statement to be checked. # $cleanup_stmt2 The 2nd statement to be run in order to revert effects # of statement to be checked. -# $skip_3rd_chk Skip the 3rd stage of checking. +# $skip_3rd_chk Skip the 3rd stage of checking. The purpose of the third +# stage is to check that metadata locks taken by this +# statement are incompatible with metadata locks taken +# by FTWRL. # # EXAMPLE # flush_read_lock.test @@ -96,8 +99,8 @@ if (`SELECT "$cleanup_stmt2" <> ""`) if (`SELECT "$skip_3rd_check" = ""`) { # -# Finally, let us check that FTWRL will succeed if this statement -# is active but has already closed its tables. +# Finally, let us check that FTWRL will not succeed if this +# statement is active but has already closed its tables. # connection default; --eval set debug_sync='execute_command_after_close_tables SIGNAL parked WAIT_FOR go'; === modified file 'mysql-test/r/flush_read_lock.result' --- a/mysql-test/r/flush_read_lock.result 2010-10-21 05:43:57 +0000 +++ b/mysql-test/r/flush_read_lock.result 2010-10-21 19:24:20 +0000 @@ -1,8 +1,55 @@ -# Use MyISAM engine for the most of test tables -# in order to avoid implicit commit affecting -# tests for DDL statements. +# FTWRL takes two global metadata locks -- a global shared +# metadata lock and the commit blocker lock. +# The first lock prevents DDL from taking place. +# Let's say that all DDL statements that take metadata +# locks form class #1 -- incompatible with FTWRL because +# take incompatible MDL table locks. +# The first global lock doesn't, however, prevent standalone +# COMMITs (or implicit COMMITs) from taking place, since a +# COMMIT doesn't take table locks. It doesn't prevent +# DDL on temporary tables either, since they don't +# take any table locks either. +# Most DDL statements do not perform an implicit commit +# if operate on a temporary table. Examples are CREATE +# TEMPORARY TABLE and DROP TEMPORARY TABLE. +# Thus, these DDL statements can go through in presence +# of FTWRL. This is class #2 -- compatible because +# do not take incompatible MDL locks and do not issue +# implicit commit.. +# (Although these operations do not commit, their effects +# cannot be rolled back either.) +# ALTER TABLE, ANALYZE, OPTIMIZE and some others always +# issue an implicit commit, even if its argument is a +# temporary table. +# *Howewer* an implicit commit is a no-op if all engines +# used since the start of transactiona are non- +# transactional. Thus, for non-transactional engines, +# these operations are not blocked by FTWRL. +# This is class #3 -- compatible because do not take +# MDL table locks and are non-transactional. +# On the contrary, for transactional engines, there +# is always a commit, regardless of whether a table +# is temporary or not. Thus, for example, ALTER TABLE +# for a transactional engine will wait for FTWRL, +# even if the subject table is temporary. +# Thus ALTER TABLE is incompatible +# with FTWRL. This is class #4 -- incompatible +# becuase issue implicit COMMIT which is not a no-op. +# Finally, there are administrative statements (such as +# RESET SLAVE) that do not take any locks and do not +# issue COMMIT. +# This is class #5. +# The goal of this coverage is to test statements +# of all classes. +# @todo: documents the effects of @@autocommit, +# DML and temporary transactional tables. +# Use MyISAM engine for the most of the tables +# used in this test in order to be able to +# check that DDL statements on temporary tables +# are compatible with FTRWL. drop tables if exists t1_base, t2_base, t3_trans; drop database if exists mysqltest1; +# We're going to test ALTER DATABASE UPGRADE drop database if exists `#mysql50#mysqltest-2`; drop procedure if exists p1; drop function if exists f1; @@ -54,7 +101,7 @@ Success: Was not able to run 'alter tabl Success: 'alter table t1_base add column c1 int' is blocked by FTWRL active in another connection. Success: FTWRL is blocked when 'alter table t1_base add column c1 int' is active in another connection. # -# 1.1.b) For temporaty table should be compatible with FTWRL. +# 1.1.b) For a temporary table should be compatible with FTWRL. # Success: Was able to run 'alter table t1_temp add column c1 int' under FTWRL. Success: Was able to run 'alter table t1_temp add column c1 int' with FTWRL active in another connection. @@ -98,10 +145,12 @@ Success: 'alter event e1 comment 'test'' Success: FTWRL is blocked when 'alter event e1 comment 'test'' is active in another connection. # # 1.x) The rest of ALTER statements are too special to -# to be tested here. +# be tested here. # # # 2) ANALYZE TABLE statement is compatible with FTWRL. +# See Bug#43336 ANALYZE and OPTIMIZE do not honour +# --read-only for a discussion why. # Success: Was able to run 'analyze table t1_base' under FTWRL. Success: Was able to run 'analyze table t1_base' with FTWRL active in another connection. @@ -128,8 +177,9 @@ rollback; # Similarly to ROLLBACK it is a no-op in this situation. commit; unlock tables; -# Check that BEGIN/ROLLBACK are not and COMMIT is -# blocked by active FTWRL in another connection +# Check that BEGIN/ROLLBACK are not blocked and +# COMMIT is blocked by active FTWRL in another +# connection. # # Switching to connection 'con1'. flush tables with read lock; @@ -207,18 +257,18 @@ MfmqTBcBAAAAIgAAAP8AAAAAACgAAAAAAAEAAf/+ '' is blocked by FTWRL active in another connection. # # 5) CALL statement. This statement uses resources in two -# ways through expressions used as parameters and through +# ways: through expressions used as parameters and through # sub-statements. This test covers only usage through # parameters as sub-statements do locking individually. # -# 5.a) In simple case parameter expression should be compatible -# with FTWRL. +# 5.a) In simple cases a parameter expression should be +# compatible with FTWRL. # Skip last part of compatibility testing as this statement # releases metadata locks in non-standard place. Success: Was able to run 'call p2((select count(*) from t1_base))' under FTWRL. Success: Was able to run 'call p2((select count(*) from t1_base))' with FTWRL active in another connection. # -# 5.b) In case when expression uses function which updates +# 5.b) In case when an expression uses function which updates # base tables CALL should be incompatible with FTWRL. # # Skip last part of compatibility testing as this statement @@ -282,12 +332,12 @@ Success: Was able to run 'create tempora Success: Was able to run FTWRL while 'create temporary table t3_temp select 1 as i' was active in another connection. # 8.2) CREATE INDEX statement. # -# 8.2.a) CREATE TABLE is incompatible with FTWRL when +# 8.2.a) CREATE INDEX is incompatible with FTWRL when # applied to base table. Success: Was not able to run 'create index i on t1_base (i)' under FTWRL. Success: 'create index i on t1_base (i)' is blocked by FTWRL active in another connection. Success: FTWRL is blocked when 'create index i on t1_base (i)' is active in another connection. -# 8.2.b) CREATE TABLE is compatible with FTWRL when +# 8.2.b) CREATE INDEX is compatible with FTWRL when # applied to temporary table. Success: Was able to run 'create index i on t1_temp (i)' under FTWRL. Success: Was able to run 'create index i on t1_temp (i)' with FTWRL active in another connection. @@ -482,14 +532,14 @@ Success: Was able to run FTWRL while 'dr # # 13.2) DROP INDEX. # -# 13.2.a) DROP INDEX for base table is incompatible with FTWRL. +# 13.2.a) DROP INDEX on a base table is incompatible with FTWRL. create index i on t1_base (i); Success: Was not able to run 'drop index i on t1_base' under FTWRL. Success: 'drop index i on t1_base' is blocked by FTWRL active in another connection. Success: FTWRL is blocked when 'drop index i on t1_base' is active in another connection. drop index i on t1_base; # -# 13.2.b) DROP INDEX for temporary table is compatible with FTWRL. +# 13.2.b) DROP INDEX on a temporary table is compatible with FTWRL. create index i on t1_temp (i); Success: Was able to run 'drop index i on t1_temp' under FTWRL. Success: Was able to run 'drop index i on t1_temp' with FTWRL active in another connection. === modified file 'mysql-test/t/flush_read_lock.test' --- a/mysql-test/t/flush_read_lock.test 2010-10-21 05:43:57 +0000 +++ b/mysql-test/t/flush_read_lock.test 2010-10-21 19:24:20 +0000 @@ -10,12 +10,60 @@ # Save the initial number of concurrent sessions. --source include/count_sessions.inc ---echo # Use MyISAM engine for the most of test tables ---echo # in order to avoid implicit commit affecting ---echo # tests for DDL statements. +--echo # FTWRL takes two global metadata locks -- a global shared +--echo # metadata lock and the commit blocker lock. +--echo # The first lock prevents DDL from taking place. +--echo # Let's say that all DDL statements that take metadata +--echo # locks form class #1 -- incompatible with FTWRL because +--echo # take incompatible MDL table locks. +--echo # The first global lock doesn't, however, prevent standalone +--echo # COMMITs (or implicit COMMITs) from taking place, since a +--echo # COMMIT doesn't take table locks. It doesn't prevent +--echo # DDL on temporary tables either, since they don't +--echo # take any table locks either. +--echo # Most DDL statements do not perform an implicit commit +--echo # if operate on a temporary table. Examples are CREATE +--echo # TEMPORARY TABLE and DROP TEMPORARY TABLE. +--echo # Thus, these DDL statements can go through in presence +--echo # of FTWRL. This is class #2 -- compatible because +--echo # do not take incompatible MDL locks and do not issue +--echo # implicit commit.. +--echo # (Although these operations do not commit, their effects +--echo # cannot be rolled back either.) +--echo # ALTER TABLE, ANALYZE, OPTIMIZE and some others always +--echo # issue an implicit commit, even if its argument is a +--echo # temporary table. +--echo # *Howewer* an implicit commit is a no-op if all engines +--echo # used since the start of transactiona are non- +--echo # transactional. Thus, for non-transactional engines, +--echo # these operations are not blocked by FTWRL. +--echo # This is class #3 -- compatible because do not take +--echo # MDL table locks and are non-transactional. +--echo # On the contrary, for transactional engines, there +--echo # is always a commit, regardless of whether a table +--echo # is temporary or not. Thus, for example, ALTER TABLE +--echo # for a transactional engine will wait for FTWRL, +--echo # even if the subject table is temporary. +--echo # Thus ALTER TABLE is incompatible +--echo # with FTWRL. This is class #4 -- incompatible +--echo # becuase issue implicit COMMIT which is not a no-op. +--echo # Finally, there are administrative statements (such as +--echo # RESET SLAVE) that do not take any locks and do not +--echo # issue COMMIT. +--echo # This is class #5. +--echo # The goal of this coverage is to test statements +--echo # of all classes. +--echo # @todo: documents the effects of @@autocommit, +--echo # DML and temporary transactional tables. + +--echo # Use MyISAM engine for the most of the tables +--echo # used in this test in order to be able to +--echo # check that DDL statements on temporary tables +--echo # are compatible with FTRWL. --disable_warnings drop tables if exists t1_base, t2_base, t3_trans; drop database if exists mysqltest1; +--echo # We're going to test ALTER DATABASE UPGRADE drop database if exists `#mysql50#mysqltest-2`; drop procedure if exists p1; drop function if exists f1; @@ -83,7 +131,7 @@ let $cleanup_stmt1= alter table t1_base --source include/check_ftwrl_incompatible.inc --echo # ---echo # 1.1.b) For temporaty table should be compatible with FTWRL. +--echo # 1.1.b) For a temporary table should be compatible with FTWRL. --echo # let $statement= alter table t1_temp add column c1 int; let $cleanup_stmt= alter table t1_temp drop column c1; @@ -136,12 +184,14 @@ let $cleanup_stmt1= alter event e1 comme --echo # --echo # 1.x) The rest of ALTER statements are too special to ---echo # to be tested here. +--echo # be tested here. --echo # --echo # --echo # 2) ANALYZE TABLE statement is compatible with FTWRL. +--echo # See Bug#43336 ANALYZE and OPTIMIZE do not honour +--echo # --read-only for a discussion why. --echo # let $statement= analyze table t1_base; let $cleanup_stmt= ; @@ -169,8 +219,9 @@ rollback; --echo # Similarly to ROLLBACK it is a no-op in this situation. commit; unlock tables; ---echo # Check that BEGIN/ROLLBACK are not and COMMIT is ---echo # blocked by active FTWRL in another connection +--echo # Check that BEGIN/ROLLBACK are not blocked and +--echo # COMMIT is blocked by active FTWRL in another +--echo # connection. --echo # --echo # Switching to connection '$con_aux1'. connection $con_aux1; @@ -282,12 +333,12 @@ let $skip_3rd_check= ; --echo # --echo # 5) CALL statement. This statement uses resources in two ---echo # ways through expressions used as parameters and through +--echo # ways: through expressions used as parameters and through --echo # sub-statements. This test covers only usage through --echo # parameters as sub-statements do locking individually. --echo # ---echo # 5.a) In simple case parameter expression should be compatible ---echo # with FTWRL. +--echo # 5.a) In simple cases a parameter expression should be +--echo # compatible with FTWRL. let $statement= call p2((select count(*) from t1_base)); let $cleanup_stmt1= ; --echo # Skip last part of compatibility testing as this statement @@ -297,7 +348,7 @@ let $skip_3rd_check= 1; let $skip_3rd_check= ; --echo # ---echo # 5.b) In case when expression uses function which updates +--echo # 5.b) In case when an expression uses function which updates --echo # base tables CALL should be incompatible with FTWRL. --echo # let $statement= call p2(f2_base()); @@ -380,13 +431,13 @@ let $cleanup_stmt= drop temporary table --echo # 8.2) CREATE INDEX statement. --echo # ---echo # 8.2.a) CREATE TABLE is incompatible with FTWRL when +--echo # 8.2.a) CREATE INDEX is incompatible with FTWRL when --echo # applied to base table. let $statement= create index i on t1_base (i); let $cleanup_stmt1= drop index i on t1_base; --source include/check_ftwrl_incompatible.inc ---echo # 8.2.b) CREATE TABLE is compatible with FTWRL when +--echo # 8.2.b) CREATE INDEX is compatible with FTWRL when --echo # applied to temporary table. let $statement= create index i on t1_temp (i); let $cleanup_stmt= drop index i on t1_temp; @@ -635,7 +686,7 @@ let $cleanup_stmt= create temporary tabl --echo # --echo # 13.2) DROP INDEX. --echo # ---echo # 13.2.a) DROP INDEX for base table is incompatible with FTWRL. +--echo # 13.2.a) DROP INDEX on a base table is incompatible with FTWRL. create index i on t1_base (i); let $statement= drop index i on t1_base; let $cleanup_stmt1= create index i on t1_base (i); @@ -643,7 +694,7 @@ let $cleanup_stmt1= create index i on t1 drop index i on t1_base; --echo # ---echo # 13.2.b) DROP INDEX for temporary table is compatible with FTWRL. +--echo # 13.2.b) DROP INDEX on a temporary table is compatible with FTWRL. create index i on t1_temp (i); let $statement= drop index i on t1_temp; let $cleanup_stmt= create index i on t1_temp (i); --===============0973455425== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/kostja@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kostja@stripped # target_branch: file:///opt/local/work/5.5-rt-stage/ # testament_sha1: 689fd7c41328aed8ab54d00c5c2d6a073b253249 # timestamp: 2010-10-21 23:24:23 +0400 # base_revision_id: dmitry.lenev@stripped\ # 36aid69h9r75o2ro # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWe17JNsAB9DfgHATXPf/93/v 3/C////wYBE1HyIAAPCZFSgUC6AUKBiVpoAAAAFBVAAkpT9KGmJMm1N6oyHqGgAMjQABtRoDQASg mgQCaJkNRlTemSmmRggwCMIaAaYcNNMEMhppkZMIBpoAwmjTJgAQNBqf6qpNAAAAAAGmQAAAAAAc NNMEMhppkZMIBpoAwmjTJgAQNAqSTQQBMgCaJiaYiYNU8TU02k/RJmSegn6STA136dvhIFUIXz/o 3+v7urxJxyFSYp+Nyqqv6uuDmKPFLQzNJedFF8NZZXnJp8VOvrZNW1HWKjqo0GEzpLFRz8nad3RY x1k5JpY+yCVxb4YSTFUfS8U0xx41IWZfRxH6450WWbtTB0WMtZPJpZawSy6YpovHjuuwIhuDKsR2 +kPeFn7V5vSk4s8lFpaLTq8qSbkiJzTkuy9/G16vV74xDr9CqC0U/tjAZovF1uiiym9ucGLJ6T+s 65UVSJSp4/okb757VjpVdTBZAu6zhmVoYy5tK4jukKq84o4TKNzsxQVJqdxSU62vWtJNSeL4hOeM 6OrzYqwq3xVavgtJjTW4SlSTf99Z4lDU6HYOWHJHAkDDDDDHUwfyZrLsT9WDI8Xi9JmxWM/S/ZgK b1mM1OB7yxrXa1KUpwbWDyU/JT0efmfmpS7apNjlSylFFN6jd01W1Tm+RZopgupSmLpXsxdJhGT/ D62Tm2mSU97mwaMiym9sfK1PeyO5gXU9sUyW02VVNS5ophka12Ky6zDNhODguPB0d+WxSjco6TBn KqmxSzFuWclll2bJ9qzwdLa6182hi/FwHBsaHN1NQ1tjJmXU2NmPi612jrc21rL8lNj/LFuUxycG CXX2NF+C7q3VWossWyjRzXH9mL6VlmpksmaxZ3NfDi6mbiwZul0LNa5ZLM2xou+gyLNSnS4rFhpS XXmoxaKZLLuBdZscGBuc5Zr2s241v8Gazi7GpZxtnFTRwaMFMnJSjUu6KLKcRS25wYMF2CmC0lVV NWusTNSlGBk8CzQxU2GtduUpsbhvjc7VmTtaNTByanNOQ3upc2sZo1O9wZNbmbVupZqcl2xuYtzS zA3Op1G1sdrEvdDJUrV7FjXk2peTKq2VStfyVfixU56SqpKTdrgpKAAAAACIQAAAABBAAAAAAgAA pJkRCkvpdTBkllJNiXFzMmQlO57Hw8WjXjVdzazOjFieKytFmSyy66m97Ea0dEBT6Xez3qs1OKnw dsh2x7lBMUADqT2NGg9gd6nkFTw0pUOUjkYT6E3dnRLqp3z9KWf23r5YRZbWs9rWtZinn6mZmKni QGhMwWel0vO+JSm/tKUYrNsnTEpwk6E8x+juMscjVozhtqR5albLHxU+xjZJffGhLMr2v36cb5yJ Qkuu+JtXkzYtmEaeXbrGtcqTFKpY9QvkKVi54CzDMRCNZ4S9BXjJq5tD1zuEnxNPm0Xa5B7akLTB itUeRz+3HHas4sKZknTqCRYBS/V/d536Nzqifap2iMgxtI3fz07DhI5iuuZ35j2XiL49gIxaf8SR sHDc1D3wqbyNf/FgnJm3Sd+ePlbeeO3LZi5irE8ZE1Dbs7pCtyj1oYxwMgSO3EYJrcsZnMkS1GOb ga0Lb/kZHihmXKoYMDcjhiuus95YdtpSqGiFLEis6Y1kVuNxQ60MCY1JyN4xfxoNiQlBiZXmhTDw xwtwxLdOpkbUKEHaelj8jlwH2sxzOGmc5txSPEVoCCeqoS5nHrlYElMMl4GY8ysDrUU3jd53alFT EXCWKyQzFsV6kFSqsxXGTvLh6tzU6VRKWGRq5Dqea2jTqk6e7zkxy1uzHFxX7JOb9tS7R5XFj4Oq NWhsr73xxfpi4Tta0hRRZKdy2PY1lpTF+5Dis1QhCATIcWXAqTztXCHqs8mnpSTlG0QWy2uZR4IZ VvYxyljJuhEKLpfBhKEuJodbGxb1mmi5YYNd2Q0qE1CHCUJOR7prWchuA8itZvXc2jhwKGxmOblc 8sG1LC/uM04pCZgmZLPM0yYk5M4i6nZSpgXMNLhhbuMILodURz3Dmb4bMzEbN2Iipbis1zVF7JWd XjSTLSvpjrnf1GrnaqtLWV7So8v8z5X01jyNNK4hMYAU51jAXw+SkDA89TCLCYyaBVKimD9GpSMr MsFkFNg0fxUii4s3aVUo3LP2T4LLKcE38GZMGbQakhvfi/Fmf4YjscAsn932YNrYpQVEfso3OLgj 4OomxSk1E+BrYk5GJdkUNbcSkucipmn7NZY1DoWNEycIk8rcnNvN6mtmlMBgwRSUcRvPhJJgP1/W 0GZTqpo5tkSYNgwNh+rQp/N6n3T/xPE9nypeYSYph9qfZVhpW+qVWihYUHcLiKgiMwYSQkvw70L+ q1xBXHIUYdB0mX2JSimcrmNEVgrh/BdkplaS38I/BYSxOtNh/FSyf02padS0WNRp+Jd71JeiLsFm CTDhgeD7+R+K4eDCRZm0SLL0/q4Nh2E/DKJqW4yNTXEWYXQXTr0T8HY7E+zV5x2Lo0DUxvNAnKCw XbhOJxEOBZCWigeBQ+BOFqSlVCkKQopUMh5XyW/N/n/WCf0iHrePs7GhODvcXQ1jwTtZOet+bDv3 jpTLZTqL1sj/n51UtH9m+AxJ4muUwkoYWSyVKUojEl5P/ralecipMVDvu1KGCVKqvKtZVSmFk9rW uprQqTR3Oh8i7JKUo+UosVCmCk7TReeGDveTX6XgzdXkVGxLr1Ef2e4dTYqgamonkVGEP1pY2iw6 cfWPgLdLcTuwQ6GEyZCJ7xABgKIaNHnr7/d3bYvrJqUo8qUekm7zuJkyD8SYMULkEywMTCikJ+25 A4rNSmJRsUu1NRbFOJmsLsmIxYtSj52L1bJqYJtUya1mLcWZMW5ZD8FMWpkMOgHny7zh1OSntyMN ONCgwq1O8yKHgV8T4Q5nm207qW5m6TpHZWGse2Auh9buaoxZrpbKxSCUltU0PUCgm1yGSKbOuOlq l5FksE1seLZpZ2rw/1ZnCMTmpTznU65NaMHhJSjdFpaKUiyZmjRsnuZsUw8crvWmKU+Pd4rsmWTG ZwUWgwKYjg46r6VEzOwSDVxLIIyjI/710mTVJyMk5KhrswGqGTPXJkpSUVScnpdzxer1d719706v Otnnmv7GjJ4I4OEbI/Y+Y6R9W+VXr7Xdikso6KPnS1l088p5rNrzOUnNrsPlZDRGpPRSXyd7yPKh 62BSyyzCKo7G54xSXomrOJqUP+kpSlKqk5fkzDBr9CWSaKFlKKkzFMZAus1Fm/BMRzZu5BfCuNIP QW+MnPj1R2wtnt3Q9EeYm+YuLGJaoe+e5dNZeSV5JO9HOx1qd7+/n8MtZuVKUlIUzK7Xxu5yKnCI pSUKSlHNk6ZMBqJ2ODwKUO1YnYRuS0mcrONR3dz9/qYxKacG2ST+DcktCilPm8JLGD6m59HseyKP DyaE0Iz5GClCqSlG85ryX7bv0U9Kdz6DWT2HWkwfMWIWUXkpgLa3qkuYqjY8mBOEmk9Hxtl56kzH cmsWIu3Vl5Tf72L0p8WZbm5s5uwN55FEWlMzqNypO2kWd/T0IyLbn1uxqCpK9LYho0sQ1RqYFE2E fZyyfGXTFglllP5MyxScLxixUf0YLDzJUMYlEYTaU0UmlEYrEWkpisda1kxkqFI12d65k0SZqiLM HQpLJK0ItUsztJGFp5lj29XF64Ch0tYWjubjU7oxXd4TJg8LPBME6JD2kzXTIjrUkT1sk5KKTRuW opI2Metm4sU+GDZia0tyP3KP3KXUf9ycpPkIvLyWwlN/6PQ7onKJNHk9W9OaYtfQwf7e5vanUpu7 TB598eqikxIf+3WjNMVUWSG7g0yxfUlJqwxYPK2+hx3nm6iavTVcSlG9SylKNKWlKT5ak5xivJgq TE9W1JgFKLpZi9heZMVFKn+1Qs87WnjdyVI6x88pMHX89o8WuZq1e1LN0nH7Y0egz29ydb4ms6it znb/gm/FYEBVM0RmIKCy95XdGdWJHUQf94p1MhirRTRWnmWZpZd1M2KmlkmDBdkUuGE1qaO9bIxS xRkzbFmopSplSp/JtaejRJ+G7i6tzZtKfGs4uS5YxXL0u8mLBqaPrYJ15R3G1JmmySn1fexPe93S nu4prfvOw5IvKUcVN4pzeRZSy0YEo/L8tbpvZ3U1JzdAIKoJtyRLkiE+M7AH+NBJ40t4u7u5tUpi WWnjksxWTEUpg+5ywZueSzNdWDBQUmOWIJD+QokyCAy/ZRiwQKEyRtS9ibEnx55GE+oVgjnJJsRh FhKkTCXs+5hEXQ+9k8aXXT55xLIraRaE7qG9mumBgqDFSZ4Ug4dbhzQuXJaWcImVZyTpdjCTSdDT I8FFKXYq3SY2qksotKWo2UlsXypkydK081OKh9H855HQTVj7mtvwiXb9zDno9b52NJdLDemt9d3y NMHY9zvk64ob5RkrX22H2k+n7GG96HFofmxay8Qp6Bj5cX5t60ku5J5cGDvxUUpHWyWLzsWpRPve Zue9onmK7Y1fc3fU6HD/8XckU4UJDteyTbA= --===============0973455425==--