Test slots invalidations in 035_standby_logical_decoding.pl only if dead rows are removed
Hi hackers,
Please find attached a patch proposal to $SUBJECT.
Indeed, we have seen occurrences in [1]/messages/by-id/OSZPR01MB6310CFFD7D0DCD60A05DB1C3FD4A9@OSZPR01MB6310.jpnprd01.prod.outlook.com that some slots were
not invalidated (while we expected vacuum to remove dead rows
leading to slots invalidation on the standby).
Though we don't have strong evidences that this
was due to transactions holding back global xmin (as vacuum did
not run in verbose mode), suspicion is high enough (as Tom pointed
out that the test is broken on its face (see [1]/messages/by-id/OSZPR01MB6310CFFD7D0DCD60A05DB1C3FD4A9@OSZPR01MB6310.jpnprd01.prod.outlook.com)).
The proposed patch:
- set autovacuum = off on the primary (as autovacuum is the usual suspect
for holding global xmin).
- Ensure that vacuum is able to remove dead rows before launching
the slots invalidation tests.
- If after 10 attempts the vacuum is still not able to remove the dead
rows then the slots invalidation tests are skipped: that should be pretty
rare, as currently the majority of the tests are green (with only one attempt).
While at it, the patch also addresses the nitpicks mentioned by Robert in [2]/messages/by-id/CA+TgmobHGpU2ZkChgKifGDLaf_+mFA7njEpeTjfyNf_msCZYew@mail.gmail.com.
[1]: /messages/by-id/OSZPR01MB6310CFFD7D0DCD60A05DB1C3FD4A9@OSZPR01MB6310.jpnprd01.prod.outlook.com
[2]: /messages/by-id/CA+TgmobHGpU2ZkChgKifGDLaf_+mFA7njEpeTjfyNf_msCZYew@mail.gmail.com
Regards,
--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com
Attachments:
v1-0001-Ensure-vacuum-did-remove-dead-rows-in-035_standby.patchtext/plain; charset=UTF-8; name=v1-0001-Ensure-vacuum-did-remove-dead-rows-in-035_standby.patchDownload
From a5c6ef80cae1fb7606ff46679422238fdceb5cc8 Mon Sep 17 00:00:00 2001
From: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Date: Tue, 30 May 2023 07:54:02 +0000
Subject: [PATCH v1] Ensure vacuum did remove dead rows in
035_standby_logical_decoding
We want to ensure that vacuum was able to remove dead rows (aka no other
transactions holding back global xmin) before testing for slots invalidation
on the standby.
---
.../t/035_standby_logical_decoding.pl | 263 ++++++++++--------
1 file changed, 150 insertions(+), 113 deletions(-)
100.0% src/test/recovery/t/
diff --git a/src/test/recovery/t/035_standby_logical_decoding.pl b/src/test/recovery/t/035_standby_logical_decoding.pl
index 64beec4bd3..d26d9bcace 100644
--- a/src/test/recovery/t/035_standby_logical_decoding.pl
+++ b/src/test/recovery/t/035_standby_logical_decoding.pl
@@ -9,6 +9,7 @@ use warnings;
use PostgreSQL::Test::Cluster;
use PostgreSQL::Test::Utils;
use Test::More;
+use Time::HiRes qw(usleep);
my ($stdin, $stdout, $stderr,
$cascading_stdout, $cascading_stderr, $subscriber_stdin,
@@ -23,6 +24,9 @@ my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber');
my $default_timeout = $PostgreSQL::Test::Utils::timeout_default;
my $psql_timeout = IPC::Run::timer($default_timeout);
my $res;
+my ($vacret, $vacstdout, $vacstderr) = ('', '', '');
+my $nb_vac = 0;
+my $vac_attempts = 10;
# Name for the physical slot on primary
my $primary_slotname = 'primary_physical';
@@ -185,7 +189,7 @@ sub change_hot_standby_feedback_and_wait_for_xmins
# Check conflicting status in pg_replication_slots.
sub check_slots_conflicting_status
{
- my ($conflicting) = @_;
+ my ($conflicting, $details) = @_;
if ($conflicting)
{
@@ -193,7 +197,7 @@ sub check_slots_conflicting_status
'postgres', qq(
select bool_and(conflicting) from pg_replication_slots;));
- is($res, 't', "Logical slots are reported as conflicting");
+ is($res, 't', "logical slots are reported as conflicting $details");
}
else
{
@@ -201,7 +205,7 @@ sub check_slots_conflicting_status
'postgres', qq(
select bool_or(conflicting) from pg_replication_slots;));
- is($res, 'f', "Logical slots are reported as non conflicting");
+ is($res, 'f', "logical slots are reported as non conflicting $details");
}
}
@@ -256,6 +260,29 @@ sub check_for_invalidation
) or die "Timed out waiting confl_active_logicalslot to be updated";
}
+# Try ($vac_attempts times max) to vacuum until it is able to remove dead rows.
+sub vacuum_until_can_remove
+{
+ my ($vac_option, $sql, $to_vac) = @_;
+
+ ($vacret, $vacstdout, $vacstderr) = ('', '', '');
+ $nb_vac = 0;
+
+ while ($nb_vac <= $vac_attempts)
+ {
+ last if ($vacstderr =~ /0 dead row versions cannot be removed yet/ ||
+ $vacstderr =~ /0 are dead but not yet removable/);
+ # This should trigger the conflict
+ ($vacret, $vacstdout, $vacstderr) = $node_primary->psql(
+ 'testdb', qq[
+ $sql
+ VACUUM $vac_option verbose $to_vac;
+ INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal
+ ]);
+ $nb_vac++;
+ usleep(100_000);
+ }
+}
########################
# Initialize primary node
########################
@@ -266,6 +293,7 @@ $node_primary->append_conf(
wal_level = 'logical'
max_replication_slots = 4
max_wal_senders = 4
+autovacuum = off
});
$node_primary->dump_info;
$node_primary->start;
@@ -485,30 +513,31 @@ $node_subscriber->stop;
reactive_slots_change_hfs_and_wait_for_xmins('behaves_ok_', 'vacuum_full_',
0, 1);
-# This should trigger the conflict
-$node_primary->safe_psql(
- 'testdb', qq[
- CREATE TABLE conflict_test(x integer, y text);
- DROP TABLE conflict_test;
- VACUUM full pg_class;
- INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal
-]);
+vacuum_until_can_remove('full', 'CREATE TABLE conflict_test(x integer, y text);
+ DROP TABLE conflict_test;', 'pg_class');
$node_primary->wait_for_replay_catchup($node_standby);
-# Check invalidation in the logfile and in pg_stat_database_conflicts
-check_for_invalidation('vacuum_full_', 1, 'with vacuum FULL on pg_class');
+SKIP:
+{
+ # Checking for invalidation only if vacuum did remove dead rows
+ skip 'vacuum full did not remove dead rows', 1
+ unless ($nb_vac < $vac_attempts);
-# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+ # Check invalidation in the logfile and in pg_stat_database_conflicts
+ check_for_invalidation('vacuum_full_', 1, 'with vacuum FULL on pg_class');
-$handle =
- make_slot_active($node_standby, 'vacuum_full_', 0, \$stdout, \$stderr);
+ # Verify slots are reported as conflicting in pg_replication_slots
+ check_slots_conflicting_status(1, 'after vacuum FULL on pg_class');
-# We are not able to read from the slot as it has been invalidated
-check_pg_recvlogical_stderr($handle,
- "can no longer get changes from replication slot \"vacuum_full_activeslot\""
-);
+ $handle =
+ make_slot_active($node_standby, 'vacuum_full_', 0, \$stdout, \$stderr);
+
+ # We are not able to read from the slot as it has been invalidated
+ check_pg_recvlogical_stderr($handle,
+ "can no longer get changes from replication slot \"vacuum_full_activeslot\""
+ );
+}
# Turn hot_standby_feedback back on
change_hot_standby_feedback_and_wait_for_xmins(1, 1);
@@ -518,45 +547,49 @@ change_hot_standby_feedback_and_wait_for_xmins(1, 1);
##################################################
$node_standby->restart;
-# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+SKIP:
+{
+ skip 'vacuum full on pg_class did not remove dead rows', 1
+ unless ($nb_vac < $vac_attempts);
+ # Verify slots are reported as conflicting in pg_replication_slots
+ check_slots_conflicting_status(1, 'after a restart');
##################################################
# Verify that invalidated logical slots do not lead to retaining WAL.
##################################################
-# Get the restart_lsn from an invalidated slot
-my $restart_lsn = $node_standby->safe_psql('postgres',
- "SELECT restart_lsn from pg_replication_slots WHERE slot_name = 'vacuum_full_activeslot' and conflicting is true;"
-);
-
-chomp($restart_lsn);
+ # Get the restart_lsn from an invalidated slot
+ my $restart_lsn = $node_standby->safe_psql('postgres',
+ "SELECT restart_lsn from pg_replication_slots WHERE slot_name = 'vacuum_full_activeslot' and conflicting is true;"
+ );
-# As pg_walfile_name() can not be executed on the standby,
-# get the WAL file name associated to this lsn from the primary
-my $walfile_name = $node_primary->safe_psql('postgres',
- "SELECT pg_walfile_name('$restart_lsn')");
+ chomp($restart_lsn);
-chomp($walfile_name);
+ # As pg_walfile_name() can not be executed on the standby,
+ # get the WAL file name associated to this lsn from the primary
+ my $walfile_name = $node_primary->safe_psql('postgres',
+ "SELECT pg_walfile_name('$restart_lsn')");
-# Generate some activity and switch WAL file on the primary
-$node_primary->safe_psql(
- 'postgres', "create table retain_test(a int);
- select pg_switch_wal();
- insert into retain_test values(1);
- checkpoint;");
+ chomp($walfile_name);
-# Wait for the standby to catch up
-$node_primary->wait_for_replay_catchup($node_standby);
+ # Generate some activity and switch WAL file on the primary
+ $node_primary->safe_psql(
+ 'postgres', "create table retain_test(a int);
+ select pg_switch_wal();
+ insert into retain_test values(1);
+ checkpoint;");
-# Request a checkpoint on the standby to trigger the WAL file(s) removal
-$node_standby->safe_psql('postgres', 'checkpoint;');
+ # Wait for the standby to catch up
+ $node_primary->wait_for_replay_catchup($node_standby);
-# Verify that the WAL file has not been retained on the standby
-my $standby_walfile = $node_standby->data_dir . '/pg_wal/' . $walfile_name;
-ok(!-f "$standby_walfile",
- "invalidated logical slots do not lead to retaining WAL");
+ # Request a checkpoint on the standby to trigger the WAL file(s) removal
+ $node_standby->safe_psql('postgres', 'checkpoint;');
+ # Verify that the WAL file has not been retained on the standby
+ my $standby_walfile = $node_standby->data_dir . '/pg_wal/' . $walfile_name;
+ ok(!-f "$standby_walfile",
+ "invalidated logical slots do not lead to retaining WAL");
+}
##################################################
# Recovery conflict: Invalidate conflicting slots, including in-use slots
# Scenario 2: conflict due to row removal with hot_standby_feedback off.
@@ -571,29 +604,30 @@ reactive_slots_change_hfs_and_wait_for_xmins('vacuum_full_', 'row_removal_',
0, 1);
# This should trigger the conflict
-$node_primary->safe_psql(
- 'testdb', qq[
- CREATE TABLE conflict_test(x integer, y text);
- DROP TABLE conflict_test;
- VACUUM pg_class;
- INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal
-]);
+vacuum_until_can_remove('', 'CREATE TABLE conflict_test(x integer, y text);
+ DROP TABLE conflict_test;', 'pg_class');
$node_primary->wait_for_replay_catchup($node_standby);
-# Check invalidation in the logfile and in pg_stat_database_conflicts
-check_for_invalidation('row_removal_', $logstart, 'with vacuum on pg_class');
+SKIP:
+{
+ skip 'vacuum on pg_class did not remove dead rows', 1
+ unless ($nb_vac < $vac_attempts);
-# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+ # Check invalidation in the logfile and in pg_stat_database_conflicts
+ check_for_invalidation('row_removal_', $logstart, 'with vacuum on pg_class');
-$handle =
- make_slot_active($node_standby, 'row_removal_', 0, \$stdout, \$stderr);
+ # Verify slots are reported as conflicting in pg_replication_slots
+ check_slots_conflicting_status(1, 'after vacuum on pg_class');
-# We are not able to read from the slot as it has been invalidated
-check_pg_recvlogical_stderr($handle,
- "can no longer get changes from replication slot \"row_removal_activeslot\""
-);
+ $handle =
+ make_slot_active($node_standby, 'row_removal_', 0, \$stdout, \$stderr);
+
+ # We are not able to read from the slot as it has been invalidated
+ check_pg_recvlogical_stderr($handle,
+ "can no longer get changes from replication slot \"row_removal_activeslot\""
+ );
+}
##################################################
# Recovery conflict: Same as Scenario 2 but on a shared catalog table
@@ -609,30 +643,30 @@ reactive_slots_change_hfs_and_wait_for_xmins('row_removal_',
'shared_row_removal_', 0, 1);
# Trigger the conflict
-$node_primary->safe_psql(
- 'testdb', qq[
- CREATE ROLE create_trash;
- DROP ROLE create_trash;
- VACUUM pg_authid;
- INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal
-]);
+vacuum_until_can_remove('', 'CREATE ROLE create_trash;
+ DROP ROLE create_trash;', 'pg_authid');
$node_primary->wait_for_replay_catchup($node_standby);
+SKIP:
+{
+ skip 'vacuum on pg_authid did not remove dead rows', 1
+ unless ($nb_vac < $vac_attempts);
-# Check invalidation in the logfile and in pg_stat_database_conflicts
-check_for_invalidation('shared_row_removal_', $logstart,
- 'with vacuum on pg_authid');
+ # Check invalidation in the logfile and in pg_stat_database_conflicts
+ check_for_invalidation('shared_row_removal_', $logstart,
+ 'with vacuum on pg_authid');
-# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+ # Verify slots are reported as conflicting in pg_replication_slots
+ check_slots_conflicting_status(1, 'after vacuum on pg_authid');
-$handle = make_slot_active($node_standby, 'shared_row_removal_', 0, \$stdout,
- \$stderr);
+ $handle = make_slot_active($node_standby, 'shared_row_removal_', 0, \$stdout,
+ \$stderr);
-# We are not able to read from the slot as it has been invalidated
-check_pg_recvlogical_stderr($handle,
- "can no longer get changes from replication slot \"shared_row_removal_activeslot\""
-);
+ # We are not able to read from the slot as it has been invalidated
+ check_pg_recvlogical_stderr($handle,
+ "can no longer get changes from replication slot \"shared_row_removal_activeslot\""
+ );
+}
##################################################
# Recovery conflict: Same as Scenario 2 but on a non catalog table
@@ -646,39 +680,42 @@ reactive_slots_change_hfs_and_wait_for_xmins('shared_row_removal_',
'no_conflict_', 0, 1);
# This should not trigger a conflict
-$node_primary->safe_psql(
- 'testdb', qq[
- CREATE TABLE conflict_test(x integer, y text);
- INSERT INTO conflict_test(x,y) SELECT s, s::text FROM generate_series(1,4) s;
- UPDATE conflict_test set x=1, y=1;
- VACUUM conflict_test;
- INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal
-]);
+vacuum_until_can_remove('', 'CREATE TABLE conflict_test(x integer, y text);
+ INSERT INTO conflict_test(x,y) SELECT s, s::text FROM generate_series(1,4) s;
+ UPDATE conflict_test set x=1, y=1;', 'conflict_test');
+
$node_primary->wait_for_replay_catchup($node_standby);
-# message should not be issued
-ok( !find_in_log(
- $node_standby,
- "invalidating obsolete slot \"no_conflict_inactiveslot\"", $logstart),
- 'inactiveslot slot invalidation is not logged with vacuum on conflict_test'
-);
+SKIP:
+{
+ # Checking for invalidation only if vacuum did remove dead rows
+ skip 'vacuum did not remove dead rows on a non catalog table', 1
+ unless ($nb_vac < $vac_attempts);
-ok( !find_in_log(
- $node_standby,
- "invalidating obsolete slot \"no_conflict_activeslot\"", $logstart),
- 'activeslot slot invalidation is not logged with vacuum on conflict_test'
-);
+ # message should not be issued
+ ok( !find_in_log(
+ $node_standby,
+ "invalidating obsolete slot \"no_conflict_inactiveslot\"", $logstart),
+ 'inactiveslot slot invalidation is not logged with vacuum on conflict_test'
+ );
-# Verify that pg_stat_database_conflicts.confl_active_logicalslot has not been updated
-ok( $node_standby->poll_query_until(
- 'postgres',
- "select (confl_active_logicalslot = 0) from pg_stat_database_conflicts where datname = 'testdb'",
- 't'),
- 'confl_active_logicalslot not updated'
-) or die "Timed out waiting confl_active_logicalslot to be updated";
+ ok( !find_in_log(
+ $node_standby,
+ "invalidating obsolete slot \"no_conflict_activeslot\"", $logstart),
+ 'activeslot slot invalidation is not logged with vacuum on conflict_test'
+ );
-# Verify slots are reported as non conflicting in pg_replication_slots
-check_slots_conflicting_status(0);
+ # Verify that pg_stat_database_conflicts.confl_active_logicalslot has not been updated
+ ok( $node_standby->poll_query_until(
+ 'postgres',
+ "select (confl_active_logicalslot = 0) from pg_stat_database_conflicts where datname = 'testdb'",
+ 't'),
+ 'confl_active_logicalslot not updated'
+ ) or die "Timed out waiting confl_active_logicalslot to be updated";
+
+ # Verify slots are reported as non conflicting in pg_replication_slots
+ check_slots_conflicting_status(0, 'after vacuum on a non catalog table');
+}
# Turn hot_standby_feedback back on
change_hot_standby_feedback_and_wait_for_xmins(1, 0);
@@ -715,7 +752,7 @@ $node_primary->wait_for_replay_catchup($node_standby);
check_for_invalidation('pruning_', $logstart, 'with on-access pruning');
# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+check_slots_conflicting_status(1, 'after on-access pruning');
$handle = make_slot_active($node_standby, 'pruning_', 0, \$stdout, \$stderr);
@@ -759,7 +796,7 @@ $node_primary->wait_for_replay_catchup($node_standby);
check_for_invalidation('wal_level_', $logstart, 'due to wal_level');
# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+check_slots_conflicting_status(1, 'due to wal_level');
$handle =
make_slot_active($node_standby, 'wal_level_', 0, \$stdout, \$stderr);
--
2.34.1
Hi,
On 5/30/23 12:34 PM, Drouvot, Bertrand wrote:
Hi hackers,
Please find attached a patch proposal to $SUBJECT.
Indeed, we have seen occurrences in [1] that some slots were
not invalidated (while we expected vacuum to remove dead rows
leading to slots invalidation on the standby).Though we don't have strong evidences that this
was due to transactions holding back global xmin (as vacuum did
not run in verbose mode), suspicion is high enough (as Tom pointed
out that the test is broken on its face (see [1])).The proposed patch:
- set autovacuum = off on the primary (as autovacuum is the usual suspect
for holding global xmin).
- Ensure that vacuum is able to remove dead rows before launching
the slots invalidation tests.
- If after 10 attempts the vacuum is still not able to remove the dead
rows then the slots invalidation tests are skipped: that should be pretty
rare, as currently the majority of the tests are green (with only one attempt).While at it, the patch also addresses the nitpicks mentioned by Robert in [2].
[1]: /messages/by-id/OSZPR01MB6310CFFD7D0DCD60A05DB1C3FD4A9@OSZPR01MB6310.jpnprd01.prod.outlook.com
[2]: /messages/by-id/CA+TgmobHGpU2ZkChgKifGDLaf_+mFA7njEpeTjfyNf_msCZYew@mail.gmail.com
Please find attached V2 that, instead of the above proposal, waits for a new snapshot
that has a newer horizon before doing the vacuum (as proposed by Andres in [1]/messages/by-id/20230530152426.ensapay7pozh7ozn@alap3.anarazel.de).
So, V2:
- set autovacuum = off on the primary (as autovacuum is the usual suspect
for holding global xmin).
- waits for a new snapshot that has a newer horizon before doing the vacuum(s).
- addresses the nitpicks mentioned by Robert in [2]/messages/by-id/CA+TgmobHGpU2ZkChgKifGDLaf_+mFA7njEpeTjfyNf_msCZYew@mail.gmail.com.
V2 also keeps the verbose mode for the vacuum(s) (as done in V1), as it may help
for further analysis if needed.
[1]: /messages/by-id/20230530152426.ensapay7pozh7ozn@alap3.anarazel.de
[2]: /messages/by-id/CA+TgmobHGpU2ZkChgKifGDLaf_+mFA7njEpeTjfyNf_msCZYew@mail.gmail.com
Regards,
--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com
Attachments:
v2-0001-Ensure-vacuum-is-able-to-remove-dead-rows-in-035_.patchtext/plain; charset=UTF-8; name=v2-0001-Ensure-vacuum-is-able-to-remove-dead-rows-in-035_.patchDownload
From 383bfcf39257d4542b35ffe2ab56b43182ca2dea Mon Sep 17 00:00:00 2001
From: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Date: Tue, 30 May 2023 07:54:02 +0000
Subject: [PATCH v2] Ensure vacuum is able to remove dead rows in
035_standby_logical_decoding
We want to ensure that vacuum was able to remove dead rows (aka no other
transactions holding back global xmin) before testing for slots invalidation
on the standby.
---
.../t/035_standby_logical_decoding.pl | 76 +++++++++----------
1 file changed, 37 insertions(+), 39 deletions(-)
100.0% src/test/recovery/t/
diff --git a/src/test/recovery/t/035_standby_logical_decoding.pl b/src/test/recovery/t/035_standby_logical_decoding.pl
index 64beec4bd3..bd426f3068 100644
--- a/src/test/recovery/t/035_standby_logical_decoding.pl
+++ b/src/test/recovery/t/035_standby_logical_decoding.pl
@@ -185,7 +185,7 @@ sub change_hot_standby_feedback_and_wait_for_xmins
# Check conflicting status in pg_replication_slots.
sub check_slots_conflicting_status
{
- my ($conflicting) = @_;
+ my ($conflicting, $details) = @_;
if ($conflicting)
{
@@ -193,7 +193,7 @@ sub check_slots_conflicting_status
'postgres', qq(
select bool_and(conflicting) from pg_replication_slots;));
- is($res, 't', "Logical slots are reported as conflicting");
+ is($res, 't', "logical slots are reported as conflicting $details");
}
else
{
@@ -201,7 +201,7 @@ sub check_slots_conflicting_status
'postgres', qq(
select bool_or(conflicting) from pg_replication_slots;));
- is($res, 'f', "Logical slots are reported as non conflicting");
+ is($res, 'f', "logical slots are reported as non conflicting $details");
}
}
@@ -256,6 +256,22 @@ sub check_for_invalidation
) or die "Timed out waiting confl_active_logicalslot to be updated";
}
+# Launch $sql and wait for a new snapshot that has a newer horizon before
+# doing the vacuum with $vac_option on $to_vac.
+sub wait_until_vacuum_can_remove
+{
+ my ($vac_option, $sql, $to_vac) = @_;
+
+ my $xid = $node_primary->safe_psql('testdb', qq[$sql
+ select txid_current();]);
+
+ $node_primary->poll_query_until('testdb',
+ "SELECT (select txid_snapshot_xmin(txid_current_snapshot()) - $xid) > 0")
+ or die "new snapshot does not have a newer horizon";
+
+ $node_primary->safe_psql('testdb', qq[VACUUM $vac_option verbose $to_vac;
+ INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal;]);
+}
########################
# Initialize primary node
########################
@@ -266,6 +282,7 @@ $node_primary->append_conf(
wal_level = 'logical'
max_replication_slots = 4
max_wal_senders = 4
+autovacuum = off
});
$node_primary->dump_info;
$node_primary->start;
@@ -486,13 +503,8 @@ reactive_slots_change_hfs_and_wait_for_xmins('behaves_ok_', 'vacuum_full_',
0, 1);
# This should trigger the conflict
-$node_primary->safe_psql(
- 'testdb', qq[
- CREATE TABLE conflict_test(x integer, y text);
- DROP TABLE conflict_test;
- VACUUM full pg_class;
- INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal
-]);
+wait_until_vacuum_can_remove('full', 'CREATE TABLE conflict_test(x integer, y text);
+ DROP TABLE conflict_test;', 'pg_class');
$node_primary->wait_for_replay_catchup($node_standby);
@@ -500,7 +512,7 @@ $node_primary->wait_for_replay_catchup($node_standby);
check_for_invalidation('vacuum_full_', 1, 'with vacuum FULL on pg_class');
# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+check_slots_conflicting_status(1, 'after vacuum FULL on pg_class');
$handle =
make_slot_active($node_standby, 'vacuum_full_', 0, \$stdout, \$stderr);
@@ -519,7 +531,7 @@ change_hot_standby_feedback_and_wait_for_xmins(1, 1);
$node_standby->restart;
# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+check_slots_conflicting_status(1, 'after a restart');
##################################################
# Verify that invalidated logical slots do not lead to retaining WAL.
@@ -571,13 +583,8 @@ reactive_slots_change_hfs_and_wait_for_xmins('vacuum_full_', 'row_removal_',
0, 1);
# This should trigger the conflict
-$node_primary->safe_psql(
- 'testdb', qq[
- CREATE TABLE conflict_test(x integer, y text);
- DROP TABLE conflict_test;
- VACUUM pg_class;
- INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal
-]);
+wait_until_vacuum_can_remove('', 'CREATE TABLE conflict_test(x integer, y text);
+ DROP TABLE conflict_test;', 'pg_class');
$node_primary->wait_for_replay_catchup($node_standby);
@@ -585,7 +592,7 @@ $node_primary->wait_for_replay_catchup($node_standby);
check_for_invalidation('row_removal_', $logstart, 'with vacuum on pg_class');
# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+check_slots_conflicting_status(1, 'after vacuum on pg_class');
$handle =
make_slot_active($node_standby, 'row_removal_', 0, \$stdout, \$stderr);
@@ -609,13 +616,8 @@ reactive_slots_change_hfs_and_wait_for_xmins('row_removal_',
'shared_row_removal_', 0, 1);
# Trigger the conflict
-$node_primary->safe_psql(
- 'testdb', qq[
- CREATE ROLE create_trash;
- DROP ROLE create_trash;
- VACUUM pg_authid;
- INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal
-]);
+wait_until_vacuum_can_remove('', 'CREATE ROLE create_trash;
+ DROP ROLE create_trash;', 'pg_authid');
$node_primary->wait_for_replay_catchup($node_standby);
@@ -624,7 +626,7 @@ check_for_invalidation('shared_row_removal_', $logstart,
'with vacuum on pg_authid');
# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+check_slots_conflicting_status(1, 'after vacuum on pg_authid');
$handle = make_slot_active($node_standby, 'shared_row_removal_', 0, \$stdout,
\$stderr);
@@ -646,14 +648,10 @@ reactive_slots_change_hfs_and_wait_for_xmins('shared_row_removal_',
'no_conflict_', 0, 1);
# This should not trigger a conflict
-$node_primary->safe_psql(
- 'testdb', qq[
- CREATE TABLE conflict_test(x integer, y text);
- INSERT INTO conflict_test(x,y) SELECT s, s::text FROM generate_series(1,4) s;
- UPDATE conflict_test set x=1, y=1;
- VACUUM conflict_test;
- INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal
-]);
+wait_until_vacuum_can_remove('', 'CREATE TABLE conflict_test(x integer, y text);
+ INSERT INTO conflict_test(x,y) SELECT s, s::text FROM generate_series(1,4) s;
+ UPDATE conflict_test set x=1, y=1;', 'conflict_test');
+
$node_primary->wait_for_replay_catchup($node_standby);
# message should not be issued
@@ -678,7 +676,7 @@ ok( $node_standby->poll_query_until(
) or die "Timed out waiting confl_active_logicalslot to be updated";
# Verify slots are reported as non conflicting in pg_replication_slots
-check_slots_conflicting_status(0);
+check_slots_conflicting_status(0, 'after vacuum on a non catalog table');
# Turn hot_standby_feedback back on
change_hot_standby_feedback_and_wait_for_xmins(1, 0);
@@ -715,7 +713,7 @@ $node_primary->wait_for_replay_catchup($node_standby);
check_for_invalidation('pruning_', $logstart, 'with on-access pruning');
# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+check_slots_conflicting_status(1, 'after on-access pruning');
$handle = make_slot_active($node_standby, 'pruning_', 0, \$stdout, \$stderr);
@@ -759,7 +757,7 @@ $node_primary->wait_for_replay_catchup($node_standby);
check_for_invalidation('wal_level_', $logstart, 'due to wal_level');
# Verify slots are reported as conflicting in pg_replication_slots
-check_slots_conflicting_status(1);
+check_slots_conflicting_status(1, 'due to wal_level');
$handle =
make_slot_active($node_standby, 'wal_level_', 0, \$stdout, \$stderr);
--
2.34.1
Hello Michael and Bertrand,
I'd also like to note that even with FREEZE added [1]/messages/by-id/4fd52508-54d7-0202-5bd3-546c2295967f@gmail.com, I happened to see
the test failure:
5 # Failed test 'inactiveslot slot invalidation is logged with vacuum on pg_class'
5 # at t/035_standby_logical_decoding.pl line 222.
5
5 # Failed test 'activeslot slot invalidation is logged with vacuum on pg_class'
5 # at t/035_standby_logical_decoding.pl line 227.
where 035_standby_logical_decoding_primary.log contains:
...
2024-01-09 07:44:26.480 UTC [820142] 035_standby_logical_decoding.pl LOG: statement: DROP TABLE conflict_test;
2024-01-09 07:44:26.687 UTC [820142] 035_standby_logical_decoding.pl LOG: statement: VACUUM (VERBOSE, FREEZE) pg_class;
2024-01-09 07:44:26.687 UTC [820142] 035_standby_logical_decoding.pl INFO: aggressively vacuuming
"testdb.pg_catalog.pg_class"
2024-01-09 07:44:27.099 UTC [820143] DEBUG: autovacuum: processing database "testdb"
2024-01-09 07:44:27.102 UTC [820142] 035_standby_logical_decoding.pl INFO: finished vacuuming
"testdb.pg_catalog.pg_class": index scans: 1
pages: 0 removed, 11 remain, 11 scanned (100.00% of total)
tuples: 0 removed, 423 remain, 4 are dead but not yet removable
removable cutoff: 762, which was 2 XIDs old when operation ended
new relfrozenxid: 762, which is 2 XIDs ahead of previous value
frozen: 1 pages from table (9.09% of total) had 1 tuples frozen
....
Thus just adding FREEZE is not enough, seemingly. It makes me wonder if
0174c2d21 should be superseded by a patch like discussed (or just have
autovacuum = off added)...
09.01.2024 07:59, Michael Paquier wrote:
Alexander, does the test gain in stability once you begin using the
patch posted on [2], mentioned by Bertrand?(Also, perhaps we'd better move the discussion to the other thread
where the patch has been sent.)[2]: /messages/by-id/d40d015f-03a4-1cf2-6c1f-2b9aca860762@gmail.com
09.01.2024 08:29, Bertrand Drouvot wrote:
Alexander, pleae find attached v3 which is more or less a rebased version of it.
Bertrand, thank you for updating the patch!
Michael, it definitely increases stability of the test (tens of iterations
with 20 tests in parallel performed successfully), although I've managed to
see another interesting failure (twice):
13 # Failed test 'activeslot slot invalidation is logged with vacuum on pg_class'
13 # at t/035_standby_logical_decoding.pl line 227.
psql:<stdin>:1: INFO: vacuuming "testdb.pg_catalog.pg_class"
psql:<stdin>:1: INFO: finished vacuuming "testdb.pg_catalog.pg_class": index scans: 1
pages: 0 removed, 11 remain, 11 scanned (100.00% of total)
tuples: 4 removed, 419 remain, 0 are dead but not yet removable
removable cutoff: 754, which was 0 XIDs old when operation ended
...
Waiting for replication conn standby's replay_lsn to pass 0/403E6F8 on primary
But I see no VACUUM records in WAL:
rmgr: Transaction len (rec/tot): 222/ 222, tx: 0, lsn: 0/0403E468, prev 0/0403E370, desc: INVALIDATION ;
inval msgs: catcache 55 catcache 54 catcache 55 catcache 54 catcache 55 catcache 54 catcache 55 catcache 54 relcache
2662 relcache 2663 relcache 3455 relcache 1259
rmgr: Standby len (rec/tot): 234/ 234, tx: 0, lsn: 0/0403E548, prev 0/0403E468, desc: INVALIDATIONS ;
relcache init file inval dbid 16384 tsid 1663; inval msgs: catcache 55 catcache 54 catcache 55 catcache 54 catcache 55
catcache 54 catcache 55 catcache 54 relcache 2662 relcache 2663 relcache 3455 relcache 1259
rmgr: Heap len (rec/tot): 60/ 140, tx: 754, lsn: 0/0403E638, prev 0/0403E548, desc: INSERT off: 2,
flags: 0x08, blkref #0: rel 1663/16384/16385 blk 0 FPW
rmgr: Transaction len (rec/tot): 46/ 46, tx: 754, lsn: 0/0403E6C8, prev 0/0403E638, desc: COMMIT
2024-01-09 13:40:59.873385 UTC
rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/0403E6F8, prev 0/0403E6C8, desc: RUNNING_XACTS
nextXid 755 latestCompletedXid 754 oldestRunningXid 755
rmgr: XLOG len (rec/tot): 30/ 30, tx: 0, lsn: 0/0403E730, prev 0/0403E6F8, desc: CHECKPOINT_REDO
rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/0403E750, prev 0/0403E730, desc: RUNNING_XACTS
nextXid 755 latestCompletedXid 754 oldestRunningXid 755
rmgr: XLOG len (rec/tot): 114/ 114, tx: 0, lsn: 0/0403E788, prev 0/0403E750, desc:
CHECKPOINT_ONLINE redo 0/403E730; tli 1; prev tli 1; fpw true; xid 0:755; oid 24576; multi 1; offset 0; oldest xid 728
in DB 1; oldest multi 1 in DB 1; oldest/newest commit timestamp xid: 0/0; oldest running xid 755; online
rmgr: Standby len (rec/tot): 50/ 50, tx: 0, lsn: 0/0403E800, prev 0/0403E788, desc: RUNNING_XACTS
nextXid 755 latestCompletedXid 754 oldestRunningXid 755
(Full logs are attached.)
[1]: /messages/by-id/4fd52508-54d7-0202-5bd3-546c2295967f@gmail.com
Best regards,
Alexander
Attachments:
On Tue, Jan 09, 2024 at 08:00:00PM +0300, Alexander Lakhin wrote:
Thus just adding FREEZE is not enough, seemingly. It makes me wonder if
0174c2d21 should be superseded by a patch like discussed (or just have
autovacuum = off added)...
Adding an extra FREEZE offers an extra insurance, so I don't see why
it would be a problem to add it to stabilize the horizon conflicts on
the standbys.
09.01.2024 07:59, Michael Paquier wrote:
Bertrand, thank you for updating the patch!Michael, it definitely increases stability of the test (tens of iterations
with 20 tests in parallel performed successfully), although I've managed to
see another interesting failure (twice):
13 # Failed test 'activeslot slot invalidation is logged with vacuum on pg_class'
13 # at t/035_standby_logical_decoding.pl line 227.
Something I'd like to confirm here: you still see this failure with
the patch, but without an extra FREEZE, right? If we do both, the
test would get more stable, wouldn't it?
--
Michael
Hi,
On Tue, Jan 09, 2024 at 08:00:00PM +0300, Alexander Lakhin wrote:
Michael, it definitely increases stability of the test (tens of iterations
with 20 tests in parallel performed successfully),
Thanks for testing!
although I've managed to
see another interesting failure (twice):
13����� #�� Failed test 'activeslot slot invalidation is logged with vacuum on pg_class'
13����� #�� at t/035_standby_logical_decoding.pl line 227.
Looking at the attached log files and particularly 1/regress_log_035_standby_logical_decoding:
"
[11:05:28.118](13.993s) ok 24 - inactiveslot slot invalidation is logged with vacuum on pg_class
[11:05:28.119](0.001s) not ok 25 - activeslot slot invalidation is logged with vacuum on pg_class
"
That seems weird, the inactive slot has been invalidated while the active one is not.
While it takes a bit longer to invalidate an active slot, I don't think the test can
move on until both are invalidated (then leading to the tests 24 and 25)). I can
see the tests are very slow to run (13.993s for 24) but still don't get how 24 could
succeed while 25 does not.
Looking at 2/regress_log_035_standby_logical_decoding:
"
[13:41:02.076](20.279s) ok 23 - inactiveslot slot invalidation is logged with vacuum on pg_class
[13:41:02.076](0.000s) not ok 24 - activeslot slot invalidation is logged with vacuum on pg_class
"
Same "weird" behavior but this time the tests numbering are not the same (23 and 24).
That is even more weird as those tests should be the 24 and 25 ones.
Would it be possible to also send the standby logs?
Regards,
--
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com
Hi,
10.01.2024 07:26, Michael Paquier wrote:
On Tue, Jan 09, 2024 at 08:00:00PM +0300, Alexander Lakhin wrote:
Thus just adding FREEZE is not enough, seemingly. It makes me wonder if
0174c2d21 should be superseded by a patch like discussed (or just have
autovacuum = off added)...Adding an extra FREEZE offers an extra insurance, so I don't see why
it would be a problem to add it to stabilize the horizon conflicts on
the standbys.
As 0174c2d21 added FREEZE already, I meant to add "autovacuum = off" or
apply a fix similar to what we're are discussing here.
Michael, it definitely increases stability of the test (tens of iterations
with 20 tests in parallel performed successfully), although I've managed to
see another interesting failure (twice):
13 # Failed test 'activeslot slot invalidation is logged with vacuum on pg_class'
13 # at t/035_standby_logical_decoding.pl line 227.Something I'd like to confirm here: you still see this failure with
the patch, but without an extra FREEZE, right? If we do both, the
test would get more stable, wouldn't it?
Yes, I tested the patch as-is, without FREEZE, but it looks like it doesn't
matter in that case. And sorry for misleading information about missing
VACUUM records in my previous message, please ignore it.
10.01.2024 12:46, Bertrand Drouvot wrote:
although I've managed to
see another interesting failure (twice):
13 # Failed test 'activeslot slot invalidation is logged with vacuum on pg_class'
13 # at t/035_standby_logical_decoding.pl line 227.Looking at the attached log files and particularly 1/regress_log_035_standby_logical_decoding:
"
[11:05:28.118](13.993s) ok 24 - inactiveslot slot invalidation is logged with vacuum on pg_class
[11:05:28.119](0.001s) not ok 25 - activeslot slot invalidation is logged with vacuum on pg_class
"That seems weird, the inactive slot has been invalidated while the active one is not.
While it takes a bit longer to invalidate an active slot, I don't think the test can
move on until both are invalidated (then leading to the tests 24 and 25)). I can
see the tests are very slow to run (13.993s for 24) but still don't get how 24 could
succeed while 25 does not....
Would it be possible to also send the standby logs?
Yes, please look at the attached logs. This time I've build postgres with
-DWAL_DEBUG and ran tests with TEMP_CONFIG as below:
wal_keep_size=1GB
wal_debug = on
log_autovacuum_min_duration = 0
log_statement = 'all'
log_min_messages = INFO
The archive attached contains logs from four runs:
recovery-1-ok -- an example of successful run for reference
recovery-7-pruning and recovery-19-pruning -- failures with a failed
subtest 'activeslot slot invalidation is logged with on-access pruning'
recovery-15-vacuum_pg_class -- a failure with a failed
subtest 'activeslot slot invalidation is logged with vacuum on pg_class'
The distinction that I see in the failed run logs, for example in
recovery-15-vacuum_pg_class, 035_standby_logical_decoding_standby.log:
2024-01-10 11:00:18.700 UTC [789618] LOG: REDO @ 0/4020220; LSN 0/4020250: prev 0/401FDE0; xid 753; len 20 -
Transaction/COMMIT: 2024-01-10 11:00:18.471694+00
2024-01-10 11:00:18.797 UTC [789618] LOG: REDO @ 0/4020250; LSN 0/4020288: prev 0/4020220; xid 0; len 24 -
Standby/RUNNING_XACTS: nextXid 754 latestCompletedXid 753 oldestRunningXid 754
2024-01-10 11:00:19.013 UTC [789618] LOG: REDO @ 0/4020288; LSN 0/40202C8: prev 0/4020250; xid 0; len 9; blkref #0: rel
1663/16384/2610, blk 0 - Heap2/PRUNE: snapshotConflictHorizon: 752, nredirected: 0, ndead: 1, isCatalogRel: T, nunused:
0, redirected: [], dead: [48], unused: []
2024-01-10 11:00:19.111 UTC [789618] LOG: invalidating obsolete replication slot "row_removal_inactiveslot"
2024-01-10 11:00:19.111 UTC [789618] DETAIL: The slot conflicted with xid horizon 752.
2024-01-10 11:00:19.111 UTC [789618] CONTEXT: WAL redo at 0/4020288 for Heap2/PRUNE: snapshotConflictHorizon: 752,
nredirected: 0, ndead: 1, isCatalogRel: T, nunused: 0, redirected: [], dead: [48], unused: []; blkref #0: rel
1663/16384/2610, blk 0
2024-01-10 11:00:29.109 UTC [789618] LOG: terminating process 790377 to release replication slot "row_removal_activeslot"
2024-01-10 11:00:29.109 UTC [789618] DETAIL: The slot conflicted with xid horizon 752.
2024-01-10 11:00:29.109 UTC [789618] CONTEXT: WAL redo at 0/4020288 for Heap2/PRUNE: snapshotConflictHorizon: 752,
nredirected: 0, ndead: 1, isCatalogRel: T, nunused: 0, redirected: [], dead: [48], unused: []; blkref #0: rel
1663/16384/2610, blk 0
2024-01-10 11:00:30.144 UTC [790377] 035_standby_logical_decoding.pl ERROR: canceling statement due to conflict with
recovery
2024-01-10 11:00:30.144 UTC [790377] 035_standby_logical_decoding.pl DETAIL: User was using a logical replication slot
that must be invalidated.
2024-01-10 11:00:30.144 UTC [790377] 035_standby_logical_decoding.pl STATEMENT: START_REPLICATION SLOT
"row_removal_activeslot" LOGICAL 0/0 ("include-xids" '0', "skip-empty-xacts" '1')
2024-01-10 11:00:30.144 UTC [790377] 035_standby_logical_decoding.pl LOG: released logical replication slot
"row_removal_activeslot"
is an absent message 'obsolete replication slot "row_removal_activeslot"'
and an additional record 'Standby/RUNNING_XACTS', which can be found in
035_standby_logical_decoding_primary.log:
2024-01-10 11:00:18.515 UTC [783410] LOG: xlog bg flush request write 0/4020250; flush: 0/4020250, current is write
0/4020220; flush 0/4020220
2024-01-10 11:00:18.646 UTC [783387] LOG: INSERT @ 0/4020288: - Standby/RUNNING_XACTS: nextXid 754 latestCompletedXid
753 oldestRunningXid 754
2024-01-10 11:00:18.702 UTC [790526] 035_standby_logical_decoding.pl LOG: statement: SELECT (select
txid_snapshot_xmin(txid_current_snapshot()) - 753) > 0
2024-01-10 11:00:18.724 UTC [783410] LOG: xlog bg flush request write 0/4020288; flush: 0/4020288, current is write
0/4020250; flush 0/4020250
So perhaps it can affect an active slot invalidation?
Best regards,
Alexander
Attachments:
035-failures.tar.gzapplication/gzip; name=035-failures.tar.gzDownload
� ���e ��{s7��y�]}�
Ol�����F���z�(�F���;�qb�A�m�a��%)?��_��j6��Q�E)�R�9������D"�H\�N.]]���>����,�������TK����OF�ZRI5�������28���7�������������������u����##�����_�9;9>?:5�qzv��������������3DF��=�O ������ �?2��[o����?#L<%�)5C���������:�/�+����^|���,���5��}ys��z���|�Q}��uu�]^d���H��W'O��.�����������wWg��������������W���f�mN
�g_�`~�����O�W_g�Q��n���!�������44?]����\������xv�����gG�|���g7����("(�b�����t���������Uv��i�]���Mv���mvz��Ef^a�YDJv(�}�@��I2����?�?�����<��S����O���>�����G������{��o�a�������������������������_V�GW��'�����������������[��W����������'����Ft7GW���o����mg��������������������n��O~14�������[�ywe�y���C��������W���y��$��~�>�]�p������-q��T����i������2;>9Y]�f[��}�PF�����I��,fC����ipuq{��?���6{UV/�������<��T��k#��?�_V|5��>`T�i�X��b/����ys�1!�J�����+��}��4s���t����V�}���>~�z��3���3�x.�4�������kU���������af��aF��f$��9�����a���>/;�~���z�����-;/��O��K������b��?�{*������F���������^�/n�_�����m��ih��A:��~rh�:��T
�wt����H��kF��xsZ�����{�����O������g�?����tU���� ��_�U[�~#���a���g�?��6���&�C{��'xoQ�=F��{�h��/���[16�iZ���[�1On�G�q��.�����1��{L�Y�<�������������a�w5��l����w�&8uA��LzF"7�[���E�����]����_����?MQUcCc�T����X0��5�#����]�I�� �~����t���D������oI���w���t$\���o���������'<���������7'��t��������c��IZ��w#��~X�{~�5M����f��4�h/�����c[���K>���}�����Q� �w=�J4���[�{���M���XF2h>�5� ���$���6�i�`K�Sj��4�c{�3>�����s�f?���F�>U����������M�z�����1mG3�{���)���|,���D�h��zo����(
�|��-{����Z�;w��w3�i44�g��a��R#�m��� �w{/W>��?z��r��
-�>����c?���� \�~�bQc.�r�?���s\��|o��$xoM����/���W�i���^����������b���2g[�����fiK��y���)c���/n����������_f{Z����M�L�-��zN.���-0�PCy��&I��UE�*���z?�T�X����W��{i(�l}�'�Gf����|���������[E)���7���Z�����w�o�\M����G|�S��y]n~�y�?���{�����G��B��50_}3��R�s^���j������h��>�����(����n�����?��;#�u�#�4-��%\�O�O-c�d
�x-F���������Z�� d\���}h��T�yAS�[����?���2��2f����5�j���?R s��.�c1�4m�2�,������K��7��#���,�����iV���Z��X>��U��!�T �{����s��N�W�����zuun~�H��������_����������:M��=�&�j�V���yL�� �^�o����K�n�GtSw��a0x������\ �������Z��nT����m]���`�R��-� ����}a���\�����~e^�d���#��T4_C]��������n���#��0#4�����:���_%ceC��c���Z|����Y=�u��LG��4�����������7g����37����k��w���oV��W��G����MW�Y��������'~���<���teZ�T��k6Omyl�����e�rl ju�Yrw�Kf�,�����E����T?���T/���~��Rv�{�b\�>�p-������Yvw��k��g��(����C�Yv��*������7Q�#�o���g���n��S��o�G���E3�e���k����?��N�#�o�@�g���n���?��D�X��,�?�����2��k�� ����D8!vU���Skk��N���~�L���242��������������OB��o�]\�������EO������n�Oy��m)?`��W���%��J�$�b�5���rR����w�|�����^]���B�~�mo�x�zw�D������Wn3�+�`�\��&�M6?|���u����������������������7[�g?_�>[�;������O�7������i����m?_$�A�����1���wg��k����������J�S{����fL�kv
���N�m�w�����7�FsN�'1�{�E���������~?��2����]��PX�2!$K��,�h����H$�6�w}����>�4�����U�>y�w���&���h�kj��f���^j3Z��rG��j�vG�w�3�������->f�>`������&g�=���<��W'��_M��|l���f����������Q��'���^�e�dV7~]m;o;7��g������_��������0�Tq ���H&{ +���Xi`�hpN~�������m��wb={�nuzf|��G�w���k�k��������[U���������/_����^5�����a8��V�����~c �_��|������o���N3r��]���!_��{~��EW7&�?=?�/f_��:�M��
��������7�c��~�=3����wW�9�N(���/.l�����FR����� ���+���-%2ovu��]���J�����^]�d_��~�MF��/���|���W�O<]�~m>���_���qr�:����BXv�uv�������������s������7��{��Y��_^�1���mb�������`L���\'�o�P�/������wF����5���|�4)�lXH�6��/mq�yc+vUf{������g��Q�!�<�O/yv��Y�7v�9�MC�6�n(!2�7��l�m�(�����BK��g�qB�dd�W���&�����������6$�����X�hs�3�[�?�K��'���^�3��'y����������0{��������o�d��O?����n�O��Z+�+��9�Gk���6�eG��uf���7��'�q�_=p����>)�O�Z��a?v��<�//.V.
vs{��*6���� O^������������'C�T�*S���?������c(S��C+S��$e>\� ���O�(�Q&��S��������<�Z���(
����Um��3��#)��^����G{[���^]?�9�4�8
4��F
�?I�����
�Z����k�� J��5\!�Y���,m�n�����{v ���d��������������F�������^eO��j��X���z~��=�i��t���Q���m�p�f1>����>=����������o�������8~}n��.��V������m�/�� ��2�y�����S{�������r�������P����'���������iN���!��=��C��,�W�O��g_6so}����m?�nV��1�{�������^^��������}oX��gf6��;bmxI��S�,�8���b��_J}PhiL��/��f����f�^o�\���d�(����;u|c�Yo��?�xa�~u��7G���������������������g��1�����+-��s�\o+<}zq����x�gq�O�oO|��=�N��xM��.�����5wu��e����ug��]smdeL�j���qw��w��%���O<0��O���Co���'I!��s���6���)��f��c�>7������'�(�|�U���5�z8�C��2��*q�� �d{V�W���F��7| 2.:�����0�������w�vC����a�Rv �����8 T�Y��Y�����q��.1���&�����8��l�$+� >�����A�����0Yh2l[�4/�,���Ak|�����'����������K�U�������i<�d����
Z��A����JU��H��Hl���q�
�������nf����zM3�rcW1��SJ�1��OP��f��s��<����a��:��O �����P����{�6��6����o���7�����vS�~o,d�����ya�%���qX�����N\�����/.o����~���������3�v�r��fJ�����`�[3b�����g��2��T>�%J������v���n;��s`�3���$�1%LG�����t���o3Jg���]Q�lMmP[i����^��������O�������+3���7�f�?��p~��_�}
p�y�����_'������������;��d���~}f�����y����'��O��]n�m.���Y@2���t���'���;�����������X����x�E)xT�A��~X�_���V9���^sm$~����X�'%�������}A{����i������/�}m��M��� �2m�Rr�ufO�]\^l>�Sv�����������������6
����4����c����g�d�n����th����0�Y7.��.F��{u~|u���O�g7{G���cE��Y�8���13����^�S(����]�j�W��i� ��S�\ge�O/^�[��Zv�&�=��K�3��������X�m������u[��N�G%��`�S��/��J#2���;�:��T^�� � ��*f6�>W�jM�YO;���J��O�{u}��mB���uT���������3>N���o�����Ut�8:W���RD�
�u��2w�&8�+Z�{(��j�Vz��9Yt{�}����g��U��=$��+��7�&� g�I0�x���~�����Kc��'c�Q���m���>������sh�������x���'kG�p;������g��_�0���k��O\_� ����S�}W����d��+���6���*���z����t����������g'o���l@�=onlv���L�W�k��+��O�B��W~�na{�~�� ��.���r����N��juj=">�(��f>K�7;[g��.n�~>� �� u����������3�^�b}t�>�
�b�����6�{���O��^������o��F��.n�`;2e;���o�NlsvO�I��Os��������6��8EDe����s�����gJ��=q����5F�����������������Guzf�ck=��/��f�_^�����x��1�o�_c,4{��QO|H��f��f/[��z(2�L�>�T��Ku��%�s����
����11��zzn&be����?]Ns���>RI�k��� h|>_?�����t���
�cS��s�@a�D�������w��:�����9���<g6��{��[������G3�~aVC���?g���?{ �S��;;����3��s�x t���~@�q ��b{�M���\[0�������@;�|cDu�~��A�#����d���5n�O9��42�����ualq�gF��AA���n,��������ft�5����*X���~����f%���e���CO���g�5('��=�������
h�~���<0>��p����7�~������y�C���
2���y����o+h����B��}[���� ;������0Z�g�_�|��Q��O��b�{s�}{.G}�������X��3�;pj�K8����t��y���'���oo��<F���R0��cJt���K��<��O�q�:�������_������4�j�m�d?�5=g�d�tn��[����d���d���� ���l��(��,H{��ofA1���Y�s�S��f2��W�����G}�~����
�Ss����
])�iN!y4��-�6�>���O6� 7��w�������� 6��
6�9�6#4/\���s/��h���.���A�u4_l%���;�b�fZ�;$�Y���y'��v��� _0!h���C����=da7�������{�]��s�q ��?��_%���O�7��]�%���U!�b�,���Ph�j�,��Ol
����/HhNs�Z{���������b�J{��"_���n�$��4i�k��!��'�K�O��?S:3O�_�J6qM���MH���fml���M��w&F�)�7���5�S��4�aOm#��H<(���9��wb1G����u����{�Wi���tX�Gl�NJf���9a�0��W���|�����
������
����|�Ie�'��zk_m`�o����zc�Ag'gfU��t��k�J|�"��7���,/���}o):��2WB�u��i
�M0����H��D�:��3RQ~/���F��������2�W��O����[�A�)atv(�����? ������=tt�z�����GXn�X�Q���L{�Y��������p��mK�������"�1�>�P�� �����v�!���X�w��������p�z����������&���������n�����I������i�4��u��n���z/�\��B�Td�\�:H �)�A��Av������IS'd��)C�|T�����e�����
�$����j���zz/�d��)��i�BI��V��vL�����.��L���� �\�~_Y��A��Q��.QkS�'���t}�e}��?q������������t������@��FI�?=�����������H��]�����c�� ���@y�d�@H���.��c+]8�r���w����T�X��z��p�F��/��+��F��K�����[��[��g����~_)��o�!����U6��
�������C~p����e��A-6X���W[@�6����@@.�c�j�A�#��������O�Ox��o�����]��~�����Tj%
����s������s�����]���n��|u�}i������W���$y���:���}��C�W��/Y���Y����|���k>8]��f?������;�WY��1�X�~�/{����rxs[�;�N����������'=���uh�`��_#��
��v��h���U������:�����o�"d���+'-J��������k�e��������aF��=�)�6E�Z����w��_{1��JD�
Q(�.�_�k�^_n��������s����|����Qm��H��^��r��9��������?�V����q�wFGp�����8n�B�����v�f��d��5'Cbj�QLFIb���`R��k�mi&�]^��4w\w�����]f�������?gD�����q�������G^�/6' ���G�n^s�r���(�lX��=�)��+��|G9�`�\���-�`:�}���`:��u8���w�(������g���2�w�3`up�D�;M!�p�q�Z� �L`{� r-�4���#�@\3;����f�|�u_�|vmox����Sf>�X�f���X%������;�����V��~���My�[,b�'v����YV�PG�O����{q���oL���+I���Lk�/�c��U�.����t�??�������_��F
�Y����|�n��'�Q5TKG>y�����e5������-�I6�����v����m�B�.2}M�e1�,�Vm�C����!9i�����ky(I�=6���k/���Fl�z}���<�����������Z��r�i9�rQ�Xs���B(6����DW7�T���s�s�(����q�e�[fe��{e�S\H���btQ^�+Z�=������gT,1;L��Y����/_������Go��R�i��'~�K,~���
�����"���S��H�@�o�t��S�;���`j�aW<�6Q��
������Ac��t(��
)���fa������kz�����:&y�4g@��^y���y&�=�p����-��r,!���q�^��cG c������9d�"�;c\D�\������G^A��j�q�Q [��?,9
E,^��D�c�z
�J�I��\��1�E�Y(����+/ ��1Q0�bF�7�[���%�=-&��F��{M���{�}Z,Ffy+R;#��r�1��������G|u}|qs���E�kI��F��1��#������|�����7� M���j�������������[��K��o��;w�T�������[��i�����`;�b$e8�cG��aN�N�/���G��O?9}�n]x0��N���GBs�n����|�+#L<%��q����^�(�Ze?��?+�=�hQ �:%���'&����<-m4���d md[���I_�( ��]�p�W~?W&�s�~9�8������{� �����"��� j'�2��a�b�TI�'t���(CU �JF\6mO]$�W����'���=�vSl�=hEwv�?�e(�v��AS�N�>o6���u$lE�'nz*b��1'r��ho��em����mm+�t������-��V��*�H|k[)#��bb�VRuU��=EhlI�������c�:��Lv��Z2��i8��/�A^
<��7�GM��I��,a3"��/av w��p��_�]���}�OR�����(���Y?I�.H�����������I*��C�H.���w�>IGSV]��.��Cf;@�
�k,�KN����s[t,�����l?0��� ��y��k��Z�z�l3
2��z�w3jdfCn�Me�F��m��#���Z�*�Y�dS0�P�k�u��CU����l��� j��� �A�G!>T����?h�(�o���h���K�u�A����9Q��_#�P��;����N����@�����������-k�D1��3��dh9���'���(���+�1�e�\j��������G�G&`_G��G�#qv�W�c��2r�v�a�����������&�2�v-G9�9�TrL�E��B�f�����E��������Bs���1��� ;����������i�4*btlC��(��d��%�E��,���kL��615k_$�V��vr ���<����������;�0��H@�� �k:jj���M��>�vT�s/���#oG�9�t1�l$!��r�5�e�%��S��5�����������`G*a^fG����r��P1{H%��!�@�s� �����!��@��#E� �y)N���Ux�k��0���Ux�p�����]�}�"�u���ZB��)�Y�`�
H���N���jH�i�I�/#0�^d�tR��cYg2�pz���c1�������8\12�-#G���{�8����A�CX��pz�!�a�]k�5���:z�9��1��c�������s�,�n>~8��K�mS�T|�U|Jj��j>e�O��5�P������ �]�fV�l��x�����tJ���D�Ez�\$���_>���s���+a��0B�#��y,9��1�~<�>�
���~�#���"��_<��A*@_0,������m�G������]L�8r,%`,iL�G�c ����v�r���g���2nB�(��7��?�� �����wb�����#��Nl���7�L�����t2�W�,��^�8U=e������e�fX��Sy�
j��`�4p}�>r�{+wIy���OI��vk"�D�
��6���\d�����E���a>{8%���P���+��F'�����H� �XE����l?P�KwJ$x�.Z��ajB�p��C�cdc;K���4�1�YN#*O)PY�W�H�4�U��]=��h�_��m����.k� �Ok���~�2$�'��`_�������\��rJ!m�>�����b1�Nj�������[
a���b3��
P��s��h���&��\����!�|�|??e�*5���@���?�� �:���D�����w9������X�^�12��d�4�5Xa���)t���e�X��1?HJ5-�F���>����6R�Y��I�DfDjXFwnj ��H���m���5*���~u�g:�|M��� ��/����t� ?��kK��Eg���f����W�) �n�N����s����&��;�
����G��:�o/ ��S��o�n�EB�~R!Gn]����������^����F[?��g��m�}v���������-��J�b���������������*������������0��A~����T��J
|�R�()�
s"'0n���E<�x�CRct���}xFj���rSR�%/��y p�<T�"~�h�X{~H��Y+����g}����rog�l���������cu�_�36S�gR��T�����|1\h>*4_Ls[�u���Q�������6����������4��pB��v��� ������n��h
/U���8�9$�n>)TV
��v��4�z���T=>)���K�~|R�������O
�t'����:]A�POw�L����@���rIJ02Q��d�����)�>���X�Y���fX����;�D����L��G� *L���?kB��CTx�g�����T��%9�@�����
hJH�G~�A���n������Z1�
o���A}|T����P~"�A��Z
�k����wP��V����3��A���V�����;'�B]������z|T������%����PW�=����sju����K�VQ��6{tu��j"*��f��.9[MD������%g�i�-��f��>�l���@t��g+�F/�=9��?[��y��*��
���vXW���V���x����Uu�����?[uPW�=�����"���c��~T���P}�R0����>�l�`��"�'����V�r�
�B<���V�B]���*}�R�~�c@}��J�2jj���G}��J1��;��<���Vv!De{t��g+u��������U�GW��PW�]}���C]���*��PW�������8�U��t���V�*�U�������s9�G}��J@]{t��g+uU������$�U�GW��PW�]}��JB]�{t��g+ uU��z������;]����41����Sv��'o��xF�Q��
wRf����_�������L;�q6x��-��������@P�����`������3N��"�1�
d�����-���t�� 6������@��Wp�A�@G�]������#{��zu|��N��7C������?z����j}�G*9�`�����N��^����8_�\���L������'�U�b����s��W�m��>|���i&Q[�GX=�����5��yG V���h�*;pD�q"��hX5�r�H,��b<��mR6�9X��Q���'4'K��T ,���J='K����,����<'K�
DKuaV��Db���������DbX,��Xe&�zN�9����������r����K��v�g�A�\hCOH�F��K��B[z*�&U�6�G��B���~�
M��ram�*�x?�6�=(�k���;"/�%��ra����)[�����rm�����e����1�����w�4Y���e� !��V2�����A>d�|XS?���CNA{ouK�b� |J����i5��HX ���`i�)���A��z@*�.�i�����caf.�G�Zz
���_@���qTCi9N$~=��t����H,�[5�%t�%�9�X����${N$z=��C�9�X��V��P��Db��#X5(��9�X��V��� ���B/�G�Q��9��m�Y|��;��b�R�y%����X���^)`�=(�k�Y_��Xz����+U�p��Ac�U��A8� !�E8��|�8�|�8���!M���W >[��U,��4XC���; -��Q��/d��BHG����i�����X�e�R��;��TR[����z&�d��LeQB>y����,:���{��Kn��R@����aKk�Jpi�G�Jh)�T�5��qaB/���w���S"�
��a7����*�X��
,���j��<�Y���]r�����<�<K�+�R����)f��0�U�GI�<��o�&����5A��:��+6RK�<�vZo�'���9-j��u
�������"�D�C����5���n��iZO���Y�S��u���T���WZ�.�� �H�N������[�e:�"-��Q�!0R�j���(��O�Y��b�dDs$='�"�K��f
�#�c�^�hB��:�����k�V��L�,����r����/�������Nu���W1�@>x8`G����5a �"7Zhu���!#q�t�MkP��Hg�9���s9=��b!R {���kMD�����:���2�W�y[�p����uE���j�,faA�����tJ���i������4�v �6?=�ja�pp�sF�����*�;���4���,�,��%�l`1
���T���N����$�{N$v_�=)-�p[�s"��������t��8�X�|-���ET�q"��I�����5�='��5r�W7"����H,t
�`q���^��Db���F��S
f~�����k�X����4�kN�f^�q�5�,\4zP,:_k��s�A�\�|�1�lPxP,�h�W��F��b���~��nB+�A�\������m����X.����� iB��b���^I�b����ra���q��2�_����f5�S��+=��S���������h��r��z_���@�\h����Q��!��B{�y|yV4$�_��?�*����������#oKh����,��%k�] ��J}�����r�v�KU�KG��B�{?p^�&��� �a�b��,����b�R��e��~��r��\�'�6�h����{�_�q�C.��J��W�6��X.���4��] �_��:�S)��=(�m���r������W��7<(����E��A��U��������~���������X.��W*.����/��X.t<��pqg��X�����u��xP,���w:j��iK��?l=�U����b���{�3��r�X.��+�S7"�yP,�����/�r9P�������l(
s�=(��q��0���X����F�a��r���7���<(�k��S�_M����X.���q��)�0n�A�\����V@�(�+����.��r��=��cK@��������j��M ������h������o��)������>L���B�f���*�ec����Fk�?��J:r�6O�go��-=B4����
��{����okJ ��/�go�$���4r�bI��M�9$@I���74
��D��
�ci�m����N!�y�e12#�� X���[�?Ig5������Y|S%Q��z��D�OY��mJ�G,��@��4R���s�9L!�6_��c��M��9:���O�m�0u
(C�9#f-��&�y��6�r�y��S�6�rD�B�Rk�=�Bi��y`=O��4O�<��u�z��ER�h����[O��N4�z6q��R3�A�����Nyt���'"3��,�)-��M�����t����l��zD�r�5h=�����,�)��m�z��#����)A�v�t�zv�s,�2����s����+e���i>e])�Z�����0u
���JE'��[Z��i�R;�|����+z�3yNYh�o��XM\U�v
\�;�H�i;�����[�f�N�b����+�D��
�i>�D�rh=�f�N5g=gd�O;R��������#E@�)�'#Y��:������4��Jh=���6�4��Jh=��m�P�(�b�P.���VA��b��M�Ic����SM�Y�0u
���s����:�H��z�X-�|�����D��[��:%'+������C�����L�i;%��3���ka���b�|R�XZ�U@��w�����ZOD���Y�S
��-b>)SE�8G[B�Y � �Y�c8��J���kF�g�#.�0'�z,l"P���:&B��H,t�����7�r�H,|����`)�f{�����R$t$<'}�wK7a��Db����eX��s"��)�cX�w2<'��?���0��9���n&��]G��0��J���u�d��L�)� �����0���I9��:���X�1�[
4�qJ�� "O���N��F�XP�Y�C='=)����KU!��Db����X2����H��r���D�&���o�c%��DI��a':N$��I9.��*Bi9N$~R�������PZ�����y��R��6�����S��+��O)a���b��v�G�Ji�/zP,����xF���[��De���A�\xS?"/^���b���>Z���B��5�6�;.�
,�
RZQ���b�fX��$D�0k��r����~�Uh�=(�o������0�G��S��(c2j��X.�_�{&�<�A�\h{��^�`��X.|�M��t���r�����Uh�=(�o�G����(�o����)kd�p��X���=��2�=(�m�y�G�����:L��
>�-kF9� �A� ��,n��(D���9\��n��"�_to�M��W1����Ly��b10K��Y�`�+�ca'g�!`d�+��XS�X��0�Q<�B_�s"�xj��kb9��j'�q��k�|���10����z��!Q�������Hy� ��8�Xx����8���s"��^'��5XZ��B_���z���`����*���y�C�g�;p��D�d��X��_���h$� ���='=�D|�D�������w��]w��H��;8��A�N��������b!��#��H�A���@h.>='����t�����������dQ�p���H,�
/��uxp����S��W���T��!W�8Qz���y�W����@�\�BZqC/id��X.����W��Z�\��5�J��~I3\C.�����>��[t{����0��6z��g�X�� H����0���BI���Z�������g@Y4`���
h=V�\Z����s"���RY�����B;}#����H�PkF�N��(�9�Xh�/^g�*�C��s"��q�x'*��
����:}��;Q�:��<'��&>HB���������T����p�y��bQ��&�*$���d# f�y,���FR��qIV���<V����-�m���J>W�� �Q��;C�y��0�5ogH�����h &[��*Z���"<$�s"�R��U��X(��S��M�l�/�UY�Ig���:|�j����{������mL&5b%ea�M&��<
XIyN$V��s��-���
�Ix��4��y��g�C��ig��G��J�����6�r�k(Z�be���I�m�/@�-fu=Pr�T�����������Nt���@F���tVR+��p]�y&Ke��:~��P��.T�XaM*`og��RZa�|ho<�d��Z�IiR+��I��X�;���B�:V
����L���y&KewrH�YT ��Z,��:�:�8�v��)����4�!�,�Lg1��xN$V��bE8ix��#+OX��6������/R��P��O��W*4OjoX)@��
N��T���U:e��6�7�<&R��%iqwF
V�*L���M�J�Y\��U��pi�0�a����,�yV��l�k���I�X�
�,���IG� G�<�d+<7�qd�a����z'\����������3�tN�)�5�=6bJ����p��9�X�#�:u5<gd�%5�yxf�3Y*ssO�g�t�5�����ssO�)��`.s�H�{�W���{N$>�$���k��Q�}���=�d���MV���: M�����O����y`������mV��9t�4�B�+������g��RFXM����d����rO�]�!������D��8#Sl��i>�4<�d{3/�j�5�9Qb�&�e"�9oj�9#��2�a��a��b2Y"�F��;����X��{���JZx��^i�z�4����Q�+��z���Ay�F�='+ygq��<g��R&���k�<-�f��4��$�B�!�M�K�Y e�sF:+e��i^��qI���D�ps�Pi��R�F�$-xN$~Y��6Kf�C�������Qi�t��Dba��B�`�����Db�^�En�y��!H�,4���Z<�d��[�bE�P�Z���U��S�<'o��yS ��q"����W�����t�@,�9y��!(H����R�bM��!�<����V�c{ ���XC�c���)��az��[3��yN$��r�T��
����zk��r+^�?i��4T��L�C��|cV��*�X�9n7��K�`)T9s��S��� r�H,��+�������;N$V�W�]���R��T��<�������dR�������w6�5S���X���R�E,�:�IzN$V���E����k���T���@�*Y�M�!j�x�P��v�qF:+e��h��U�3Y*3C�4��f��jP�Y�eB�EK������QIF-#��L���Y$G�h�F����p� �i^��qV��DR� V���L�e^������v��5�����
`�*a��[3�tV'!V|�*���r�|�I���;�#ba� �"Y�*Ix�c���J�
��xN$Vjo�`���9����IO���*�<��<_��KI��X���"���4�A�l����YH*�@�����'=@a���y>}_��,%�b�\t.xJ������� �0IE@�����"���4��@�M�.��G*J*�]���Y����M�3�YIU��p3��L���1Rp�P�u��n�G���,t�<g���Za�F�3Y*Ya��UaMRF�J�F�35�Gv�Zi����c��Ij�9��d��Z�4Rb��E�HZ;�4�F�3u����F*�B�<.��'.M�����v��,%hWF�F�r���
���>�g��� }��IQ���^sO�*%������3�^G�y�� =']���HnT{N$:�I�c�e^ �����X�����/�.�x������<�����8�X���f�����Ui�Jf�X���c�jPy���BWd���������+�8�������A*������z1�8#�A�\��V/�RI����X.|���Tip.��b���^��JU9���A�\Xc/e�AU�
6����rdo���0M��b���^�#���%��B����������X?m�e<��T�2��X.tEnO��I��xP,�����Y5���X��J}�^���w��Jm�k�����m��+��
��<(�k���>��w1<����J�9k���3U,j^��Pq�^�$�='+u\�.@���tV��i���mj`�����c��2y�u)�j;���N�40^�*��z���N�P`�`� K�*�������6?=��,$� V��<�<��W�<�4�T�����i��3�UD��T�V*����@>�8������h!��2U���� V�����y(��H��v1�������H��T���
��2�fe&��q�y8�*�=C3�
���d(�U����)*\W��X���Rfc���
;��R�W5S��c]Uba�j���u��u���l�&]O�-Xf:����y�)��Q���8�B�>,��j�`u�:�:�3�`9�x&KevRZ���RB,�����CT�#�Fc�L������/3Pw���Db�w��xh�1�����WxH�xVGC��L���BG�X�hf��P�<'�#X<��P8�s"��;�#{W��C��9�X����~������H�"�$��"��=gd�I��5����x��R�[�*�?��RA,��"��Z wT�B �����3�Z����R�g�=']YcT���H,�$#��nU��X����N2����o�`U��@���d������3�r�H,��l�<�l��{C���Q4-�V��L��y��bd����q��+�B�i�0D�9�v��)�:L�4�#3�y�5�1e�G�X�C���.������2�d�o@��K8-�<�d�����pzN$:��u�� X5bk��J}��eE�C�����y��p �9#����6�K�|9=�maf�6%�X-�B���R��������
H���uPW����f�I�`U �C��2;F-gP��h�ER�'1��i��g�T��'�FN��S���-�c��,��9#�����i���O���03;+~cO���X������%��D�J����nZka����w��]U�r�!����+}g)��]�d@��,���y&Ke���o6�\3�5=�u����4�{���"I�<���Fd����Ci�`\w���J�Y�Vu�I����y�/PR�[3t���b!"d���-/w��W�I�=�u
ZGd���hO�����O&R��W��9h��� 7,K���T��U����0�u������e!��p)S��VI�2�fZ�K�3UO�)�����:���I�HM���4{2�C�F&-�'M����UAL������ (
�H&��DkUsJ��r<gc��T:hQ��E�,�M�yhREZ-�2RD�d<b�d� Y�#d�g�T���+v*)gIUEP�q8��bX��I�b���UF`��3a�B2��s���E��G����g��10��c��k���K�5=�l��|9&k�*8������6�_��L=>�P-aCQC�����z����y�:j�f���"S�lr�������WZ���(��:N$�������+0]*����&��<�tn�@��q"���F��%k "h�c�k�#X(2�9�X�K/�M"�U��&IOL������L-��r/�Y
H��H���\�]�A,DzP�������S�����OL���+�c��H��W�u�J��c�2��i>�z=�T�Q.S��c������=���|�� �#�}[���#*�@�o���J��w���{O����U�|��TNe��4�%�B�&���w���-bW|r�4�m���y�Q����=gD*)��<�#
K[���RC��jU����Lkl~�j��,$
�Lm+JS�p��+����*�0I%�vE�B�$��C��8naa�J�J�+���Sc�J1��X����J�+$���i
��b�]�0I��v��+i�m �J��+KY�
��r�����0�C��X���6:VC�RE�
�)tM��� ��f)�@�����{�5hW�u��ThW�7�s����C�����T�<m�-l>���P�M9��.�X���[3kq:�%ZhU���
�d��j��u�H,lDs+oA��q"���Q��� �������b�b9N$v�e�����8�X�R#X�p���Dba���b�.8��s"���tF�DW�X�����`Ku]��8��4��g� ,�r�X��v�������b�zF��\����3��*�r�X����QJ����b��z�Sx]=(�}�M�`TRr9P,WjkOU=�A�\��=��sa=(�+���e��\y>��B�d3�U��������6�C��X�����;*�j���&�Q.V����r��������A�\��=SaD��r�v�Y�~�A�\��=+��0=(�+��gu�A�\��=k��x�
�����UtzP,Wj{�Y�F��b�R�{.�������s�2��X�����aY������2L��A�\��=��m������6���A�\��� a������V����FVS�{!�
�����8z�;*���A�\h{�1� �� ��`�Wj{/J(/��Jm�E�����r����mB��b�R�{I�������K����b�R�{)�������K�����-���^��6m��J���2���A�\��{Y��=(�+���m�S��b�R�{E�������+����X.��7E�K���=(�+,L|q���}\R<s\YF.�B��:�~z��������_��]�~�����y5����nn��wW�������f�����?���8�x�>d�d4��������W����_&��s���;L�f�K�l�D�~�~��?_^���Y�:�|\@����w�������������`x�P1�B�"r�e�b���0A!��S�w�uW��(<��������'�mkP��n,��$�����p��9�X��v|Q�
��q"����\e�M�U ��n���)bI�L5L������H��S�W����v�F�4$�D���B��I�"�9G��Db��������a�����^e����Lk0{N$z����t�������S����Q`������b�����gE��0(�A�\��j|�;.�=(�o�Ut�6k�0X�A�\hSO��_��
4=(�m�i���%�q��5����\�0��A�\xk?"�<�0��ra��Y�E�D^����ra��V#\u��=(�OE�{-��r[/+�r�X.|P5z#+�
]B���;����0�|���������X!�:C=(�]q,��}�d�)�A�\x{��"aP��b�����z�(E���X�����y�I�A�\h�����hA,��b�������2saX�� ���t��dV2`��X.t��1.AY��PQ��k�����Rv��A�\h{Ou�~��� ����rF��h����ra��Y�F�DY����A�\3�}�N4U��X.��'�uZ�U@^�������*
�V=(��!�0S���A��U����U$�W���L�B��<n�*]��G�������� ����{�G��Ra\��b���=�
� ��B�{�U �&�����C�5��u��r���H��fm���X���8�h�y��b���}|�Q�6��=(v�
o���D�7�(�m���U6����r���q?��A���r���F�����r����v�!M�}�A�\�xN<n�������O���;���h����{=�e��&�_����i|���E���A�\�����jJ��=(6`FRt��jj�{��J�iZ���X.���\-�N�s��
�����`-c!��r�N��Q�@�<(���_��^�B.���'���imNC{�A�\h{����ex�\�����*:�U�J��sw\�C0�uZ�@.�M�B��U<o�������X���Q��h
���r�������uh'<(���������r�N��tx�p������~,�0)��b���9z���C;�A�\h{/�v�k�0n�A�\x{�'�.����b�����z�cGB�Q2�.{uF<'���p�c�������ZN��C.��B��:����Y ����b����H?� �(���G�s8�x���r��kU����<�r�X.���G���:�r�X.|�>jW9�����r��s�zOyxyX�������!N%
��{, ����8�$�����G����a^m��B�{��h��|N^m���G�9���(��_�_�w�y9P,�����c�(����wp����=(�+<�~�C���Qr��S���T��M����Y������!C�K�|�qdj���-N
�����<(n� r2\���-�% ^������y�?r�w��$��������9�X���#�$�*�='+q��=�H�N��"�r�m*cXp_<'�����lv0��{�w��Y��MBi9N$�wa*c�{�y��8�X��d>b �2\�xN$�[<�I<*����&�����9���PY@sQT!��r���Dl�U$���X.���y|�s���r��N/Zr9���x!a�X�gB�f����i *��l�)��1��Z�,[q��i���1K��0
�� ��.��04���A��H�|IB���D����:rD�6��=����0�F�H��-^���Dba;W���$���H��c�m��q�t(�4�v ��S4��Yvi;���k�]���H�U�oz*�._r��|�����F:nJz$����F:h��~Q���
6���'����a�H����[�Y�^�q��+ ��X%�5��Vtv�
c���]%��IW���='+�"I(���vI�a�N<�"8&�d��N �����K=���!~��M(6��QK:�
�; -4������4j9O�0�A����7f�*e+�{N$~�e��y��#�7X����:F�q"���-#XmF��Db�k5��$���E\8�����by���s"��'�G�Dx
n����'�`�<�[��������nyN$V���\����='���6��.B��A�\���l��ryP,z����"���=(�+�BB��n�4��$^H����L�,��P�S��t�]H>�8�D,��08�Sc*�t!al!r&\r!�XX����+ -y���<�D�O3/N���J�����H,����Vb�6���Jm0=(�����S���{��|�
�i�!J���%7�
�+U��S
�����RSA����8�Qp���#�5�?�d`fF^F����H�����6Y������9�X�Y��x�����U��B1YKfY;^U-�C*��v��9�CX���*V��o���=*���Wu P�W���*� ���l�S�t��/�<��=�f��<��Jj�T��s����[�����Z�|�-SM%������e�i �d<s�&�L5m ��,�; -e�j� ^��r�"��y�?l��
3���j���zN$V��y�&,L���H,�u�#X����<'|����H,|��,^"�s"�����w���������']����3f��!��� !�E}]���x._j���qX"N[����N
�b���*��G0
v�`�i�; -�#�����������y�?���f������%���+q9H�[ �x���{�5�G�b�D��1�����v�7��dx��s"�D��s.K=gl�%��B�kz&�d��r��y��|�g��&��|�re�|�g=��@����x�%��Ry$�����x2�yR��8��2|�5�?���+�4R�5�9j��7@�o�.���<�o���]���)s�����2�p����M���<���G�Jh1�T(��u#����B�m�OMQs�,�c�����^����[�x��\a��Db����5H�����Jm�un@{&�d����� fw�%���$������k]J�W�1Kk�u�C�*n��S���xyD@�R��u���� �c�"^�4,���<��3�u���q)��8�X�"J��ux^�U�{N$:�?����t�B��`�k��i�����.���W]��4�A����X��<���
V�K~����qw\Z������?�W�B/�s"�������a�o�s"�f��K����9���\?R��u8�zP,�
D��V��0���b���^��a����D��J}|��"��AcNL�u�A�\������SB>���|�u��� �D��:��R@��:y�u�!��@"��%�1���x�:��m���c�(�T��A%�Y�bj��]d���U����9��������X������#%�K���!����q'b��-�
�.<'�)��*����H�7��u��y<'��Ie(.<'�y<�����9�X�e�H�cEA����J]��{:�X���_F����Mg��5��d��=�t���r��`�
jU�a���r�������@I���[�x�S���/�5�����wEh�=(�o����)�MyP,����j��� ���������r�6��.Cs�A�\3.;��8uQ����b�����uv�<(�����X�Mn�{P,�{���z�@�\��}C����r���6��
��=(�k���s�*�m��X��%�]�����Q�.j'�����X.����%Cr��=Wj��i�K�{Pl o���P��a���b�f��(WK�0��A�\x{?�e&�@^�5����d�xP,W�PN��p���X��>�U����A�\3����h�&�����G��4���A�\�+�����k�l�����q���M8o{Pldo��������A�\�xN<���m��zP,���B����6\?zP,�����
�xP,W�l]Y��B4�Y�x�� �C�3!D��v}W�kq=�\�����O>����|���
N���VI���L�-$@nm,�]���j���H&taL�Pj��������BW�a��s"�R���x����Jm0�Z4Dhp1����kg<�/��lj�pkh���l�
������
fS�� �+&�5�M�!^�$�9
�<��f�9�����������w�u����T��Jj���kR=B2���������al)�|�{�6�-����XZ������6�-m!^���Q����r�2�?��w��}���,�Z �^ ���a$8��s�:+��4a��� !�%
����W�t��N,N �P���^tbq:�7�XI{��i0,[�#a%����x���i�9r;��c[���P�@3���a��:�����9GsQ����[<z,l�Y���CAr�Bi9N$V����mJ�q"�WU��H(-�����+�j:J�q"��
�uE(-���J�=((����8�X���,^>�s"��{�#X��A'zN�9Mm�iN�P\����fR�s��2��r���(��Ac�Bb��VEh=)2-|����O�iFu�
N �P�@�m�8�+�T,��N��A�����n�4�+YD@w
���������#x|��$R��x=gL*�-S�A����v|�����|��[�2�9�|�c��|�-S�+���&?����m���c�|������x��+�_�&��
�?���+�_|}�-�e�������$�� )��j���P��:�Xx}����v��"��=B2��q��_1=�����������e����B�hq����-� %�$,i�
M�D\@���"��e[������CUs�H�Wb��M���!�x&�d��L�j ��p�._r��k���v��[&^����*��2��PN����R����Y��.'�!4�5PG]�B��Z� W���I%�ej)D�^F�/}9��S���������2��*<�/�e���"��<������nz"_�rRK�C�XF$�J�2"��L���n��-��T����Im�#�1!$��e��|������2 N ����]���Ip �x�������L���`z
�����L�7/v
'S2���2� �?|����YH*�X��Z-Hr�$:�0}�w-��-��oz��._z�^����Ko�d�b��*��2)
^�FB�Y&�f���<m�PT��T�mZ U&���A���H�9K��f���=��J�t��l��i��k�X��[E����b!<�kh���C,��Eu�H����(�9�����AM�� !�e���,!R�������|���w���X% ���J<�0 +������!^�Bz.���HQA��b��9t����.j�Gx�f�4�(g����Jd,���h!E��
L#�����3���U`��q"����e�p�;N$����n��CocyN$��B�b.�eXa��Db�ka���s
F��Db%.�&x����8��qt$�
L&��5�0Z��*\�{N�9���h�;���A�\x;�.A��'=(�o����[���A�\��!E��2, ��b�FB�<8s���B�s���Yt}epJ��H���K��28�CZ�E�WB�D8U���+C�A�H��Hh�����!^4����������s��@�����<�+�G����:�w�<gL*�
cC B��U��Y�06�5�l�����)!"0����06����X�Xb��2H��ml$��al5�kce+��)O�5�?m,��i�������$m��>mk���;g�y��b{�����}�`��T/�<K�|���F�<m�5l>�mI��mj������|m��
_�H�P����t���Y� �$����1�`N�eE�:�%�����k���"��,�Kjo-`��3�l�u�rI ��� `r-���t���;l�,!�1K�O���0}3uKFK�l�b�/�5����D�CR1����v�P���k�5�B��)��%�����m_��u,
�Jwn|l�Y7hz��<8>�9+J
��9"���+�E�B� ��b�f\l��V���I�s���<:��D&W���q�U�%�CO��b�f��F�C������b����L�Q��
����X.��~K�A?�<v���$��k@�9(�l�p
O
�����+��pz���������j���5-az��--�����
�X�;�'%��:$b����1���<\�>�Dh�
d��`��\#��V.���Q�^J.
�'5����Y/gl��FYM�q[�,$��f*���&I>��:{R#��9�,<���aO<0��ZAk��= L?�Vp�U#fI&�u)�e�=ZF���5������0��1UC�q3�B*a,��F���B������fY�����K[�\28=�c 0�����r$d�R[(X�Lh
X�W��7�'�g��|��H��u��.�����*_<o�W��{�}��]�z|���yss������]e�N�QG��(�Rr���w����W��1�����d���P����j��~zU���&����g�m{���|��z?Ea��s��:�|������0�W���b0d��i���#�g<{q��M&�]�V����5������2��o�������6�yr%���!X�������_�x��w���t�}{������7�&y���7�������?����~'�w��x����������=g1,iQ���x��}_]����WA!G�H`ZS�l4e�Q�^���{���Bj�D�3q&�y7�$�x>;���F�:��7�e�����u>������i���gz�T����J����������?
��?�#�.�U��O�k)�2����x}m@M'�|�����).�&B���zhF��s�����Q]�|���MI3��
"�2��]n]��^B1������t�O���u������ :��H�?|��w�_+����e�>��2]i���>�{�I!j�BB�������E��hpA���C�8v9��k���^E�1�:[$#�D��j�����W����bA�O��,'�k���� k��M �L�pf�d =-(�sl������R�hZ��]���W��Y���[E)!�j$$��^�/_������V<����#�:�h��j'��^mg����d ���W�D����Y-�?Z���"5��\���L�%��Z}���'vf���ckk UA��������m5����>�}���(�$Y�|��R��2k.J0m�����Z��A X���r����J��WT-�c+���u���h�O1�����1��|�����
��d6:PK��W,������>�����o���r�K_�(��]��4f4 ��������K4��.�d���2
0J�5�]�H'�z��>����(���6�Bm]���E������"z��~���>"z��^�����>���{����>���
��d�O_,����Q�O�.$:yp�}�t}?}�'ao��+@������a�y�����qu�18u��O�P�8r�#��O���d$����2�m3~p���4~��O�e�d�7\��M|4��W��8�h�h��������
�r���0�Z�����r������������/�7T&�#�`��H�u�#K�_�/��9��Bl��W��c���8�sc<sbmAk�aW�Z��u��p������h�)"�.��rSR9��e�YJ�
���*S%�?����y��9������E�������rw�Uw���4K��Z>�@N��jJ�|�����W�c���C�4B>/�!@K%�ZMw j���
�@y�i�Y�!Dm����!}��,�Us�^�/fpx��$Y^;��7��1woV����G
K#�M�|�s�\���,�_2�39�&]x��;�^���4���j~���!���7���9���:��p%�X�Do����}�B�Y�����8���e�5�?���O����}�5��<�r�//�����s ��$(�_:�6��n����rP����N4���N���R���M�b^M�0eE��\��9/3�U����8�o��ijZq����|�s��q�55Y6p��H�)�e�J$5&�zzQ~B
��w,�Z@����h����DN���r6E,Gp����]bH�*�yQ&�.�a��A���/G�L�d�r���G�I:F��
�>��WS��%I��W��x���_�KJ��k�wyd�����*A�����(Z�U�H�:j-������]U!y��l������j'-)��Z�&7PEj���1��!�W����<��R]
�IW�i��(�_�5��?���>K��8�y:@����.�T�rq�1{�����SL���~�u�
�Y���8`-jH��3�F�Eu��X�����v��.k����A+��: Td�.��P T�N����-���N�������MJ+�������Y��IF5j�+U[�MD
��p�C6�4��O+^�V}]�����������E����"��C�x�AI��S��8��^��n���l@S�2�w������(�)���b��;�
��[ ��e��e�,JW��,##k+!}�}S�� �%^;h����i��9��e6�U,-V��dQJp�-�C�*9�bX,N+�*t�u����o��8�Z�4��o`�x�pE�^�ZG6�`dSTn
�����l
AI�=��ud�����Z��L\;~T��g�9����b�&,���-�{��=�sn�{'��E �<t��f����=j�Kx(<�R�*M+�� k��8�� S���:��2�����Ha�� �G]�c��Z\��I
����rq�J��kx/7�P���6�c ����]1���KF�%�&���E�;���[�F����gY^$�f=BE���T]9B�%��T]~�T]v�T]�^X�ZK�����
Y�1��/ZH���.��-F��"�� ��F����m�V�M�Z�<�!r?.R�\�MM��zP�Hw���F\�pDJS!��C(h�p-)�O>�
�ac(
�~����6��0�wQ��fgl5�-�asZ�]�o2���1\���lQ��zX�;����j �S�!^ ���I��u;����������!�awZ�}���3���n�1�Q��zX�:�=�ao������!�a�R�4�wQ{Sy�c�[�a�`=�
���QO���/��K�T����T<WG�[;��O����j�����\�#-������=��~9� ���h
�&*Q�>K���(��!#F���)}F��u��Z�K������o7�G��:�4A��c�Zb��R�+>�d�-��J���b^��
UM���:��h��S(p��I%����g)�;��_w�+�G��\y��Q���5��_fW������49�; @������n���fy+�jS%+��Kn���7�5gzv���MK@L
K*]�
����(L@���w�:���7K��;����J���f��2S��.�7C"3=�]+H ������8�(�]R�f��'k�h j)i,�=���S�@�j�"_-Hc6i��� b���9|�b���+��u��*�G�2��X�i�GDSY����a5�O]O��0������i2��4��[h���1�j�Rg���=����,�bT�a(a���b�R;��ceH�����z�ud���V���<Y��vk�����r�7�l2�>�����V�I��#>�j]��?i�~�oP����I��#>*xc*�p
��������������������&�8W'