From: Anitha Gopi Date: May 27 2011 4:52am Subject: bzr commit into mysql-5.5 branch (anitha.gopi:3406) List-Archive: http://lists.mysql.com/commits/138272 Message-Id: <201105270453.p4R4rJ21010988@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0173590056==" --===============0173590056== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/anitha/mysql/repo/mysql-5.5-mod/ based on revid:anitha.gopi@stripped 3406 Anitha Gopi 2011-05-27 [merge] Automerge : Updating local tree added: mysql-test/suite/binlog/r/binlog_reset_master.result mysql-test/suite/binlog/t/binlog_reset_master.test mysql-test/suite/rpl/t/rpl_typeconv-master.opt modified: BUILD/SETUP.sh cmake/configure.pl cmake/os/WindowsCache.cmake include/violite.h libmysql/errmsg.c mysql-test/lib/mtr_cases.pm mysql-test/lib/mtr_misc.pl mysql-test/mysql-test-run.pl mysql-test/r/func_math.result mysql-test/r/openssl_1.result mysql-test/suite/innodb/r/innodb_mysql.result mysql-test/suite/innodb/t/innodb_mysql.test mysql-test/t/func_math.test sql-common/client.c sql/item_func.cc sql/log.cc sql/mysqld.cc sql/sql_acl.cc sql/sql_parse.cc vio/test-ssl.c vio/test-sslclient.c vio/test-sslserver.c vio/viossl.c vio/viosslfactories.c vio/viotest-ssl.c === modified file 'BUILD/SETUP.sh' --- a/BUILD/SETUP.sh 2011-05-06 09:20:01 +0000 +++ b/BUILD/SETUP.sh 2011-05-25 10:39:11 +0000 @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright (C) 2000, 2007 MySQL AB +# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public @@ -250,7 +250,7 @@ gcov_compile_flags="$gcov_compile_flags gcov_link_flags="-fprofile-arcs -ftest-coverage" -gcov_configs="--disable-shared" +gcov_configs="--with-gcov" # gprof === modified file 'cmake/configure.pl' --- a/cmake/configure.pl 2010-11-12 01:33:19 +0000 +++ b/cmake/configure.pl 2011-05-25 10:39:11 +0000 @@ -190,6 +190,11 @@ foreach my $option (@ARGV) $cmakeargs = $cmakeargs." \"-DWITH_COMMENT=".substr($option,13)."\""; next; } + if ($option =~ /with-gcov/) + { + $cmakeargs = $cmakeargs." -DENABLE_GCOV=ON"; + next; + } $option = uc($option); $option =~ s/-/_/g; === modified file 'cmake/os/WindowsCache.cmake' --- a/cmake/os/WindowsCache.cmake 2011-04-30 05:24:38 +0000 +++ b/cmake/os/WindowsCache.cmake 2011-05-26 07:54:19 +0000 @@ -341,6 +341,7 @@ SET(SIGNAL_RETURN_TYPE_IS_VOID 1 CACHE I SET(C_HAS_inline CACHE INTERNAL "") SET(C_HAS___inline 1 CACHE INTERNAL "") SET(FIONREAD_IN_SYS_IOCTL CACHE INTERNAL "") +SET(FIONREAD_IN_SYS_FILIO CACHE INTERNAL "") SET(GWINSZ_IN_SYS_IOCTL CACHE INTERNAL "") SET(HAVE_CXXABI_H CACHE INTERNAL "") SET(HAVE_NDIR_H CACHE INTERNAL "") === modified file 'include/violite.h' --- a/include/violite.h 2011-04-08 10:23:36 +0000 +++ b/include/violite.h 2011-05-19 09:47:43 +0000 @@ -134,13 +134,13 @@ struct st_VioSSLFd SSL_CTX *ssl_context; }; -int sslaccept(struct st_VioSSLFd*, Vio *, long timeout); -int sslconnect(struct st_VioSSLFd*, Vio *, long timeout); +int sslaccept(struct st_VioSSLFd*, Vio *, long timeout, unsigned long *errptr); +int sslconnect(struct st_VioSSLFd*, Vio *, long timeout, unsigned long *errptr); struct st_VioSSLFd *new_VioSSLConnectorFd(const char *key_file, const char *cert_file, const char *ca_file, const char *ca_path, - const char *cipher); + const char *cipher, enum enum_ssl_init_error* error); struct st_VioSSLFd *new_VioSSLAcceptorFd(const char *key_file, const char *cert_file, const char *ca_file,const char *ca_path, === modified file 'libmysql/errmsg.c' --- a/libmysql/errmsg.c 2011-03-08 17:39:25 +0000 +++ b/libmysql/errmsg.c 2011-05-19 09:47:43 +0000 @@ -51,7 +51,7 @@ const char *client_errors[]= "Error on SHOW SLAVE HOSTS:", "Error connecting to slave:", "Error connecting to master:", - "SSL connection error", + "SSL connection error: %-.100s", "Malformed packet", "This client library is licensed only for use with MySQL servers having '%s' license", "Invalid use of null pointer", === modified file 'mysql-test/lib/mtr_cases.pm' --- a/mysql-test/lib/mtr_cases.pm 2011-01-18 10:21:37 +0000 +++ b/mysql-test/lib/mtr_cases.pm 2011-05-24 08:54:34 +0000 @@ -287,9 +287,11 @@ sub collect_one_suite($) "mysql-test/suite", "mysql-test", # Look in storage engine specific suite dirs - "storage/*/mysql-test-suites" + "storage/*/mtr", + # Look in plugin specific suite dir + "plugin/$suite/tests", ], - [$suite]); + [$suite, "mtr"]); } mtr_verbose("suitedir: $suitedir"); } === modified file 'mysql-test/lib/mtr_misc.pl' --- a/mysql-test/lib/mtr_misc.pl 2011-04-07 08:12:52 +0000 +++ b/mysql-test/lib/mtr_misc.pl 2011-05-25 08:58:33 +0000 @@ -31,6 +31,7 @@ sub mtr_script_exists(@); sub mtr_file_exists(@); sub mtr_exe_exists(@); sub mtr_exe_maybe_exists(@); +sub mtr_compress_file($); sub mtr_milli_sleep($); sub start_timer($); sub has_expired($); @@ -199,6 +200,40 @@ sub mtr_exe_exists (@) { } } +# +# Try to compress file using tools that might be available. +# If zip/gzip is not available, just silently ignore. +# + +sub mtr_compress_file ($) { + my ($filename)= @_; + + mtr_error ("File to compress not found: $filename") unless -f $filename; + + my $did_compress= 0; + + if (IS_WINDOWS) + { + # Capture stderr + my $ziperr= `zip $filename.zip $filename 2>&1`; + if ($?) { + print "$ziperr\n" if $ziperr !~ /recognized as an internal or external/; + } else { + unlink($filename); + $did_compress=1; + } + } + else + { + my $gzres= system("gzip $filename"); + $did_compress= ! $gzres; + if ($gzres && $gzres != -1) { + mtr_error ("Error: have gzip but it fails to compress core file"); + } + } + mtr_print("Compressed file $filename") if $did_compress; +} + sub mtr_milli_sleep ($) { die "usage: mtr_milli_sleep(milliseconds)" unless @_ == 1; === modified file 'mysql-test/mysql-test-run.pl' --- a/mysql-test/mysql-test-run.pl 2011-05-12 13:19:59 +0000 +++ b/mysql-test/mysql-test-run.pl 2011-05-25 14:07:16 +0000 @@ -263,7 +263,6 @@ my $opt_shutdown_timeout= $ENV{MTR_SHUTD my $opt_start_timeout = $ENV{MTR_START_TIMEOUT} || 180; # seconds sub suite_timeout { return $opt_suite_timeout * 60; }; -sub check_timeout { return $opt_testcase_timeout * 6; }; my $opt_wait_all; my $opt_user_args; @@ -299,6 +298,8 @@ sub testcase_timeout ($) { return $opt_testcase_timeout * 60; } +sub check_timeout ($) { return testcase_timeout($_[0]) / 10; } + our $opt_warnings= 1; our $opt_include_ndbcluster= 0; @@ -657,6 +658,8 @@ sub run_test_server ($$$) { mtr_report(" - deleting it, already saved", "$opt_max_save_core"); unlink("$core_file"); + } else { + mtr_compress_file($core_file) unless @opt_cases; } ++$num_saved_cores; } @@ -3413,7 +3416,7 @@ sub check_testcase($$) # Return immediately if no check proceess was started return 0 unless ( keys %started ); - my $timeout= start_timer(check_timeout()); + my $timeout= start_timer(check_timeout($tinfo)); while (1){ my $result; @@ -3485,7 +3488,7 @@ test case was executed:\n"; } elsif ( $proc->{timeout} ) { $tinfo->{comment}.= "Timeout for 'check-testcase' expired after " - .check_timeout()." seconds"; + .check_timeout($tinfo)." seconds"; $result= 4; } else { @@ -3575,7 +3578,7 @@ sub run_on_all($$) # Return immediately if no check proceess was started return 0 unless ( keys %started ); - my $timeout= start_timer(check_timeout()); + my $timeout= start_timer(check_timeout($tinfo)); while (1){ my $result; @@ -3606,7 +3609,7 @@ sub run_on_all($$) } elsif ($proc->{timeout}) { $tinfo->{comment}.= "Timeout for '$run' expired after " - .check_timeout()." seconds"; + .check_timeout($tinfo)." seconds"; } else { # Unknown process returned, most likley a crash, abort everything @@ -4331,7 +4334,7 @@ sub check_warnings ($) { # Return immediately if no check proceess was started return 0 unless ( keys %started ); - my $timeout= start_timer(check_timeout()); + my $timeout= start_timer(check_timeout($tinfo)); while (1){ my $result= 0; @@ -4383,7 +4386,7 @@ sub check_warnings ($) { } elsif ( $proc->{timeout} ) { $tinfo->{comment}.= "Timeout for 'check warnings' expired after " - .check_timeout()." seconds"; + .check_timeout($tinfo)." seconds"; $result= 4; } else { === modified file 'mysql-test/r/func_math.result' --- a/mysql-test/r/func_math.result 2011-04-20 07:52:40 +0000 +++ b/mysql-test/r/func_math.result 2011-05-26 10:09:25 +0000 @@ -543,6 +543,12 @@ ROUND(LEAST(15, -4939092, 0.2704), STDDE -4939092.0000 Warnings: Warning 1292 Truncated incorrect DOUBLE value: 'a' +# +# Bug#12392636 ASSERTION FAILED: SCALE >= 0 && PRECISION > 0 && SCALE <= PRECISION +# +SELECT SUM(DISTINCT (TRUNCATE((.1), NULL))); +SUM(DISTINCT (TRUNCATE((.1), NULL))) +NULL End of 5.1 tests # # Bug #8433: Overflow must be an error === modified file 'mysql-test/r/openssl_1.result' --- a/mysql-test/r/openssl_1.result 2010-01-29 14:54:27 +0000 +++ b/mysql-test/r/openssl_1.result 2011-05-19 09:47:43 +0000 @@ -44,13 +44,13 @@ ERROR 42000: DELETE command denied to us drop user ssl_user1@localhost, ssl_user2@localhost, ssl_user3@localhost, ssl_user4@localhost, ssl_user5@localhost; drop table t1; -mysqltest: Could not open connection 'default': 2026 SSL connection error -mysqltest: Could not open connection 'default': 2026 SSL connection error -mysqltest: Could not open connection 'default': 2026 SSL connection error +mysqltest: Could not open connection 'default': 2026 SSL connection error: ASN: bad other signature confirmation +mysqltest: Could not open connection 'default': 2026 SSL connection error: ASN: bad other signature confirmation +mysqltest: Could not open connection 'default': 2026 SSL connection error: ASN: bad other signature confirmation SSL error: Unable to get private key from '' -mysqltest: Could not open connection 'default': 2026 SSL connection error +mysqltest: Could not open connection 'default': 2026 SSL connection error: Unable to get private key SSL error: Unable to get certificate from '' -mysqltest: Could not open connection 'default': 2026 SSL connection error +mysqltest: Could not open connection 'default': 2026 SSL connection error: Unable to get certificate SHOW STATUS LIKE 'Ssl_cipher'; Variable_name Value Ssl_cipher DHE-RSA-AES256-SHA @@ -83,7 +83,7 @@ Ssl_cipher AES128-SHA SHOW STATUS LIKE 'Ssl_cipher'; Variable_name Value Ssl_cipher AES128-SHA -mysqltest: Could not open connection 'default': 2026 SSL connection error +mysqltest: Could not open connection 'default': 2026 SSL connection error: SSL_CTX_new failed CREATE TABLE t1(a int); INSERT INTO t1 VALUES (1), (2); @@ -189,7 +189,7 @@ UNLOCK TABLES; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; SSL error: Unable to get private key from 'MYSQL_TEST_DIR/std_data/client-cert.pem' -mysqldump: Got error: 2026: SSL connection error when trying to connect +mysqldump: Got error: 2026: SSL connection error: Unable to get private key when trying to connect DROP TABLE t1; Variable_name Value Ssl_cipher DHE-RSA-AES256-SHA === added file 'mysql-test/suite/binlog/r/binlog_reset_master.result' --- a/mysql-test/suite/binlog/r/binlog_reset_master.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/binlog/r/binlog_reset_master.result 2011-05-26 10:50:43 +0000 @@ -0,0 +1 @@ +RESET MASTER; === added file 'mysql-test/suite/binlog/t/binlog_reset_master.test' --- a/mysql-test/suite/binlog/t/binlog_reset_master.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/binlog/t/binlog_reset_master.test 2011-05-26 10:50:43 +0000 @@ -0,0 +1,26 @@ +# ==== Purpose ==== +# +# Test bugs in RESET MASTER. + +--source include/have_debug.inc +--source include/have_log_bin.inc + +####################################################################### +# BUG#12574820: binlog.binlog_tmp_table timing out in daily and weekly trunk run +# Problem: MYSQL_BIN_LOG::reset_logs acquired LOCK_thread_count and +# LOCK_log in the wrong order. This could cause a deadlock when +# RESET MASTER was run concurrently with a disconnecting thread. +####################################################################### + +# We use sleep, not debug_sync, because the sync point needs to be in +# the thread shut down code after the debug sync facility has been +# shut down. +--let $write_var= SET DEBUG="+d,sleep_after_lock_thread_count_before_delete_thd"; CREATE TEMPORARY TABLE test.t1 (a INT); +--let $write_to_file= GENERATE +--disable_query_log +--source include/write_var_to_file.inc +--enable_query_log + +--exec $MYSQL < $write_to_file +RESET MASTER; +--remove_file $write_to_file === modified file 'mysql-test/suite/innodb/r/innodb_mysql.result' --- a/mysql-test/suite/innodb/r/innodb_mysql.result 2010-12-08 14:47:47 +0000 +++ b/mysql-test/suite/innodb/r/innodb_mysql.result 2011-05-26 15:50:06 +0000 @@ -2663,7 +2663,6 @@ COUNT(*) 1537 SET SESSION sort_buffer_size = DEFAULT; DROP TABLE t1; -End of 5.1 tests # # Test for bug #39932 "create table fails if column for FK is in different # case than in corr index". @@ -2685,6 +2684,23 @@ t2 CREATE TABLE `t2` ( ) ENGINE=InnoDB DEFAULT CHARSET=latin1 drop table t2, t1; # +# Test for bug #11762012 - "54553: INNODB ASSERTS IN HA_INNOBASE:: +# UPDATE_ROW, TEMPORARY TABLE, TABLE LOCK". +# +DROP TABLE IF EXISTS t1; +CREATE TEMPORARY TABLE t1 (c int) ENGINE = InnoDB; +INSERT INTO t1 VALUES (1); +LOCK TABLES t1 READ; +# Even though temporary table was locked for READ we +# still allow writes to it to be compatible with MyISAM. +# This is possible since due to fact that temporary tables +# are specific to connection and therefore locking for them +# is irrelevant. +UPDATE t1 SET c = 5; +UNLOCK TABLES; +DROP TEMPORARY TABLE t1; +End of 5.1 tests +# # Bug#44613 SELECT statement inside FUNCTION takes a shared lock # DROP TABLE IF EXISTS t1; === modified file 'mysql-test/suite/innodb/t/innodb_mysql.test' --- a/mysql-test/suite/innodb/t/innodb_mysql.test 2010-12-20 12:17:17 +0000 +++ b/mysql-test/suite/innodb/t/innodb_mysql.test 2011-05-26 15:50:06 +0000 @@ -830,8 +830,6 @@ SET SESSION sort_buffer_size = DEFAULT; DROP TABLE t1; ---echo End of 5.1 tests - --echo # --echo # Test for bug #39932 "create table fails if column for FK is in different @@ -852,6 +850,28 @@ drop table t2, t1; --echo # +--echo # Test for bug #11762012 - "54553: INNODB ASSERTS IN HA_INNOBASE:: +--echo # UPDATE_ROW, TEMPORARY TABLE, TABLE LOCK". +--echo # +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings +CREATE TEMPORARY TABLE t1 (c int) ENGINE = InnoDB; +INSERT INTO t1 VALUES (1); +LOCK TABLES t1 READ; +--echo # Even though temporary table was locked for READ we +--echo # still allow writes to it to be compatible with MyISAM. +--echo # This is possible since due to fact that temporary tables +--echo # are specific to connection and therefore locking for them +--echo # is irrelevant. +UPDATE t1 SET c = 5; +UNLOCK TABLES; +DROP TEMPORARY TABLE t1; + +--echo End of 5.1 tests + + +--echo # --echo # Bug#44613 SELECT statement inside FUNCTION takes a shared lock --echo # === added file 'mysql-test/suite/rpl/t/rpl_typeconv-master.opt' --- a/mysql-test/suite/rpl/t/rpl_typeconv-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_typeconv-master.opt 2011-05-25 14:39:39 +0000 @@ -0,0 +1 @@ +--testcase-timeout=40 === modified file 'mysql-test/t/func_math.test' --- a/mysql-test/t/func_math.test 2011-04-20 07:52:40 +0000 +++ b/mysql-test/t/func_math.test 2011-05-26 10:09:25 +0000 @@ -370,6 +370,12 @@ DROP TABLE t1; SELECT ROUND(LEAST(15, -4939092, 0.2704), STDDEV('a')); +--echo # +--echo # Bug#12392636 ASSERTION FAILED: SCALE >= 0 && PRECISION > 0 && SCALE <= PRECISION +--echo # + +SELECT SUM(DISTINCT (TRUNCATE((.1), NULL))); + --echo End of 5.1 tests --echo # === modified file 'sql-common/client.c' --- a/sql-common/client.c 2011-04-28 19:17:29 +0000 +++ b/sql-common/client.c 2011-05-19 09:47:43 +0000 @@ -1840,6 +1840,8 @@ mysql_get_ssl_cipher(MYSQL *mysql __attr ssl_verify_server_cert() vio pointer to a SSL connected vio server_hostname name of the server that we connected to + errptr if we fail, we'll return (a pointer to a string + describing) the reason here RETURN VALUES 0 Success @@ -1849,7 +1851,7 @@ mysql_get_ssl_cipher(MYSQL *mysql __attr #if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) -static int ssl_verify_server_cert(Vio *vio, const char* server_hostname) +static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const char **errptr) { SSL *ssl; X509 *server_cert; @@ -1860,19 +1862,19 @@ static int ssl_verify_server_cert(Vio *v if (!(ssl= (SSL*)vio->ssl_arg)) { - DBUG_PRINT("error", ("No SSL pointer found")); + *errptr= "No SSL pointer found"; DBUG_RETURN(1); } if (!server_hostname) { - DBUG_PRINT("error", ("No server hostname supplied")); + *errptr= "No server hostname supplied"; DBUG_RETURN(1); } if (!(server_cert= SSL_get_peer_certificate(ssl))) { - DBUG_PRINT("error", ("Could not get server certificate")); + *errptr= "Could not get server certificate"; DBUG_RETURN(1); } @@ -1901,7 +1903,7 @@ static int ssl_verify_server_cert(Vio *v DBUG_RETURN(0); } } - DBUG_PRINT("error", ("SSL certificate validation failure")); + *errptr= "SSL certificate validation failure"; DBUG_RETURN(1); } @@ -2507,6 +2509,9 @@ static int send_client_reply_packet(MCPV /* Do the SSL layering. */ struct st_mysql_options *options= &mysql->options; struct st_VioSSLFd *ssl_fd; + enum enum_ssl_init_error ssl_init_error; + const char *cert_error; + unsigned long ssl_error; /* Send mysql->client_flag, max_packet_size - unencrypted otherwise @@ -2526,9 +2531,11 @@ static int send_client_reply_packet(MCPV options->ssl_cert, options->ssl_ca, options->ssl_capath, - options->ssl_cipher))) + options->ssl_cipher, + &ssl_init_error))) { - set_mysql_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate); + set_mysql_extended_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate, + ER(CR_SSL_CONNECTION_ERROR), sslGetErrString(ssl_init_error)); goto error; } mysql->connector_fd= (unsigned char *) ssl_fd; @@ -2536,18 +2543,24 @@ static int send_client_reply_packet(MCPV /* Connect to the server */ DBUG_PRINT("info", ("IO layer change in progress...")); if (sslconnect(ssl_fd, net->vio, - (long) (mysql->options.connect_timeout))) + (long) (mysql->options.connect_timeout), &ssl_error)) { - set_mysql_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate); + char buf[512]; + ERR_error_string_n(ssl_error, buf, 512); + buf[511]= 0; + set_mysql_extended_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate, + ER(CR_SSL_CONNECTION_ERROR), + buf); goto error; } DBUG_PRINT("info", ("IO layer change done!")); /* Verify server cert */ if ((mysql->client_flag & CLIENT_SSL_VERIFY_SERVER_CERT) && - ssl_verify_server_cert(net->vio, mysql->host)) + ssl_verify_server_cert(net->vio, mysql->host, &cert_error)) { - set_mysql_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate); + set_mysql_extended_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate, + ER(CR_SSL_CONNECTION_ERROR), cert_error); goto error; } } === modified file 'sql/item_func.cc' --- a/sql/item_func.cc 2011-05-21 08:59:32 +0000 +++ b/sql/item_func.cc 2011-05-26 10:09:25 +0000 @@ -2259,6 +2259,9 @@ void Item_func_round::fix_length_and_dec } val1= args[1]->val_int(); + if ((null_value= args[1]->is_null())) + return; + val1_unsigned= args[1]->unsigned_flag; if (val1 < 0) decimals_to_set= val1_unsigned ? INT_MAX : 0; === modified file 'sql/log.cc' --- a/sql/log.cc 2011-05-12 18:35:31 +0000 +++ b/sql/log.cc 2011-05-26 10:56:17 +0000 @@ -3372,12 +3372,6 @@ bool MYSQL_BIN_LOG::reset_logs(THD* thd) DBUG_ENTER("reset_logs"); ha_reset_logs(thd); - /* - We need to get both locks to be sure that no one is trying to - write to the index log file. - */ - mysql_mutex_lock(&LOCK_log); - mysql_mutex_lock(&LOCK_index); /* The following mutex is needed to ensure that no threads call @@ -3387,6 +3381,13 @@ bool MYSQL_BIN_LOG::reset_logs(THD* thd) */ mysql_mutex_lock(&LOCK_thread_count); + /* + We need to get both locks to be sure that no one is trying to + write to the index log file. + */ + mysql_mutex_lock(&LOCK_log); + mysql_mutex_lock(&LOCK_index); + /* Save variables so that we can reopen the log */ save_name=name; name=0; // Protect against free === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2011-05-25 10:17:27 +0000 +++ b/sql/mysqld.cc 2011-05-26 10:56:17 +0000 @@ -2070,6 +2070,12 @@ void unlink_thd(THD *thd) thd_cleanup(thd); dec_connection_count(); mysql_mutex_lock(&LOCK_thread_count); + /* + Used by binlog_reset_master. It would be cleaner to use + DEBUG_SYNC here, but that's not possible because the THD's debug + sync feature has been shut down at this point. + */ + DBUG_EXECUTE_IF("sleep_after_lock_thread_count_before_delete_thd", sleep(5);); delete_thd(thd); DBUG_VOID_RETURN; } === modified file 'sql/sql_acl.cc' --- a/sql/sql_acl.cc 2011-05-21 08:21:08 +0000 +++ b/sql/sql_acl.cc 2011-05-26 12:33:21 +0000 @@ -8527,14 +8527,14 @@ static ulong parse_client_handshake_pack DBUG_PRINT("info", ("client capabilities: %lu", mpvio->client_capabilities)); if (mpvio->client_capabilities & CLIENT_SSL) { - char error_string[1024] __attribute__((unused)); + unsigned long errptr; /* Do the SSL layering. */ if (!ssl_acceptor_fd) return packet_error; DBUG_PRINT("info", ("IO layer change in progress...")); - if (sslaccept(ssl_acceptor_fd, net->vio, net->read_timeout)) + if (sslaccept(ssl_acceptor_fd, net->vio, net->read_timeout, &errptr)) { DBUG_PRINT("error", ("Failed to accept new SSL connection")); return packet_error; === modified file 'sql/sql_parse.cc' --- a/sql/sql_parse.cc 2011-05-21 08:21:08 +0000 +++ b/sql/sql_parse.cc 2011-05-26 15:50:06 +0000 @@ -1749,6 +1749,67 @@ bool sp_process_definer(THD *thd) /** + Auxiliary call that opens and locks tables for LOCK TABLES statement + and initializes the list of locked tables. + + @param thd Thread context. + @param tables List of tables to be locked. + + @return FALSE in case of success, TRUE in case of error. +*/ + +static bool lock_tables_open_and_lock_tables(THD *thd, TABLE_LIST *tables) +{ + Lock_tables_prelocking_strategy lock_tables_prelocking_strategy; + uint counter; + TABLE_LIST *table; + + thd->in_lock_tables= 1; + + if (open_tables(thd, &tables, &counter, 0, &lock_tables_prelocking_strategy)) + goto err; + + /* + We allow to change temporary tables even if they were locked for read + by LOCK TABLES. To avoid a discrepancy between lock acquired at LOCK + TABLES time and by the statement which is later executed under LOCK TABLES + we ensure that for temporary tables we always request a write lock (such + discrepancy can cause problems for the storage engine). + We don't set TABLE_LIST::lock_type in this case as this might result in + extra warnings from THD::decide_logging_format() even though binary logging + is totally irrelevant for LOCK TABLES. + */ + for (table= tables; table; table= table->next_global) + if (!table->placeholder() && table->table->s->tmp_table) + table->table->reginfo.lock_type= TL_WRITE; + + if (lock_tables(thd, tables, counter, 0) || + thd->locked_tables_list.init_locked_tables(thd)) + goto err; + + thd->in_lock_tables= 0; + + return FALSE; + +err: + thd->in_lock_tables= 0; + + trans_rollback_stmt(thd); + /* + Need to end the current transaction, so the storage engine (InnoDB) + can free its locks if LOCK TABLES locked some tables before finding + that it can't lock a table in its list + */ + trans_commit_implicit(thd); + /* Close tables and release metadata locks. */ + close_thread_tables(thd); + DBUG_ASSERT(!thd->locked_tables_mode); + thd->mdl_context.release_transactional_locks(); + return TRUE; +} + + +/** Execute command saved in thd and lex->sql_command. @param thd Thread handle @@ -3093,31 +3154,11 @@ end_with_restore_list: goto error; thd->variables.option_bits|= OPTION_TABLE_LOCK; - thd->in_lock_tables=1; - { - Lock_tables_prelocking_strategy lock_tables_prelocking_strategy; - - res= (open_and_lock_tables(thd, all_tables, FALSE, 0, - &lock_tables_prelocking_strategy) || - thd->locked_tables_list.init_locked_tables(thd)); - } - - thd->in_lock_tables= 0; + res= lock_tables_open_and_lock_tables(thd, all_tables); if (res) { - trans_rollback_stmt(thd); - /* - Need to end the current transaction, so the storage engine (InnoDB) - can free its locks if LOCK TABLES locked some tables before finding - that it can't lock a table in its list - */ - trans_commit_implicit(thd); - /* Close tables and release metadata locks. */ - close_thread_tables(thd); - DBUG_ASSERT(!thd->locked_tables_mode); - thd->mdl_context.release_transactional_locks(); thd->variables.option_bits&= ~(OPTION_TABLE_LOCK); } else === modified file 'vio/test-ssl.c' --- a/vio/test-ssl.c 2010-07-15 11:13:30 +0000 +++ b/vio/test-ssl.c 2011-05-19 09:47:43 +0000 @@ -59,6 +59,9 @@ main(int argc, char** argv) struct st_VioSSLFd* ssl_acceptor= 0; struct st_VioSSLFd* ssl_connector= 0; Vio* client_vio=0, *server_vio=0; + enum enum_ssl_init_error ssl_init_error; + unsigned long ssl_error; + MY_INIT(argv[0]); DBUG_PROCESS(argv[0]); DBUG_PUSH(default_dbug_option); @@ -91,16 +94,16 @@ main(int argc, char** argv) ssl_acceptor = new_VioSSLAcceptorFd(server_key, server_cert, ca_file, ca_path, cipher); ssl_connector = new_VioSSLConnectorFd(client_key, client_cert, ca_file, - ca_path, cipher); + ca_path, cipher, &ssl_init_error); client_vio = (struct st_vio*)my_malloc(sizeof(struct st_vio),MYF(0)); client_vio->sd = sv[0]; client_vio->vioblocking(client_vio, 0, &unused); - sslconnect(ssl_connector,client_vio,60L); + sslconnect(ssl_connector,client_vio,60L,&ssl_error); server_vio = (struct st_vio*)my_malloc(sizeof(struct st_vio),MYF(0)); server_vio->sd = sv[1]; server_vio->vioblocking(client_vio, 0, &unused); - sslaccept(ssl_acceptor,server_vio,60L); + sslaccept(ssl_acceptor,server_vio,60L, &ssl_error); printf("Socketpair: %d , %d\n", client_vio->sd, server_vio->sd); === modified file 'vio/test-sslclient.c' --- a/vio/test-sslclient.c 2010-07-08 21:20:08 +0000 +++ b/vio/test-sslclient.c 2011-05-19 09:47:43 +0000 @@ -50,6 +50,9 @@ main( int argc __attribute__((unused)), Vio* client_vio=0; int err; char xbuf[100]="Ohohhhhoh1234"; + enum enum_ssl_init_error ssl_init_error; + unsigned long ssl_error; + MY_INIT(argv[0]); DBUG_PROCESS(argv[0]); DBUG_PUSH(default_dbug_option); @@ -60,7 +63,8 @@ main( int argc __attribute__((unused)), if (ca_path!=0) printf("CApath : %s\n", ca_path); - ssl_connector = new_VioSSLConnectorFd(client_key, client_cert, ca_file, ca_path, cipher); + ssl_connector = new_VioSSLConnectorFd(client_key, client_cert, ca_file, ca_path, cipher, + &ssl_init_error); if(!ssl_connector) { fatal_error("client:new_VioSSLConnectorFd failed"); } @@ -81,7 +85,7 @@ main( int argc __attribute__((unused)), /* ----------------------------------------------- */ /* Now we have TCP conncetion. Start SSL negotiation. */ read(client_vio->sd,xbuf, sizeof(xbuf)); - sslconnect(ssl_connector,client_vio,60L); + sslconnect(ssl_connector,client_vio,60L,&ssl_error); err = vio_read(client_vio,xbuf, sizeof(xbuf)); if (err<=0) { my_free(ssl_connector); === modified file 'vio/test-sslserver.c' --- a/vio/test-sslserver.c 2010-07-08 21:20:08 +0000 +++ b/vio/test-sslserver.c 2011-05-19 09:47:43 +0000 @@ -52,6 +52,7 @@ do_ssl_stuff( TH_ARGS* args) const char* s = "Huhuhuhuuu"; Vio* server_vio; int err; + unsigned long ssl_error; DBUG_ENTER("do_ssl_stuff"); server_vio = vio_new(args->sd, VIO_TYPE_TCPIP, TRUE); @@ -60,7 +61,7 @@ do_ssl_stuff( TH_ARGS* args) /* TCP connection is ready. Do server side SSL. */ err = write(server_vio->sd,(uchar*)s, strlen(s)); - sslaccept(args->ssl_acceptor,server_vio,60L); + sslaccept(args->ssl_acceptor,server_vio,60L,&ssl_error); err = server_vio->write(server_vio,(uchar*)s, strlen(s)); DBUG_VOID_RETURN; } === modified file 'vio/viossl.c' --- a/vio/viossl.c 2010-08-16 12:50:27 +0000 +++ b/vio/viossl.c 2011-05-19 09:47:43 +0000 @@ -144,8 +144,9 @@ void vio_ssl_delete(Vio *vio) static int ssl_do(struct st_VioSSLFd *ptr, Vio *vio, long timeout, - int (*connect_accept_func)(SSL*)) + int (*connect_accept_func)(SSL*), unsigned long *errptr) { + int r; SSL *ssl; my_bool unused; my_bool was_blocking; @@ -160,7 +161,7 @@ static int ssl_do(struct st_VioSSLFd *pt if (!(ssl= SSL_new(ptr->ssl_context))) { DBUG_PRINT("error", ("SSL_new failure")); - report_errors(ssl); + *errptr= ERR_get_error(); vio_blocking(vio, was_blocking, &unused); DBUG_RETURN(1); } @@ -169,10 +170,10 @@ static int ssl_do(struct st_VioSSLFd *pt SSL_SESSION_set_timeout(SSL_get_session(ssl), timeout); SSL_set_fd(ssl, vio->sd); - if (connect_accept_func(ssl) < 1) + if ((r= connect_accept_func(ssl)) < 1) { DBUG_PRINT("error", ("SSL_connect/accept failure")); - report_errors(ssl); + *errptr= SSL_get_error(ssl, r); SSL_free(ssl); vio_blocking(vio, was_blocking, &unused); DBUG_RETURN(1); @@ -220,17 +221,17 @@ static int ssl_do(struct st_VioSSLFd *pt } -int sslaccept(struct st_VioSSLFd *ptr, Vio *vio, long timeout) +int sslaccept(struct st_VioSSLFd *ptr, Vio *vio, long timeout, unsigned long *errptr) { DBUG_ENTER("sslaccept"); - DBUG_RETURN(ssl_do(ptr, vio, timeout, SSL_accept)); + DBUG_RETURN(ssl_do(ptr, vio, timeout, SSL_accept, errptr)); } -int sslconnect(struct st_VioSSLFd *ptr, Vio *vio, long timeout) +int sslconnect(struct st_VioSSLFd *ptr, Vio *vio, long timeout, unsigned long *errptr) { DBUG_ENTER("sslconnect"); - DBUG_RETURN(ssl_do(ptr, vio, timeout, SSL_connect)); + DBUG_RETURN(ssl_do(ptr, vio, timeout, SSL_connect, errptr)); } === modified file 'vio/viosslfactories.c' --- a/vio/viosslfactories.c 2010-07-15 11:13:30 +0000 +++ b/vio/viosslfactories.c 2011-05-19 09:47:43 +0000 @@ -165,7 +165,7 @@ static struct st_VioSSLFd * new_VioSSLFd(const char *key_file, const char *cert_file, const char *ca_file, const char *ca_path, const char *cipher, SSL_METHOD *method, - enum enum_ssl_init_error* error) + enum enum_ssl_init_error *error) { DH *dh; struct st_VioSSLFd *ssl_fd; @@ -249,11 +249,10 @@ new_VioSSLFd(const char *key_file, const struct st_VioSSLFd * new_VioSSLConnectorFd(const char *key_file, const char *cert_file, const char *ca_file, const char *ca_path, - const char *cipher) + const char *cipher, enum enum_ssl_init_error* error) { struct st_VioSSLFd *ssl_fd; int verify= SSL_VERIFY_PEER; - enum enum_ssl_init_error dummy; /* Turn off verification of servers certificate if both @@ -263,7 +262,7 @@ new_VioSSLConnectorFd(const char *key_fi verify= SSL_VERIFY_NONE; if (!(ssl_fd= new_VioSSLFd(key_file, cert_file, ca_file, - ca_path, cipher, TLSv1_client_method(), &dummy))) + ca_path, cipher, TLSv1_client_method(), error))) { return 0; } === modified file 'vio/viotest-ssl.c' --- a/vio/viotest-ssl.c 2010-07-08 21:20:08 +0000 +++ b/vio/viotest-ssl.c 2011-05-19 09:47:43 +0000 @@ -60,6 +60,9 @@ int main(int argc, char **argv) struct st_VioSSLConnectorFd* ssl_connector=0; Vio* client_vio=0; Vio* server_vio=0; + enum enum_ssl_init_error ssl_init_error; + unsigned long ssl_error; + MY_INIT(argv[0]); DBUG_PROCESS(argv[0]); DBUG_PUSH(default_dbug_option); @@ -92,14 +95,14 @@ int main(int argc, char **argv) ssl_acceptor = new_VioSSLAcceptorFd(server_key, server_cert, ca_file, ca_path); ssl_connector = new_VioSSLConnectorFd(client_key, client_cert, ca_file, - ca_path); + ca_path, &ssl_init_error); client_vio = (Vio*)my_malloc(sizeof(struct st_vio),MYF(0)); client_vio->sd = sv[0]; - sslconnect(ssl_connector,client_vio); + sslconnect(ssl_connector,client_vio,&ssl_error); server_vio = (Vio*)my_malloc(sizeof(struct st_vio),MYF(0)); server_vio->sd = sv[1]; - sslaccept(ssl_acceptor,server_vio); + sslaccept(ssl_acceptor,server_vio,&ssl_error); printf("Socketpair: %d , %d\n", client_vio->sd, server_vio->sd); --===============0173590056== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/anitha.gopi@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: anitha.gopi@stripped # target_branch: file:///home/anitha/mysql/repo/mysql-5.5-mod/ # testament_sha1: 838f46f71d9f6ef5efee7e7c08c50bfa5ed40a15 # timestamp: 2011-05-27 10:22:51 +0530 # source_branch: file:///home/anitha/mysql/repo/mysql-5.1-mod/ # base_revision_id: anitha.gopi@stripped\ # rv3j7mvs33bgm10m # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWUgTPtQAPEZ/gHyxsKh///// /+///v////9gWl6d5hr7u73cH3vvs3w+pJ9PHp970I+mIq99nTtetMPrN5fJBr5vu1xOad3NNm2W zbr3u99doNPoa+9leeYFUB3O7JStDzn3svAenb7OC77gDOy+2IDmGFH097zlAp7dzQB3ePV8yHCW RKoT7HQ+85e93b7z7r2EfNrvA288O++FPnvPp2p3voeOlWOX2wT5976+cGe9tqGnPvgd68+xjYrr rSnub0b21vWd53GzMmkjs+887ZbWsha3u5uOupzXG42yutO99XffX2WnPb3e+Pd5tt9nHfdza2WT YzbNL7btpvCSJACaGI0ymTRo0yJgU9MgmpNqH6o00epiD1GJ6jaJifqnqBJITAJoIIJhBMTVTeon 6p6jNRpoAB6gAAAAAJQCaISaaaBRmo0ZU9G1Iyep5J6j0jTQPU0AAAAAASaiIIQmhpMKfkEzUTaj TxEnqMJvVNpNG1G1ADTQZAMIIpCAQaCaNMTITTAjVT2RTDGqep6TamNT1T8p6ptE0PSDE0yBFEIE yABTTExDRVPejTCZVNoI0MyjAho9E0BkDByPQ0L2doSRPzGEDIQgwOUCEiIAIUMmB2HGGGJV9Pwl 3TxznSTjh2HzPyEinJn+B++H4+bDIdioZB8fur8GiP1yQ9RzqpseWaKM4dzpfV7fa8vP8Lu/4W86 qfHxV1zjBTPGaeXpyWnL0fWIHYKiKvM00Pz33XGIf9eLwGMLE6qpV7/XfU6JuOlSrqkZ+uv2Y5ba fy6TI3GUyej79Bg4cv06aZNBFZ/DJzfx/Bvpf9P3f+QkPwP4nH+ENuBKdRxJyEsjdJ3n8h/5mT6F x1wK5T+ZoPoTZen6cz91sPAaswL6p9ZBc2ieiLv7zGqOOub3kTyzeLSRTUDNAoklaidooM2/hwrk Rj4+1jva/2S7MlfXGoynhk6e2SIjk9O11My1P7mhUT/jFXQpGVLHkiZraOgjgvpa+OY0sQ/mxw+N T9PIb0a8oqyrJnPJb9dPQN9SvG7q3Wz0EmXwbP0Nu3RL9kqj93RmqUvPzEapiT5614qSxNJaNP+X 6cXbdc7ZL22tjpFzo6OjgfTBmLomnhvo2TCLkgeT6CqooIX6U7mp2dXyW3fT4t+x6q1xtzXfyNa5 Hd7q0eKGp1h5iMNErpx9RUTq/TV6/x6p0E8UYDOZ94wywiFrYVXlkIv13cn1x5IqYUcHOGTlgZk1 8opjM5eF3bgVAAboAuhemHphTPBHCSVwhVTS1lIWnW4QmqQULTKdbJNmdjJ2b1EwZytZfVQqVWCT 1+XvwIghy+HrXgx97q15z1Ow3U6c25rzGRuhMEIhAdVwjQw3XyOmetjbLst7OsTmFV+9133W8C5q cTQzcouihyqSGgXOpJ0TJqMlLI+cLLaBDUYbVZJhNXEPqoIfVxFabWKvCuazqJpmFMd/B0uqXy5M 7KDbzvBtBsvsOxEHIU1KOX87j6ftdKNbuYHX6ZgdIG7Tp2ubZ4c7zNP4pYNNcNIW4dF5KJCG1dKM MipnwqrahISRlEg+RDhKSLEJrhPIYAswHC00YR6kJs7ZqQiwwoR9c7vr5f2q/9qw7Lf8u+h9AriI Vd9Plx+XPg5F+r9Ek7KX/XOSxT3dQujOg5xS3lNEKGB+cTxeS3zMKRo01D5m5/iVWNqH5WUAwQ+4 rPSVcUlzkI9eYPLDmZHDNLKp/iYP2fAFO0FIEYgiAiAiAWLIqxVFiihFUURFRgooLBSKosVVFUFF IoKAsiiIKKKT7B48h+IgE+38Xc+XA+2vBpn28vbvqQ8/PkgalDBWKxjEFEUZ6t+O/uwmwvG/DTjZ KdFd2x9juOLMtC4ZtPDwtriFVcWKaprpm9Wree9XZy3gu9WacaNNqVxRlu2dYV1m5V0poeFIUw7D z2ZAy8VTIuqRY8I6dPmRHNKcY07nOH2FpTeWHZmwwKzG/Y1qQrzRTo29C74NsbJYxS103uWmWnt1 IY2XORxwvYeNU8K2a41njq3NXgwxrvRa4SqoyImFGVmYFIVldmtod3nU5KRWlnh84bEw9trDl3WB 1Zo1Dce4Pr9nxQM55g3tiOM79VTooclhXtszPaG+8E+MTbh0ewuQrSbVhJXZFWKxk1YUYaMOKzQS xC2TN3ilXO2oeLWFS1MLQpDQ9rhZUzGbh2Z1JGy6ZFlR7ZMLCwtFZd6VmaaA7vI0lDxxO5JPAiu7 7/Ve9ZfcA5wDRMb9ophcYigbzl9VCRap+pcNycu/YktpD1Oiv9+Rz0+Pf8d6j/K2UVQZvv1dOAtP 3i7CgWK5D/rXZSubE86h5Hb3mu6pKSMUqTzsLdXiOy8Ow02mg/l0+m0uZPXRJLVkYCmaq2qhbZVI qCP5GVGehidBSaBXVGW5dB6Rwm2XL4rNsPsrAtGNorpKNB0UK5TFU4tPn+TVDWUlUxxFTjufSVXN hxNhH/gaxf9AX9onjArtp16RsGJq/N269n9fSe+Peum/oluhhMN4nVHkKITNLEz5mcfQd5ObyxDj /jgj0N6ijB7rW+bfb2tGNN+yBDAwojahwseemmmTEJaDzYTyVPiPkMbDBYH8CZeJzK0FLIwOHuOR zzH3zGRwswnBIkn0lxULA2bD/1oUtA/dApwAWk0Fn+xGnqMI0GX0FAtuV8k927TGRNzzBPT+F8N6 umRAyv3dap9vw5/lAu3Nh/m6QsLfDOjjGfORHE5oGSTsnORlaMvBDH52X8y5+7cK5huoxvByMspS MAy8/tN94/CKknYeiJRHPNt9OF6vuqJySTli/vddkVTNSehPxchMRjO6FNNrmmAD2xCbuZzlWadK efQ20NyHYfCYFIYMA1GIGIIMLIn4580QPX0rt9+yPr1G7d9z2guAmM7EEHs9eK97X57ePgJrbIvu bHEaXu5i2OfONI9zEEB0Oz3jBJreSUcWkKqz9hddpRFbVauf1FfzVnaS4cSXVnUdEfF3B9PpxFKQ nDmXph8BhbHasIbNbjPpeCRuH8ZE3IVgFOdIWL+1R31PIp2xRQRJjukiE1tJ4N33C81FEUFrxGBq XgZZR3YyHPgoaq+VseM5Pua7trLTSIwfpcO/Bbi+LMuyS5vUHRERDy2CuleuPbWzic9OdYH4gY8E dpjknefANVNYmGCAxSEuKnxhD+5yIA3lcv7l9OdA0JL+PBe+tnzPe5o2v5FJT5cUJ3ne1q04iEBS PIOWQzw4wwxNggeq+d7LAmD7vrJLB5x4b1Muff6CwJhe0TA4mJTMaytkBL7fiQFtqcmd9djq+lyQ ofZhU6YBo8zUWGhYbF3N/STfnJA1md1enzCfUKkRE5tZWEw3HmHUj0jbwdro+2z7fCY7rKcW6fCs yAr3BXUFZ8YFSHmPJSS7XiOjLyShIgERm62unqY4sTAyYf7j9scqsSbkRkZkYRdlpcmvQ31feR7/ nqvCN7tPV4y1XcZECRY5JlSie1GPoo5wzQLDdezhEUfr4nX7ivk5pm+ht17OZpBhjxMn2frgeJKW WoZhjPiKPLMOzvqNSYdlugjFv+Bq9XXZ5/l/J+P6v1nuPjj6oFeJeWavpkxX5MZbCrDsZq3Wlw/2 epPF82mhUzBfUcxwUVyzcy2n95u26T7S3N5lf27t5h77LVoW7eeJn2TOD7TgCwBnR8C+Hs411ZnW VdNPfodxp11OsLGkYod4majakG5W7beS57NGyLVHng7Yso6GsjikWuW1U3jjCfX5NK4ZfL4O08Ts fxnp3wy+eIb1GVrXpfwsrU3Q6HqprnJ4VzyR7zxyB7btZnhvEmEIJUkyEoEhGv6oZtOhr8a9dFGO vZsso5ccbutmGNDA0rAIIMgLRED62EtCAUkgX9SkSMjGP00FRMJKjGMEjIxnzh2lgCH5JRVlbAul U6toWMUX/381SyJPK8gPFIfwkLA+s+rWFw+hQ/T77nsIk7PvX80Mflujr+qjVxXRcskk/oZminuj l5FO6vSwPd8n7HGh8rJOEEQtzfIP4xOOONe8rnzjJPYdXw4wCHA42MNT2IcweV/Gnffg+zd7oqLM v0tjzGYXqZyYzNnohlnJP3bj5ZI5xm+yuBdcRlfzUcFin5bcqeVt+eVRSyzBBvnEvOF/tw0SKNKK 8qwuWBlp16hvv+VWrglHjzzlkIPQ+MkpDlgtgPmYggDQFli50+8PF7e8dpfxbuNPL2VprrUeJT/8 JKl9xxrpI+UIPauq+X4h8bTJTPWJEuXHDUzt0+1o3vrVfNRgGhdVsIiAmNvOr/Ah3iDGX/L7Ax6V /o+ro7IlBL7nL8v9mlnLuMgxIUr3qFWBPEoJqfrDFnqDcDDD1AkAh2jzaND1ZwfbaWGQX9cBEIj+ 0YRCUAm4hVQkZbLvtfiahSv31IahmM/uLGUsy1gYt4ez7rUeCGTBDLMCSG1TKStWH0BgDf2Bp2v0 h10jpAdSCGS716a3PVlmBoluAcOx2WNy+sEJYCrGuiOFQe5ptIY5ZivNQooa+I4CmZg5O9DecB5m 0yzIP/w/YzTLLnucnw7+fbxjujUEQmsGAt0UOT0Hmoc3W+jfLCG11miO4yGd+SZHOxeZCHv2kKHe K4QQAaI5MbUKG2TThJUmLxqb6ZeLRIdqDkPBvcT0mwE1tnejjrwKg0SdZ26/f5noNRJX4jH3fbx6 U1tpF+xLiEdPg2Pqu3xwMyVIlRmW2ZrWYIixizbgmMZnPCSJoPlDy6/Egn0Ip5+EuHkd68YXYUQC dvAenzfTT009l9UfYOxdvLPuQZ8E5XMGCxnZM+KieP4zGF0CyMMTEMQyYusmKtda7D83O55DFoWI QFC9C7UJWP131gBP1KJIm1aRySEC+YpIAVSiBDKg8ymCY8jxHLQPcdMZGis0oUcEA/nPmcNjbGMc CWBUEZhjf6APZt72Q+ifz7LlERD5L3wehvxMyzMzMzMMzDMzMzMze9uvbEwIzMjMybflyZMMThUT h0WUdMB2qT6/hovqN21HGkZmTJ+VVX4uvIVoj9Dr5xSk+zn9r8IE4bkNmzYEzJwqcCxaykzJMyeo 7uVPn7fn5+86W5k+q0zzwn31i+jWtKF+oVSIEMiFdEFIW2wihqnBLxQYeCaMhokODhIb60GybsNL KmiFJOCQiwC0NEMYZDSglLpUGzSkUiBh6MySGpHTIxILS50oRMCGUA3ABklkmA9PExLUSeE22sZR JglgDICwQ9TCxgWhGE55mqtqO1UkhiPJOAWfrGGrCB4AMlEAKEiUV/klFEKt8zmvSiukDUi8kgHQ gHHWcuI5oVTgrgSwTgwk8mRhZ2MG5jVKpTaMlyydjUYl55CliOArSOGPn57cG9bW73wnZFNwAZCO z8jWc5qyHWybj32JJGhAcX2m5O+5yxyXM8p3BarYVj3gwwiiCmTThwByOHqQQ0/Am7coB5y5RwmY cLbkmnq9cWUWbkS6BuhUb4cUIAC6BAHWRqdQDOSNTwda1EsvtUxg2dS8X6wZnweCCzxaFCrEmIpA yRYqQsPNHR31zFq33eruqohEHD0EOko8AyIZFXiVN+Mj6jZzQxQa7jma51JuV00q5MGZZzKIay2V jAC1pQ4bcW93XDRdBjVhD2MXTVcg3BQWwxGo0DJDUUjI5YrJJSIKIjyOItBCpESTqgBKFTU/TDPy ouivZLSCAVzIBaxrJVDBiqHQJkP1X6rsNYxDZLGORkR+/vac57lwQd9d5E9wRZvuWdRe7LpEiNyF DYSKwOxMcbjULFauNSAwRzbBQhkiOqkFkInKmYVIEXsMRNfBJ2WJuyvqvgg7DxQ2Oprl/i93jps8 Udam9HhqO0Dq5hXEiqB3qCIHmteUr2wD4XDcQV4tspalYaRTAoHfkeyG2bkkUOSGmt8Tlkyhpc1q rmpdHKqdUtWWdt1mLVnZ9xA3A09cCGfHhs/dJyn3xMtEQpc2wkZUJOdxZoUnH/Bk+3Rma7DkoXBR oEmA5SBhMhYckBhg94Ckq6kaLDmiBQXyrcANK/DtIYL0QogyUahCgJLIogtKKVzvrbxmcSYMAowX VGWCtJcvDDZrJekSDT2T8gXNSch4pBEZs3IcqgSw0SVwlIJDcGjN5JxgSYRUDT23s6i4t0PQdS2u xvSoTxoYImQY53Uzw4yULOXHgf3vUZAMaOqg41+WTdIMUgjmSvGuLC0tzX2F9k6Sn0wqmuNFysng MKdjtJRQTkwaJouEoZ7iiOug7ptDISHz0RE7mk58uB5yMu7wdGsde9Hv7T2I5jOM7jUtl8G1LyIb dsayxrnEcxg6hpbMMuzq1S1b2fF6QeWq1GfhI7zIa7ls7rtA80g3otytRI7qpHXE3roLpkwPHHQl AVaM94nWptUYgQbMhONOp02OtwLtOaW4duvDe63DAs4IckRJC/i3KxHEp3UHA5lEh4eiORIpnpoI t1g+vDGrx0mNxGChTnX7pB6JB28iOCQ/sT7VONac13okvIm9hczeWAu9OIGZrQTbdMgnTrkcxC8s yctp1gpJ7qiLFpEWUKfkUWZaoMJ4PTMjaZdnO2KxV9SfwrO+/Z6c9xcOi/7pXnEIrixlI2cuT1DH UpqVtaaqQ6chUjBnuT7knqCAeONGUgdTYwdceyB6RSzO83nfGOUzQ5N0FjWTsqYzcDdYDlogbQRN eBiVc4eRNx2mZ3nxy5enDI32nfszlDl1LJeK8LikN/F48JHU6vwytJ3cAIDg9YUj4HU8uMmjuGMk pzUNI45pqEOPsxh/CANyqednw++S9R0m0wJiwgzEhy2GjZMaKRykc8BFFpdTyxq885zIYJiErFjZ xuZwSJEjf8kknULk6zK7FiRU3ieSrAq6C9i+pwaDyxceXLa8ntrTWXDm6oOQEh5bIO9pLa1JlMpA uzESRUvANwayRdqDvwEeCrKiP4EHUyY3+Qzd92VOGa4eXWfaiHP7z0KJQGHpQCvI0a7JekUTLbIi Q41ZppSbl4lmlHGi8y94dcLpiNg0uL5LV/fLe91RRBeHUjCnxMWHtrBgF2YtoENkAO7IcGghe61M XHOyDYShKiIbMlajMmmJTCS9dpDfrLWG4q9MbOIjQCQReOHDjUzH0VR/20Hat81vbOUFEEjhxdaw YE9PQOcfoxu15aVYK2iJpepWX2knvovGujL5mnpwa6dzGp3ndvvIhsbg7bPzGNJ9WxPn8xIxyRVx s27ZBNsxce6RQaX06eS5LRpdhMygLdVOui0QcKb+W65hEH0MkkGDxFrBr1A1SEyvYsW04fxEuNuF qCuX0NjRhmKJwkfywLCutgXfjqNMtYMEA7JkEzIZLrTdCUYXm12ORiS1w6bXeuWkTNDqSFQhA0E/ IDa0SxACFoEHBS4CGzQh3kJsmZ0LsVpaWVAD0LnpjZ606WbWobsDo0zGgqQ68blToTNjbzJQI+Ds mNzYF02jfaIxORy6BwdiFIlDDi/UvhjQReg4YmD3DMpOOtNEnvuUa8eexJVOVaxY2v7SRGuTc2VU 8fFJCIX2P6wxuzmd/USCP1XHI8qYgamA7kVAHzcGhDynFZ2l0Gn5DGmDHUZ/VswUUkRwQPqXnUYs 5Xj8VVTxIqRPMWr1QcbBKDa7Q8DxFk3mt9snotvr77fssCIbfmLawiZc/SNMLhZYg10hrSONB468 gdCkny4wKh35CRJ9z4vCDNa0g0yeeoqpZUZaGuUrMayprUqa0q51C5u5esu0jNhitS7YZp2Mdye1 ONtzAJQGhWVgE1ZTpa2EyUKw1Gk2fbh7KHu21aKF/j4EEqNRgQe5K2CjZ1TtE960Oa2inUaC9o8U uaHTKIhZwtiMRA6WMQixhsJ2GgYn4ep075vghXjlyOGxXBCAzoyP25gRW6Pu5ZmTcRB/wJn3iLBI vCz3ulqCyJtYG/d8tRjStUHJW4Ugo302+J4O0i032F2bXp+8pGsDc5UJFN3X5+ZogiHLETCh2Hmc yYqXfuUDqpRZQ2/M42nvPNNzT62LuLhpSTIh5ckEEX7zNi/U/Dq9Bq3wbZ5e8isrVj5FPBiLaBvU 2NOKcmy/JBnRS/JT3Np6Gpc7IGOLOG31PZ6ciDVnrAcyjsqrDDHle1kbqVCfBHD9h9SzoNH888ry NTU855n8zvvoyLO4fLVhz0HkkLG5S1sqm3fvTg0iqG4qZe5jqWsEnDQ0V/JSlWGo8gO22Subalyh 1pIwaFj3a5weRVAxBiwaXjqtcnHBOY7U9jwucDhaAxqNcf1zg6ELkzkzqtz5SHkgog6zW4m+duTc feEzW5vTrc6ECumbtnBgJFDoacSH/l9SCD0R7qCDqu3t9j4qtDM3Wd7ahUeDsA2OWxGxtZO1yqG6 CGaHgmQZe1St76DUr1mWynErCyC5mHRu1dG26DdOGqx/S/a0LU6acTD59c6UxK5lqUsytaFhoLq9 LOotHhTIqzbusZnU4bOrXW2wqOZgIQKATBE4/cvk8qrXUqXC07dg5nhM6QKo0jqDBAl3hfeKPoYV b8N0EGhBnztakZTN7mGaoDc1jkOjSkiDUjuUmOIGaUDZbO6ix8mjSA+GEaHGT5KpQ5mIpGxoYagG U8gJYbcd95yxMTHpnKbYY1Z8RWQXypYtwaIV35haTpE5tOhkZBaexqfzX3DH4qhxSG7k7Eh6KGi6 auoO0SRwU9T8qbbw7wMH1lgnZY6M5A0Oo/QKGHlg99qJJjE/BwcuN8cBfhdzHhI7HDc8Dbl4OT4b wztU1361NA9NOuD4AdM5IPNhIbUeTOpB9OxSRc3ElWa2ccNcodts2wzHQ6CoV2kcsztRYDiG5BdS lNzSRzgrK/AVsFpmjVGdtq9niI05tsWHT2v14L3K3NTWBYqWE84G4JsnJA7aIkZqEve5fPXE7ZcK BOY0icWyEAtlUb1JmJYgP1GM2eupgn2MwGCQw0zul3nT8ywULn3p3JECkSxmRg0e7LvD08ZWbpyc FLnVQHkDwKEoHAxg0pLV7xMzBrocyzg57GSioGKT4xDR0JimpPYzCYEefOjCTFekmeQ9rBgnh2Ep bBJdC3hIkZEGUkwsizznZzJoWhiuSYLuo2bNb7+XmP7dvEk2nKomEYp7KmFI+MTULZJlmYMs0qu9 1iHaL2ELxpr3Onxxv9Lm5qWELEcNxE7PlBkH5OasYCHoZoH214rtBnIVbjmRXqQ1GNaRBDSjpBvJ gVWskuCJGdsthzOHvcuaCVB366TFw20O5tnTsWQiH1YCGCA5ly5Wy4SXuiebm3A2+KXH6vQPcFgR Qo4FBzuIuE4YBIVCjgcECTvwgfNuh1zDqb7annbdiTjLv0gBgex1f3Gj0K2OvBec0y9Soddboid8 n3kDwt8c1NMi2/jGHjsLUItc7mKr0KTDbnImeSt8szrJTizE6B3iSLFBQWLH7Mai8+3P0HfN+nic us6SFQEpeT9gJVfRJbZHuO51qTn0r2Pp0YLuQ3zTOWyb3AwtltfUs/ZjCRDR8CoJjXoUjLxoUoem qXgmWnzct2TMmqUmaj9nkRQdrsZztih3N1psNrfJkpL7mwvcZL2Zvtoz3zcm3Ka39vTk6y/CduNu B20LuQ/4dGMApeo9UpzcpIoZgG856G21cHYjY4Ztqw1cCJJkLFIF4QDRZVaWIwPXhWqXHnsXxABO RqqCuqLn9A29dC0z5FzYge/xW1Rsbt4KA/qXNjqSMyPgJHTvPQnk9bnX4EaQJFyhMyS0il9PYiUN zFWbtocUPhvkp5pfBmrKE3WYgblhgwwymQ5jQZNOzw2Pa4inJ0vJvQuNzs8XhWbg3bWQFhwe5rMl 5zD4nYjvbCwShkKUeDpM0tHFu0nw8j5U+Hm0YttVqsSwsMvqVTEVfyQamoyRhVTCYas3PjKbx4nT iSlOml+uA8cY6w5FZCh+xMLVXBK79JBjMY5kzeTEB0xeowDuOWA+rBFMgmYuwIQJh+p7tKQ6L+6H oJ1CjXtOW6rv2dsQAGsbASq30OZNBK5U29LqXCmBe5FAWSVDIl1nQtsvMNTQqkdvRBgvdAYed9zB ZqgWnjguflWTXu7zujodQxygZ5H12LuLGIUcRSWEjkkIIRk7KKO/m+jC1Yd8FaJkiIcs2lOOY8R7 ukWXu6kcyyBjmh8t7ltzFxu6+Gdz2JG/S+bonGg1zKVcDsfP6n2WO3alDmkLb7janPh4VVh+D7E6 1u/V9DQxEulWB8G5Bj2cdbkjXg3G0Wt5LMNx7jv58SxoQzYwa/nbTXTcjfQ1tMx1KEzNCtTIQLlN iP0J3DVB5Nia6JBdyTCAPqpJ6AsGTY/NGxcxDPBpJPN3Dh0Rs9qGhcpQu+ZGab34WBFUYJTN9ku/ vjO8xvvTI0bG+pC1qbkG+KCZ8jYYMrI+RA8xt9FU6t+iobbbnQ2OtpH363CXhrR6ELEMtrhtPJ6j rQvDMw6hILTt6TqSiFfuz7EPa1K+ZwHodoHSr4G10GY2veBmA4D8Z7j4n9Rx6jv3iq8Et4hzp6ex 7vBs8Zxaiy2GLmLzL5tovqVmarBtu5LR5hpEMoiDsrGnRh8bYUgewA5b2cjKjBycJGR/mb5lEuUv Rb85NbqvLI8sHsc5GH1ByKNgVAwZhjYoPdci4rB3ocaxfNw7x7JGryxX8tjOxa9Mn0Ou+hEMJMVo PL90Fnxbq+udUQTcJl4u809OKaHUwbj9jHmvisD/FRdtAAKFg24IPyNEV10B8DXpfB7k5nz8litq YNnhDoeccmkEGB2CkeJj98wMHWhu64QicC4Y8UzZ5qbHKHQDiyHM9WbRHYSbsLLp9hdrwjs950m4 5IkKDrwPLoRhr9xWLddE19y3PBDt0+GChQ6WKlxgiYH9tojdYesxxsM3bQgS4KHTp2q1VLERCeJ5 7ejfZmjeAvnOb+pRwj49NftSkt57NdvTLXlHQhDgiM1SEDXrqvHowMJss6gqmpIFVnk/GUiz+lrH Yed9CmTampoaG8STGvstRwjJAHlDU9DI4o4uaTIkDZjr5xNRz9rYsalB5Q4suGJStdfro8kMCpZ1 BBs177HiPNPYh3eR+g0U2D1Nw4a0uUxDU7d+bwFeh8NPReah5Oqov8ZnanL1dOfL8z1OuE+GKXxH xFYxm6HWczENXkOTp3znL5m9anM5HlJRIGTAioKUNLkvcJblgngEV7QQcpMeh9ZnxGNmvhjFy2M+ hLKNnqGb5N5TI5+M/hbZRUBrpyQXMZRnYcPk4lIe2tcGug4YZAlBRXFEJVNEjBQtNzxy1vjjbn2w kkMObN3KZM1YoTQmfOWOHL5PM1M1Pd5rqZ0mzhn64cFTnBJnVdGDiRL6v4bU5cfKdIcJ+lNeX3YQ 0xgHNogcI6GjwXBBWH5eG5gpxdx9KvlvoER7toGeveMzm7KRiZtLG0OXdTJpF2w+xKFowzoSIcky LqLUoSVb6dKoYY2yTMjw0IzxpQZ5rKBgxIzvo7pANFYbNNiI4g7pRTY0skD5p7fJIH6C3HQjuMlk FBg5kDe0NhiixeRyDB2F44cUL3OhEealL9bWmQ63uYynmVUbQuUHlLjigZrLUbQmSLmSpOzGwjyX w+nqewiKCJ+aFpzEoLckU7eZBuFnJS9rcSA+qDNCDPpvhtszTToRhowxic5zbzkeDEZh8s0Rqopq ojDXnDGCqudUR4siqBohRDpWjRLyBuEha1CEi8cidIv+OkZud6EoHwMGcmswcRdcV7FF7/HYiSEl I2ma+pV1iS/dQm/DmpxvnMspFFRx3K8mK07soBxsw2mR1EGSxjB0Uz8dXnJS0qSyti3HvexRnWfS /4ElohTd8VD1SIKha5UqbB37P3IrI6o1azKR77RO5XmyCqXJCxkjDR28Qe8yVZ1hJNDBKg469ewp bzNS9uSItDY2DD3RSBmQm02LbE+BoJtjnkc9aPInOxl/xXTpUsg6arZxs1HgBZhzLaXD96z3mEjJ rrnpzvvbXJE5wEHdHlFruOUqzYcQnQ47B1nPpFr8XMEDsfJIJUi7L9CjhxBSNIdSaQXM0OL3VCNr Ep1Nw7o0HmiqdzmFSp+SFdaFaDi48riZaZY060LlZ231vhxk4PzoPyEi0zBx9lAfsXapPaZYht18 o7naxWkGnpOhS04gt4udIOyx2UXIburOoMrpYo6NT/9iYPMfO0XZrPk7LMYe3z/g0JU+U04QdyhC nEhDENHS6qj+pXTf+v+Zv5QYBlJMSBM5FCvczPncVmDXQnQsR2IQWpLK4SyqmKhWg7ESEokN0OKB kyBYbhG1VDFQoXQFirZvIITm1grNtkRhMGIQRCEhBAHhcjfOrqyvLFKYEl9FCiImoRlQjJ1KFQSs CADmSDBJkh8urVM7DTbteERBDUIJSBrCFyBYaLFEddNn4+73phrh3sfh7MaVWD8moZT4gZi6AtVq jytMN2v34rTH4H+d4ZqKHwyeXcODbSX+EYPSNV7BjZr2kbtdvFA/dEAhf3i7aFH+v7tXjFRwuvMq j/U1qRWIi63Fmp5TvaqDgiigCI+klEpERIiMGKqwVGmJR5KVUUVVQuXS0FSpRZKYsaLWQpBSCKC3 FiQAqUFIgyCtSqoFmc7mwIn6LrukDxgQiFk+YdUg8VCaD+FFpAfB+Oak/V+f9ISjTMmEdtlSVZ5v 0isNBJtljNQ+phBJMmxCaFAAsASBBoEJEmkUAvfqtT4fMipEP9f8e5U/N/sroMzpHyAw/H0BfRWb 6wIXp7yrlJROMZJW/6JJ9v6Fk3KKURqaQh2kMKsFAFILIoILIMkWIBFIMgXRMf4q5X/4IDYW4VhE 7pUApAUiCO77z/bZbYMuR78l/oNaCTCra+prGfxNgz/Iw3OAl0fjXbGrJmYHPjF9pxhCsBVmR4Km tXvBwCNEvv9P99DTJpBzZKYvwYOt3Vtow746IHVCu7lateeydYwMLDH5wLNWcUqFey049FBwuDIP 91U2q8MAXRf1SHrof7MOEch/xruQcANAwV9XGaga0q3AEmOA2tDCsnYefjQaeCyMRfAd8Dgfcgj6 KGHeY3fsOBvd7Fc4qNImU+khtN8rcBN5FKdUpDdS3sayysAhl5bhnvy3q2C5K4GQP0NeWscXUED/ h9QNo3Oj4j6O04bzYnSEqgDReCuuFcJf8aFZjHyCa5CCbk4WDzCD6goyJEChYJ5ty6CGgwp1GACp +wmCBiJcjptkfZ6I2Oi3EOD/Qwndga2ByqmzcCz+mAvOkgEtgIGFjiam8n/xqbgeA2kgYtUbxoK2 FcKBRXjQaDQPj5FrGe66FtV2gIQrwk5NBWh9UhkJMG7nJDzgtV3lpsoVq4T0A6TXOSpK+ceQLl56 DqIiGtG3hjCGEyYEmauSUhzADapXFOC0PI9gmVz37Qdw3q2QDJLgXMbGVnSBblYDCEZGEPXnJoQh uAldfLRWKGo1DvUKYJA1g6YTnkN6AZNT0GErLRQwaAdS0+HyXiSw5uIjvBgXqmThizeI5oT467mD m6oidc+Ywm+xYoNY4VxHVCIHbCbCAdomyEIkFuS+nyqZ3K1OFW95aOsapkPplvbK3jlsdUGO4wXa QQkCf2RNJnhkQPrCIHVx2LLZuHaYEji/3DA1a5Y5xRvIjlQoOyDdByWqrB4DBCRQiYViVNYJVZbk NyXVef3FOPCv7O9vh3n7cmYTeMsdZ0K+yTrK2smrzDKf0H/N+IX4HgekqGcH8j6vrKGr9RtZwRZs g3/0hU/ZkqSi2xBI31lw1LhiKqIiRh1VMfKa8I/yWc2x9MhvyvfYhKEXoRAoKColEaKkkogFFRlV 4DIAYIzoKJ+UjLJMxa3FVv6y8bigv8QTO6StWgx/ZBBoozP6MlJGoST1SJKaZIgdraYLhVMzW71/ Zk6rmYI19UtgYSVhoQmRuSSVVJthmxg3TIawoS8olk8Pb6j66OR0/LY2xKD1hC+LPy/HowvUwQSu fV+Y/me83lxPAlGFX5SpmiJj/xJVTUWMS3EzyjQLmbyrnkW4r15T2DbDGRTwrTxO2T+oRz0OhY5k 5Icg0cDXg2CvsU3NLGAgeqzk1LZKftnyZNzzRyW+S07YBxjS4xuQNCr7nXYYZtlAqYJqsDgxS9OZ mnv3FtUuCEwU5BqaZylaNaxjJyI0FgMPKT1q8D9BAHawrQgCIWe2GGQU215ctFDQmmWo33nnrnIG cpA9rMLaRkDifCA4bdK2W/WxQByCEoYIfK0eghINK2MCbuvZznUWxK0bAd08Oc9Bx6Fi/XC62dUa HZVuLHoKHiUkktkebBpmbzENCmhnlxk0yJ2nI3XDwRSBRPZrpdy/BjnC2LmvydoZVqQhfBEEQpAd qd+/aeMTnQ5mbbLyJ2bpJEjP+kzbwsB7XrgcdGCEFkxUPdcnFtDIkRq/wUTPcodg1oHiQAVkdL8D OgGUyq4whzD+R4S/H1GswM4bFzTOVYGBHmMqD58T/DhUnpGBzjaAQqIdWf1inExT96dYGWq4nnnZ t1QA59GbDVAIkbJ5jkih8KFaUHaTpxqB0SRmgz841ICML9sZA16ATdMSA1UNjRo6yKJwqU20wDEE gRhQhbi6bWS5iR9hUgl56VtmDoivD08VbW24SxOXuBOLxfOC9KHg7jqXj3m/qMGLR3nY1rA8B4Hn YDyj1Ju7x8sMN9ukxS8g2kELYwbycmMCnyKiU4wCZqSxpVsFs3vGnVMw971A0DVUPyIjjQlIdrkK DD1e/6msgzQawzoMp11dm173MSmKRghfUnZxQ1JsIY/V6ChcsXJsdKex+984m+DUqTNnMaj4vNNw j8UEuxOhyxt0Yf48pIJjw33pAqbHv6+h8lzk8CKiXvjpHtOkDY9wP5k9zqUGed4fAgUGSdGxc6p5 1Kng40O3X9RgDF/E5iQlqYKkiMNhrdS1I+ZvKV7uR7gAhVhSC9O3E18rGfIM0Y+kzS2k0uwC5WLY t0zfUu4OnVc7HkQd+bmd3Z1xoeU1PQdc2Iamw1BKGgShqCVEqCVEoEoaBKGgShoPaBzk7CdE8xy3 HAgiAIGFCBhRwGBDhCjoaHdopC814nwITkPqBoUL0sKijyPU8fxr/GOuFYYhIM+Emsh0DpPKQc6F AP2QJlC4Dib3x19jBBn8lAW4emoj5xlICsd8IQvq93V4xhbdBaAYMCQrImD03Fl8Du90kfA8vgaO tQt7ORZEgVyRh+1Tcg1EFGxg0e8o0WcZdPcijEkc/QX8raxaxu43Hmh7rO2pXSpqajrG480Ikjus BvAoQXgdBwxqeiO/5ZIrqV6Gw3UxYkbmNBIctiL+iUB3T073PFYPzKDjuVCvgYzqMSBjc7NQ0JHk EQebbeKgWOGOhA2IdjRzGiwdSyXN+0swQTXaGzFMeSCDGcJwbj+v9hV/88z6EQKLHkb98rB9QuB9 GSqyY/QPdUITGYY+jVS3zkOCXj8xJHsl20OCJT09NCZodmCLFipQ0LyA2gHBjgB7CrJOVFLkeYmI bfNVkq2rIwpZ08pfzzED6iIvJ6iwZvmEw8EajOZ8ujmJADHYuj9MPvZZa+BkL8sbjgSNce8V2t8A Q6DrDsIYJpBBRQzFJlAGusH8o7AMGR+L1ftUNihvADELZeRXcQJf11PMo4vJ4fme8DFgumRKEKOh OtlRIZxCZAYSYYTwExQCIkAEyDz+T3P5157f62nFOWMH75vshtqgAn1MX8Oqhs2eJitoblgxTFCl M9sSuIxWZ63euipYHfu/9/lAjpBz1LXREk3BvANAu1YoOhYZUtcW6YK/MMO0MkoJshLGBaWVUjJi p+bO3NrkDxQawO/iu6QW8JZJzJGRDPsK7PmSAQiHjGTklEGUl82cmUIZyNBLkqFFypSCtRqioClS RgNJsb+zl9zlptWvIwWShmDor93ySHzcpApmukNpSJ0Qi7JXz+hIzFMsiIL+k9dEY7J33b4JB/DG na78ngWMYNdCBcaf8G36mpMkOcWPn/NaA5l81vWW7ORMl5YNZLJ4JDqObjAfX+LYoTuckK8Ko0Tl xYl6m4yRQYTDD2oanC2NeIoPFDJ506Z1DQowSSAKwK/QaJFNA7Dzobj4kTgPNkMyBhkx7bN5IQim LkjL69Tv3abGZHCQVFIhrqclNO8e5zIuPiWOiASt3oKAMlFYmHWwg7DTVeBVeVWj5SncbxU4HiCz e1XaURpA5SGot2SSJIMxWkBjNdjp0aNBjWXYTGSwWpKdUKCDg5IesWTjLLSmSk7TZoSxYdpkX0k5 zGId1OzOVGPTdlv4iecMSCmxTemOB/Ib34sNxRKke4OlgHKn7vxkjW1LnOcz1N0XHMoooEhicMsN iPrOVYeQegjrEAdieQt1bDTwBkez0fCjrQexd1IsmNaaDyOw3LA7lgkEMhgkEMlmWdhlyCyuF7Mm WLc7M1aNQ5vSOwiO/Aw7tEa63mSCMV0vqroSYZFv87wsT3AfNyzo+8bByd/I4joVTkWodhv3ndz3 sbij+JyCf23w50l0h3YwXjCB+CehB+p/lyGTU1KhHVXLDhrmo8ozz1T3MKicGGHWrTH8hIUcrNLq w/QeCQ0MFSBJTiUYgu2mHc50mtGu3kQtoZTSiQVvyXd01RkJxPJgrtMGwlMITbIxOzS8Zg9Jky1K q8+jY2G4boJkzsaQMLLoMRqOAN5FCleOn1/TdVxeXSAcRs0grfFINTapUqLnJfSsV5WJTW1QVDFI uCe+CBDdQTGiZBVIARVc7vb2HbweRXmxQfgHz/T07kw+cTKUyw6/7/jmvPX4+8c40746z02707eE deDodi4dofdhEGX1wSTux30aD3niNRNuOJlzxqaHyBExRmUGJcHfuL554KE9TU0HkzuMOO7M/w9L 96O+cn59u/lPv8HYIPq6Ep5+N7S29HZ6dvd07U437+OOX8KlJc9OY7zjb2zLCyZX1PIgeo0+Fcgf Eqevp0X1lqezOUx39D2dxwM4vq9fyPZ3E4Oacx9GzbHUZqkZs34GlOm5cMYO6hiR9Gd8HbJkgspj 0K9nmnl1Y9SSQxJIVOedjIaowUZSCgsWEYqsVijFWQaCJ6txcwIHMSEL8OhESLamTMOLsxxJbjA5 AfE0BDKhLbKimGsyQ2nkTaI4z6Xu7eRQ27zYQW1oeUd9SS4xMWStSeJAceYyHELyDYQegAXchOgH XuSYeyYQCnsOAHPsMfUXyUfGh6U8zNwumosvfGanjJbLZeOS+SjQ8yYe8SUaePseB3+HqdYnvhG/ IOQzJtjKyqp6XVeh7HnMNjXvDciZ5v+n4Ma9XkGVnM5zGh9OnMZPzzWDUizyCzx7B60g1y2c2Vsm LPNDdfJx5tWytIJBHbbs6rQYbPaHDSbUEp0IIFRe9saS1FRto4BpImAYYuNyvXBVcigbEgjOQ3ox sHR1iyF9G+SzLFhzWTbeR9vHns69OVIMDl1lcvK+zi+MrxQlinSBxVjGmfY8rSsaiPThlaHWj70g yABKr0d2JuGS2dIMvAs9HxaD3EEwEkixBhdKgUMLavGlGSO4Zc7JWJKLSkoBYSz6wvA6mhkn+5qQ Iy4VoaiX5/U8KOe2QKgMkgwrW8QFmSRE+75v/tqnX7XMaPEvVJBqwHHsLntPv7ELvQnQAw9MFRbx mw5Hz5G06zbpHja4vZKnwpdIX3o3MjNguFjqNSXLsuTQrz3ALS2pghvCzNCmAbIEQwA8WP+UfuMU EvDa5DWQhzc3u8hR7vRPu+2ZBBYe+qixZBIMgvZMPlMkRA8+ceAGChDoRJ5yofhHUR4GopNiNZbS uh0lb8cKmRwvssLRkHUwjK+R4JILphBC7aKFhRW8iohwhdyKQ3Zw/fIGBgkQqtFCGQwMFJAkIhWY Yp1un8JlEDHZeSGI7TJuYQ8E1IAXr07yC3lACND2oVh87hliCEtrOUlmkOosmQQgLM4scenUbZEg E36d5c7FDhtOGMI8Eg0yCTERECTMMMzf6SWKU0978pelGLiAkRGBzEZ2ek7nt0HtPSGVI9Cgkmp7 y1TkoVUWTTFZ4tTlHKD2kU+lBc1MncRkrJ0YspUUog3LQjbKB+DhN9xhg1NC5DJXQGk2ry2hvEjc qgiW8rmSVTkuKx+25UY4HOKHXR56o4y/pfcyTqPGIlll0Kkx3BHTQp4mxibbG50+aXwRhyC80kzD 3N1HjDUIYTig6uBS3OTQwEIpQPx+XSGNAj0OKfwdnZDWgZkTPhf0gcFPA5849jk7EamBAHfZ08tp aWmm5AKQMWnUj8RdvUQBV25/EX+iweyDGvRe4roXxR6GyD+CqSZBvGUvRVJSmIyVT6gMsgsC6Yht BxTV5vf8dprfptfho+LqhD3o+AFQfgQdjLFAf0EGqEe5GOeFDmUMlxN7047FJiaxdYi3arjCOpIM gLiUCvHHE5CkMQKlcqyow6RDKtdeohYt/ASV8opb+xiDA4gZHgDBUY3RBZAphMdwlyXMAssGA3Rs KYWdToaIaDj3VHmGKGdGjh5PucmHVIRD/zXp0RIGGUnF73aOx4Pb5HSdA9Dh7huTOZsWTKIJKhJ6 eEmaqkFL5HYXNDinIqES10muyMHAsalEo6KEb7HGOVWCtNhn2llnyARpOKtxViSdjQgv6FQdAqEj xNqqKzAk4Gq/ULHOPja8RMo7YRdKvCIOxBrqNS6qYFu1IHnOOrj2hstN/QwHdgMUnwVKiiDAol0P XmTIfGXHBcyoQCVDAml59zMdw39oayniwmwICDAU5m7GcOWSANcQDmBAPtHmYNZ3OhNlFKErfwhb Schg8YNeAnzwrNtNbstAu0tiJ7jyw+ctGLFFkDSd4+YZ2WE368BzmoFB0SYa5DiNRISYQ8sTvOve 1qG3vFPaZFu04BCEA1U1r9YTyNMU+GsU9HkA6AfFCevhvADtxNnC3H66e+1LF3h6iJeK6mid7kZs +iECbWLAC9aO3AJBtmUDUnAYFjWZTrQeRiZD2oiHX0TNSHB2JiTUMgxxM5M0KctIHc9To6AXqRX9 A5KbVNZ46/BInyNiFBqQYI0WrIFTuUId5u5HGCACIIFAM4VZOr+2glahM7SvkhCBlTFQ3n8zCfEi UBxhg/37ENBAMxMGXfkHac5+0RHBXM6p0fWocAvbFOi2H4jaiPrACBMgClA+E9G/2GoCAtKoWYqG rHhC88A90CW2XUCwznk09H6XQPKx++36JIQ2TfJ/VYynnycbnHIn3E3PPgabMZKsOwuV9c5ETzHZ gSvMNQ1N9A9CpA7UyuANWnNOkHl2kiE4eYXAO+LpwgA7wcWg1UZfxbboiMApIZsH37v1qGRQsUP5 Jae9Ekv6mSazgMDrFGDICRhCCitwnuqesOtRh2jwYdm9CfMBzvYmxZOUdB5NIYYgYGIYISBhPdLw wC1hDQAjf6FMp+yO+7mIV0aACyPAxDCCLkgGSQdZ2D2FBrVsR13l6i0gwIgTFJN7g73PU96w8BsR DOyiQXoiy1JJI1F3qLEsEsQEGKH3fv2Pm7w9/Js5YBzB+j2qJ6u9DNpxlEbJMoOBKRmYlWxf1DUG 50IdBOpbUZVkLfG0MoZA/yAoQAuzkOUlmvgvAvFl2JrZFZc/Mh2bx6GDJuV36B53YIWQ8SBm3klA YSrMjAxED3hiEh58El2PA8Wj9yqHXHBQNhGxFIiK4whea/aCMi6iKHJn1fgjYTPzk1IPkhEjkQ9T 6cj14Oo4vmPeIlgonxyGQhT6HeCSHiaUyGowQ9qHqCcUIHWm55PinSaCRmwTRA8jiOB2D7MPYhcX jCNyRxOrKCOVFZoLDQSF3WguWAYE07JFLS6MoHrwGhDUUc54dsejUC4jCGUAxA7giRoyhUSTOlEB ZNTaMCjzHIJA7eTwew1JzIVTjCBqIIgcBhQ6smRYTmKkjSobUsN7aobWFE9YQhgiIjdDuvXUBEEB ZCsmADmkuzJARQ7rTuh5PSyqQsNGd7iejYOTUcbW5zwvUnGM0LFEPEa51Q0wCoJ5mFSSCKSLBSAx eZogyNwFQkAfDWTJqbFISEEIA2XbjzsfMwwDf30yDOC8D2CD5z6RcCyKeo2mtDWdpOtN4k252Pg+ HFXhC6jEMAbtUzSZ+mj0tcuhA246+KEy/cmQuKh0oWFEf6/3Sr5jgoSldIWSgz1+M7xzyJ0ImxRZ Z0QsMFH3WZPpaLOry4JDHzlEPDEC1FJ3j3fMcoVZhkmaBknD69vX2rEOBu98+jacxW2PT2vS7gRs mA3KHIypWHFPtOACWpmxKwP5uPoD2vo6nw3GBMv0QUT4E0r+Ro02HI+TeXjuGCq30IIocNlwUqKi EBJ8bn3ISFOyjwMmdClz8X3dHONxJr90NFDMWqEKaVo+J7D1yoSDqHyTXwKWJ3r6l8gyRIBIFKz5 l1B7HT5/h7R7w8hh43EjQY6kIDQk5DURts1ObMSilVCcDXNFCs3PPQsaFR2JY1a/rHUiMgTcGpDr Qv4MIPV48QKIUMmq815kxlLWobNiXLrEA4glVtItQCvchQGZabkIsTIUK8Tg4k07Bw1oVKwoO3us UB7T9X6XhEO3QgBcYGCPBwrN4HovSh7KHXwsO/4OP2hiLGp6tuJvhiLrTQhH+M2ghdDcc7jik/nJ AwLQ73keo8zuV8fx9duhJNaQgd0Mv7SrDwaHSXAUhx4HEtkkclQYdomuSXmaUSaJiZbxmwpzDUxL LqGGhLFkoT5igufv4Xt2ld50SQ5IciXxgBKJxgBOiMEBENwFGRMq4DUhfuD5wP0/OPpX53YKpgZQ ZKEnMzyKJ/0ZBWVyxO6SRBvAGDHefgGAA+Y1fxbEQJ9YRKIafRoBKgwAmcQ8lznzJSQ/xCygOSAY SqrshqKJMmyhQKJtSgzKBCsJIrfoCaSYiDjWimKldDQVqFsu+L31QhEebwpHs9/0XkncSciTxjKR IkUIpGMQYgyLHRdSQSBOvFQ+ju7ALh0hA88VJy4ZI0ig8YJO0n2CTfQrULV6k6+74h7UqRS3kjao vZk8AEPluKq7i4l1vzPaXIfUDpucJQz4zuQ4hRnuSFGCJcukqsNSIMllSBVBkDtfvYoiPa3FGLyr MILBCol+iCcuyguiMbS1BbiSvxzDW1uBkHPxA87U1uoHXhwFc6SZH4SA+6BD0gViP0bpetdc2f1l k2mJJ8DUNF5wPpLSNdiSSGb6wNnJQqZgQYPx8y9COB6UIQ66kc1wCg+KaztM2vgYd5QcyqifvwAv KsBwg2mAi/JCTMt8RW8LuI4Jmi+p+/Hfi8E2CkQIcNsuheJb2gWmQ7S8Kpvk7Ol3/BtHITLullsJ JSfVJDQKiG8ZAvm0LLYSH4Gw8CRVCIyTDCpAQduMxTdCMQJwIUAsGlcR4qEwTJzrAQhFU+5VBM2M EhMoC5GDT1PpnfbIew7H9fc4RpB8sEjhq+H5pW9bo5xbWGbN2wEH5hkBgT8fC+jAUggkMCQqQmpF hEIINrkQVCYKnWgHNcHTAFptNpLygCbMnMl4FyeRRBPoERqDM5AoVoLv6e6ZULyP2jpc4iVVrl8n BQCpE/TKtApC4MnqcTcUHg1TQpz5eC+/oXRFRMX0OhAJiVfn9qG0gO2BAtJklyfYT03sCf9eiUeD sLVTny/I64HkhLuIQg3/nEE02blDkqL9cuI5Oo7O0q/uofbUaOAnT18/SMHyJHtEr70gVJIMIQ9k KghQjZfuauaP7lRAMDUeLDmRPQSAkKa/WJ5wcIDcwoTF3q04FY6rBsB/hlbIMDMCfBXwGvzysHib KfD0OPFxQ6vBD3Cvm4hz0QDPyul1I6LF58D9akb2Y3iYjemhmDb9cTgyDCHFQuf0JbabpAREQcrG dCGgZxP7D9BJc9LCVBajrQacBinYVjDIPj2II9alWQ9hNu006wK5fYZqTSJLollA3dzitCCbgsw+ cqUhfYL6jcFD3HManMvPY2A2CZoK2EhR0Asmsw6IXilQZFfZZN0mAHOZxLuQZbkGkVvFaEa0Otie bxAX5S+rp0bud4GTEUVAEqpJUYKiihVQoQYwBQGDhqZtagWxCljSUiMXzIFJnBLLqUUT4pUvh0hL aASBIE+zBAYz35obnrXmQDZOcjx3B7kegoVnHQdA/Txdpc6nC+SMjokXQ0gknRFXdRkTaiEnJkEq ps5v+MIKh4QCpUm9QqCaAdYxJpFge40be3Q3JzulwRulIhhMCikouybCWpExUYYuUHb9j0ThL+1j Y1nVokQQwRH3JB+MY18ega3j7YDXptE1Z0y+OS8HvncIBEIiZxrV6jXiy+2KbnuUlgD1ycqgcmXz QN1dqhoUKCAag8YAExhDwgRNxQO3xTzty33pQMcjyR7XY5lDJA6VPCyfjdqOTkfCYCdLahLcm5yM wISEAZysMEhRGAk6UDyZEHuGDMw5oLtyC1HTxQopUg7hYqrpS4wMtnOxy9O+Oa9A4bDvCA/pjYGd bCadkADaFXzLiY2J8sVKjycm11QJZzOY1FJwkOoDUGBIQlJoAZrwOD7ukavDzvc2RQgQPpkoTAWF C1CwmYjuZN5FBy4E4Xt6Cptl3Ky7Xr59ZhmyZEzGiham11+XFmIHJyT80rp/tgkhWVSARRTbpkBn IRcq2y9i43yGmooX2AcUGtBfsy1TSmz5aP84ATGoMUMwc+56wj1QnVTC9q34KqrM9v30pKH5cl1O FTwVEfxN6xPss2PYSTzXoMMsJyFF1DdmGQ51HYm0NUJlpcUCRpNY2Ipjv8z2IBLvbnvc5QmBWCOZ Je7Vfo90JDMWEHTKNx00gxyobFhvQa6jomWBxiKXfYjrl3KWdkmHyH4HwCGRIJCFw/ONUi3Gg0MX LuH+5VXIhMJfBPMYdoEgudHNs83FnSTcYxAWQUWKsFBViMFiCIEiNaqdhW2YSwnVTgh30CFNJWl1 g2AIwU8RpYyVT8th8UPqYIHej5wRACgosWKKKLBSLFFFFJFGZDOAA6mNmESIDK6owMYx2utoJVQk lsa+qqiiiiiipUoqVKKKKKKKqlRKooVEqqqqqqVVqqqqqq1IfBO6dU9J65N4ECXQqMFkRDaUS7YV pSjSJiUYAdY73EFc4ft7kNdP1N9Ih1BEnPwKj0iPskn71ipMUe9k4ej/I3SLiLHNbjnyYLo00Mmw bbdkyRuhhLPPRDdIS0IcASCMgM8kZ6gbkQFYA6ZC1AocMCj14gKVc6zwC9E1OQVUgT9msCLHSWoh 1D9I2GTJK4ypAUQgksOHEsXJ3olHzJHEXkuBySfW1rEcefNfVCFpi9eAJKSqQ4zBiaqa+BhHYZD6 W9xnOC0Z57msEmqZWhkmDckaso+F9cGciRe6o+5LXMzm5QgLRFE1l9LJUInA8EwjD19uE4AW1QYS qpEbOys3ij3+GpNXeppWut5yG5NCMggeKMpyuprUNFQF1KUukLYhXSNow2QJ9POeHOCH4lD521PF 2fGl32MEPiK5js4uShHL0hKZ3BxMzfHRLGEkQMQ1MrKpSLybhaQ0aiqMNdZmcOEPAd4IiaiQp/59 faPtx70x0yiBqNI901kJifPMcmQAN51Awp3pBIiQd5TcfuKEvU4h7x5v2twLNwQRBEJEJCunYoTO kYccmp66o8bNw9NKsRTE1GXRDtuHfgBMsihDWn0csWSZkppA+A05KwmqjkYD2rEIGo2G3m2ojUAi Sw0CU51LiAqcR4A6F4qlVD2vAfWnlsx/zo+x3iayICLBDAqfpkD6mUIg90AyIOR2r2wTfZ7ZDXAr BDgMIvEhfFIG5dDEu5DOoWZpIaxTrArDA9CRKLohSB9XfN5ChQoO+0uv8oiBJ0JKEoYFhb2Y58GQ RLP45chDxyRJG1oNAvC4yUjd6C9RDh3Fw3NZ7xik7YhaVSyQMiEXbqdQbk60wtccg5PtPcR2B+PV ubt4KkkxQXxL/AocnZjdDCMNhJZAysdV4SKcSf7oyFXoTT+UBM0KRwUWCYSiDtxtIpvZGrdLIhCP eSiIegyQcpM5KTr+k10o0yxoIeJ8QMSqbSTyOoH1BNPmRD74MtZZO9WUPcWf2y2MdC+3Xhi5gpVK J0cS9+VkHZYEY2HSjoW36lBVrX1WU1dL9xqQTiAYJ9kKwQkLD1ebLmXo8M0qu4PHJDkAa0Or8UwE TwzR7XdviqhiJxGASEIXWVVkOkGHedQoMDL3GKAfmB5IAybE1Di4XCzT4S+uafzykSsEkZEKk6R/ QVrOuo0gXolJ0wrxpR1gELWQfPeUwtrgDDI826CGfJjrTg4wIkRQohgqBN8Iu/kqMUPtR7diuweB bxuA+Vqmh5vV0hN5kKT86O870g5x63DBHyciHfpyYh0vQpOEMxvmglqIw1dXI7Q/K5YPnwNQHR+Q /E1JnHrnlCbkz1DB8xb0APyIEpU7Ars5YlCGlIrFkMTpNV68Vais+S+BWZRVixPg6+Dund07uWgI W5HSVrnN5WkrAJTdsRRYdXoha1xAuZepxPWnTUI4icyGdMkBCuJuraQBKMXQExOLo5lNRyepX5+l uGlxiJ6GZ72t4j0onaBoK3WPuQ7gLFipg8EwE+UPMg6J8AfdSsA5gZvUH8CqDq6qiCD3jVkecFs5 EHL0oNaEZgPncdwGoWV1Vtrad9SdH0hjNSxLIdvcckOKVaRptZbCg+rmGYJoMezAt5XsEUnQoVyq E7nacw7Ssd9kKR175O12PuLe0vHZ6NNjtTFh4nN8g2lDpHO4D36d00p6JpRufPokx7cS2scQ5k5n cG7pGN74A1F6HfzCaspv53g7UMHWci9tFV4m0la8nzNynpR6jvSmXZ4p0TVmbTduNm9bioGLUkgt oHch3GRAb3QeSoQpIyAFM0wOY7VfYt589opdOgCTQE3y5UPQbtelMMoSek6kOSt5i2G9Q5UnP7gb Dcbh3oftPMvNoGjeHEBjkBE4vYryPPEYCx1J2FisYAbgKrSa+PkzBeCcz17MAJJWdjWdZx1gZ34c ezQBvVRyaw6FOQ7Bw0Q+O4cXknc7QTsAyexD0ajZ7tDiq7M49uumJcwdZ2lZt52ABsSDIbHrL0Pl f/nB/n5+5zmXwMh1njoQ8pFRW9ShnS4eghDxA8OA5wuVC2I9SK84nQrFIhwU1fSXoPJj/5N5EBwc X3/i//F3JFOFCQSBM+1A --===============0173590056==--