Eagerly scan all-visible pages to amortize aggressive vacuum

Started by Melanie Plagemanabout 1 year ago62 messages
#1Melanie Plageman
melanieplageman@gmail.com
10 attachment(s)

Hi,

An aggressive vacuum of a relation is triggered when its relfrozenxid
is older than vacuum_freeze_table_age XIDs. Aggressive vacuums require
examining every unfrozen tuple in the relation. Normal vacuums can
skip all-visible pages. So a relation with a large number of
all-visible but not all-frozen pages may suddenly have to vacuum an
order of magnitude more pages than the previous vacuum.

In many cases, these all-visible not all-frozen pages are not part of
the working set and must be read in. All of the pages with newly
frozen tuples have to be written out and all of the WAL associated
with freezing and setting the page all-frozen in the VM must be
emitted. This extra I/O can affect performance of the foreground
workload substantially.

The best solution would be to freeze the pages instead of just setting
them all-visible. But we don't want to do this if the page will be
modified again because freezing costs extra I/O.

Last year, I worked on a vacuum patch to try and predict which pages
should be eagerly frozen [1]/messages/by-id/CAAKRu_b3tpbdRPUPh1Q5h35gXhY=spH2ssNsEsJ9sDfw6=PEAg@mail.gmail.com by building a distribution of page
modification intervals and estimating the probability that a given
page would stay frozen long enough to merit freezing.

While working on it I encountered a problem. Pages set all-visible but
not all-frozen by vacuum and not modified again do not have a
modification interval. As such, the distribution would not account for
an outstanding debt of old, unfrozen pages.

As I thought about the problem more, I realized that even if we could
find a way to include those pages in our model and then predict and
effectively eagerly freeze pages, there will always be pages we miss
and have to be picked up later by an aggressive vacuum.

While it would be best to freeze these pages the first time they are
vacuumed and set all-visible, the write amplification is already being
incurred. This patch proposes to spread it out across multiple
"semi-aggressive" vacuums.

I believe eager scanning is actually a required step toward more
intelligent eager freezing. It is worth noting that eager scanning
should also allow us to lift the restriction on setting pages
all-visible in the VM during on-access pruning. This could enable
index-only scans in more cases.

The approach I take in the attached patch set is built on suggestions
and feedback from both Robert and Andres as well as my own ideas and
research.

It implements a new "semi-aggressive" vacuum. Semi-aggressive vacuums
eagerly scan some number of all-visible but not all-frozen pages in
hopes of freezing them. All-visible pages that are eagerly scanned and
set all-frozen in the visibility map are considered successful eager
scans and those not frozen are considered failed eager scans.

Because we want to amortize our eager scanning across a few vacuums,
we cap the maximum number of successful eager scans to a percentage of
the total number of all-visible but not all-frozen pages in the table
(currently 20%).

We also want to cap the maximum number of failures. We assume that
different areas or "regions" of the relation are likely to contain
similarly aged data. So, if too many blocks are eagerly scanned and
not frozen in a given region of the table, eager scanning is
temporarily suspended.

Since I refer to vacuums that eagerly scan a set number of pages as
"semi-aggressive vacuums," I’ve begun calling those that scan every
unfrozen tuple "fully aggressive vacuums" and those with no eager
scanning, or with permanently disabled eager scanning, "unaggressive
vacuums."

v1 of this feature is attached. The first eight patches in the set are
preliminary.

I've proposed 0001-0003 in this thread [2]/messages/by-id/CAAKRu_aJM+0Gwoq_+-sozMX8QEax4QeDhMvySxRt2ayteXJNCg@mail.gmail.com -- they boil down to
counting pages set all-frozen in the VM.

0004-0007 are a bit of refactoring to make the code a better shape for
the eager scanning feature.

0008 is a WIP patch to add a more general description of heap
vacuuming to the top of vacuumlazy.c.

0009 is the actual eager scanning feature.

To demonstrate the results, I ran an append-only workload run for over
3 hours on master and with my patch applied. The patched version of
Postgres amortized the work of freezing the all-visible but not
all-frozen pages nicely. The first aggressive vacuum with the patch
was 44 seconds and on master it was 1201 seconds.

patch
LOG: automatic aggressive vacuum of table "history": index scans: 0
vacuum duration: 44 seconds (msecs: 44661).
pages: 0 removed, 27425085 remain, 1104095 scanned (4.03% of
total), 709889 eagerly scanned
frozen: 316544 pages from table (1.15% of total) had 17409920
tuples frozen. 316544 pages set all-frozen in the VM
I/O timings: read: 1160.599 ms, write: 2461.205 ms. approx time
spent in vacuum delay: 16230 ms.
buffer usage: 1105630 hits, 1111898 reads, 646229 newly dirtied,
1750426 dirtied.
WAL usage: 1027099 records, 316566 full page images, 276209780 bytes.

master
LOG: automatic aggressive vacuum of table "history": index scans: 0
vacuum duration: 1201 seconds (msecs: 1201487).
pages: 0 removed, 27515348 remain, 15800948 scanned (57.43% of
total), 15098257 eagerly scanned
frozen: 15096384 pages from table (54.87% of total) had 830247896
tuples frozen. 15096384 pages set all-frozen in the VM
I/O timings: read: 246537.348 ms, write: 73000.498 ms. approx time
spent in vacuum delay: 349166 ms.
buffer usage: 15798343 hits, 15813524 reads, 15097063 newly
dirtied, 31274333 dirtied.
WAL usage: 30733564 records, 15097073 full page images, 11789257631 bytes.

This is because, with the patch, the freezing work is being off-loaded
to earlier vacuums.

In the attached chart.png, you can see the vm_page_freezes climbing
steadily with the patch, whereas on master, there are sudden spikes
aligned with the aggressive vacuums. You can also see that the number
of pages that are all-visible but not all-frozen grows steadily on
master until the aggressive vacuum. This is vacuum's "backlog" of
freezing work.

In this benchmark, the TPS is rate-limited, but using pgbench
per-statement reports, I calculated that the P99 latency for this
benchmark is 16 ms on master and 1 ms with the patch. Vacuuming pages
sooner decreases vacuum reads and doing the freezing work spread over
more vacuums improves P99 transaction latency.

Below is the comparative WAL volume, checkpointer and background
writer writes, reads and writes done by all other backend types, time
spent vacuuming in milliseconds, and p99 latency. Notice that overall
vacuum IO time is substantially lower with the patch.

version wal cptr_bgwriter_w other_rw vac_io_time p99_lat
patch 770 GB 5903264 235073744 513722 1
master 767 GB 5908523 216887764 1003654 16

(Note that the benchmarks were run on Postgres with a few extra
patches applied to both master and the patch to trigger vacuums more
frequently. I've proposed those here [3]/messages/by-id/CAAKRu_aj-P7YyBz_cPNwztz6ohP+vWis=iz3YcomkB3NpYA--w@mail.gmail.com.)

I've also run the built-in tpcb-like pgbench workload and confirmed
that it improves the vacuuming behavior on pgbench_history but has
little impact on vacuuming of heavy-update tables like
pgbench_accounts -- depending on how aggressively the eager scanning
is tuned. Which brings me to the TODOs.

I need to do further benchmarking and investigation to determine
optimal failure and success caps -- ones that will work well for all
workloads. Perhaps the failure cap per region should be configurable.

I also need to try other scenarios -- like those in which old data is
deleted -- and determine if the region boundaries should change from
run to run to avoid eager scanning and failing to freeze the same
pages each time.

Also, all my benchmarking so far has been done on compressed
timelines. I tuned Postgres to exhibit the behavior it might normally
exhibit over days or a week in a few hours. As such, I need to start
running long benchmarks to observe the behavior in a more natural
environment.

- Melanie

[1]: /messages/by-id/CAAKRu_b3tpbdRPUPh1Q5h35gXhY=spH2ssNsEsJ9sDfw6=PEAg@mail.gmail.com
[2]: /messages/by-id/CAAKRu_aJM+0Gwoq_+-sozMX8QEax4QeDhMvySxRt2ayteXJNCg@mail.gmail.com
[3]: /messages/by-id/CAAKRu_aj-P7YyBz_cPNwztz6ohP+vWis=iz3YcomkB3NpYA--w@mail.gmail.com

Attachments:

v1-0007-Make-heap_vac_scan_next_block-return-BlockNumber.patchtext/x-patch; charset=US-ASCII; name=v1-0007-Make-heap_vac_scan_next_block-return-BlockNumber.patchDownload
From 78ad9e022b95e024ff5bfa96af78e9e44730c970 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:42:10 -0400
Subject: [PATCH v1 7/9] Make heap_vac_scan_next_block() return BlockNumber

After removing the requirement for blkno to be set to rel_pages outside
of lazy_scan_heap(), heap_vac_scan_next_block() can return the next
block number for vacuum to scan. This makes the interface more
straightforward as well as paving the way for heap_vac_scan_next_block()
to be used by the read stream API as a callback to implement streaming
vacuum.
---
 src/backend/access/heap/vacuumlazy.c | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 52c9d49f2b1..7ce69953ba0 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -229,8 +229,8 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
-static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+static BlockNumber heap_vac_scan_next_block(LVRelState *vacrel,
+											bool *all_visible_according_to_vm);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -857,7 +857,8 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->next_unskippable_allvis = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (BlockNumberIsValid(blkno = heap_vac_scan_next_block(vacrel,
+															   &all_visible_according_to_vm)))
 	{
 		Buffer		buf;
 		Page		page;
@@ -1096,11 +1097,11 @@ lazy_scan_heap(LVRelState *vacrel)
  * lazy_scan_heap() calls here every time it needs to get the next block to
  * prune and vacuum.  The function uses the visibility map, vacuum options,
  * and various thresholds to skip blocks which do not need to be processed and
- * sets blkno to the next block to process.
+ * returns the next block to process.
  *
- * The block number and visibility status of the next block to process are set
- * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * The block number and visibility status of the next block to process are
+ * returned and set in *all_visible_according_to_vm.  The return value is
+ * InvalidBlockNumber if there are no further blocks to process.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1108,8 +1109,8 @@ lazy_scan_heap(LVRelState *vacrel)
  * relfrozenxid in that case.  vacrel also holds information about the next
  * unskippable block, as bookkeeping for this function.
  */
-static bool
-heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
+static BlockNumber
+heap_vac_scan_next_block(LVRelState *vacrel,
 						 bool *all_visible_according_to_vm)
 {
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
@@ -1117,7 +1118,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 	/* Have we reached the end of the relation? */
 	if (vacrel->current_block >= vacrel->rel_pages)
-		return false;
+		return InvalidBlockNumber;
 
 	/*
 	 * We must be in one of the three following states:
@@ -1166,9 +1167,8 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 * but chose not to.  We know that they are all-visible in the VM,
 		 * otherwise they would've been unskippable.
 		 */
-		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = true;
-		return true;
+		return vacrel->current_block;
 	}
 	else
 	{
@@ -1178,9 +1178,8 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 */
 		Assert(vacrel->current_block == vacrel->next_unskippable_block);
 
-		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
-		return true;
+		return vacrel->current_block;
 	}
 }
 
-- 
2.34.1

v1-0008-WIP-Add-more-general-summary-to-vacuumlazy.c.patchtext/x-patch; charset=US-ASCII; name=v1-0008-WIP-Add-more-general-summary-to-vacuumlazy.c.patchDownload
From 818d1c3b068c6705611256cfc3eb1f10bdc0b684 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Fri, 1 Nov 2024 18:25:05 -0400
Subject: [PATCH v1 8/9] WIP: Add more general summary to vacuumlazy.c

Currently the summary at the top of vacuumlazy.c provides some specific
details related to the new dead TID storage in 17. I plan to add a
summary and maybe some sub-sections to contextualize it.
---
 src/backend/access/heap/vacuumlazy.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 7ce69953ba0..15a04c6b10b 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -3,6 +3,17 @@
  * vacuumlazy.c
  *	  Concurrent ("lazy") vacuuming.
  *
+ * Heap relations are vacuumed in three main phases. In the first phase,
+ * vacuum scans relation pages, pruning and freezing tuples and saving dead
+ * tuples' TIDs in a TID store. If that TID store fills up or vacuum finishes
+ * scanning the relation, it progresses to the second phase: index vacuuming.
+ * After index vacuuming is complete, vacuum scans the blocks of the relation
+ * indicated by the TIDs in the TID store and reaps the dead tuples, freeing
+ * that space for future tuples. Finally, vacuum may truncate the relation if
+ * it has emptied pages at the end. XXX: this summary needs work.
+ *
+ * Dead TID Storage:
+ *
  * The major space usage for vacuuming is storage for the dead tuple IDs that
  * are to be removed from indexes.  We want to ensure we can vacuum even the
  * very largest relations with finite memory space usage.  To do that, we set
-- 
2.34.1

v1-0009-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchtext/x-patch; charset=US-ASCII; name=v1-0009-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchDownload
From f21f0bab1dbe675be4b4dddcb2eea486d8a69d36 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 12:15:08 -0400
Subject: [PATCH v1 9/9] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Introduce semi-aggressive vacuums, which scan some of the all-visible
but not all-frozen pages in the relation to amortize the cost of an
aggressive vacuum.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
considered successful eager scans and those not frozen are considered
failed eager scans.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. Because the goal is to
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager scanned
and frozen, the semi-aggressive vacuum is downgraded to an unaggressive
vacuum.
---
 src/backend/access/heap/vacuumlazy.c | 327 +++++++++++++++++++++++----
 src/backend/commands/vacuum.c        |  20 +-
 src/include/commands/vacuum.h        |  27 ++-
 src/tools/pgindent/typedefs.list     |   1 +
 4 files changed, 326 insertions(+), 49 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 15a04c6b10b..adabb5ff5f1 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -12,6 +12,40 @@
  * that space for future tuples. Finally, vacuum may truncate the relation if
  * it has emptied pages at the end. XXX: this summary needs work.
  *
+ * Relation Scanning:
+ *
+ * Vacuum scans the heap relation, starting at the beginning and progressing
+ * to the end, skipping pages as permitted by their visibility status, vacuum
+ * options, and the aggressiveness level of the vacuum.
+ *
+ * When page skipping is enabled, unaggressive vacuums may skip scanning pages
+ * that are marked all-visible in the visibility map. We may choose not to
+ * skip pages if the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ *
+ * Semi-aggressive vacuums will scan skippable pages in an effort to freeze
+ * them and decrease the backlog of all-visible but not all-frozen pages that
+ * have to be processed to advance relfrozenxid and avoid transaction ID
+ * wraparound.
+ *
+ * We count it as a success when we are able to set an eagerly scanned page
+ * all-frozen in the VM and a failure when we are not able to set the page
+ * all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, we cap the number of successful eager scans to
+ * EAGER_SCAN_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, we use a localized failure cap instead of a global cap
+ * for the whole relation. The failure count is reset on each region of the
+ * table, comprised of RELSEG_SIZE blocks (or 1/4 of the table size for a
+ * small table). In each region, we tolerate MAX_SUCCESSIVE_EAGER_SCAN_FAILS
+ * before suspending eager scanning until the end of the region.
+ *
+ * Fully aggressive vacuums must examine every unfrozen tuple and are thus not
+ * subject to failure or success caps when eagerly scanning all-visible pages.
+ *
  * Dead TID Storage:
  *
  * The major space usage for vacuuming is storage for the dead tuple IDs that
@@ -142,6 +176,27 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * Semi-aggressive vacuums eagerly scan some all-visible but not all-frozen
+ * pages. Since our goal is to freeze these pages, an eager scan that fails to
+ * set the page all-frozen in the VM is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once we fail to freeze MAX_SUCCESSIVE_EAGER_SCAN_FAILS
+ * blocks, we suspend eager scanning until vacuum has progressed to another
+ * region of the table with potentially older data.
+ */
+#define MAX_SUCCESSIVE_EAGER_SCAN_FAILS 1024
+
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple semi-aggressive
+ * vacuums, we limit the number of successful eager scans (as well as the
+ * number of failures). The maximum number of successful eager scans is
+ * calculated as a ratio of the all-visible but not all-frozen pages at the
+ * beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -153,8 +208,22 @@ typedef struct LVRelState
 	BufferAccessStrategy bstrategy;
 	ParallelVacuumState *pvs;
 
-	/* Aggressive VACUUM? (must set relfrozenxid >= FreezeLimit) */
-	bool		aggressive;
+	/*
+	 * Whether or not this is an aggressive, semi-aggressive, or unaggressive
+	 * VACUUM. A fully aggressive vacuum must set relfrozenxid >= FreezeLimit
+	 * and therefore must scan every unfrozen tuple. A semi-aggressive vacuum
+	 * will scan a certain number of all-visible pages until it is downgraded
+	 * to an unaggressive vacuum.
+	 */
+	VacAggressive aggressive;
+
+	/*
+	 * A semi-aggressive vacuum that has failed to freeze too many eagerly
+	 * scanned blocks in a row suspends eager scanning. unaggressive_to is the
+	 * block number of the first block eligible for resumed eager scanning.
+	 */
+	BlockNumber unaggressive_to;
+
 	/* Use visibility map to skip? (disabled by DISABLE_PAGE_SKIPPING) */
 	bool		skipwithvm;
 	/* Consider index vacuuming bypass optimization? */
@@ -227,6 +296,26 @@ typedef struct LVRelState
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/*
+	 * Count of skippable blocks eagerly scanned as part of a semi-aggressive
+	 * vacuum (for logging only).
+	 */
+	BlockNumber eager_scanned;
+
+	/*
+	 * The number of eagerly scanned blocks a semi-aggressive vacuum failed to
+	 * freeze (due to age) in the current eager scan region. It is reset each
+	 * time we hit MAX_SUCCESSIVE_EAGER_SCAN_FAILS.
+	 */
+	BlockNumber eager_scanned_failed_frozen;
+
+	/*
+	 * The remaining number of blocks a semi-aggressive vacuum will consider
+	 * eager scanning. This is initialized to EAGER_SCAN_SUCCESS_RATE of the
+	 * total number of all-visible but not all-frozen pages.
+	 */
+	BlockNumber remaining_eager_scan_successes;
 } LVRelState;
 
 /* Struct for saving and restoring vacuum error information. */
@@ -241,8 +330,13 @@ typedef struct LVSavedErrInfo
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
 static BlockNumber heap_vac_scan_next_block(LVRelState *vacrel,
-											bool *all_visible_according_to_vm);
-static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
+											bool *all_visible_according_to_vm,
+											bool *was_eager_scanned);
+static void find_next_unskippable_block(
+										LVRelState *vacrel,
+										bool consider_eager_scan,
+										bool *was_eager_scanned,
+										bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
 								   bool sharelock, Buffer vmbuffer);
@@ -314,7 +408,9 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 				minmulti_updated;
 	BlockNumber orig_rel_pages,
 				new_rel_pages,
-				new_rel_allvisible;
+				orig_rel_allvisible,
+				new_rel_allvisible,
+				orig_rel_allfrozen;
 	PGRUsage	ru0;
 	TimestampTz starttime = 0;
 	PgStat_Counter startreadtime = 0,
@@ -458,6 +554,8 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
+	vacrel->unaggressive_to = 0;
+
 	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
@@ -471,24 +569,49 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 		 * Force aggressive mode, and disable skipping blocks using the
 		 * visibility map (even those set all-frozen)
 		 */
-		vacrel->aggressive = true;
+		vacrel->aggressive = VAC_AGGRESSIVE;
 		skipwithvm = false;
 	}
 
 	vacrel->skipwithvm = skipwithvm;
+	vacrel->eager_scanned = 0;
+	vacrel->eager_scanned_failed_frozen = 0;
+
+	/*
+	 * Even if we successfully freeze them, we want to cap the number of
+	 * eagerly scanned blocks so that we spread out the overhead across
+	 * multiple vacuums. remaining_eager_scan_successes is only used by
+	 * semi-aggressive vacuums.
+	 */
+	visibilitymap_count(rel, &orig_rel_allvisible, &orig_rel_allfrozen);
+	vacrel->remaining_eager_scan_successes =
+		(BlockNumber) (EAGER_SCAN_SUCCESS_RATE * (orig_rel_allvisible - orig_rel_allfrozen));
 
 	if (verbose)
 	{
-		if (vacrel->aggressive)
-			ereport(INFO,
-					(errmsg("aggressively vacuuming \"%s.%s.%s\"",
-							vacrel->dbname, vacrel->relnamespace,
-							vacrel->relname)));
-		else
-			ereport(INFO,
-					(errmsg("vacuuming \"%s.%s.%s\"",
-							vacrel->dbname, vacrel->relnamespace,
-							vacrel->relname)));
+		switch (vacrel->aggressive)
+		{
+			case VAC_UNAGGRESSIVE:
+				ereport(INFO,
+						(errmsg("vacuuming \"%s.%s.%s\"",
+								vacrel->dbname, vacrel->relnamespace,
+								vacrel->relname)));
+				break;
+
+			case VAC_AGGRESSIVE:
+				ereport(INFO,
+						(errmsg("aggressively vacuuming \"%s.%s.%s\"",
+								vacrel->dbname, vacrel->relnamespace,
+								vacrel->relname)));
+				break;
+
+			case VAC_SEMIAGGRESSIVE:
+				ereport(INFO,
+						(errmsg("semiaggressively vacuuming \"%s.%s.%s\"",
+								vacrel->dbname, vacrel->relnamespace,
+								vacrel->relname)));
+				break;
+		}
 	}
 
 	/*
@@ -545,11 +668,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * Non-aggressive VACUUMs may advance them by any amount, or not at all.
 	 */
 	Assert(vacrel->NewRelfrozenXid == vacrel->cutoffs.OldestXmin ||
-		   TransactionIdPrecedesOrEquals(vacrel->aggressive ? vacrel->cutoffs.FreezeLimit :
+		   TransactionIdPrecedesOrEquals(vacrel->aggressive == VAC_AGGRESSIVE ?
+										 vacrel->cutoffs.FreezeLimit :
 										 vacrel->cutoffs.relfrozenxid,
 										 vacrel->NewRelfrozenXid));
 	Assert(vacrel->NewRelminMxid == vacrel->cutoffs.OldestMxact ||
-		   MultiXactIdPrecedesOrEquals(vacrel->aggressive ? vacrel->cutoffs.MultiXactCutoff :
+		   MultiXactIdPrecedesOrEquals(vacrel->aggressive == VAC_AGGRESSIVE ?
+									   vacrel->cutoffs.MultiXactCutoff :
 									   vacrel->cutoffs.relminmxid,
 									   vacrel->NewRelminMxid));
 	if (vacrel->skippedallvis)
@@ -559,7 +684,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 		 * chose to skip an all-visible page range.  The state that tracks new
 		 * values will have missed unfrozen XIDs from the pages we skipped.
 		 */
-		Assert(!vacrel->aggressive);
+		Assert(vacrel->aggressive != VAC_AGGRESSIVE);
 		vacrel->NewRelfrozenXid = InvalidTransactionId;
 		vacrel->NewRelminMxid = InvalidMultiXactId;
 	}
@@ -654,14 +779,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 				 * implies aggressive.  Produce distinct output for the corner
 				 * case all the same, just in case.
 				 */
-				if (vacrel->aggressive)
+				if (vacrel->aggressive == VAC_AGGRESSIVE)
 					msgfmt = _("automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n");
 				else
 					msgfmt = _("automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n");
 			}
 			else
 			{
-				if (vacrel->aggressive)
+				if (vacrel->aggressive == VAC_AGGRESSIVE)
 					msgfmt = _("automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n");
 				else
 					msgfmt = _("automatic vacuum of table \"%s.%s.%s\": index scans: %d\n");
@@ -802,6 +927,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	}
 }
 
+/*
+ * Helper to decrement a block number to 0 without wrapping around.
+ */
+static void
+decrement_blkno(BlockNumber *block)
+{
+	if ((*block) > 0)
+		(*block)--;
+}
+
 /*
  *	lazy_scan_heap() -- workhorse function for VACUUM
  *
@@ -844,7 +979,8 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
 
 	TidStore   *dead_items = vacrel->dead_items;
 	VacDeadItemsInfo *dead_items_info = vacrel->dead_items_info;
@@ -855,6 +991,7 @@ lazy_scan_heap(LVRelState *vacrel)
 		PROGRESS_VACUUM_MAX_DEAD_TUPLE_BYTES
 	};
 	int64		initprog_val[3];
+	BlockNumber page_freezes = 0;
 
 	/* Report that we're scanning the heap, advertising total # of blocks */
 	initprog_val[0] = PROGRESS_VACUUM_PHASE_SCAN_HEAP;
@@ -869,7 +1006,8 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
 	while (BlockNumberIsValid(blkno = heap_vac_scan_next_block(vacrel,
-															   &all_visible_according_to_vm)))
+															   &all_visible_according_to_vm,
+															   &was_eager_scanned)))
 	{
 		Buffer		buf;
 		Page		page;
@@ -956,11 +1094,23 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (!got_cleanup_lock)
 			LockBuffer(buf, BUFFER_LOCK_SHARE);
 
+		page_freezes = vacrel->vm_page_freezes;
+
 		/* Check for new or empty pages before lazy_scan_[no]prune call */
 		if (lazy_scan_new_or_empty(vacrel, buf, blkno, page, !got_cleanup_lock,
 								   vmbuffer))
 		{
 			/* Processed as new/empty page (lock and pin released) */
+
+			/* count an eagerly scanned page as a failure or a success */
+			if (was_eager_scanned)
+			{
+				if (vacrel->vm_page_freezes > page_freezes)
+					decrement_blkno(&vacrel->remaining_eager_scan_successes);
+				else
+					vacrel->eager_scanned_failed_frozen++;
+			}
+
 			continue;
 		}
 
@@ -979,7 +1129,7 @@ lazy_scan_heap(LVRelState *vacrel)
 			 * lazy_scan_noprune could not do all required processing.  Wait
 			 * for a cleanup lock, and call lazy_scan_prune in the usual way.
 			 */
-			Assert(vacrel->aggressive);
+			Assert(vacrel->aggressive == VAC_AGGRESSIVE);
 			LockBuffer(buf, BUFFER_LOCK_UNLOCK);
 			LockBufferForCleanup(buf);
 			got_cleanup_lock = true;
@@ -1003,6 +1153,15 @@ lazy_scan_heap(LVRelState *vacrel)
 							vmbuffer, all_visible_according_to_vm,
 							&has_lpdead_items);
 
+		/* count an eagerly scanned page as a failure or a success */
+		if (was_eager_scanned)
+		{
+			if (vacrel->vm_page_freezes > page_freezes)
+				decrement_blkno(&vacrel->remaining_eager_scan_successes);
+			else
+				vacrel->eager_scanned_failed_frozen++;
+		}
+
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
 		 *
@@ -1112,7 +1271,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are
  * returned and set in *all_visible_according_to_vm.  The return value is
- * InvalidBlockNumber if there are no further blocks to process.
+ * InvalidBlockNumber if there are no further blocks to process. If the block
+ * is being eagerly scanned, was_eager_scanned is set so that the caller can
+ * count whether or not we successfully freeze it.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1122,11 +1283,14 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static BlockNumber
 heap_vac_scan_next_block(LVRelState *vacrel,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	vacrel->current_block++;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (vacrel->current_block >= vacrel->rel_pages)
 		return InvalidBlockNumber;
@@ -1137,6 +1301,8 @@ heap_vac_scan_next_block(LVRelState *vacrel,
 	if (vacrel->current_block > vacrel->next_unskippable_block ||
 		vacrel->next_unskippable_block == InvalidBlockNumber)
 	{
+		bool		consider_eager_scan = false;
+
 		/*
 		 * 1. We have just processed an unskippable block (or we're at the
 		 * beginning of the scan).  Find the next unskippable block using the
@@ -1144,7 +1310,65 @@ heap_vac_scan_next_block(LVRelState *vacrel,
 		 */
 		bool		skipsallvis;
 
-		find_next_unskippable_block(vacrel, &skipsallvis);
+		/*
+		 * Figure out if we should disable eager scan going forward or
+		 * downgrade to an unaggressive vacuum altogether.
+		 */
+		if (vacrel->aggressive == VAC_SEMIAGGRESSIVE)
+		{
+			/*
+			 * If we hit our success limit, there is no need to eagerly scan
+			 * any additional pages. Downgrade the vacuum to unaggressive.
+			 */
+			if (vacrel->remaining_eager_scan_successes == 0)
+				vacrel->aggressive = VAC_UNAGGRESSIVE;
+
+			/*
+			 * If we hit the max number of failed eager scans for this region
+			 * of the table, figure out where the next eager scan region
+			 * should start. Eager scanning is effectively disabled until we
+			 * scan a block in that new region.
+			 */
+			else if (vacrel->eager_scanned_failed_frozen >=
+					 MAX_SUCCESSIVE_EAGER_SCAN_FAILS)
+			{
+				BlockNumber region_size,
+							offset;
+
+				/*
+				 * On the assumption that different regions of the table are
+				 * likely to have similarly aged data, we will retry eager
+				 * scanning again later. For a small table, we'll retry eager
+				 * scanning every quarter of the table. For a larger table,
+				 * we'll consider eager scanning again after processing
+				 * another region's worth of data.
+				 *
+				 * We consider the region to start from the first failure, so
+				 * calculate the block to restart eager scanning from there.
+				 */
+				region_size = Min(RELSEG_SIZE, (vacrel->rel_pages / 4));
+
+				offset = vacrel->eager_scanned_failed_frozen % region_size;
+
+				Assert(vacrel->eager_scanned > 0);
+
+				vacrel->unaggressive_to = vacrel->current_block + (region_size - offset);
+				vacrel->eager_scanned_failed_frozen = 0;
+			}
+		}
+
+		/*
+		 * If it is a fully aggressive vacuum or we haven't yet hit the fail
+		 * limit in our current eager scan region, consider eager scanning the
+		 * next block.
+		 */
+		if (vacrel->aggressive == VAC_AGGRESSIVE)
+			consider_eager_scan = true;
+		else if (vacrel->aggressive == VAC_SEMIAGGRESSIVE)
+			consider_eager_scan = vacrel->current_block >= vacrel->unaggressive_to;
+
+		find_next_unskippable_block(vacrel, consider_eager_scan,
+									was_eager_scanned, &skipsallvis);
 
 		/*
 		 * We now know the next block that we must process.  It can be the
@@ -1199,6 +1423,11 @@ heap_vac_scan_next_block(LVRelState *vacrel,
  * The next unskippable block and its visibility information is updated in
  * vacrel.
  *
+ * consider_eager_scan indicates whether or not we should consider scanning
+ * all-visible but not all-frozen blocks. was_eager_scanned is set to true if
+ * we decided to eager scan a block. In this case, next_unskippable_block is
+ * set to that block number.
+ *
  * Note: our opinion of which blocks can be skipped can go stale immediately.
  * It's okay if caller "misses" a page whose all-visible or all-frozen marking
  * was concurrently cleared, though.  All that matters is that caller scan all
@@ -1208,7 +1437,11 @@ heap_vac_scan_next_block(LVRelState *vacrel,
  * to skip such a range is actually made, making everything safe.)
  */
 static void
-find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
+find_next_unskippable_block(
+							LVRelState *vacrel,
+							bool consider_eager_scan,
+							bool *was_eager_scanned,
+							bool *skipsallvis)
 {
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
@@ -1217,7 +1450,7 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1253,23 +1486,31 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 			break;
 
 		/*
-		 * Aggressive VACUUM caller can't skip pages just because they are
-		 * all-visible.  They may still skip all-frozen pages, which can't
-		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
+		 * In all other cases, we can skip all-frozen pages. Even fully
+		 * aggressive vacuums may skip all-frozen pages since all-frozen pages
+		 * cannot contain XIDs < OldestXmin (XIDs that aren't already frozen
+		 * by now).
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if (mapbits & VISIBILITYMAP_ALL_FROZEN)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Fully aggressive vacuums cannot skip all-visible pages that are not
+		 * also all-frozen. Semi-aggressive vacuums only skip such pages if
+		 * they have hit the failure limit for the current eager scan region.
+		 */
+		if (consider_eager_scan)
+		{
+			*was_eager_scanned = true;
+			vacrel->eager_scanned++;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible block is safe to skip in a semi or unaggressive vacuum.
+		 * But remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
@@ -1781,7 +2022,7 @@ lazy_scan_noprune(LVRelState *vacrel,
 									 &NoFreezePageRelminMxid))
 		{
 			/* Tuple with XID < FreezeLimit (or MXID < MultiXactCutoff) */
-			if (vacrel->aggressive)
+			if (vacrel->aggressive == VAC_AGGRESSIVE)
 			{
 				/*
 				 * Aggressive VACUUMs must always be able to advance rel's
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 86f36b36954..236bd2dbb98 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -1079,7 +1079,7 @@ get_all_vacuum_rels(MemoryContext vac_context, int options)
  * FreezeLimit (at a minimum), and relminmxid up to MultiXactCutoff (at a
  * minimum).
  */
-bool
+VacAggressive
 vacuum_get_cutoffs(Relation rel, const VacuumParams *params,
 				   struct VacuumCutoffs *cutoffs)
 {
@@ -1213,7 +1213,7 @@ vacuum_get_cutoffs(Relation rel, const VacuumParams *params,
 		aggressiveXIDCutoff = FirstNormalTransactionId;
 	if (TransactionIdPrecedesOrEquals(cutoffs->relfrozenxid,
 									  aggressiveXIDCutoff))
-		return true;
+		return VAC_AGGRESSIVE;
 
 	/*
 	 * Similar to the above, determine the table freeze age to use for
@@ -1234,10 +1234,22 @@ vacuum_get_cutoffs(Relation rel, const VacuumParams *params,
 		aggressiveMXIDCutoff = FirstMultiXactId;
 	if (MultiXactIdPrecedesOrEquals(cutoffs->relminmxid,
 									aggressiveMXIDCutoff))
-		return true;
+		return VAC_AGGRESSIVE;
+
+	/*
+	 * If we are not required to do a fully aggressive vacuum, we may still
+	 * eagerly scan pages as long as relfrozenxid precedes the freeze limit.
+	 * We don't bother enabling eager scanning if no tuples will be eligible
+	 * to be frozen.
+	 */
+	if ((TransactionIdIsNormal(cutoffs->relfrozenxid) &&
+		 TransactionIdPrecedesOrEquals(cutoffs->relfrozenxid, cutoffs->FreezeLimit)) ||
+		(MultiXactIdIsValid(cutoffs->relminmxid) &&
+		 MultiXactIdPrecedesOrEquals(cutoffs->relminmxid, cutoffs->MultiXactCutoff)))
+		return VAC_SEMIAGGRESSIVE;
 
 	/* Non-aggressive VACUUM */
-	return false;
+	return VAC_UNAGGRESSIVE;
 }
 
 /*
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 759f9a87d38..39809f3fc83 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -288,6 +288,29 @@ typedef struct VacDeadItemsInfo
 	int64		num_items;		/* current # of entries */
 } VacDeadItemsInfo;
 
+/*
+ * The aggressiveness level of a vacuum determines how many all-visible but
+ * not all-frozen pages it eagerly scans.
+ *
+ * An unaggressive vacuum scans no all-visible pages unless page skipping is
+ * disabled.
+ *
+ * A fully aggressive vacuum eagerly scans all all-visible but not all-frozen
+ * pages.
+ *
+ * A semi-aggressive vacuum eagerly scans a number of pages up to a limit
+ * based on whether or not it is succeeding or failing. A semi-aggressive
+ * vacuum is downgraded to an unaggressive vacuum when it hits its success
+ * quota. An aggressive vacuum cannot be downgraded. No aggressiveness
+ * level is ever upgraded.
+ */
+typedef enum VacAggressive
+{
+	VAC_UNAGGRESSIVE,
+	VAC_AGGRESSIVE,
+	VAC_SEMIAGGRESSIVE,
+} VacAggressive;
+
 /* GUC parameters */
 extern PGDLLIMPORT int default_statistics_target;	/* PGDLLIMPORT for PostGIS */
 extern PGDLLIMPORT int vacuum_freeze_min_age;
@@ -335,8 +358,8 @@ extern void vac_update_relstats(Relation relation,
 								bool *frozenxid_updated,
 								bool *minmulti_updated,
 								bool in_outer_xact);
-extern bool vacuum_get_cutoffs(Relation rel, const VacuumParams *params,
-							   struct VacuumCutoffs *cutoffs);
+extern VacAggressive vacuum_get_cutoffs(Relation rel, const VacuumParams *params,
+										struct VacuumCutoffs *cutoffs);
 extern bool vacuum_xid_failsafe_check(const struct VacuumCutoffs *cutoffs);
 extern void vac_update_datfrozenxid(void);
 extern void vacuum_delay_point(void);
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 171a7dd5d2b..abed3008f87 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -3056,6 +3056,7 @@ UserAuth
 UserContext
 UserMapping
 UserOpts
+VacAggressive
 VacAttrStats
 VacAttrStatsP
 VacDeadItemsInfo
-- 
2.34.1

chart.pngimage/png; name=chart.pngDownload
�PNG


IHDR�o�<&9tEXtSoftwareMatplotlib version3.9.1, https://matplotlib.org/��!	pHYs.#.#x�?vIDATx���w��U��g7��!H�:Tj� �(��(�S�*�E�� E�P� ��C'�PBKHH������f���&�L��w��w���������r�-����� ����E+�,V(X�P
�X�`�B)�`�R��
��J+�,V(X�P
�X�`�B)��%1bD�����}���s�=��U������u�V���t���e]�/��+�g�}6W\qE�O?���qV

6,uV
�`!^z���s�=���R9��J���,��-Zd��)��Q+G}tv�u�:��8qb9��TWW����S��X�)���h��ez���w�1;��Sv�q�:4�{�.u�Z�`�
���y�M7�TT~��c�|��_��h��`�Bx���g�}��f��������C��(����o���QG��
o��6�n�a�#���������h�O�>�	�jI�d*++����f��5jT4h��;�G��~��SVV�\��m����n�l�������Y`�J��g��%�\��<3f�X�9;v�	'��3�8#-[���UUU���������S��`�V^����:uj=������y��Y~�$�F��E]�M6�$/��R�gy�������
6��GY��`��Jh��Q�c�=����m���[o����3�n�m��m[t����^�z��g���<}��-p����C�^`A�TUU����+��R�[k��r�e����>����_~9���Z���g�y&{��g�����q�;vl���4iR������c�=�^��y)��������O�_����[o���OO�N���-//�.���Gy$?��
��|�I.���z�����-������k������^��y)������o~���x�u��<��;.v]yyy����|��_,������	�9S��}��GuT***�y_��,(�~��e��q������v���jm�
r�9��S�L�C=�Ly��g�y�h�O�>��',�,(�x�p���"�~x�����^)/�����O?�Lyn�������o����j���EQ�+Xuuu�}���x�M6I�V���G�����}����w�Y�<���+�����R�KRQ���9rd��W4(eee������U�����G��5��G�Ly`q�K�4c����='N���k���[4>����}�eL��V�	&���UUUK�n��)���������S�`�*J�4��5+���#���o�i��M�.�������:uja���kg���[�,�$
�`���C����:{��wI�����h��o;�X��K�4�:uJ��M��>�(�f�Z�9����z�h�O�>+<kX��5l�0���Ka\YY������Kuuua��g�l���+<kXP���o��w���
�~uuu���W4��O���5�,(��}�{i��Ma����=���
���O?�?��0n��Q�<��v}�l
��Z�n���:�0����G�����N����+9����|��}��<���k������(����.uX=����6m������^�������;�G�����G���WUU�<0<�@a���,tP~��d�]vI�����L�>=o��F}���}��y��W�$u�6���L�N�2y��������p�����,X�n�����>Z�=�9�����w��O�81tP�����}�7N��]��m�L�>=&L�'�|�9s�,pn]��o���}���q�N���������{���x%��u�<��#9���r�5�d�����f������{����u����\Gu��+V��R�5]EEE�������{9�����c�%����[�?��<���6lX��5|��<��Es}���cbX6e������Ouuu�~������3fL&L�����u�����{z�����;�:&,5X�P����E+�,V(X�P
�X�`�B)�`�R��
UQ�P*&L��O>Y����i��q	��c�������=��#m����ZX���|��t�A����{��7_���kun�r�E`�BU�:�����_4���{��F�(
�Z��:�0���gq`��j��q�x��6�[lQ�4�j���gq��cX�,V(X�P
�X�*JXu���|�nR=��I��k'��)u
jC���,y��R��QV�|������N��(�����j�-;&MJ�c��d��d�X�X�R�:��x�����.�?�I?�T�+]j����US���rB��J%�����-mjG�T*'$�N�$M[�6K�v5���J���Q�,��cj���&e%�$RsX���RV3�&<�����V3��}I#%I����R�*APk/�)��x�E��d�W��`�z?�wL���[%{�����.��������(i�^R�0����fJ���'���3��Cj�FIv�N�j��f`A
��Z�1�������(m�y5m���S2����$�&$��+������TUU�����Q�������<eee���X
��Z�[���eis,L�uj����Z5X��K	X�TWWg����<yr&O���3g�:�b5h� ��7O��-��y�4h�����(�jm���c���k^���+'�4��������~�Y�f�:
@���3'�&M��I��$-[��:����a��:���>��Eis,I�k|is�����>\����<yr>������o`�6cJ����^����X9��)�U�������RG�3f���a�2c��RGIE����3�����S����i�����%����������.P~��a��j�*-Z�H��
SVVV��W]]�9s�d��i�<yr*++���f���9rd�t�R��
��Z�9��7�V��fmk��^L�=���&����,���>}zf��U4��e�����J���^��
��I��m�63g�����3g��:ujf����
�,cy����MJ&~��Z3n�<)[�?y�v�������gj������U������
6T~��5j��]������_'N,Q�%�:�R�J��S�����5nQ�<�����7.K��N��$�]������L5+u:`U0V�V��_������j�*&L(�M�81:t(]��]X�
PS~U� )o���%=�R�TKVV�l���������j���]���V
����9sf�\���_	X���f���������*�i���c�'�~��Q�I�����TX@-TUU-0��a�$�?��wMuu�,X�����z��)4zH��C���XV-�'��'S��:	�*���^`�T��p��R^^��\UU�B�WX���g���K�b����X�;���)mj(������k�-:&
K�e~���4m]�����^�[2����<�yX��n����R�%V]�L�Ts���'�:�6����5�)�j��d�X��Jl��d����MZ�6��j�}���S�	#��~�T�/u*�5Wy���n���cyE��ii����$]z&��l��fN@�(���6����uRVV�,k��mj��g$���4
�K����`5iU�k��M��F5�+��6��J����5GX+FYY��m���	%���R�%0id2����[�w��k�k�i���X9��1�Z6lX���
_}��)u�%�5kVz��Q�|�u��:�d���������^{e�u�I����^�}��]����~�^�{����_t~���WHFXV���X���'g���*������RGZ�*J�DO_���h�\����&j���������F���o`Y��w��;���$�p�
s����8����9���3n��RGX%2$/��b>�����93m���f�m��w�9M�4Y���L����~;���n�������M�6���cv�a�t��m��r��e����?�O~��$�i���}��7�5*q�C����5�
vNZvL*'�}����$-��9~�d�W�L��uj�2��1c���/,��;��4l���������S��:
@���93���z�_|1/��b>���TWW����[��O�z�������.�(����B�o��E������;/:��/0 ��{o{�����+���Z��]�v��'��N8!m���_�����n�����{�h~�=�H���k���'��+��"#F�����s�5����O���+#XP�G�w=>Yk��fY����a�d��d�'��W�	�:�V�����w����������_�@�����7�8qb��K�.9��#J����������j�����������Q�F��-�������O�SO=��f�����z3f��q��?��O�=o��)���k����%�������/q��_=|p>���Z�����r�9�����mn��������^[�^{��Wu��q��r�)9��3�$����s��'�E��q��V�Y��ijn�\��Q�Xm�Mz�����k
���)m&`�0r��\w�u�������
���I�&����ga����f��i��I	S,��7�\(e\����r�a��_&I�
��K��n�:C�-�3z�����~y��G��/}i����'�,�j��u:u����[g��1:th������������?�)�~�2<�����������^�:��r��g��I3fL�������?���Wf���m����k��595K���o���C�q����V����RYY�$i��i���S�@��W^y%3g�,��>�������������R����[�nE���}��:�*���"�7��=/�����N<��><~�a^{���7.���?��K��9���9��C�\���/~1�^{m�~��L�0!���n�!C�d������K��Y���UUU9�����k�-�����?>S�LI�4o�|��j��U�<�������mf���L{�
T��Z��%���:E�������:-��9N�����4����k������o,����o�M�6�D�y�����[l�E���]YYY6�h����N�q����;f��������'�|�^�1v��\r�%Es�^zi�>�������|���N;��]w�5��
K�|��'���+s�,�:���9��#s��g/��x����O��p����w���$�5kV~��/�����o~��$I�-r�g����[�=������nH��5*w�uW�9��e�seW^�P_����+u���`�R' I�H*��Gy��.m`�����-c��)������0
�i��	E�V�Z�&@�w�}7n\����q�9��S���;�I�&�z����7�<yra��������Z�����nn��������*c��]��M6�$o��Fn���Zn������[���z��<�V�f�����O~R_t�E����R�7W��=��G������_�=Wv��e��d����'�3i���y��A��y�S�$eeI���O��NJ�&MZ$���t�����U�w�Q���m������i�O��O/����(	@�������UUU�L���K|��k����n�����N�L�<9��_s�I'-��M6�d��}�k_K�=2h���������?X������/���O�������~�~��-�^���7�Q�9`��<8m�Q���2R��jc���c�VI������e�-k
�*k>��)���T����={v^x�����[7n\Z�j���_?�z�J����i�	&�����{������g���i��M:v��w�1]�v��GQ?&L����>�}�Y�������i�&n�a��f�t��q����{�e�����O��A�t��1;��S6�|�zxK6j��<��c��W���TT�_��K/��>� #F�Hyyy6�p����{��������g��;�����'�m���l����n�-S�)S�����������c�f��ii��u:t�����~�KJVV���������3h�����;=zt�N���-[�}���j�����[����^��2<xp�#F$I�]w�l������:g������<xpF��3fd���J�����.��q���r�����^x!�~�iF��-Zd�}�]��s���/��a�����>��9s��[��X����{/����3q���k�.�;w�����v��-s��c���'���#2y���k�.[m�U���/�A�����x���3h���5*��OO������g�]wM��M��ZUUUy��3p���;6��7�:����w�=�:u��k��s�=���G�l�Az��U���w\�+I����E`-��v���k���K��=������;IRQQ�?��������=�\rIa��?�9���/�m���,Vs�Z�U��z�rN����zN2������_,J�����w�����������Y�f��+��W\QT1W�����o|#�_~y�]w�Z_���^�]w���~8\l!�l�SN9%�����X�QVV���.� \p�"�=���-�����_���\s�5y���2g��E^����QG�c�=6m��]l��=������~��_~y��o�������<�N����>X��}m,��^Ks���u�]�k��6|����5k�������^�&M��7y��\|�����2i������Z���Ks�q��:�����;��3������/g����<�S�N9�������V��|p����_��W���.��9��'f������Cs���/s�9�,q��6,��w_��������[��O���O>�$w�uW����<����1c�"�m��m�=���v�i���s����<��������.��u�G}�$���k�
����~�9���^X��m��&�\rI�������a�r�E��{���q�zN�f���o~3^x�b������������K/������5�h�UW]��X��~������q����K/�w���?��h�6�l���)S���+��m��V��2�
d��v��^��v��������v�i��������;���O��������E>�������c�I��}k�k�������[o�5�~��B�i��I��w�\t�E�r�-k�o��}s����s����r����W��U>�������e�}����_^�k������������Z��=w^������S��y�z��d��E'N��&L��������zj��v�e�Vd���O�V�
?������X��#k�)cj�-:�6���I����7K:lX3W�����bM�0!�{���g�����$�1cF�������#>�`�����k�����7��M^����_%��~�SN9%;��C\�����}��l���9��#��/,��*I����������N�o��:]��3��W���E�_%�;����}�k������w]=��CE�=��c���:uj��o��r�)-�J����\v�e�g�}2m�����!C��g���7�Yh�U��=:����r����*�����l���9�����/,��*I>����w�y�j����K/-q��o�9]�v-�z����7��U��}�{Ee>{��w�>��Z�]��x��t��%g�qF�������$?~|����:�?�*.��������,�J������'������]|���t�M��?�q��WI���w���6�,��rK��1����7�e�]���k�������_�V[m��/�|���������
7�0���"���d��9���v�}��p�	K�^�W�~����[�����"��5*g�yf��k��* ZO>�d6�h�\r�%�,�J������{����n����gK}�I�&e�}��~����_%5?�z��|�_X�������_/�����^��s�t���0�9sf
TO��g��E�����y����'�����$��w����_��4h� ���ka��+�d��1�~��EE���{���J����ufV�[��|�������c����`TUU�C9$�>�la�}�����K�O���C�f�����&M��o~��y����w���=���Z�l���;�u���={vF���?����A�e��v�����c�e|����O����f&L���}k��V�Yg�4j�(�����a�RU�t�c��g���.��0n��e�t���M����>Z�����E��b�|���\��-��O?]���M�l��FK�Wuuu?��<��#����;�s������{��WT*���O��SN�M7��Q�Fe�=������$eee���{��o��c���?,���W_�v�!Gu�b3-�5��i�����i��e���2v��|��GE��#F�H�^����/g��7_��m����w���w��P�����<���{���/-r�
7���������k��;��#eee�}<+���3(rj��Q�_��j�*
6����3t������'�����>����U�����3�<�0n��q�u��������?^����oLuuun���%�=g��w�q������}��Yw�u��Q�|��gE83g������L�4��Ep��;���
�F��[�ni��u>�����,-��?�8�vXF�U�[w�u��S�L�<��}?��n�)'�|�e���5K��]��e��7.~�a���M7���#G��{�Y���]w��c�=v�������[�ni��Q���c�&I�z��v�a���P��������|�[�Z�=�I�&���[�5k��kp��9��/��?���%i�f��P�3�c��Yo��2{��2$S�N-�WYY�o}�[y����JW5���N��G�uZ��G�6�h�w��>�%�����3��m��&u���G����Z�p�
i��Y���_��=��$�����g��A�\�Uj���������#�)������~6����}������k���,,T�~�����&I��~�<��=zt^}��4(�G���7��6m��L�>=Gy�B�����q�z�����_>���L�4)���n�W^y%����1cr����s���u��y����/r�Gy$�<�H.������|�;�����6�,���a�r��=������N��o��Q�Fe���y���2d��L�81?�p�?���h�b���\O=�T~��_'I���/�����q���[o���^���#��Od��6+Z�����d���5*�|�Ia��[,�~��������$�G�A�e��y������og���9������|��y��7s��Gg���i��I~��_��O?��!C���/f��!y��w�����=���3k��%�j��A����x�����2e�����{y�����K/��?��	r�w�TVV��#�\�j~_���r����g��G����7�|������,��~{�^{�%>�%���S���;��N���_~�B�/����,t�=��#W]uU�z��L�:5��������������s���f��v*���������L�2e�O)M�81?�����������Q�������W^��Q�����.Ptv�M7�/���������6l�SN9%o��v��Sx����O2x���p�	EeNg�yf�{��Z?�q��^w���Nn����3&���^^|��|��'2dH��{�Z�Y[g�qFF��
���N�|�O>�$/��r�{���7n����{,'�tRQ�������g���4hP�>� �G������l��p�?�����7�Yl��������~Q�U��]����5c���[o��W_}5�G��3�<�]v�%I��C���o���f�>���|���.*�j��}���?d���y��w
����{.���k��?�������t�_��W�����:*o��FF��W^y%���c��?�1�Z�*��2eJQA��f��i������u�c���{��e�5����g����qYYY��w�Z��:uj�?��������>��S����V[�_~���v�R�(uVoUs��������,i�~�^�Q��m�>?E���9V*���>���$�W����{��i��a��-Z�������{g�]w��Q���T��g?�u�]�����o�}������b3�o�>'�xb;��|��_�+���$����2h�����c�5sKZ**�+6�`�:�y��?~|a��s���?�Y��a�-Z��_�r���/��K/]�@cQ��X���'7�|s4hPtYYYz�����z*�n�m>����1bD����|��_���Z�7�x�h����.�~��
KRS�t�i�-p���s�u�e��i���[�$���9�����;��E�y����n�-�v�M7��>�v�!���N���������:h��z���!C��k������e�u�Q9���s����H������������o���<��<��y�����|_w�q����������a�VTls�Yg��_��b���&M����y����{���^�z-q�.]�����Zb)Z�&M���=x`N8���|��I�O?�4��~{N:���?������m�������[.���v�y�<���9������O9�������,�{����J�:t�Px}/��n�n�!�{���G������=;'�tRX��3y��$���o��<�:uZ������j��9rd***r��w�[����7m���u;a��|���.S�����C����.t�v����3���^�ze���I�_��9��c�X���SO-*j�j������k����������.y�����o;w�ygQ)Q};����
��_�<���}�����'�|2}��)*�:������}��Xrq>���������n������o��q�=��l��F���W����{�������Zk��Q���1c�
6l���W���������T���r�9�������|=/��~���k�}�������-���_�Y���UQy��z�2:�3+)�H��������R~���[�5cJ�k�b�u��]w��@���6�x�����h��[o����f�-��S�D��ms��w����}�������������/�7n������k�.�n�m����;���nZ��j^k��V�=����|������\�[o�e����[h���.�������VW^y�B���j��Y������/��j^M�4�������[���u-NYYY���WTL���c������������\t�E����t��q��W�*//�u�]�
7��0W��mU��?�a��Ws5h� w�qG�u�V�9rd���?/r��^XT����s��W������7����>Z�GQ�a����_�Z���r���/��jan���|�����%�\����y�����g���3s���.���?�8��{oa��Q��}���_����<��zk6�h�%?����{�����/���������������c������\��u���~����_�k��v�!�R��5+�=�X�������,��SVVV�=�7o��=����_��������Kj���^��~�����wQ���ks�1WGK>�U�����OJ�����~���:I��?s+�&-j^�Us���L����#nLZ�zd(����TWV�:�j�l)JV�����i������W��=��3�?�x�d��i���;s��'�[��7�8;��S^x��$�s�=Wo{/��W_]4>��3k]~�4.������u������N*�_}��z������Yg�e����,^x�����sv�a��������]������Lyyy�<���^[�����]����~�������5��c��q��g�}
�N;�������f�m��?�9����i�&w�yg**V��F���C��~��$5�6��MK��MK�l�����9����x^�&Mr������.�������������Nz��������;�\�Lg�uV������=;Ir��wg�������;l�e^�K�f�r�9����9s���t��e��z���W��������p��w���/^��;����}�$���w���/q�����.�QGU�Luq�-�����0>��#��N;-q]EEE.���������?�����k��G��M(\��;,��_
�W_}5�~x���L�/�j��I�������
��~����g?+���������V�g�����;���s�=��O�z��8���O�F�2s��$���:Y=~r������N�f�:���Y�?n+DYy�u�d�I����d��������\�t�����2��hQ���M�LIY�����P
6�Sq�1�S(�J�����kV�t���P��<
���5kV���_WTT���O^n�k��u�������v���K�.>|x��S"1q���q�e���z����&����-�������F4X�_�j��E�u��?�0I
�O}���{���#2z���������^{���������3f��C�_����On���t���~�����������[oe�w,a�e3o���|��9���8/��r�N������?���E��|�;u���}����3HRS�S[GqD��U_����j��V�80�~�ia|�����4p^���O�g�����1c��C�E�<��3E��Z}��H���3u��:���'�|�h\�b�����/g����'���%��#G�������n���{��w��o_��l���E�U��h���E�F��y�����M��L����?�7���B�]R��������]tQ
������o\�\���y�B��I�R]]�R��.-X�����_U4J:lX�4��+����:��7.K*���~��d�S���l���i��]�����W�x���9rd������^�o��Q�Fe��IP����2��MK��Mk���^~��������.�:u��������������w���P�4YU}���,/�s��g�Z�;����o_��s�&M�T�u&L��w��g�y&�g�}�I�&-�<,��1cjU��$��~���_(�y�����/|�P�$'�tR���o�:{)UVV�����O<��f����<yr�N�������3f�
J�|��~�8��5��;��'�x"I2g�����+�}�������j�v�s�.]�
��}��Z����Nu�V}��u�����;����v��h���_.�����SQ[��M������g��s���1cF^����a���u�]k����<�{�����^�{��jU�U���c��E����iEh��I�x�����1c�b���1c�d���+z�\{�����c���Ey��7��_��0>��s��F-S��h��Y���$�����i���Y�v�E�jbn9O�M�#�/mX���%���������-]`�T��Y6�2��1V;e+����-����]�tI�V�
�C}��b�W���3�<3�����9s�*��	�K��!C��KS�R���,I�����-�Z^�Tf�$�-�J�@������2u��\p����k(+��	&���
��;����n��ck�G�y�U��z�\y��K�cE�5kV����\r�%�<y�R�Q��me��A�l��fuZ���[
��d���`���;E���/�o��9�4iRZ�n���Z�h�:,���V���k}���������7������=;�F�*�7�`�Z�������{���^�^��f��Q�Fu�c�m�)*��[��$uy���)Y1?���-Z��T��0�?�������'g�������_�k��uz��Z��3'�w\f���$�j��r�g,u�����K�*`�&����e���6�n���tW*�����,e��zk��}���k��P�UUU����!C��W�^���O�)���-���(�ZD�$M�4Y�����%TKS�1�ey|���3fL��s�������O]_����^n���|�k_+�o��y�����t���M�6-p@��e�gy}���[�NEE�*N�?]X��R��4q��%`�j����[[u���z~�5�������i���2$Z��������l�5���(������_VUYY��B���:u�b�������k_�Z^~���\�f�r���g�m���>W^yea�����t�Mi���ReZZ������-����,��D���c�v%�����SS�-�<���6��W�6e��
Df����~���_m����c�=����f�u�M�����i�����.�,?�p�s�������K[\�����e��cup�!�,P~�����w�����G�[o��h�"M�6Myyy��~�����o_�k�_��$]�vM����i����O^��j���J�^���6�d���O�V���i�4h��p��?��.�lE�].���q~+�ZVUUUK<gE��,��W��31[�F���g����)����z���T��Y���K�RVVV(��5kVF����^��{�1�h�4E��f���������5j����e�]j���i�r�y��'�tR���/�9����g_�V��T(�*Q�����o9O�����������S�������������}Vu�
7����/��^{����7��������[��ii�l��h���������_4����J�d������
EZ�l����>GqDQ���<��c�t�!C���NX`~��A9��3r�5�,���������n��0n��a~������O^bQ��!C�w�fy�76k�,�&M*�|��TT,[�J�N��i��d���_��W����2���[��/l\���y�
��������-��k��9��4m�4]�t�G}T�>|x�
��^4�l�������*G}t����4h�?�����W�R��f���i����]w]����:��$O>���U���_�4sa����3g�]�t���W
�Va�'%c������)�����]�q�����jn��q�������i��1u^3n��������j�j�s������=���/}�Ku�yj��]�x��Q+��+�n���?����YN�
�x��9��#j�vY^��f�����������w�{�����}m���<���Muuua|���?�q������a����5kV6lX�5c������t����������c��K�su��C��q������{��5Z�h��
f��YI�O?���{,��%i���T���jc�����I��6���k��A�q�k���w�Y`��������_�����,7�|s>��Z��2���b��3V'���`�U]�������k�>~�f�Y�����e��A�d��d�C5_O^[S��z����t�G}TT���k�����SUU��^z�0�v�mk]~�$o��v�2-��7��h���/����,��z���{��W�$��/�P���}�z���^�,����>�����6�����/:�����J[86��V^^�O<��kW����0g������uZ���o��w���9��
<���Vc+�����G�����3bD�>P�����s�d�u�I�F�
�w�}73g���,w���^�����v���s�=W���}�Y�
V7l���u�$��zjn�����k��&}����+���3��=cuRQ�,�I��|��'m:�����t����`u��er�����\�+I��M&�L��[�l�\�|���7.����/=���E��v�i�s�����g��n�i������u*")///WWW�z���o�f�����2I��k����?O�N�j����c��Yo��
ELu-C[��9�p{��6J�
j�n��Iy��W���<�@������y����_��M7�4O?�t���?'��9��������:��2����Zk�m���ZWUU�������'��V[mU�s+++���4h��={.p^�����c���?�xv�y�e�����w�����O��z��N;�TT���;'�pB��4(C���L�5�v�m�$If���g�y&{��g��WWW���Es_���;�j���������GMuu�������{���-Z�����{n~���������~��Z�_�-Z��G����~8�]vYa���[��+�X`����p�V��/�VFc���wO�{W����$�k����>�������j���)i$VB�f��]w�U��o�����{���9��P��9����������IM�����Y�F��
��^{��g����Wu���[���I����0M���uX������L�>���������O���^{����n�!m�Q����z*]tQ����-��v�}���V������w�}w�L�R���s���$�w�}��7�tSf����!W3;��SQ����?�A���u�����o���TUU�j���^[�y���gj��}k���G��\���:�d�M�+�ji��wN�
�?�p��E���[��_���k����.��_\4w�9���s����E�����{�]��=z���m������U�y�#�����.�,�cZ�)����3�!�&�>Z��������ki�X�4��g��(�`!.���L�<y��=��Cy�����M���#�X������%����={������\@��]�����C����SN)��7���o�Y�=Ve_��W��O=�T����N�:n�����0a���1"\pA��UUU���:*�G�.�u�Q���Oa��e��u�]i��Qa���/^���y�������|h��)9����g��x���r��w/���������+���w���s{�����{��q~���/[��H��
����0����	'�P�%a���_�[o�����_�UW]��u�>�ln���z�2���;.eee�������R�E�3gN�<�����}�{��ouS^^^�>�$\p�E��{������O�-[��������x���;��?�/����^I��3'�>�la��g����Z%L�|����W��<}}�S�O�n�Nk��k�S��6+��>�,�~x����4l�p��<8G}t��1��6m�,pn�
��/|�P���g���+��Yg���������:��t��5-Z���)S���R�?>m��������+���[��b���w�}����'[m����7.�����n[��+�}��7
4��9s�$O<�D�;����;��s�m���9��sr���������s���(k~_|q�x���x��6Z��z���_��W��O~���0��#������}�:_wy�y�����g�����/���=���2���7������+�����l����r�-zUUU������u��1Gy�"������������*IM�^���s����-�'�|�����9��C���;����N9���������#�$�<�L���o�_�~i��u���:ujn���4o�|��i
4����_Tu�g�A�9��S��������C��9sRVV�������&��������$5���>8�<�LQa��������}/,�5o�<'�xb��[�u�Y���
�G<���������>{���1b�r�SN9%:tX�u���?���O.�;��cs�5�,C�������I�&����	�,
�V#F���/����_��/�\����k�6�t���2[o�u�R4�1��o���	�d���c���Vk�4J�H�\�?�+�������1�����k���������K_�R������������S����s�:���?��n����/��E�{��G
����s�����s��g�c����1c����n�E]��'���,�l�I�{��Z�///�^{�����I�	&��_�b����f��6K����������Xw�qG��n��7.I����f��v�~��w�q�l�����:uj�{����o��w���N;m�-�Z{�����{��GI�<���5k�"��V%G}t���?�7�pC*++s���k������'���k~������?O�l���y��wju���~:^xaa��Q��u�]i���B�����G}4<�@��~�c�=6��w_�����o;�^zi����������.�,=z�(�7}�������9�����'�����k��M���2~���������Kr�1��U�V�s����~��y�����^}�����O�]v�%�\rI�9����y������/��~z����,�>5g������y���s��w�������W�����[�o�[��k�B)�}���-��"��zj9��t��e�u�q�{��7����2i���w�y���q�����+�>�h��"�SO=5��s���g��6K��
��G�_��W~��$I�f�r�����o_�>������~�P���Ge�������v�aE?�^x���u�Yy�����������s���oE�������o/��yI�A��������I�&��N�����4?��Os��sN�����������*��w_N9��>�pn���s�i�-��<���9��c
��I��f�����c�=����k��mz��Y�5+�����Z\	��@�J��g��W\���O?-u�:����@��.��|F7_���)X���
�������l�_Jz�[�L��>�����y��G��+��W�^i��}�v�����g����6mZ������;�X��e^�{l��������Ij�E����\u�U�x����M��;6C���9s
��9���1��XIr�������Kuuu�������g���s�x������h�K�.��?���:�P82}��\~��������c����:i��Q���a���X������
����'�x"���O�S-�}��'_��WESI��_����/l�A�Zk�L�0!C����3�y���x��s�,������GY����~��r�����v�m�f�m
�����r�5��G?���<�z��f���O������<�x ���~�Yg�L�2%��
Keee���w�=���w������]���s�E�����������(g�qF6�`�4k�,�qF������;.Gq��?���3j��\u�U��W^y%GqD�����K��o_�?�O�0!�}�Y�����m����_�{���>}z�����O?=��~z�Yg�t��1�7���3j��J�j�o�[��{����+��7�|3o���B�o��A����@1SEE������z���;r��g��Ij�"�;����?H�����i�E�������O��<���C��c�����]vY.�����7t��t��m���:��<��s����]�����s�M7�k��i��u�Z�a��M����k��i����y����=�h��w�������;{��G���_�u��=��S����;f�M6)a�����X��^z)��s�*Y~���/����m�c�rS���w5kW�@i���>����X����N��,~�������o����Z�;vl^}��4h����-[���{��{�����a�������o\4_UU���{/�������~������/��c�c�=����6
6���y�x��g����/p��Q�2p�����K���W���$9��C��C�����o/a����?�);����~�a���{����������Z���=��|��'������SO=u��:t��?��O)/�_���g���^{���^�����p�����y��3h���2���{����g����������.KYYY�d��y��w��+�,�����n���W^yen����s���2l�����+y��W2d����_�l�r��;���?<�<��B�t>���80/��b�{����_5h� �;w^�5��i�G}4�s��t��!��{o9��L�2�����[/q}]����y�����c���i��e��A}
6h� ��sNn���z��&������^4?g��|���y���(�j��}x�����.+0��i���s�|��%L�b(�Z�h���i���9���
����y�'��7������.���qr�����$������J�O*m.V�[����?�K/���i^�5����A�-�ga�t���^z)?����I�E���/~1=�P����B�L]���?�;���_���s�=��s�4k��N����#o��fn���l��v�]��A���������r�i�-U��E�&Mr�	'�w�}�E��6m�������������-��"���s��w�Q�F����k��}��Ww��9}���u�^�z�g?�Ya<c��~����B�F����3W]uU:u�����u��k��6�>��j[�t�����'�Xh��\[m�U�����|��E�f�q��Gg��a����Z�4��m��[��V�����?�<�n�m�������g
�~����_�b4h���7n�=��3�_~y>�����K�F�6m��o����K9��S���[�m�����H�����{������!C
?���W�G}`%5����O���y5i�$tP^{��������k�&M���;�������~_5o�<'�|r
�^�z��|+��o��p�c��9��#J�f�(����.ut��W��SOM��-��g������i�����;f������w���]�f��a�;���??\pA�d�u��a��+���p�1�S�_2����~;[n�ea��[oe�-�(a"V�����������HZv\�`�v������1���:
Pf���>��hn��7NEEE�����������������_��=;�?�|�|���?>�Z��z�����{/S���)S���Og����8qb�6m���_?_����K�exD����#����g���;vl***��m�l����v�mW����#Gf�
6Heee���+�����Z�T�k���y�����;�d���i��Q:w��w��V�Ck���g���^�o���c��A����S��v�l��6��W��u���>�(��{1�^x!#F�HYYY�Yg�l������0b�����K5jT�������j�*���n6�|�l���u.�Z�L�81/��B>����3&�f�J��-��c�l��f�t�M[�X_v�a����+Ij
�&O�\��������������Q�2c�����ZY�������Y�f���k���g��1bDf���6m�d��7�.���B^c����'g�������$]tQ~�����u���,K����ZIx���g�}��f�-��r���%J�xo��v.������k�����^�@PO���O^O�MHfM�)�J��mJ
Xi4k[S�U9��IX�TTTd��v�n��V���h�"���_��������9���Jc�X{����������$W_}u~���V%zM�4I����
�X����|�K_�����RG)��6�(m��r������u�]w�^cU��u�|�+_)i�1c���7�(���z��^~�$�n�m��v��~j�������7�X(�j��}N9��'Z1������n�=z�2M�UUU9���2s��$�7���5�?>X�
}!����������&�����Y+`��M��r|Ic+�3�<3�Z�J�><w�yg��|������5�0�e�]J�Jg���������:+-[�,]�h�hWb�w��Wg��I�V�Z��k�-q"�?�?�96k���m��n'�2�2i������C�9���
�.����`uS]]]���_���Es���w�3�2�����1"I����G?�Q��8
�Xf~�a�=�����K/M���K����)5���H���k���6���[�5M0�����|���$C��M7�T�D������}��8p��������W�L�>�0���{f���^�a�4y���2�+��2�7.a����X�}���Oeee��K_�RN:��'��5��Q���VNs�>|>�����%���t������j��a
T�+����s������oO�=���{f�m�I��SQQ�q����7��������~�hm��-s��7�(9�V��-3j��R�(X,��o�9�?�x��_����?�������~�-�j���9��S��k�����J��^N��C�2���A�j]��u��}������rN��`��>����q����g��-�����`��9���X�M�L��I�M����d��R�Xq:t����g���^��>��������o��+3X,��O>9&LH�l������^�,�F�������f����)
��Sj����6�rj�$���5����)��61��J��K�
`E8��2j��<��Cy��g��od���;vl�M��f���]�v���[��c�x���a�J(1X,��������{�o�1M�4)Y��������Jv}Vo���������9V�I�OI��*m��^�z�����1V:��
+uJ�U�V9��Cr�!��:
�������c���?�aa|����w��%L����5GX��4h�4j^s{���FX�)���~��g��QI��;���//q"X�fL�9*�j�Y��c����X�U�:��|0w�qGa|�UW�]�v%LT���O�!�R�5��A�|P/�M��J�"�3����yis���m�	#�iJ�`���Z�<yrN<���x�}���GY�D���c�t����1�G����&sf�:I�6�%���:�*h����`�`Qkg�}v��$i��Y����'`u6���W��9�hT�<��'
|���fmj�O�>y�o�{�?H6����V.>�I�:�����.H�n�J��^���c��I�.��P�6O��?�9��+�+����R`�0q��TWW�g�qF�����u��s�m����M��HXUL�Psl���)�n���c��|��I����}O�FE�,L���c�6%��T�u�9��^s��P�(+��RX��e1���4�2i���8mB)S�|*J�U�Fm�Gy��������o��0�g�}r�g�
6��|��������jN2������1���%~3+��3��F����P�E��h�"{��w��=��3E�u�Yg��`������o���R�,��q���"���L����X�D+X�Jc����N�N�uM6M6�Ri3,����i�d���r�,��`�������O<�Dz��U�0��fV�7����YI���fmj
��<�L�,i�,Y������5��P���}��L�6m�����O��G}t�{t��9=z�X.�����Zsl���9�S�vI�$������~�l���E(9X+���:*}���9rd���//��c�9&}����dP������5�`���L�f'sf'�G%�G&c��:@i)�V
��'����X�t���+I^�;y���r|i3�Zy�$���5��IE��fX^���9N[��VQ�,��a���5��������~�?���z
V3�[���YRVV�,�K��`U�/m�R+/u�$�YYsl���9��fmk���J���`+��Sk�
���Y��5��������PJ���*'$�>�����Z3��YI#,W��%���3���$
�&��%=M4,u:�GP2/�M^�{�\�6�H�b��%��I�}��q������l��d�V8X@��Vs\��B��6�(i$��n��%<��:��������J�
`�R�����k�_:6Y��fXQ��Q��$�f�`M_�H�R���o�=�����[oM�>}J�zU^�����*�4��v�uJ��T���9VN(e
��������J��L]�sk���O�=#�3+)+OZ�U��V/M���M(e
�O�����<ve����s��'�5T�65��	�L����(����9���t�����jyZ-���W-�	�j���8mB)S�x
�`
7aD�q���]�/m�5M��5GX��F���
O�}Ts��A5����.���i������5_����Kr�uI�&%�@={�����d��)//��n���{�u���]7}��<��3y��w2y���m�6�m�Yv�m�TT,]]��)S���o��w����c3m���n�::t���o�M6�d���������k�������	2c��4k�,m��M�n���G������|�e1|������9rd�����[�S�N�e�]��S�z���9s��/d��a����2g��l��9����:�X���6)��'�3�x���%��Fk�*i�=;4�5�fn�{5_�mS�l�N�����w�����������9s��������^�>�`�u��5�������/L�&�e�������s�
7d��I�]k��r��������U���?w�yg�������_����yn�N�r�I'��?�a��m[���z��Ws���������3{n����������NJ�=
���
K������c������=��n��-���3g�����M7��A�-��������3��{n����-�1�u�����.(��x�����+������^�;��#��y��m��F��S�k��#k���+��7��k�5Yg���X��'��5�2�f������I��-m.����S��o|#�<��"�����e�]�^x!=�P�6m�$2dH��o���f�5z��|�{��[o�����j�Y������u��?�<��w^n����s�=�q�k��W��U~�������V�:4�^{mZ�n��/�������r�Gd����=���:/��r��������w�������z���z���|���K`���03��[wN����YHT��''I�N
�Vu���9������:w����;���2���^���S������)����n�)�F���{�����'I�����{��o�>c����~Xt����:;��C�:��E��>}�sM�6������-[���,c���G}TT^5b�����+/��r6�|��>�[n�%��s��-[�L�n���y�L�6-����'�|������W���������i���5j�����u���4iR���g��s�=���O�I�&������;,�F�*��������S&O�\��X�)��5���&-J��5o_s�:��9Xz�����a��$GqD�=�����c����E~����n������?�g������I�&9��3s�I'�S�N���{����y���
s��~z=��4l�p��4h�}��7_������{f�
6Hyyy�9�'O�}���/�0���~����2Gyd^}�����-t�3f��3�,�;���s�9�d���_`������K/���w���~�:u*��=�������
��q��g�}�8�}��z���(��m��r�Yge���**��<yr�����{��9rd���_��������~����g��Q�F�A�9�������$m�Q��i����g���~�+X���[��H�J�P�5��9Xzs��.����v�i���}�\w�u�6mZn���$Iuuu;�����;i��Ex�����n��t�M���f�v�;���$����s������Zh��={f��!����bs�l�2GuT>��|��y���$���z����d���[���{,����/�}������{�=��3{��g~��_��O>)��I�&�{���d��z��Q��6f����?�����.������B��-[����~�����w������$7�pC�?��l��v�����#SQQ�;��3������i��uz���%��N�`5V���i���8uLis�l;����_����/Ny���/�s�������_���Y��{��Es>��"����������I��~��i��uannQ������E��O>���j��Q6�`�Z�_W�����[o�'�pB~��_,��j^���n������+���N�>���Z~��T�:�b
���6j���8�������^o�d�=J	X������N���h�,�������r��.����;g�v��/�X����k����.q������TUU%I^{��������~������+I��s�-��i���6lX�Y���W_]���Y�\z���^��V[��_�z����$�?�����3'
4X��f����s��s^�5�,X�
�Z�6j���X9>y�o5�_�'���I����,�������w�]u�?����))�J	B�*�����
JQ�����]uW�U������Y@QTDtQ�T�B!��:i3�L����$CBH239s'������=���=�;<�2��|���S?�r��������/�x�36��}���O��'��QK#G���;�����?I���n^�
�:uj�z����;wn&N���u�o�}�����y���=�y6�����|m�;���;v��8���z��.]��n�-�y�s���c�=6�G����[!X���-�j+7��Sr�G��3����$Y�"Y2�x������k����xS�����[��x�������#?���r������ky��,^�8���O{��y��[�u�G���>�V�J�|�K_������| ����F��v����Z��oLq����S����>}�F����>w���5R�[����<xk�~tz1G�,/Om��=���O���e�`@-jhN����S?
�e'����D=��������k��.[�,������~5+V���g<QGG�z�����9��3��o�������s�=7x`^�����/|a����g��q����1}��>�g�}v�>��~��`����n����z��Bl.�P����\��R��	FN(
���+;	�9*�����li�������{���y�r�G���{���Pq�W���<������������[s����3��L*�J���}��9�����>��+���?����h����n����l��Hs+�/������>i��rH���m�������W�z���w�1�~x��{����9rdZZZRWW�{�����G?��g477����e.���|�����i����Z�f��i�6mZ>��O��c���������n��|O���c��\�z�F]���8���`�0��������:�-P3FN(������l.�������=5jT�=���r�)}������&=�R���SN�)���;��#W^ye���?��k���y����_���������_�:�v�&=kc����9>���r����k�]v��_���oi�a�gMVC��+�Z��������I��<��d���@m�����[��)���Q�.X�`�����{g����{���T���y�����~��/�8�^{m�uK�,�I'�����/#G�������	�o��vy�K^2���6\�
���5XM�����}r1>�����_/I�8��H��n��w=~����5���{o����P�T��^{�=�yO����\}��}��������G��'�:uj��{��w��@�(��an��b*��=S_�����7%�9�8�tNR�������c���w�m����o�}�/����:(�;���sN���r�����������M����?�������m��l
�`���,�,��SW��wB��NySqn��d��rsP�X������}�������#R���C�s<o���^��������s��1y����������w_.���MH	�`S��\�,�a�aD�����;;J�@��v�m{���~{:::�����g���� �Z��j�����n��q}�g���I���?��������E�6i�,�V�-�j��u}�k���sa�9�
|p����;���7x���ss�q�mTQ�Z��G���8+W������j���/�9w�����}�������^������v�i���������G��~x������~��|�3���{�8
�`��Y[��Zn�omVWG�1�ox�����������3g�9�d���w�y�o��2m��$�^{��Q�����������<yr��������m�����u�W����^���:*�\rI������z����{��I���{�������/�W�����W�����>���������>?���2f���s��������?��?r��w����=�X~��_��o}k&O��7����>}�F}=�x
e��d��d��$���U���}���Oz���������wn��b*��}-���\Xjj�QG�c�9&���oz����?������.�8qb:::2c��tww�^s���f��w��?���~��9s��o~3���7�$�m�]&L�����,[�,3f����K���_�B&O���������S�u�����[o]��3f���;����{��_��y��^����h[�pa>��O���D&L��m��6mmmY�xq�����s�n��`�)���������X�{5�X������Z�����d�s��Q��`;�������47�tS��������u��k_��}�{���>���>��#y��G������|�K_�[���
�����>���?���}.�'����t������o�)����o���{�����y�6x�R��;��Y�������Y���J����y�������U����T���F$���]�llQm�y�U�o>���?���R������s��W���h��������>�����\p�ijj������o����n^��We�m�y��������m�>}���_����|&��M�>��z���4iR���7:c���������r�����#�x��X__�����'>�{��7���'7�y<�Jus+N���~���w�}{����d�}�)1P��>7���d����8W��y��g<~���{/�u-z8��7������9w'�����������r���s�=}�����ihh()�������s�O������)�o�}:��<���g��1#w�uWf���E����;#G������g>3{�����������p�
�5kV��������92&L�{�����+mmme�P���:���)�O�0L,~��������E����l������#�'�������H�����~��9����S�N���Sm������#�8��[5X��]�,x�X?zG1�lW^�-����(3��Q�����;�^6����7��C��o�<���'k[��+�������<�B�Z�����O�:�w+^I2~�d����,X��%�oJVu�{7FPC`0�tw&*��_7��W-�������:x����T��Z:'��H�l_v"����ae�����O�<���!g&�?��L0XZ����,{
�V��[�_U���������>G��CK{1��N��_&����H�O)5��R����{or��������(���M^��R����c2��d���+I�G'/y����,6K��<r{���8�����i�F�c���N���3���NV�$�nK�_�t.(;��S��f�yK����{��&#Fm�<O������r3��0bd��K�uS����R#lXl���yL2v�b=��d���[������(5�FQ��fY�������C�f���bv.,5�F�+;�i��b�h+7Phi/�������FxZ
��,+�s��rs��������`c(�`��XV�m��
u
I�����&�Q�]
e(Cggg~����k���y�2v��x��9��S��v���&t/-f��rs�k�,_���}�q�>y���(5�:j�k������z��8������Oy�u�]��N:)s���s���.�����_�b�<����0l�XV�m����K��T������*y��
�`SU*�u�U������W�s�����$��/�:��s���=I��6��c��S^{�}���c���%K����j��e���mo{[*�J���7np�~��,;A������Un�q�{C�J���Kn�^�tn������{zz���XB��������R���xK���_����V��T*y��^�����Hg�uV�,Y��r�r�RI�Z�Yg�������q�5;�������W���q#��N���	�T���R����)������.]����S������766�Z��n�p
�3gNf����<��c���;��#����{K�����|�;�>}z�����p�	�EZ]]]��g>��>�uw&�^S�^����U~��C2nJ�)��9��K`�f5jT�����Z����V�\�N��1cJJSh(���t�w$I��j���r�A=����~���J%���/r�!�$I��c�r�!9��#��?�!Ir�E��_�j��j�#���������+y�����D
�I�_���4rB1�*���2j����?�����'�g�����S�TJL�i���3k���^���yX�����w�a����=���_~y��R���C�-�z������-�Z�`A��������`u�.��������>y���e���Q�������'I����&�Zf*����illLOOO��%K���������3r��444���o���j��U�V���3K�.Mggg��j�k������XR�BM`-\�0IQj5n��
^������I���NZ�u�rHF���K�&I����+�J����/~w���������IcK���\�������d�=����R�d�����>���{zz2����?��t����1�l�M�1R�u�������������nH�Z�����:j��U*�L�:��x����`��t����Z`�Jr��&{�S�j]�;;f��jIkkkv�i�T*����#Fd��)1bD�Q�Pv��x�p��eOy��W_���0aB��c�������w�t��~&�?X����%�+I.�Hr�����F�������NOOO�q6��Q���v������(Ij����=IR�V��<�u�����$�J%�z��|b�VSSS�3�Wwg1�Z������bvu��jSkkkv�u��X�"�/��%K���]v,�
������#3r�����
����j�k�=��]/Y�$��v[8��>���1#��zk*�J���/~���7o^�z��1`3TW'=��ucK�Y���2��
�`�T*�477���9�&MJ�Z����S�V���G�RI]]]o��PU�Xp@�������$9��sr�E������|��Z��R���#�|��,X�Gy����)S)9��Y�"����mR��Ck{1;;�L�G�RI}}}�1jV]��c���9��cR�VS�Vs����3���7��i����@�=��T*�T*�<�Y���{�����|��I�����{l���T���,*I��R�5��ka�1�$
e���|�#���K{K�~���?�A�k��j*�J�>��
���_��w��6�d��)��`c��)�jlN*5�+�����-fWG�1�$5����~���_��_�%WIz�����;���s��'?�>�V�����T*�T*�z���`=V�Jf�-y��d������r3���������,^�R��[������}�C�8qb��_�5,�=_�VS__�3�8#_��W7���^�9s�$)J��=��A��Tn�(��}�5���>Fo�4�$=]����s�NO�sr2f�r�[�aQ��$oz������>��r��w���+�o�}�8�����O{�]w��N8��������Oim!��II���RI�?��L@�kjM���d����>�t.H:*���aS��$MMM9���s��Go�����'!��[�h1�8+����F�����+IFMz�`KVXi��d������q�m�e�x��c���6Ck{1;;�Ll�`�G�����KV���a���=�Z����Qf
`k�`�K���{�X�_5�H�Go��������xs����Q��?Z������VjX`U���r�-���k2}��,X� �-������/|!p@��!fUO����e���������H�����]K�l��UVOOO���o�+_�Jf�����j��J������Zo}�[s��W&I�L�����j��CG�����FmS���d��J�0�Z�����d�}�z��ICSi�����)����{s��'g��i�V�I�J��$��r��'����v�d���������=o�CJOW1�Z�����,[B��b��[������g$��ny���G]������C=������WO<��#�8"{��G��E]4hy���{MVcK�9����%�����{�k��������5_�����c�9&s���=7e��|�+_�����t���.�z��^�����+%/04�(��2#F&�};y����~�T�|7YWG����D�`}����w��[pu��'���o��������imm����>��$I�Z��w�����Jf`�Y�������(C�.iS�;���:�|��������g?��������y���Y�zV�^Ir�wHF`���*f���u#@�ki/fWG�)��EM`M�>=>�`��j���������������e�������w_�3��G��k[������5]�u�m���G�����%��s��������~������ll.7@Y�`uu��J�t���s�$�J%S�NM]]�?Nkkk������������M-��(KK{1;��J4��?�/_��1b����h�������dO`h�V���b����Q��j[���H�3�T��_��vh�������&N����7o^��[�jUf���{<a��~�	]�}$��O}�54���l�v*��9�+I�-T���.��n���$�j53g���E�2f������[n��e�z����g�;#0t=xk����d����P��_���������G�k�'�ZXv*`�����>8


Y�jU��j.�����Mo������o�������g?{ bCP���t��^���Pj����'S�_�=��kq���J��l��SWv��3fL>��T��T��|���Ngg�f�u�
7��?�q*�J*�J�>��N%�z����ucK�Y���1�\���\^n`x���$y����$�T*�1cFN;�����l���M��^���Z�*�j5�J%���#.0Dt?�w�46��`(jlI��u��r��S�`��y��^�j��$���K���=/�������g���p=��<��#��W��vZ��w��������
#���r�5�J�2�Xw-.70<5�` ��'?�������93I2m��u�Q�v�m��g?;Iz��>��O��_�b�����s�=}��V�y�3��o~���}`�X[���Rn���yt�l~�|Q�I��hX`M�81W\qEN8���y���eV�<�H~����^W�Vs�UW���Z{��K/�4--������b6��A��jS�����������w�=��zk�������>IQl�v�}����������o�u�]���'o�����U���rsU���9��d����Y�~� @���$iii��������?g�}v��w�$I�Z]�k�]w������u�]9��s���\�'����b6)�X��1������|������	>�0v�a��s�99��s�������+���OGGGZ[[3a��L�:5�'O.;*lu=�\������=����Rn��j�J���s��Iwg����S���,�z����<�y�+;���?'��Uv��M���C���$o�i���O����tu�	F�}����'w�uWn���<��cY�dIF�����g������������c0�tws����Qn���d�.�f�-���ZTj`Q�Uf����n�)7�xcn����r�-Y�dI��S�L�<�����1#_|q����\{�����z�k������uy�{���w�}�e`�Z[�5z�d�=�����-��(30�(������|�_��7���~��8I�+V�E/zQn�����g��E�����o�����������O�R��u=k~�JSk�9�x-c��bi�jeR�;��~�mHC��7��_��e������)�������v�e��	Y�lY����tww������~���1cF����o��A�k�Z����k�T����d���m|���ZW�Xg�q�������1c�d��1�2eJ����d����g����#�t���cd���9���s��G���Jccc�{]]]���~��|�#�9sf��o|��k����w�������lT�P3�����IWG��5_����?�JeP�1n�����o��������.���'5jT<��t�Ay�s���:(3f�����Es<�!���}�c9��#��k�������u9��c����47�|s�{��Gs���f��q[*2CHOW1�Z����iS`=��dUw�42�C���ZUWv��T�V���{������������������4��q������oOGGG����|����I'��)S�l���OSSS~��_��k��QG�Q�cc���%�\�����s���~6�Q��;���Rn6MK{1��\��7'�}mr��K���aQ����J���zr���
�6t�Zk�[�|y>���}�{���]w�5{��w����?����{���|���o��O?���+��b�bPcz����Zn6�~/O�l����������L@�j(;@��1#Ir��w��xGx��T���3&�|�+s��g���J{{{F���������i�r������oN�����mo{[>�����3,��������e�]�U�V�a}�+_������e~��r�a����F���>Xb��K����t<\WW����Ll��_Z������k�M�:J����/��2eJ�����|��Y�dI�����}(���������?��r��������s�M7�mo{[�M��o~��y���r�E���>�vX���w�������k�������hN9��44���p�;vl��E����-������=�����ZJ@k{1;��aue��Y�f��/y/^�������?�'>���,�z��>������s�G�Z����E������f��w����v�a�V������K��[�g��s<~�������ts����~Y�����et���|�k~^WG�1�V�Xg�}v-Z�J�����}9���6y�������3fL��j�������o�sMCCC�������>�J%I��?�a@>����k��s��g<��$li�]�l���/^
M�f�Z������@
�������/N�T*������f���6����}m��Z��;���:����.9���S�V�$7�p�f?ok�x���Nks�1%�`K�YS���ZnN��bvu$k��
`��t�5�\�U�V�R�d����n��������������k^��')J�������m-����+K�.�=�0aB�;���%�-�jl)7����+�����h(;@�w�}������{��{T�������f��v�]/\���������|��_�s�#�HZ[��{��3's����{�������u�)DhR�0l4�$
�����%J���q�g%M��A�0U�X��/�]��?���-X��w�b���^3j�����������l��9y�k_�U�V��;�����w�k����o|#���|_������
���q;%s�Nf���sSJ�:��L@����m��&IR�V3c��<����v�m7{�k���w=q���^�t������#7�Y���+r��'f��Y��F������M}}}���������Zn�	�Jf��T���/K�{�tn���ZQWv���m���$�J%�j5_���6{��s���/L�RI�R����f��������~��7��^�:�{��r��������������_W���5XM-��``��6���d�c���Y�[6��L@�h(;@r�!�0aB����j���}�s9��C����l�������_��ttt$)��N<���^{��7��w�u���>������_�{\�T��o;���>���~�&�s�����x���������n+��+f�,�ak��b.�Wn�v�tV}}}��������d*�Jzzz��W�"��Gr��g����i���������=7�|s*�J��j������u�\����+��"�J%I���>w�?S����?�o}�[}�}�_�?��?�s'M��I�&
�3�8���.^�����|���5X�����5]��$��������'����S�T���������������U�������+c��ISSS�.]��~8��v[~��_��n���Z��R���_�b�����.���ttt�`~��[�s��s�9'��sN�s���������D��sa1G�L��d�n�L���L���y��jG�`555��+�����3f�R��Z�f���9���r�y�m����W�j5I��O|"ox��{��?���{v�a�<����S��������p�s�y�{�����D�����m��)��-dm��9�u�)��vJ�:��L��V�XI��N;�����[���\v�eI�J��$��V�S�Tz������|�+9���������/|����w���}��q�����TR"�����-���`51��OVv'7|�����Ya<Y]��6�l�_�����/���J������O�4)���2}��
�_�~?���r�g��Z��5�������2�.��lSj�������H�����:�8���rsCWC�������?>?�p�����r�-�={v:::�b���3&�����{���>��9�����0��[���_�SO=5�V��=w�����?�q���M��������']���n��s���[������=�w���b��?et��=�(^I�1;y��d��r3C��m~�~��s�I'���N*;����?�)�z������{�����_�����l=f������Om��e'�,m���lA�9��k�`1xn���������=���??�^zi���KL�uY���������W*k�9�����~c�]{��9i������Yp��rsC���\�I?�p�UW��/~�S^����e/{Y�,Y�{�Y�zV.����9r�b�+�s�������O�[�������k��������������}��/_�������c�����{�= yy��u�Q�?��_�������>;��r�&�����d@rl�V,-���rs����/��9IgG�n�T�J�1
����N;-3g�|��{��y���}���O������s�]w����sn��e9��S7k�j�:��Z������!fm�#�H�=�Xo�Gr���`�a]�5����7/Y�b�&����pR��X��k��rs��MzF2v�d����=vW��(i[^.`�vXW\qE������������7{�J���+W`2X�k����O������>~|��IWG�t�,�0l
������z���6mZ��Z��h<�����M�:���/_W����"���d�����%�1r����Ry|=r|Q��l~���J%����[n�������T��T���SO\?�������}�T���<��-����d�.[�y�9��'s�[S��aP�����O<1��-�-�=zt�>��L�:5�����eW���3y��,X� ��~{n���,_�������;�~��K�,��%�s�}�����?�u|�2z����6��
���j���������g��Xs�1���~��c�&I>��O��w�����#���w��%9�����O|"�>}z����|���MCC�i(��9��c2~j�Y`�h_��
��5j����s�M�RI�Z�{������ijj��{G����:+�~��s�q����k�?���^�:?���99��?&�~3Y�r���V7a�M�v��b���	��0����+�G�(�������"%���{��'�>�h*�J*�J>���mt��M�<9����������G�\�����y�k^3��^�,|����n����1i�b._�<��X/���f5]�����%IR�VS__������~���O������O~2g�yf������`aL���I�����;���O%�&n�F����yt2f�M�������}'Y� Y�$���I����:����(CM`��7/IR�T2e�����m�����
���'���|g���s�����{��n��6`y8�������Q�����0�T*�6{�U=E��U���I��r�����E�������kZ[[����J���K�np��#Gf��������$7�|�,�!�g��>�����/-�����
����d��d���s�,�Z�tVKKK��Z������G���3I��C=��������~�4k�&���vX�Y�M�:�(��Z�dJ�i�2����?~|�z��%��f����]�q�O����s{�����H�`�YQ���rs��ul1;��(OM`����I�j��Y�f������������j��=�������S�T�$c����������j�,�����g�444$I���r����s������5kV.������c�X��,+I��k�����YS���j���;����5�J<Xn&`�������<�9��=�����u�y��^�#F�R��Z��mo{[~�����\%������w�3?��S�T�$c���^����l��+��0�����M1g�-����~�����f���.�J����e���.�l�����w����V��T*Y�xqN9��l��69������<'�l�M���o&I�u��/�����-�9�4=����\n`��Br������<�����9�f���/�:��S��U�_~yf����5�����}������Z�f��y�������%+V��}/I������������`��\S���jN���oL^������s]e&�����������.�,��?��z��u�imm�UW]��N:)�������j��V��V�9��cr������q}6G��b6�(7�?�����H��d��t�\�`%�������?>W]uU.���\x�������c��Z�f�m����7��
9��#�@b��c�#��G�9+�����t-.�;��y��
���b��Iz����R�[��(���|�?���c����&��^�;N��V�a*I����[cs�0"Y�"�\��[]�s����'���?�yL2��I}cq<q�d���.0�Z��%�%]I����[�,6Zu���W�?3�oH���s�`�Sk���Ee'�Xl��+_�������,����^��}&ij)�v��}���J��a_��j��<���������K3r�����g���O}}}��jJ�
�F��^&=#y��d��d��sw�Vg����{��w��������i��b��u�1bD���g�E/zQ�8������%$�-+���)����>=3��E�����k�[�7��(;0��U���3��w�+���oz�U���^�|���x��������~6G}t�����:u���Psz���������J]����z��bvu��������������7��M��jo�U�RI�R�s�����7��M���g�������j����lh.70|��)fgG�1�A�Pv�����?g�yfV�Z��(�Z[l����=��#���O[[[�-[��������Jwww��I�����O?=+V��g�Q���z�`5�(70|�������`���;��3o���j����������
o�������ihX�c�\�2������??���z�_�zu���w��C�{�Q�'�V�_$
��������\�8Y�2����r���������?+V��-�z�3���n�-���wr�a����*Ir�a������m����v�-IR�T�b����}����&�\^��������I*��kq�Q�AT�Xs����~�����v�!�]w]��g�M�g�}����^���'�����+3g����P�z�`56�������`%y��d����3�������5�\�U�V%I*�J���/f����������/|!'�|r�d��U����s�I'
X^�Z���$7�8��NV�(�5�(70���M�/J~�������d���	Xue����g��G��W������xEF��J����[��:�\�tu$=]��I�(50���d�N���#�ss�)70������I�J���w�9

��8����:uj�����R����k b�����<�c�������}�r3��~'�$����������fVM`M�8�w]WW7 {V*����	dO�Z��k��d�.�f�>�c���Qj`�
LkTI���g%I��jx���^��_��Z�*<�@��������X�����N����\Xj`��t���)S�$I/^��/��_�]~��Y�hQ*�Jv�i�x���fU��`5(�J�:��]��XM`%�����������f��������K�������#�H�����+���b��(AK{1;�`5_�u��g��OL�Z�}���#�8"�g���=f���#�8"��w_����|e���7
F\������ZP������H��R�������/�g��j��[o�5{��g>����;���}w�qG>��e�=��-���J��7�������Pr���gE1�����r�[���b�^�|���{�K~���gy���~j(;@�q���)S�d���Y�lY>�������l���}��7���Okkk:;;3o��������$�j5�J%S�L���+����e��]�Tr�y�
��
z����\n`�������,��,|�8�����i��������/������J��{�v]�V�$��������u�[����9sf~��l�s��f)���j5y��d��-��E�QP�S�����X_}n����sa����������R��y`(����W+���-�=�yT����u�EVWG���~X�j��������:6i�e�]�K�?q�>����-fgG�1�~���3f�`�-y����<��r������]e������L�Rv��zUr������n+��m��0������@�|�p������[�����|��dmV��Rc��`�ZT���&��P��''w+/�P��^�%s�Y��q;%m�K�lXC���l�!y����0���-����O�]������"ij-/�i����z����Rn���}�d��&�v.^���{Y�����������gy1���0�T*��}����$g%]�E6C]�X�,����^���2S�J��`���������R�0�tS�����kQ�1�M�`�Y^�X��^���2S����f�%�sO��sw1[��PZ������&R�0,_�\��d�����G���V��s����~�X�zH���J�lXC��9E�U���H��=�������l_��s��S���S��S�Jy��
S�0tvs�v�1+5
@M�n����?���\�?I���5bd�����`��(fk{�)jO���u���7�o�bi�t�,�`l���&�g�����-��7���u\Q��l~2~J�i���`#��H~����Kk���
�59>Y�`�l^�I�
Q���?Z�_��'w��[�g?��lM��s��rs�`#-�S��;%�;��,�����K�l�������yt���'�Xw�ygf���E����+�ju��x��0��M����ye�bY�9��S�����S9���^S��d���?[^&`]����+�������w��]:;;���,��<���e�x��m�N�S��%�CM�/.
�������T��
��������o�e�]�$�V���W�RI�ZM�R�x@?u�.��g$����aD��S���S51y�9�z����NM:��	XW�`uvv��/}in�������%V��?�Y��X6����"����F������+Y��(5���/����?��o��O�Usss�:��<�Y���I����VvL�:�u\�9�-#F%u���UIgG2z��k�tVwww���/�_%��g���|�3ioo/7��?����������l[^&jO����'��']
�`(���k��6��-K�RI�R����|�[�*;�O�nK=��\��d��������X��N<QM`�{��I�j��������w������U���O^��b�26iQ^&jS��bvu�x��.��?~��R�d��v���n[r"` t�)�j���������b����?N���=�rP��`�WWv��hii�]�;��$�@�YS��������L�����$s�N�vi���$
e���v��w=�����������NIv< Y�<y�����%]e�j���/|a�������3fd���;vl���~�-�j-7��R�l�w�^��������+;@�=:��zj�d������~Tr"` t�)�jj)7�KK{1�:�L$IC���S��T.���,\�0���'����<;��s��`X�V7������������kQ1`0�z�'��I���$���/��v�m��_�"G}t��������_�8��hP�.>+y������\��~Z���*Y�4i]n��
��_w�a������.���3f�y�{^N=��\r�%y������]vD�9=]�Q~UY�U�[��~�W��^��I&�7���XCS��V��:J�[����W}}}��J���+W���.�E]������V�)����;/O*�r��@h�t/K:J�G%
#����S�������j����'o*�J����������'���+IFo��
����=Y�p���������$S�_j,����` �-��V�����[�����t%+W$�z�s;Tn&H��8��?~�ze2�����V�������Pi��+�y�&�����'#'�	�A�&�9�X������I:��	�F5_���?���0l�-��]���h��\l[������V���������
#��[B����������,����T��������e����,��,�&�c���Qj�*)��$�W%�WkXl
Z����U��-����m���Y�`A-Z���Wg�����1c��C�������[JSkR����N~����1i��������3�
�������8?���r���g���}����+s�G�s������??I2i����e/�"y`��S�5����T*������&M{����'{���X�UVX_|q���wg��9I�j����J����N�6-����$#F��#�<�1c�^Xb�`�7&��r���r�g/�������'K��	�
���W�������O�c�=�I�Wk���Hsss��jV�X��.�h�����|q��K�[��������F�-j��d����v{��-(7l
�E�'?��|�+_I�Z�-��8qbN>��|��\�k}������e������-/7�0����?~5��G����r3@YZ��s~�9`k�Pv������������W������?�3�<3

�����>�����x����/~�j��?��OY�jU���5?�i��bn�g2v��RI�8��LP��5X����5_����~4�W�N�455����m;��������]/]�4��sO��s��	CQOW1�ub����f����/�,|ue��e������m*�J*�J>��lv�U����.5jT�����"&Y���ll)7m���t^��������L0\5��?����tww'I*�J���w�{�m��6K�,I�<���������b6��������\�(����u���M&����>`����?z��$E���;��m����{�����/^���`(��,fcK�9`(hiOv=4ih.^IQ�5��2S���Pv���7o^�z��I����+{�uu5��EU����/��i�2g��$�6�l����?�~��S�TJN���t����0T*�+�y���3�G�']�E�a������z���-�=�X�5~�����f����n�)7�xcn����r�-Y�dI��S�L�<PJ����|�+_�������={�����9����/��/ill��	j��G����bi1`��Z�����0,�t��I��$�j5�f���~s����Y�R�T�$�n�m���\�]w]���/��o��?\Z�
�5kVN8���v�m�����>��\p���/���'o���a���wNN��������^���2S��T�X{��W�z�����_��g?�������^��(���������~g�\7�|s~��_����3g��~��������oii�.�����Wg��Y�|y�{��zk?��\���0a���0d-x�(��oJ�l������I��-�\�`��������/�m�]}��$�����|������zzz���>�J%I��g>3�����i���Y�ti����7�)�jnn�9���3�<3���I�e������o��o�EX��sO�8����1�k����{&��F�Y�����sa�1`X�+;@�|���V��V�������w��������}���V�I�7���s��5*/~����~0?��O�����.+5��~��\~����������+�������*I�������7���o����{���.�UW]�E3e+�s��rs}��-fgG�1`X�������Q�R�T�z�������O�������9��S��o;�J%I��v���3���������������\u�U��g?��N:)S�L)5W�|���s��}(/|������E����>�>���J6�Z����
�`hii/���[.,^���D0|�|��	��/~1�j5�J%���y�k_�C=4��?��[o�5IR�V�$=�Pn���\x��y�[��)S����.J�ZM�ZM}}}�����������]w�5{��w����?���������z������~�i�;�������{|���g��������XS�������-k��b.����k��g�KV�,7
eoz���������S�TR�V��?�9����\W�V��������T*��}�s���G�%���_���}�_���d��QO{��Q���W�:����{�]r�%�k��:"@M��[��)��-f�������[r������;�L�;��������SWv����O~2��w^ZZZz�U��>WkK������kii�\���:��OP~��_�9>���6��'���W��L�f����%��^���/�����\@_�J����c>Z��G��:J����)�J����������-oIsss��'^=�|}}}�}'�|��\K��j�����9w��o���rH��������\�&=]���%'�S�N�Z��K��lX��bvv�������S�����f>��O���c����L�>=���OGGGZ[[3a��L�:5�~x^���d��Ie��	3g�Lggg�q[[[v�i�����)imm��c��e�5k�&�0�\Q���n����x����$]%�a`�`�5v���x��9����2l�u�]}�w�q�M�c�w���]w�����,/fcs�9�M��^������a�����9s��9�a�6y���'opO�����lP�5emVWG�)`xh(;�c���}����6y�'���=7��9s2w��M���{��gl�����0����im/fgG�)`x���|�w����I�&m�^���y��G{�w�i�~en�\V�����{���lp����o|#���d/�������
�����-�=J�,����sty��V�|��;��J��$����������-o�������u�QI�J���+WX��`���}����6y�#��4WWWW�2���k�sk�����D�v.fWG���b��aX�9j�+I��j�d���y����x �������jn���X�������+6�'��`���T�8b��C��$'=�\�t-J~���saR�&k~�#���EV�	�9T�V���|&>�`���������d����#�/_�|�����������xG^��Wo�=��{o^��W����}�&��,�����jJ������Y^`��I�;�m�f�Z3,
����*)����j.�����=;�\rI��Sr����eU��-��=�|�@`M�4)�&M������,�������d���9ihNV.O�:`���+;�@�T*9�������[�u��W��C��Y���7,<�`�����=f����=�������^�����$G~09�M����ul1;��jQC��q���N;-�{l��-~���;��������W��Pr����{�9��b�'����{�+�@��%�m'�����ze1�G%�:�{�imO?�tv��j��*�J�<07�pC�>���u�]�T*y��G���(]tQ�>���#��)S����%]]]I�e��e����2e�F�?s��tvv����e�w�����������v�������^���2S@mvXI���;���sN8��\s�5�T*Y�tiN8��|�k_�[����#��J�����/7�xc�����~������>����_*���f�\�j�dn�>�I��~@%�f��(U��b.��,���5$��M|[<�aY��$������+s������.J�R���+����=<�@>��O��&w�q}
������r�)u��W^�������l@���H��-7Cwg���X�zh��Tn`�ki/�-�$9����o/-��a[��$MMM������;����|*�J��j>����������466������/�G?����������W���#Gn��%K���?�i�s'�p��d����y��u}7���53�e&	�-�"���V�(�����*Z��S}
U��-�Vq-?����+j+��UAvT�MA�!B6�����wf�@	��{���u]�����}��=������j�����zm2�_v�������m�����/N�:���d�7Y���S@m��X��9��,Y�$�|�;344�j��o~��y��r�d��9eG��y�sr������K�l��1��sN>��l�y��sN:;;G�=�����~���
k�)���������$���l������w����o���{]���fL��$y�;����u�{]���S�Vs�����#���~��,\������T*��/���s�1[}�>�����/9��G>���E9����x���_��~�����>����r�������k?Sn������
�`�L��$y��_��.�,/���r��$�����C=4?��KN�xW_}u������7�:�����_��k���n�o���4�K^������O�$�����_��|�#�[������&I:;;���y�{���������e/�_��1����M/�6���`G�t�gC28��O�����7�~�����5�\����e���;R�T�b��u�Qy�[�Zv�Q���7��{�}��z��w�q[��)���/}�Kc�,��W���;,K�.MR�p��]��{������^�V��������3�y{�����jW���&X@
k��T���P��.�9��D0����{��g~��_��#�L�ZM�R�����O}*�J��x5a�����Ks������������n��q�W�}�ss���f��v����$��U���rs��J]�2�Xw�+5
��iY��$���������W�z��Z����,^�8�^{m>���f��v{��v�m��s�9���~��N`B��o*�jR�����bv�-5���������������??�-��?���t��t�=���=v�����)�~��s�g������7���+W&Iv�y�<��������i��l���Uw�UK���R^������Nr����oNg$�:��F���SN9ed��n�=�k�s�9Y�dI���wfppp��M+uuu9���s�����z�����n���ZJ�13k�b�������:�#���D0y�|����1��;�����U�JOO��\�-�\]�_U����Q�����sl��v�aoJZ:�����;��7'�*;LN5_�5�,XPv�)�g}1��&'�g�Y�R���1��X�����km��`��+;�K��b��Sn����^��ue���K�g}1g�*7�xj�(f��Rc���Pv��r�w��+��/���w�}Y�vm6l��Y�f���#�/������:*�x�3��0�n�Ir�'����|���s�[�{�y[:e��*���O��V���km��J�Rj�t�\��^�O|�����F�W������$����$9���r�����N���%���I_gy�_x`y�o-�(^�i�Yn�l�L�#�<����������ds��p�Ue�7|���_�+��"�}�k���|&s��������X����u������U��6����=�����e��=�56'�-Iw��N<��(���qc�;��\���V��T*�T*�V�#%WOd��Z���������\z��ikk������P��=����0��'�t'������(?�I��e'��M�����5����$#�W���y�+_����9��2��������3�V���7������������5�����>�}�k������
`|�n*��1��S��}�GV$�����+�;�Lzm��`2����.�(?���S�T�$�j5o{����}(�;��yY�hQ<�����o��u������g?;R����(?���'�'������I_W���T��<��<S���99���:�������%]k�N�C�`}��NR_U*�|����i�����ooo�y���<0oy�[FJ�>��+�����N�wf������������]�Y���U����������;b��U���kS�TR�Tr�i�mW�����Mo�i���j�x���~���Z�j,������T������x�uD�2��dS_��bv�)7L5]�u��Wghhh����3����
?�R��Z���k������@o1������x��G�J��\�AkG1����&��.�z����U�/��{��C��s�=�d���B�+V�pF��b������Q��bv�)7L5]��f����i����������>j�:������0�v�kmR*7L
e�s��Y?�kG<�:�g��kL�}�lh.7�t4\�54���+�T�9�$��T��Vj4(E]�v���$�j5��sO|�����>��K��R���>�T0�[LX��)����km��&Yq[���rs@Yj���CI�T*�

��������w�yJ�ZM���/�����,�r�����_*�?���ZWb (QM`-\�0�z���$�j5��������)]��?�y>����R�$I������c��l#XM��������V<��Z�u�-7������]�zW��j*�J���s��'����t������CCC9��ss�	'd```�Z�����qN0�����\n���bv�+5P#���
+����{(KC�v��������[n���T*�������O������O>9�{l�������}�9�<�Hn������?�����,]�t���R���������)�1��v�#{6S@�Z7`�Er��lX�|����k��q��M�����>lI�`U*�\x��9����l��T*�T���s�=��?�~��I����������+CCC#��V�#��V�Y�xq����������K�/��TG�+�(_k{1`Of�o6�_��qSHu�x��,&^�`%������/�<�}�ks����R�$�\n�$�����a�����s_�����Fv�m��	0�V��(��kHf�*���H�Sn.���bv�+5P��_��_���}c{�;.I.������0��DV�,Y�$W_}u>��O��s���e�F�6\r�h��X�j5�-�;�������L]]��eO������*7�
`�(���������^^&`�j5�����{�N�����{���g�.f����6<�)S��$���9���������O~��\~�����~�{��7k�����3s��tttd���9��Cs��G����W|L9�X�3������-f����g����mz=&����e�m<>PGe�RX��������4/}�K��P����Y����f/H=5Yq[q|�M�@_�a�,�V/-�������,I�67Yr��_�eN1`P��.�������~u����}:��<^��d�o�jub����b���I�I���6��tR����kmiq`����d�����k���s�g�PZ�q7cv1���|$�T������%3���
�����.���|���N�RI}}}�����	�q.8#Yq[y�o�U���6�
��L�����m2�;z�����(�-��YI����������x������$I�Z�{���v���D����b��;ih��{��I�~�������^LXP���E�U�.������9�����k�U*�+�I�]_/�1����kM���j�k�]vI�T*�����%������?��d�.�f`rj�(f��Rc����Y����K���,m�g�$il-
�z;����PWv���n�����Q	L>C��@_�n�Qn&���������j�����ek����n,7�CM`q�immM�Z���K�`��@��ucKy9��Z������U���rs��yf1{;����P�Xmmm9���$CCC��W�Zr"����7-*ICS�Q��Z;�y�
�7�V<��V��`:��T���Vn��
�}����P�XI����?MM����:����(9�f�=�l��T*�f`�����}������>�T����iCV�yf1{;����P�X���o���/�R�d��u9��cr��� I��]����`r��$��/&�����g{��__��HVk�9����l������x|���Uw�������c�
oxC����7��MY�bE^����#���^��r�!�s�=3{��������=��;��@��H���'����G�4��W]k��=L���b@MW�$�vN6�Lz��
=���N��Un6���/�zl�U�RI�Z�UW]�����)_�R�d```G���/������'g�\JjTk{�������N���&�3��]�`1��yVCS��o&�k���>��~q��Un.���/��V�#�J�2j>�k�wc1��'�NOO*�d����@mi�HYQ`�t���������c�r�?44'sv-�m�����P�XIQxU�V���j�ZO�@o1�vT���f�6��S����l����o'���3�=�;�����Z����qP�XGuT*�J�1F`54������QLXL'�*f����G����pV�,�A�`]v�eeGE;j�k����w&��d������\0��{�5��o+�����1`0�j�`�Q���.���O�G�����e�//��o�#y���{�`M�
�G����+�Yp��3gN�i��,v�^�'��a��H28��<����`��V���,�m��J]�<3���rs�Y����G����7�����X�sL*�J��g?�Y�=v��v�(�l�7`5*��)�X����b����KoH����	��`_24X��������<<�p���w%������)9����5`GL��$�V�#%XOd[��&Bu��!l�4(�`�v�wc2���7���J_��u���r������w����x��x���,v��.�z���a�R�0^�����w�a
�3f&u��'_w�Kf�Tv"�]�l�Q�L����59����/xwr�5�������X


H�R����V�U~l�����f���_K~���lV������O�.iiO:W']k`0u�(5����m����j��v��-������?�$����KN��{�\�w�`���g�}����I��}�Z��^`u�+;	���M%JM���`�
�Y�)�`L��_=��)���W��7��M%'j����o����������5~�`�j�(f��rs�X��.fcK�9�v#X���`j��X�{l����$��W^���E9�������g����T*�{�C=����o�2,Z�h����sU1���������+��^��1��^��^�<tGR������j���3�g��Un��I[���w�#�������$���Ks���n��j��$9�������J%cv=����)���d��x�mio�K[��Sy�}7s��I��}e�l�.�\vc�H����K�W^&�Q�%JM���`�
�Y�+�`L��y-X� ��_��7��
#W�'y���}�x"Y����u,,;l�����$���d����W$�,;�����rs��7�Y�(Y~K���k2s~y��]��+I^���d��w���������u�q���g}1xe�6o'T���-n?��[������.�n�0��v$��R����(��\Sn&x*~sar��$�j����kl-5�����������b]����������FM��$9��#s�����;��/~��������u�����j��/���lzw�q��]w������
���W's������bv)��]��d���{~��v,>8����suq�~E2�_��*�`{M��a���O��g�����_Y�������;���'1\���\n�*���g}2��44���G��b�����;%�3�]�+5���#y��m>�����w&�]�E���LP{��OrI`�X�1+�kH������e'�m3���u���HZf�����Z�>X<ue�j5�j���c�n^7*��1Q�KZ�����f����H1+�����fal(�`G4�`G]z��#�8��$�c=��A����d�����'-s������'sv-;<��u�l�S|���Q;����>���#O`����'`,�]�<tG�����[����"Pc���jub����b�����2~�`�j�������\n�j�}g�����@r����/K:W��
�Z���%��~y�om/���-X��iQ�u�
7��3�H�T*�\r�%%'��k�}�B��u��,[3f'�W��6`�)55d�/��w�.�������.��������s�����L��iQ��v��\v�eI�,`�\������k�(%
L�s����m�����~5������R��O����a�N�\{_�H��~�����yfy��
��S��s�'�wMRI�~T��`J.��Z[nj��@��]�[�&
M��������R���/���|��X�X<9X0U��_}%y��������y�I��='��0���+f���ZM*�r�0��l��nn+/SCcs��6_���{]��UZ$j�,�����\������)��Ky����un1���N�����n(fSkR�u�1��R`�w���Z�_E`
�~���$�r�����Ic���������	}]�w��(�o������
���n,�Va<4������X0�o�A��E����,����$Yq[��-���:<����"0I�l(��Y��`jjT��vP�S����?9��^�/����T����,�M����TL&��Iu0�\]7+�b4)�`;(��)HL/m��g��X?��MX�J��$���&W}n��,����zI���u���R)/���*����!��pV�,�vZ;�����L��j�q�>���daj.�����G���G�+���LL^���Z�*�`������[����������bv�+3�Iog1_��d��I]]R�Xn&����$��$������`r�X���s�����Mog���������������Q�����`���T����46��)��/L�~T24��nL>���k�/ih*;���(�joo��G]v7}�E�U�.9���^��d�����x���T�����b6�������q��Q�&��
�x�iQ�S�@_1g$��r��j�(f��d������x�������Mm��`z�k(J�����9e'`�Q�S����z���^K{1������b=cv����	��2����fXL����������0���q�
������yf������_3�Y��ZZn.����y��R^�����`�%
ev�@o1�����RIN����o�=y���kmy�(�p�PcKRW_n����b�w����i�`���^���R�����*5l���b*�����
�����b�Djl)��U��,+uI��r30yL��{��'�J%�j���W*�R�O����zX�c(��~��d�C��@���b����LLOM�
���C������������e�`
+�����-x�7`54���|`LN7|'���$�Pq��1��r�^S������G&�nH�7��w}yy�\&m��E�J)��Z4���������`��V�k���n��4���.����{/�����x$����/���u��	��c�`�s�=eG�I�km���$����{
���P�0�lXY�_U��?�xR���=v�{���`2hj-f�,6��X��}����;F�5�('0y
��a���o��b�����S��0Ylx8�����������0Yr�������k�/H���L{�Q5�Z���]�M������Vn.`��XX|rxwr�M���7%�������d���{�)�����7L��������evyY�`@
��.>�$I^}n��Rn`��9?9�?�������p2��t�Q�Lo�j���b��s�����}Sr�&��P���������_Q�;���(��HV��Y���v~z�H��>���?�\�t,,7@������b�g���0�Z������v�}�'�sz24P��[;��/P�Z;6`�.;	@�:���E�L����{]r��Y�����$3����2(����o7�_U�&���d�c'��@�k�W�����([�����Rc�����<�"��;���%9���"P�I[����|��9������$7�[���yr��J��M���su�9�6��!�s����Q�H~���ZM6�L������T�e�`�z���T*�fP����+f}S�9���8���0�T�������d�=��,�8�W<�d�
EV��r3P�I[�5�Z�N��*�J��j��[����b64��`[�mz��'�����<���A�+3����_��{�^[G9Y`�k�ULX�W]��f�����'�k�����j�3�����]���/���f�(�S�����%i�H�~L��`�����gC�9(OC�������#���+fCs�9���g&o:?�\��nH�wf��H24�����`|��/�k��d�����]��������7`���X��rJ��I
�������c��14���T��7{�v��`|u?R�s��$M-I���y�/��4�(��8im/;a�`@-)��)#@
�kHZ�$����5
���m�?��.�3f��(��Z;�����_���qUr�_�����v�@_1�����T�vX]k��]v����a�����Yj`������b�ji���E���s�]w��k���������ttt���|f?����1��\����u�]��K�f��u��9s��{����.��RZ6��4��\��d�C���?����L;�mn�zi����$����b���T����<�x$�o.,
�������Q�U#�������`n���-~}���9��S�O��O�?�����w����;/�]vY�������=/o{����7�)

��j��7'�����g/��,c�����k��0���s��rs[��R���rs0q4Mr���y�������[=o���9�����o}+�������:j\s�^�:'�|r~��m��7�xc����*����s����iO{���/�?D�X�vj��� ����E�!�s����%�nL�����&���Rc�Hu(��p����g��b�(��I����
��X����P^�������������,Z�(s�����K��#��|����K_��\|��9����%����s�����nx��v�i�,\�0�J%��/��>8���_}����8W^ye�,Y2.���`_1g���{|�Y���E�\{�H�����?U^&`z������L��f(��II��SWv���n������{N>��<��������������o�����n��}�c�+�z�������/w�}wn����Y�&���w�h���s�����W�zT1�Xz�������O<17�pCV�\����>�����b���v�my��0�����?o}�[�%�x��-fCs�9����$y����Lz]�����L�����b�7%
��hjK�ql��/�e�X�
����[��Hooo�<�����G����$�j��TO������}h��������3��WWW�?��?�!��#�<2��sO��d����d�:��1��r���������������g>�����w�|�k_�>���������~�_��9����4�xP�L1���3��X��C��o&]k��L��IQ��_�4�,7P�����rs0q��0~��|��9��s��5���R��<�����O��sN6l�0r|�QG�=�y�������?��?G�}�S������4�E]�������v�)�����y���}��w��~��1�0F
����0Z����HR*5
0Mto�`�������,@�[����\���q�7���rs0~�����W�*���o��V�j5���k�,Y�_��#��y�s����5k�d�������Z�����Y�hQ9���

��_������~��������?��\y��I�
6����v�����Y�;��c���_�����>������������~7�w��w�Y.��2�W���rs����bV��
I��R��@��b��'O��z`�k���5$C����y��!y�������+;����������*�J%�J%K�,��_��������N�������d�����~��y��G����$'�xb��j����I'��K/�4�^zii��5�\��~x�x����1��M�}���<��{���&K��Y3�x����������[�n,"L���b*������yf�~�	�x�^[���rs�klN������y����~��Rc0�j����D��Z����=�]vY�=��'}��3r�q��{��^.���������;o}�[s����w����8�����)�z2�w����.�,���c�m����������}������LI0����{]�)��b�C9�FLo�8&9�]�c�����m����4�`G<��C���[F���<��,\�p������,?���s��G���7��~z�<��x��cy��t�M��?��m~�n���%K���{�I�������n��<&������:��������^{���C9d,"$I��y�������7��i��P���d��I����S�����/K�C��{-�F&���b�w����S�X�����$�j5�J%'�t�V��V�O��C9$��~z>��ghh(������c�w[��w�u��~�m����o������U�	'�����tvv&I��������a�����y���������3f�����d�M~��dh`���������^���1�T������O�>��X�r�'�{��7s~9Y������}
����.�z��G����kv�u������������o������Z��g?�YV�Z���'������s�}���[�p�v]����q�;�kX{{{���������G�^��W������l��w��+^��������}���y���,0�u�.�����C���>&f�J�{�����L������j����]W)����������mnQr��?/70�4��������.�Z�fM��R�d��[<���)���I�r���}���d��,]�4�j5�\sMN<���
�$V�Z�j�:r�����EQ�������+W�I�ag�yfn���|��H��X�"�vX��O�$�|/^�J�������?�y������?���O�L��P�&k�%��/�T��Q'�~���?����.�������]�x��"y�q�`���&W~6�Z[v*`*��*�oN<��,��5\���Un�OM`54l������sf���U�V�R���x�k���NY�6�mIDAT�ti�����q��Q�����T*�u�����^sG����k_�Z?���u�Yy���388�/�0^x�>��#��Yg�����c�')J�~���z��w�9�9`������?U�����wo������{�k]YI���o�[��f���������~�������G������9�����U��l[�Qgg����eU3f���k���l��c�R��������W�"o��s�Em��#�8"��~z����x��$�g>���u�Y�rm`�=tG1�����Q���:��]��r;��kH��g���ji/f��RcSHu(��*��m[?��7�glx(��9���#9�/�����`������;IR�V���n��g=�Y�����$W^y�V��a���q��lz7��Y��0�����u������hnnu��=�U����y���������_}��������g>3_��s����y&�|}����|k��W�����Q��u�������$ij-/0���+f_W��7���3y�������+;��x���5�^�vmz����s��')J�~�������������[R�V�$�/��On����}}}�}�����^sG=��9�����O}j��j�}��g>���~����qc���r�]w�K_�R�����<���o����{����f&����l�Yn�Fk{1�:�����
�Mz7}�r}c��\n`r�� 9������{�>�`�h(;���i����>���;�H�\s�5��?��Q�������g���(�z������'�+���w����N�RI�ZM}}}�:����Fe���������k�R=�5wDOOO�?���~��#{��vZ����-MMM���k����^{���O�����|�CJ��u�{]n�������c���xG��/�b��s��w���|���(� �������YI]}24X���e'j]���;o�{��6x�Q�#IY���+��*7c��������)����~�������/y.���T*������~������%�g�}�������*�]w]��j��R��u�{]���'��y\YUWWW��j*��6_���s�����Gs����{�����>����'|N�R��g�����/_��W�EZ��~z~���I��w�9;����\�v���$����
�yVi�C�J���t�N��.i�=i������������S��Z�>XSF�`�����y���j���|�;���>����s�=7�_~y��_�J�����|�{��������j,X��|�#�m��?�H�$������+�`��l����G�U1���`�;��Q{g�}�V���C�P����ghh(I�����Y�lY.\8&���w�U��?����9�����Q`��Q�V���${^^&�v�m*�jR�l'XS��5MbGydN?����_�u��/�2��w��E�����$�V��<�c�*��H��{����G�u�]'�[���%�-�w�}�m�5{�3�����$���o�j���������C���/\�0p��q�Z�UW]5&��rt�.������#�*����\����&��W2wI����)���H@
�Y�t�I6�,���l�U�,�)���c�c����s�!�����}�>��|����<0�����{N>���q����������|f�������n�-|�6?�w�����7�.]:�x��%�+{2{��gn���������I6���\�����/5
�d���$����k��t�-7P[��vr�����?x`[5)��r��0�����O~������s�����k���~���{��Y�lY>���^~�$�}�sG_s�5���+V��{�9nll�~��7&�z{{G74lZcc��������k���
���`b�n�;X�����GT���d�#K��(XS��7M.������E'�pB>����_|���V��T*O������������83g�M���y�F?���}�����:�i��v(P��M}��M��`b��S�=6�*��},���r��k���[�/�T��������qFy�x�����~���?����w���.�l����/|a��+^��1��d��Q���w_����m~��
r�u����{���"P���b64������Q��u��jL��b����y[3wq�J2�����x,�e��7%�)S�5	�����SO�w�Yg�Z�n�y�\rI������Y�f���~���z�3��=��c���?��m~�'?�����������C�|������
M��`b`u�+5PC�6��LX���(y�����-;=����,7O��I�=�yOf��9r|���������|���v�i�����wf����@�R������z�I'�4��s��\����l�9I��� g�}�������inn~����@_1�`L�X]���P�Q���6I5��OZ����u��',�v.�z`�����e����������}��{�{�����/�����v�-I244�/�0�|�;s�}�����n����O�\�~�����>k��I�T���r�)���Ks�gd���u��w�����g>��
m�m������?����&�@o1u\L�oJ�&?>;�kHf/H=�x�
0u�qIr��;~����l��T�v�z��Z���Un�:X��{���\s�5����F�>�������|/^�9s�d���Y�n����������v����<SGGG.��������������/}�K�y����{�R�����+w����|�������<PHz6��}�6}BF}������7&3wN6�L~�����W|�2P�~����?/����Uw����w��4�s��-�X�X]]]������o|c�?��������}���ka��y�����q���������_��N:)��{����\�2+W�|��.X� ��_�����e�������K'%�<��z�44O��(�+?��{m���E��������������O%}��w{v��v������G��u�����
�j��In����7��?��?��g���n�i�������SN�?��?e��w�\Gydn���|�_��>���~��[=��%9�������-����|0��[>��W��5�<�x$��?X]k��SU��d����UK������1���k��,|^R��������b�)��Y
�j��^����U���w��_��WY�|y�������}��7GqDf������V�O9��Y���w�+�z����������<�u���Z�f��9Y�`A:��,Z��)��>����{���'��~�	0=�vS�������$��&��KN�=~���#�[�������,�;?=y��y�@�P�Uc�����iO{Z�1g�]v��_���cIz6�y��_#X�J�S�������d�������y1��+����>yp}�~�w��_��]T^.��,�)�wc1g�*7S�H��rs�Tq�������z�����4y��e���� y�����$�����2S�=`L�|2��O����r6+�`�
`u+��1q�E�)n�$�_Z�I�RIv�o�qkGQ����f(��~��d�w��n�����c��K���P��U�_��d���y��������b�)��
�j\�����~&iiO������i`�
7��H>qd��e��u�M���"l���$�b�����`�5�s�L������������s��d�"�WL�Y��E���]���r�@-��,fC��+������
�j��W�q}������`��oHN�J���8��[�GV$���,��3��~��if�9j�HVg�9�vue�Q������OCCC~������.���Q����*�jh,/�S]C����1���Z[n&�E��-�m���U�������,����Ll]��<U��I}=��6����1��|�9�������J�5�gc1�g���V������.IQ�������r��j�+I*�J�J38\���xJ��^���������`�<�������i��\��dh0��T�0YM�,��l`S��(�H��2S@m��,�,����%y��7���Iw����v���'VWv�����od���\b�m7��%�zX�l�������jQ��b*��m�.`�i(;�dr�}���g��Ub�'74��Z|E�4(��d-��\wr���z��m��r`�;�Ln� �V���{
��FS[�UI�,�IK��|���N�T*����^%�xb��rr�&�n�S�@�Z;�������X��39���e���ZM.��d�����w/'�T��ZLX�WM`]q��t��7����m����j����t������O.�����|���`��uUF�_%���J�#v{N���#o�Yw�zi2���7��������ec��5E�U]C��3�J]��V����)��*7O�&
��9��T*�'�z�Z����3��{��u��k����b���d���t6�,746'��D��%����:�t�Kf�Tj4xJz�/�e��z�������^2~������y�E�������JX^&F���a�EWO��[�����N:)�v�S��x�-fK{2cv�Q`�*uIk{����5
��M�o)^��oLf����7%�~��@�6���n(Ir�U�[���L�V3X;Rn����?~��o�&�{����^;j������5��
��������$��X����������e`�zJ2s^2���u%7�w��=L5Q��O��OO����:+�J%Ir�I'e������������-s��������=�yih���K�in��A�X��b*�����_��������n����S�u���k�/�O�K��&5���dX�N9��{��	�T#X3��[��QLX���P���X����qF������2S����6�{;������(5Q��d��j�&L�����r�����-f��rs�����d���{cR�Xj�H]}����w'}
�&��/����KG�p@�I&�`���,&���b�qI�ziR�Kxe�����'����
3�_L5M�EVog�IV�XG}t��h�}�o����u`P+�.*������Z�U��b��Yn�^���su����$��,�����L~����~�����;Lb{������u��U�U�+&LV�X������kj-��~�XW���^����rsLgS�-���-�}����k�f��
�5kV:::�x�����e����+�����qxb�AcMK��d���u����{]28�C��z7�yf�9{��L�]����{�K@�����\z�����?�+��2+V�x��v�u�}��y�[��c�9f�j���#�/T7�W�H��Z�?z+[������$�6�e���SM����>L��$�v.;<^��b��Un����H�i�3��K�K�5��*;��6�
�~�����SN�M7��$��z���=��9���s����������������(�J��5Iu��m���7L���un����S�T���fXSNCS��y��eN1�����*���������m���K�ZM�RI�RI��"���
�����A��}�s9���',70��-/����9�o��<��M����F-����.6zo��Y;moj�����V��F~K�p�XSZSk1����0�M��.� ��vZG���K�.\�8 ���O[[[:;;�j���|��Y�lY��eX���y����9s���xEi�0vz�9����,7Lwm�������hW�G���$�n�k�YZ&�pVwRJ*u����j�k���y��8R~U�V����w���y�����=�iO�����+_��r������;�J%���9��Ss��wf��y����SV��rs����l���&������}D����~yF�_�7&{PZ&@c��u_w��V^�����?��d���#�W�~��s�m�����V���d�����?���z��y����j���������������8�-�,(�.��gC�~E�������	z7�/�M�~Q��?J\n&�WCSR�/����f��j��Z������H���E�r�Wd����u������.����G����}�R����
��t�~yr�W��.���{�k�������K���4���	P�$M��~��Un����������Z�*�j5�J%���'2g���t����|��O�ZM��^�:�^{�X�J0������@�K���Lv�?����^��r30�
�o������f`b5��+�$�zlr�K�����L�MM`��Y��93�x�+v�z'�xbf��5r����~�������
3����:��]k������q�����L����O��&���R#L;
e�+W�L�T*�,Y�$

;��466f��%���[F]�-���������#`�������;��J������ySkRW���`{��?'G��X�uu��O?�`��������������������\�8����?z����'>��[���@O��V���,f��rs0�*�d�.�zx*��X5]����;'I��j����T��T*��|����i��v8#0����Y�O���b���t,,/�x�J���<�"�\���^v"���
�T�0�
`�,��U�X{����z��u���K����)_��K.���k�x}�6`5�H�Sn`�Z�X��R���M����OZ;�N�t����
�����~X���;�����Y�R�TR�Vs�g����)]���?�w7r<s��~��c� �=�l�Qn��������*����_3��{�F`��Q�@6`�u��`�i(;��hll��'������T*���[r��'�;��Nf����������_���|��I�J��W���ih���{`Z���)M-����QoOv�;H��&���d�Ce�`�������3L����Y�f�\�X��I��T*���.j�����`�������?�j5?��O������@^�������	�����o������,_�<�J%�j5MMM9���&����@O1`��7k������-X�����������7�����uQp�h��;6��6
`U��5�$
�I���mn�����/�Z�dI>����o��oG
��/_��N;-�7��>8�y�s2��������3�W���7�����.]]]�V��l�^�T*��G?�%K�������6Y���r�����I���y�T��cmX�\~��^s����}�nlNf�2����4�H*uE���r��K�!��%����j�+I���we������>4RdU�V�����/�<�_~��W�V�d�8+I�����o��o&&8L#?='�����_�������?9Y�����9g���7���*��^�m�p�T���;~^�'C���*�OS�+I>����C�[���<��C#EX�����|m���Z�f��������p�	����s����9�{��������=��5�&����/�������{�����'��w����J�����?��K�W<���o$W|&��*7�T7e
����/y����|��_�����p�
|�y�eX���y�����N;-ox����2��`����b�1�7��Y�f&���$��:�t��\������������2��_y�`zij-f�,�q5�
�����%o}�[����5�������{��7k�����3s��tttd���9������Vvd�z7��;��/���5$�I�����7$�s�>���_v:�?T�_�7%{�`�����<��_�'Xc�`=Z[[[�>���cI���tQO`�>��_$�,����,�e����@���b�����_����Q����X@��-O�{���d�������:��d���Pr�����I����
�$�����v*7L���@�u��`�S�����\����oj��,@mhhNv{V��������f����b����0F
����0�)����?��%i�Q��~tR��`�vS@y���wC�^�@1g�T^�(�X��;~^�g�J�����`���S`\���������,@�Q�P���7����{3w.'L������N.����/��d����0M����W��K.�
7��e����GIwww���v]�R���K.��0�
�����@m)�ZWj�i�ZM��r�^K{���R���j�������k�%���u��`��2X��-�����\p������kU��T*�1J��@_1�����������������b��7i��T��L�W�����\~��U^��hJ`���?�_��_d����V�I��
J6������@m.��^�,�%�T���$3��`��Y_������x�����b�)�S5_�u����������U��R��Z��a��/f�,�)hiORI�C��o/������`"�l(������qSVw�9������3�8#]]]�T*#����5��w�����;7n����v?������`5���M�
�A�K�w/����V--;����H1g�.7LM���S�0���#z�����?M�RI�Z��9s��� Gyd��`��+f}S�9��u�;�G�|���}�']k��0]��/�,xTVW�9���.����+R�V�$�J%�����_�$1����������Q������.`�f�-���.7�TS�X+V�Y������}�i��G���������M�������T�01F
�f��&���b�0��W�u��d�'u����u5]�����$�T*�{�����Xr"����9���$������s��T�Lw��<x���g�M��1{�����?;W'W}n�~��d�C��0�t��y�F�

5��@�{�����R�44{��J�-)50E(�H�{�o����{��9��,Lg;=-���%k���^�lX�l\Un.�ZW��Qp@��Z�����/9
Lo=�������,70��`�)7@�6�,����=����������Lv�Jr�I��/����K����2L5]�u�!�d�=�������+W��[o����_v,���7`5�(705
`��7����z��&���Hn��b��5y�����YSk1�`������J�����=#���sN�i`z�-fCs�9��i��I]C2���}M���3I����L��s�N��������}����u5]��$�x�;r����Z��k_�Z���/�	����b6�(705�v$��Lr���c��;���`"m\U�����������}]���u5_�U�Tr���#�L�Z�[����~��Y��o��D�-fCs�9��k���g�P<fnzsW�_���s�,(�pV�,��Pv����|%Ir��'����w��O�����>���E9������;g���}��O>y����5�S����Op������]�t)����\��qI�^���
��\�-���.7@����SO=5�Je��R��Z����+?������)_[SM���G���?�b�����M����'<v�:�����OWoP�L���b*���+?��l�7�r����b�S���)���'/:=���6��3e��Y�VG��]�5��m5\���k�T�����_��
*��=����(����P���X���l�un��y�����}�b��O��P�������d�g����L������)�z�k�T���b.>89��I%��?I�R�������|����S)�h2{��
��i��3���?�������8�&�������������=ydE����\�������/���]W%��Y���\=G�4W���m=o���������?7�d1\���&��J]yy�C����&�W0�T*�l>���MX��e�E5_�u�)������&�<P���-)��ca���+�OU��uB��3��0����g������b�u�����|���B��/��y��Ry�y#{�-�=�y����?cv����`��e��y����$��/U�L-#X3��l�pVw�9j�,(�@_1�uB��{�Yj����.,~���3��Ws�7ih.;��)�j+7�uM��T��}���M�Z��"��������If���7{]k��0�F
�f������b�)��.
�`�

$����R�L	�J��Q�`SI��b6�*7�uM����L�C��r3�����t3��y��\^����=��R0��v�yf�9��kl)�M�-I�`��u�K���<!��	6��y]�T^���mn1;���`G�[��yeRJ����kn+7�u�=�x�����;����������0�)��	6�[����R)7�T��Q������Q?�H����{�����$�����8���I������\��,�CEc��@���$
��f�J���u��Is[RW��uD2s~����������d���yf��K��<���#I�[����r3Lv
�`\v^r���S�0v�����u�H�����_�������,#I^����]��<5�����*7�d�&����l��4�&�$�yy����g���7�y$�~$Yvc�nY���O��dh�X��-7��5�������,��M���]����f��Z����$����/��t�+3���ZS���ICS�Y���iSV�,���+;L�XM����Z;���H24Pn������m^�9����}d�
�����0(��83f'���:T�`y�P+:W�mn�9���R��%3���Lf/(/�d�&�pV�,�qWW���I��&�k`���;��3�5����z���jZ��b��'�#)���zAR���`�Q����zi���&����^}��lR�����}��]�y���-=H ����( MQl������]�g���XQ��������+�+E�"HK $�!������;3a�I�|��^�u���������:����E����c}�I��hsO���X�~U����{���F�<`|����k=�I���sc�iu�=D}c��&XL[K�M�-����S�2{��`:��L��RcSPog��W'��3|�)�x����kLf/�9@yv�+9����/���b�����&}��^��������f������n���|��M�T*�|�_q>&���b������=�}G�����I��8���2��?� ����7�=���nO)70z���d����y;��W��������S���m��$������)��5��6�/��o������J��$y�+_9�����o��S�0��`��1��[�Y];����I����$7�HL����?��Z^���H~Qy�L
�E��{�(L��$�V�C�U�<&���b64����w�K��+^D�����/$��N����I�I�6y������f&�;��LN��I�%�l1%
��U�=��Z�����T�y��������e�F[��b6�&��Xj����\LX�M������7����-1	ce��d�}�U��o./c�eN1`����^���rsl���b�(�F��]�vh���Vb����&��T���7������2�����j5�TJ����M�l��``�o.���K��1I%���d��J�P:Xp�5�$I*�Jv�q���0���]�_��%3v(�Z�'��Tn.�V��b��&=�I�7�����^���rsl����Y.���%��W'��Fy�&XI�����o;^xa*�v����
�������I��������oLZ����c�,�
�7��������%3���)��{I���S�oR`����[u�W���ijj��s��j:::�f��T��T��$I�R�������:�������7���������9s�d����G�M����������������r��������-���K8���������);&0M���������9E��������5i�Uv*`{u�����[c������u�����=��'5�46)
�����T*��������{G�<����^{���O�Y���K/�?��\��������z��9���2��qN�,]�4��G��o~3�������93�w\���1�{���/ @���b�������<'Y�"�����JM�>��~X��������
m���V
�����+ih)5@�&U`�Ry�����5�A�j5���_.���455��?�auww���|e^��?b�U�l��)����r�������|���9���r��3�����_%������.�,_��W�' �l(��k(7���g'�mI}sRS[|���?��
�^���ll}��L4u���,�-��LWue��/~H������k�k,����������f���9�����g?;/x�R[[;*�G���?��rJ.���a����Y�xqf����K�f��
C_[�jU������?�i?��1�����������_�����5+;��sf����7����JGG���x,}
���'����$�|!���I��r3�f�������}�����<��RIZ������$;���<����;�|������������x�8$��GR~��7�!�{���p��$EI�e�]�����Y�lY����#'�|rn�����5k���v�i������r����5�yM���'+-���������/�<]t�#����X�
����9��XWn`�|����������cf��}M2cAQ�U�\v*��7)
�K�Z�r�Jk����>��a{��w^���w������_��v�ay���>T�|��|����g�=&�������_���������0|������&��������-o��u^5����b*���Z�SL=[���>*��$�����.5�vil)��o����S�#__J��L�����5C����dt}�#������>���y���x�E���/���?�w���o~s���7��V�^����mC��f���W^����{���3g��f��{�Y[_n��2�6X0y�_5�N^t^�QFl�#�Uw����
���g�`}��_,;����������*���>���|f�:��\}��I��7���.����Q���}(�W��>��s���
`<�oN:����Y�PV&�����������9{Q�9F���1y�k�j�7$�>#��,;����XS�5�\�U�V
]����9��c�����v�PV�\z���Z������|�+C�;��SN?��Q;`4�oN�|j������
���������;�o,7L}����O�-���
���2�g��n���M����Q^��(��������~����J��U�}���5���+�H{{{Z[[G%�w����]��#�^������vT�m���_U~tilIv?��HL�mIm}�f��]��|����P�[��?M���XoZ�,�nl�o���|��V�\���rs�A�t�
7�>��#���.�����;��3I�����n�)Oy�SF%�����;��Q9`,�v��9y�O����Q�$�%k�Ln�j��.OH���������'��9I����O}U��A��|
-���G�\�25`�(���I_���|`������1;���|����<p���<������F��������C9$I������������?��Y�|y�����;��O|b������SNIKK��������
�0��>���������'��H6�.;L.���*���{����=/���
`�|�[����7��/7�x��X���S�T���2
�:;;�l��a{����6�����r�-#��$6l����:t][[��v�-K�,�+_��\{�����o�=_|q�������p^��W�J����U���rs0�����%E���;��u�f���kS1�����Zj�I��y���#i�U^��6������Cn��eY�z�����������E�
�^�r��d[�d��l3f��M7��C=�a���o�[^��W���|���x,����o~��0���)�,�6����Vn����.�k(�����wk�fiRb�	���+;�hIaU�RvN��WI�i��a�---�2n����G=s{�_�~�u�R�^��l��!I���xE�>����7/k����W^�o|����z�����E������G%WR�|�Z�j�s������SoW1�������2��
�`�t���qF�9&���dsO��wl�;�������	`<L��_���������Z�*���o���|'���R�T���{�c�Xf��5I���������]�����z��zp��u��n]�j�'=�I�����,^�x�}^��W���}o^���O����;����p�	�w�}G%��?���}���r0��,MV�y�����b�7?����ZfSl����rsLv��8��{I�IoW�}��[�N0�&}�1����}��_�.� �������=���;��w�;?��O���;�b�����5����a��hllv���9�L��Hk�]v�O~����3�a������g?�Y�����{�M�tww�c�X>����J6`��V���<�o&��TM����`��Q�0:�<��%��?N~������L�a�`�T]]]����g�����^���|��y�^�k��v���F���i�uOO�6������gn�G:����#�_
�?~>����SO���W����Oss���&���[�H��Q�~m]������L-s�����%I���oM�#��XLX���������^�1�y�{^���7�S��Tn���|��������{����?�wuum�������gn��;g���9��������rJ����d��
I��o~��s�1#���7�)/}�K��1��~{N<��?7L}�����V��+��279���}nH��������|���z����_O�}�#<��������J�F9���(��x�[��O}�S�V�������]�J}}��fxp�TGGG��j*��V������g�V�$9������QSSS;����'?����~7*X,��F|Lg�,��'�{��;���Lo-s��ON��n���������//LD����K�T��+����y++IZ���`=��{��]v�%��/������_�*�{��f�?~*�J��j����7+W���;n�;�W�X1�z���.�����Mg���~�
�V�\9�\�����b��)��h|��R����}NT�$/������6Yu[����H0a}��d�
��`�������rs�X��N;e���I����/�^������������[�l�6`-[�l�����������^ihhHOO�����3�����:��������{~r�k��ej�S�/q��Xu{1����2;���R#L)
X=I�Z|��T��A�����6l(%����?����n�S����~��7����FCmmm��w��x��C{����t���&IKK��dFn����u������`�-7L4�����X��I��r�LE
����K.~s�JQ�u�����K�0�j�0�ttt���nKe��p��Y��x��0���k�����s�=���;�����s���R���Cv}�}�m��W�\9�z�<�����w������P�����XWn�hz:�T�uC[�Q�����yv������'w�2��{��
�����l���S�?y������x�^0���?��P�����x��q������
�_��a����������~��7�L����U���rs@�Z��}m�9`��i/fM]R�Pn���R���s���.n�=����Xn.���k���������N�RI������c�-%�G����]/Y�$W\q�V=�_������E�-�y�s���4t��?�)��v�V=�/�Kn���a{e�7�w�����P�����P��to*fCk2��\���E���,n_�
~/0���`��-[�]�����}���?������r�u��Z�&I*�JN>����9s4�n�����z�����>6�w��g��c�*�z8?���r��W]��1#'�|��fkmm�+_��\x��C{��sN���/?�c?���>��c�`��Q�l�����G�Lu-X���|���=�H���2�D��^���rsL'��{
~/0�L���w��QK��V�ZM�RI�Z������x�m�3�<3���g�iSQ�x��W�����;�������+����~��[�����?�Q�����~��_��c�}���u�Y����������_��Wr�1��u�{�#>����t.���a{�z���y����9����}Mq���b�)�`���8��$����?{+��������lP�����rsL'��{uo,7�X�);�h�V��}K2T~�h����G?�.��R��g���y���=l�]�zW���7�o���^.���q����;��.\�3�8cL����.9��3�������?��?������l�����o�?��?
���_�N8aL�[���$W}:����
�~��Rc@�f�������S���T�M��N��(�jh)7�t��Z��������L�j5,��������=�1cF���$g�yf����|�{����g>�����m��2k��,]�4��������\t�E�={��e{��������C���j��?�3������{d��yY�fM�,Y���z�����??f��������%�S��,N��Q^&�(�S�����M�-O6�W�}
���M�ll+7�t�0������|�X7�L�x]1&�I_�����f�S�T�����3gf��v����'=�I���X�9jjjr�����}m���o
����=l�T���7/�\rI�<��1�V[[�K.�$��~z���/�W��,Y������/��������������;����r��D6c����e'�ru���������Jm��;���[�������r���������/�aL555����f^�����s��
7����kmm�k^���u�YY�`��dkll�������e/�9���_��W{�J���;,�}�{���`\���w�����0�������Wn(��?I��(��'�V{
��M�����'��(�o�Yr�MI����
��k�8���r�I'���o�����X�"===�={v8��y��ijj��s�����=�9��s����X�"�^{m����tuue��9�y��s��G�[)��z`�V�1��U�'���T*��=�Z��`����
����[9Y����\���{�{nJz;��0��b��{�����{��a-Z�(/y�K��l%X�uf�X�[Q��d��''~��L�h�-O�/�9]�������*f}K��q#?����\���Lf
�&���0Y�����7S<�=O��t�K�7����No���+�I6w���;X��P�����v��`4(��@�7%���T���9[���s�d�6?y��W�7�L>�������*5�F�$I_�u����E�Uc[2k�����O��������o.f�,`
��X��zk~���d���Y�~}6m�������=;{��G;������e����x�|Mmr������g%�3��SE��b��%]������`�V��#�����7���Y:|��/W\05������a�`-_�<���g��/~1��{�c���v�k_���~���u�]�!!�#��*fC�?4�DT��4�n��N�s��7$�����o����r�����\���rs��)S��������9�������j�:���Jeh����s�=9���r������g�����q�
�@�
�����<���EV��$�����h���-���M^t^�������~���+���������)�JZ���`{L�������%/������r������b=�>���y����+��2��?�����qJ�Eow1��HV��d���c]�I���7�yv��o����6z:�t���E	VogqK��w�X�Sn6�m5%
�^����{��^����Z��Z�f�=��1���=�q�7o^Z[[����5k����s����,Y�d��~����/}i�����0M
��i���x?5Y�����MmI��r�0���O�p���W^~^���-�O�L&}�����|���M�RI�T��~��9������?�1��W��3��u�]7T����?_��W��W�z������u>y&�����.��X[��w|2c�rs0q�`5���������%I��b�t�`���`��9�����$y����_��W[U~�$GuT�������oM�Z:����X��u���d����n,�����<�����~���s����\��r30�t+�`�4���������#q�����;�H�RI�R�^��|�c���>��O���o�����$��%Kr�����C���?���s���X0a���kc��)���d���
+;I�@V�,�X���{`�PM�F���w�W��$��>���7��J�2�|���aE1���������!/.7��Z�$��sr����_[�u�+7K�@V�,�XCK1`�Q]�F��{�Z/\�0�{��Ft����,Z�(+V�H�Rv>�X��S�������,��i�S�����`b�Q��8�o.fOG�9�GM�F������T*Y�p������;?�|������u�����`VOG��]n&����FX������5��;�[��2l�I����n�
���_?*gn��ah�x��Q9����%���umC�Y�m�����'}�I���~��0�`5(�`���s�5�-IZ��_�4�*/���);�Hq��T*�V�Y�ti��Y3��V�^��K�]y��#����z���`��S�$�s�u��r�P���������{�
�c�=9��{�4�����t$��.;�c��X.����$����g>�����O:�7oN�R�����,\�p4b<���[�
�`rj(�j_[n������������b�Acl�N�k������{��������+I>������>I��}(W^y�v�s�W��s�M�RICCC>����fL������5�IM]�Y���2P����'_~u�F��n-7�ksw���b=cA2c�d����\n.����b�(�&�I_�u�!��K_�Rjkk�����>����'?�����z|___.���<�y�KOOOjkk��/})����89@�7P�U�Pn`���O17�LV/I��Kr������XW����������W|~Ky:�����^X�$PWv������<;��s^��������g��O|�y��^�c�=6�{��2o��������#�W���7��+��2�����b��T����������c�9��0Ml�.f]c�9��w�i���'}��mW&7�O����T������I�Rn����b*�&�	[�U[[�]��T*�V�Y�|y>����������Z�=�����3�������7oW�Gs�-����oN��/����l���d����}MQ�����H���B��9�����b*�&�	[�5XL�-*���sk��<�F{{�`[\���������+%
0�Z��8��G���u�l�[nhh.f�,`��XIQN�-�T�S^��
o���|����{&�J���FF�`���:
�?e�(�Zykr�/��{'sv-/�#��XG}t*�J�1F]oG1�?>���r���en1;7$����	�JM����_&V������I�����X�sG~�DCk1��eqK����
�M����p&��*�����#�������rs��yV�J�jQ��:��D�[�?��T���1���c�|;�3���c9�Y��7'=����?�k����/(7��M�,������
�`���-J�:�'�~��^�4�.&���/��i�������2wq���s��	IM����qF�@%��(y��[����I��-�m�H`<����o�����QLX05��-
�~��-{'�G����E����<���m��E�&3��	�[}sQ�����`<�?/��G�j��=�,���xR��o&���c}�B���)�o���<;y�e��R�T*�E�qW?�^���rs<Xc�uc[~����cw>P��_T�����\q����L�Q���l�����J��\���rs<X��������ci�����${=������ �Z��c]�9���
�l�Yn(S�@V�,`R�Lk�L�����g��s��I������2����K�0-
~�r��rs@��z`��q���[���JMR�0����������y���ev1;��`Z��P������25`���d�����OIv=��L�`�F�@���G$'~��,[�eN1`������4��P���Y�����$�n�����	`�,`���*f}S�9������R)7�d�v�����Xww1�g��,������}���I_O��K���I_RS[v:`�S�L����o.7��,�������IM]2ka�����0Q-�6��w�����G�<�Lf,H�~z���]`%IoW��ZZ,�$
��I�����M���Z��Ic[��)���[�_��d��K�0a-�c1���Y#?�en���F~L�
I�6��%��
���)�&
X�d��Mn��X����s}�~�,���vY1�8-9���f���RI�����(;
�,`��K.{w�������b�7��	`[�����$��+����}m��&����������������$
��	l��d���?���0Z��C@����/~kr�}��9wqi�`Jkh.fOG�9X���������>^��f$��	`DZ��c]�9&��LV�:|o�.�������~������,`��)fCs��~�f
-s�����E��b�����o/�3&���"���0P���Kj��J%y�)��N-50M����6`�6��`���-f��rsL���9s�d����k�`��t@17w%������_~Xn&`��+;�#�(��k(7�hi,�Z[n��b��yV�1`�8����/J����������t��
���d������|�;����s��7g�����aC���?�q���g<�1��sOz{{�$����a��53�P�
�j`SD��b�_�|���z���S>������,CX��L�G���^T��F��(��*�Z�dI�8��|���M�ZM���$�J�����?^xa�d�v��+R[��$P���:X�1k�d��������������������l�]f
��Z����T��JM�y��g��������z�������������_
:��3��Y�V������1�	l�>X�S[�������-nm������(K��b6�*7LG�M�j����(�4UWv����� /{�����7TvU�V��N;e�]w�o���<c�}���G�_���I�������^��1�
<��_��*������eN�n��lZ���+7���X���I���?{���l�=�g���1I%I5��L���NL7��k��Uy��_>T~U�V����4�}�{���?>IRSS3T��hN:������L�Z�O����<�_~.���b�u1�`ST��bv�-7��������1�OPIf�4���R��7%���
`�M��~����q���G>�������v�u�q�
�����,[�,�/qF��z:��+G~N_o���%���������Z�S0�����{��|���?��m���<���������$�t4��������}-�J%I����d������LCCCzzz�$7�|�,xw�6����T����_:����M^pv��kHv:`t��(Z��c}�1����y���=/70�������%�JRS��������L�����������$�J%�}�{Gt^]]]-Z��K�&I�-[6��0%�������4k�gW*��/Mv}�����Z��}m�9�ZM��n�w�-���{����������T�������R���I]�u�m�
�,X��?��#>s���C�
6��<��:��I/K�gm�������X�N��b��5��7��nOI�S^&�e�O.y�����d��������5y�?&�����%?�`��Uv*`���X�V�J�T*����.�rf]���$�7o�3`*�V���b������0���P�����>]�g,H�����aE1[�$;�]��{fR�)/06*��{�d�{F{;��L/����f�oJ���G���k�����3*g�T��������r�Lv����d�=I����?M6�L�z������U��b������-70~����'��k���=�V����{G|^GGG����T*�a�[�tlY�7��`*��$G�V����-�H�}I��d��1%�(�jl+70��[������-��k��wZ�{��������n�m�y���/�y��$I�R����&��a��
�N�6o��E]SRS[n.���R���N��$k`��R��R}s1{;�j5�T��L}5e��=�iikkKe�-���/���.�`h�x������#:��k������� ���bo��R#LI-s���������^LX0�4`��%}��f��I]�U__��<�9�V��V���'>�;��s���������<�J%�J%'�|����I�s}18!9������)5���2��
��2uo*�,�^�����7%���2,��2�������JMMM*�J6n��N8a�K�>��������R�TR�V��������0	
����g'��}q�a�r3LE�s�������6T��Zn`|��%u
���/L.86�����\j,`
��XtP���7�Z��R����n������}��������W*�$�����o|�9��#��7�)===Cg�����;�0�����������c�en1;�����_C��Vn`�-~�����d����L}ue
���'s�m���?�q*�J���s�����s�Mkk���r��O>9������z�����jN>������KY�5����oH�}#?�kC1}z��j�S�?~'��O�Jm��W%Oxq�����{c1`��s����L��%W�G��Qn&`��X�����w��7��
��W��J���(���i�P�U�Z��5k�=���=����������0~�����G����{��t@17w�$��e
���W�O���uw{1`��S�$M3�u��b�(����(�J����|��_������}����_��dK���|��R����;��s�)��kfK��s���G��J������OL����
��e���J:���
���6&_}mr����`��V�R���rsS��)�t�)���SN���_�������s��7���{�>uuu�m��r�q��9�yNN<�������F���b>��d����������5�.�;�'������������_-�7i�UN`bhh.f�,`�L��A'�pBN8��������_�>---�={vy�`��`�7�����2�����k�7�c�}M1?)��s�uc�Bn��Z���#S���ZZZ���Rv7CXM��`���'M3�����
����iu1g,(~�$�����(70uM�,�N�UXSA����u��=�NLU�X����L,CX��_~X���=�V|��H)��)�{Sr�������/I�����O��d���}]�I���}M1�`��V����G����3�'���L�����_%��7����%u
��`�Zf���&�v.�<��R)50T���nIz;G~�����:o�gSGckr����/����l�'���rsS�,�"����;���YT�wZQ����2����fqK�#_�<���"���$W�����6t�&��^Y����/%��0��Tj$`
��o��3�Q��W*���g?+5l���b>����/(7���g'w�!��Lz:��
�=7��
���k1[�%M3F~������9����VLX�h��XW\qE*�J)�]�VK{n�^�X
-��`�,|\r�W���k���k�iu����a��b�O��*70=4�������QSv`t���`��L-m;s��rs���f,(70}4��gS�9�������Z��F���U�I����V|���o��1��.f}���`"k�_��uI_oR[_n�<��
�v(70}4������{���cl�	[����_vu�Qr�cw~�6�����@y�g�W}��������N����dsO�n�_n`�h(�Z�<�������e�Iv���\��5a�`*�i/�^OO�{���Xy��+��<�e�,��=SU����O6��lZ�&���L~~��r��R�/f����al�`�����OV/)��z���7+���,G����i���g�����m������(�jlKN�p��qe'���'�V���-:d����!y��[�xNr������2��,G���Y�Tn&������SR�K�I:�'K�U���5�|����O���T�����9MCk1{:��L^
�`�v�^����&�(���\I��o$�k�Nj(��q�d�n�fk
-�T�l/X0�z������:��sSL�j���X��+7�xP����-����[r��W�7��M�.]����g��Mikk������{����1��������LQ�}�M?J6
�s��b�)�`�Z�H��&���I_o�,���`#5�
����o��.���^;l�Z��+�J����|��_L�<�iO�������%/��L}w_�\~�C��f����9�l_Sn��>���M3���r�����b*����)����{s�i��G?�Q�-�W�Je�|���\{������r�	'��/����)5S]��b������b=c�d�C�����:����j5y��Jc��[�|0����m.�f���[�y�o��U�g����%-�K�L"S������3���,]�4�j5�J%�J%�ju����cU��\~��9�������<����xD`���S��$�>��,L--s����toL�f������H��9|o���H0�v�/ihIz:�T��Or�M��G�
�$&}VwwwN8��,Y�$I���f����N:)�{l���e��yimmM{{{��Y�?������+��o;������.]�N8!�����X����nsw1�����S��4�%����|�xay���i��;5���M�<����'&55��=J�0nf�����I���F���d���al�I_���| ��zk*�J����&�x�;����'������y��x��<��O��_�����G�9��|�cK��jn���|���>�����0����V�*c`��d�����������>G��	���7u�Y���o�Y�P�X���yV1����L.5e���7�s��\*�J��jjkks�E��s�}����������;/]tQjjj�����>����1�0����'�0��o��O/n;�U�mZUn&�Nz����Vn��`�g�X�V��XW]uU��]�$�T*y��������u��_�����oO�ZM��[�.W\q�hE`��<P�U[_n��y�'O}Uq[xp�����H0�tm,�,������
���4���,Y�$�V�����[��������-555�T*����5T��Pn�����lW���{S1`$
?
���X��0�V�J�T*������i��Ft�N;��=��3��~{*�JV�^=1���
��`0�Z��c]�9`:�n/f�,�4�s����j[������R)/0qM���������sG��9s�<�����������U�Sc�e���k���I��b6(���������%��W'>;��ky���kR`���>C�{��wT������|��W$���o�a��0��`��+7L�����b�� {==y���������O�6$]K�L`������Jccc����|���z���w�}���[o�5��-K�466������L]��iVr�����0�Z��cm�1P��������	����-kXIMm��1[����(�,x�I]�����W��U����$�����}m��;����$�J%�z�����7Nl��M�l����r�0�`m�N>�w��u^��o$��������;�����uI�������I�nM����R���G�0}��`��=�����N�V���7�����u��?��|���L�R���s����rR����b6x�0���%�������$�n/'LE��,����/Mn�����C��&���b�v����&}�����s������}n�����=�yO��������o������_s��g�{��^�d�������3o�����r�o��+F~�=)fc����mu�>G�[�7Y��d�����T���b���d�C�J%���R#LX
-���(70qM�����j����O|"g�yf����|����w���<�IO�����=�q�7o^ZZZ������W��o��W^�����I�j���w�=��~V�^����*G}�X���`�,M����=�y�����m~17�*7L%��(������r�Lt
���2a��=��T*�m~\�RI�ZM���w�*�z8��|�]w�����eC��7o���kw�qG~���d��������9s������#�HSSS��&��+����,~����kH�����#1cA1`0-�>��eI���$�����9�rsL�����,70qM��A,�z,��Y.�z�3*���lm����K/�4��s���?�����r������������9�Cutt����w�1l�5�yM���/�
��F��+y�9�f����C17*�`����{�Rv��S������_CK1�������<���������.���2�m��D-�z�����v�i���������iS>��O�����s�%����������}�C��&������rs�hj�<�M
���:���/Of�Tn�m��AI}c�)&��(f_OqK�[~�<�_����r��-�:�����P�����r�)���������f����5kV�.]�
6}m��Uy�s������9����;r��7��M��������=��o)7����y�_��|n���i�����)P����|��%s������q���ny/��^�T��kX@�kB��G?����7��
y�����&)J�.������o��e��$9���s��7f��Y�����'��vZ����$���ioo����~E��O��Vx��w�Gx�����y;B�5��if�u��7��'��g$�m�f`z���to*�M3����j��e��\�<��Y^`b��X���5k��}h��y���w�����jjj���8�vX������;�L�,_�<���'r��g�W�$�����o�1I�h���r�)��'>1������&���k��S�����.I6�.��vZ�B���
�(W��-kX�G}KQ���Qv`�P�5A}�#������>���y���x�E���/���?�w���o~s���7�Y��/�y��7t��O}*7�p��<70�T���{����&����Ry�������O��_�oI9q��������]\�[�&�W$���@��/fc[R�]��FCK1`��jh�������a{���Sy�V��3���u�Q�����$7n�E]�7���c�uPN;�����$I^����OT�l���I����o���>-�Xk�N�t7X��4������b*��������k�j����=��3�{�V=���Nv}����b�G��O~2�����$3g���>��qy^`������k,/L-s�����
`�,7������
��ue�������~����J��U�}���5���+�H{{{Z[[G-��-Y�$�{�����;��,\�p���6`�5$5��f���un1;��`LS�X��5i���N�'�m�e��k����]q�[���f��w��w��$����M7���<�)��p���HGGQ�x�����o|��=0}�v����0U4�)f��rs0=�t$w�6���,�}��`z,������$;�����e�5a���s�a��J%w�q�c�o�<�����o�y����M�?���
����/�0?����$��������T*�1y.`�[z]��K��������o*7L�X������$�d�����J��4��������D�$�{A������7Y�,Y���T@�&l��w��J��j��$�X�������J�:;;�l���e�u�]������[nq��s�=���x��������������_%Y���{�v.'L5m;���&��W�w�?y���e`��o�mn;��4�J���C^Tn&��.�$�_��c]���Kz;�jR�)7P�	[�5hk��F��j���������=}}},X�Mg,Z�h����+G%����Mo�����$���O��������GoW1���d�=�T?��L0U�~Xr��M����������a�����w&;�_n�W��e���4���(��-�Z�x�V�Zm��&�M�6
�nii��_k���E������.���^:t���}.MMM��<[k���Y�j�6=���o�4����)�OKZn�j��g�k����|�9IOG����7��
����+i_S�g-,7C]CR�I��I�,��&l��w�9���,\V�=�R����z�H�Y�&����<t����6�w��>�����?���>�������v�~�
SCCkR�P|XU���~��0��O1����f`b�T�����{z:�N�E�����5����a��hl�1l���#��`o}�[�r��$�����}lT�����m���J�2'�x_��6���$��(���I�:��n�)�������$�
�`�S�5�455
������3����������}�kC�\pA���;j���PV}�9`:,��X[v&�?\�l�g��_���;������
�`�R�5����
������3:;;����q����
o�~�s��W���r�H��Mo�K_��mz�����O<ql�E������l_Wn&�����wLf�8�g��%;�5�g0�54�/�O����R��sL2wq�����k�ypYUGGG��j*��V������gn�w���Y�lY����%���gF����`��,X������S���9��T�@����{S���	[~n��2���M�o�����)�*'0��u�w����Wg��9�s�=SWW������R��Z�&Iz{{�r���������X�b��hC-]�tX���g���w�}��<P��b*���7�b��_������.y����O/5%�n��n�Q^��#�!��c��9�X�����}u����TSv�����?t{,�j5����h������9��#r�d�w�g������<c,577g������-[�Mg<�������sm��a��+I���w�R�<�����v�����a_�={���SC���:���,{;�]����������\Q��(Q����oNj������`���3�g��qZ���Yn&`|M���}�s���O}}}s���>��O9���y�����{R�V�n����'?��<��O��U��)��{pa�M7��M������<�������������|��-�
�`�������+9���o*�����	��to,f��rs0=�7��������X_|�P�����}������O}*�\rI��j*�J*����*�J��jn��������#�#z��0���k�����s�=���;�����s���R2�����M��Pa�wK��27�k,5L�J�����%{<���XWn&��u1�f���������]I���,���+;�H�����k�*�z������|���o�Z������>��Y�zu��������Z���k��7�����������/����?t����t�������?v}�q����m����{���'?���}�+_�W�����g?��y�;�1t]__?�l��5��C^��yx�^�oRS[^&��Z��kC��9����0`{tm,f��rs0=54,�E	�`!0�M��'�t�M���L�T*����x�K/�4�V�*�z��^��}�s��-�~���������M��$���gJ+�:��#2���^�:I�d��\q�9�����_���]��E/�Lmmm���������v���;o�9��4��E'{Qn���f&�����;�'m��N�x�������`z�kJRIQ�����I]�u�w������{<�}/���$I�Z���s�����*�J��<�)9����/��/I�k��&k����y��(�#���������}�cC{g�}v�=���������,W_}����3r��'�iV`��V��/O6�JR-�SM�Cwx����<�k�����b6�)���6i��t�M:�)���?��qF�9��*���9��(n��_��`R`�X�"IR�T��.�<����j~��_�G���/Oss�C���W�:�x�;Rhd������?~�?�3�<3���g�i��$��W^���??�|�;��+V���_��a{oy�[2������Z���/r���np`�[�������s��0��<T�����e'`���;��I��d�
�^�8�$
-E��o�^����>9�9���e'���.�jooZ�����U����n��$E�������������x���u�]I�%K��b�m3�������������w��]Y�lY����f������������y�[��e��
�w���9��3�=7P����W�����P�//��]�E�m��*�$��S\?��a����Jq�����=G���9�\qcR���7%;�����0�\����+����/%
�yN�iur�����[�<���E���.���y�������w�5��kkk���?���`����
6�B��w��g��k�������?�������|v�m���5+K�.�����=���9]tQf��=����������G����]��W������:���}��%��oN�try�[�Vs�c�Y�����q�+7����%���I�?Y�<Yzm����T�X��X3f�H�T���^���w�W$I*�J9�����m��,�*CMMM.�����������������,Y��a3o��\r�%9��#�+&0to*�{��Z���9�s���q�OV��l�.^���>YyK��K]����&�<��(��*nIr������r3ckR`����C����;6l��Y���g�������S�T�$G}����n���ukk�(��>MMM��7�����%9��sr�
7<��Z[[����&g�uV,X0�!���vs���C}�*�������/?L~���}��?���sc1�f������
�`j��X�rH��R����?��������n�}.����_�~�~�{�#�����+V]������y{�t�I9���r�������uV�X������=;p@�<��455m���ju�n����?�����9���W��n��x��9��X[n�N�?�V��5X�����I]���>�d�����%KR�V��w�;GuT��g�$������w�3�J%�j5mmm9������o�9���C�{��������{����������U�zX�(h�[�vXSV���+Q���3X����������_��T��T*��\�2�rH������O����K�}��xE�����_��C����t�A��O�����k,705�`u�O��J����X�������,�`CX�I�Zn`�L�����m�o���$�J%]]]���~��~��Y�~���f������}�z�%�\2t�!���eYIoW1����L
���Y�O��/5
c�sC1�f���`V�Iog�Q�1TWv��jhh���_���?>��~{*����*�J��jZZZ��o}+.|�s��������z���?���������)Ys��uO1�`���.i��tmH��&-s�N�h,<n�Unx8uMI�������]�JR��<����G��-5e
�/��������y�����3g���>���[���!7�pCN8��G=���x���S�VS�V���p��l�5K�{o.��{;�j_R�Mv���d�T�:���}_���'��=���r30z��g��N��,||����l�J:�'�_]j,`���`�455��xG���wl�����7���O�>��CF+����.����K?Y����=;�U|H��e[�n�E�����	���+��7l�c����5��pO���u�LP'�G�qe����u_Lz;����)S�5R��������b6�%X���g&=/��K��������ue����6&�����7zgzM:UMm2k�b=s�b�t��}
�&������rsSW}s��a�z��
�&��n)��Z�$��vPIZ�&��,�kL�>zT#���o.�,�Z`LB�X�M�����9�T�P�{o.�.OL�~z�Y`<5�������R�0	m(��S��X���O�[�������i�r3�x,���(70�`����������������6��)�(��.H�6����r�@Y������	[�����n�u�R�������hy���Z�{�o�c��i��c��`,
`u�K���R)7�t��aK�����Tj���*7����Uw�'+�T��f$��(/0r��K_�R*���V��XH�����G{>����qK��������M��'����2���{��5������	�JT��a��b�����r�@�[���+��������~�('0r^v0Fz��Y�����f�������|��b�yv��/%m�K0��(���K�9�l����=?Y����s}��)Y���T�HM��j�:��OCXM��
{��|������=I�9��H����c������b�V��4W�$'�k����N~������L��M���K��^ok�0�6`�)�����/y�����[��Wc��n����3��+�����s(���Z��&�	[���n�����[ow1���0Z_�6���k��0Q������JR;��k���u�����,�&l�d��������m-s�����~tn�������|�?&O}Uy�`:,���,702
�F���O���b����u���-s�������������-{M3��=��L0��7������(�E�~)����{���	��g?�����K�����J%3O>93N<qTs��h�W��u��(CO�����}+�kH�f%�><�MCK1`��6�����7��SO���Zv�l�*�qoNf����%�}�����7���[Gt���|'{�|sv�}tB�6j�S�����(C��b�5$sv)7LW�X�V'�n�n���yDR�)/�m&}��>�����g8���z�����������e����=����d���fa���z�P����},��m�v|�7���_�:�������KG9!l������2������'����L����b6�*7LgM3���6���[�O�x��S��l�I_�5���n��g��w��]9���s�����OLccc���i�����
��`b����$I�d�gl���zV�rH6]vY6~�������fD�*m�������n������d����;��
`�um(f��rs�t6o���W&k�,���9i_�l���X�6�);�h�T*�V������������N;���O?=������L�j��S��`�0:��6I����m����o{[���7�9�����
�E}sr��1�����)�����\��s��iV�9`:�T����������S���������/�����c�=v��R�$I��j6l��/�0G}t��g��s�9����JJ
Lu��WIR����y�uI����9�����-Z��%K��#�h��v9$y�������^��r3������<���M3���������X�y�k����,w�yg>��f�}�I�ZM2���;��Yg�����+�w\���/����������e]�������7�I�4?�i#:�v�����O$IV����x�e#�#�6���`�@��b6�*7�Ec[1`��2������y�{���������ks���g��������j���s�UW�u�{]v�i��-�����e]SW^&��oL��M��1#�8��f���i<��$��s��y0
������b6�,7��`V��rs�f�`=�S���|�3��=����/�8�w����$EV�T������k_�Z���gg���y�{��[o�����$�7P�U��|�C:��.I�t�a�|o:�J%�|��I����6�W������v(��U��]��4����Xk�L����v���F���,������N:)�]vY������.����T��$����/_���;/p@?��|���-3:0I�_������>�\��b����LLL��^�$i>��Q;�a�����'&�j6��G�v.l����\�4����m��r3����L.~Kr���;[�5+��	�yv1W/I~���v���5w��
x,S����������-����?���9��3��N;
+��V��V��������o�������/��~�����-��f���������$-�X��$m�{^���?�s`[��P��w$����}���fM�|!Y�������
���]��l��I�!'&{Q������-5���P��:(��Gs�����?�q�������.KWWW��b<��O*�����E�z��������vmzn�%I�������m�~�|�C�t���n��J�����-<(9��d������}�GU�m���d�)�Bo�{W@�`�����]WW]�U�e]���PlX��",�TE� �Azz23I&S�?N�Sfrf�������9s����w_6��=�����t�T])��Y���Wh�!�<��7W������V�4��[��~��n��[	@������l:��c5p�@|��?~�������HU�9�?E�q��Y��*>�T���uW9������C��];�U��'rqDL��!l�����hTzd�J�b)��������Re�y��X��im���nsV��`�lV�J4����u�Yg)//O���?)��
�Fc���)�JK���Ab�-�rvX��6�vy�=V���93���X�!����@��Y ����y�8���1g�om;��:@K�������/��W_��M�$�eX�dF�qZZ�e@|-�,}����n����������O$I������#T��+����:�sO\��1��R����$��_S������Y@��R�$�6Q�����W^yE/������kI�K�j�����?�p�;Vg�q���@�X������C��C�
�U�d���`y�9F��T������7�t��}h(O�9%���������: �9����`�ZmV0��i���K/����W(�a�U���u��g��s�Q��}-N���g��-u������K6{��A�T��K�����x����q�����\�������9S�_�������6]~����M��������yyM^�:���(�4�����6�v��
����W �m2��9��i]&�juX�/�K/��7�|S%%%�T�����������O������C�Z���*�9��$w��Q��E�A�u�$�=p�G�������,���Zw�)Ruu���Z�\�7��N'6k@���1g�������lks���-���C�!I����I�T�r��U`�Y�F/���&O���+WJ�_zU[|%IC����cu������X�X��g��tks��+~�	U�Z%�l���Sq��;b�����o�tU���Rw�m����_�N>Y��V�i�����-F�����;�;��L����/W�>�4�K�"����B�l�d���GI��6��#�>|H��s��*�d���_��z$��I%��P���b��2�����N�`
<X�����vK��������s�9Gg�}�z��aqb��6|'}��T]))*���y']���pQ����C��������3���������)\X����W�g�����_��K.Q��J�OT�W^��������z)��SU��[�r�5����2�P�h�����|������(��r6~/}�Nl�l�;����i�S�h���O1vY��,��H��E���]���*##C��~��=�\�������B�gm��=��T
�Gw��Hq�R��[Y�����P�����q�T6e�:>�����u����x���$�������M.�����{��>]�9s��9S�#G6k=@���0����@��/�>y^�Z�
@[��Ssv?P�������.u����k�zk
��V'�{I_��{�a�������cu��'*--��H ��y��R�#���^�a�.Z��/��h�IR��a�������������Q����~��u���I��C]�z�^9VS9{�V��W�������������]�h��w�y�/2�*J�HX�����$�hTZ0A*X��j?Dy�c����]�s}��P_�(��c�=4v�X�3F�:u�:��pH�F$E��������'��.0����yO������T,Y���^���&��>z�<���0U|U�_����V4j����S�PH�������bn'�]g����R����`Uo����S%I]g��-�E����������G���_����b�6�upeH2$E��2��mu"V������-���)�:����+�k�*��9���X���<�@�c���=������+�����V����6�y���`��)y�9���[9{��Q���p�9
����E�v��l5B�Yg����T>m�">�l^�J�{N
��8Pi{������j�]�t�%*�2E������+�{���!�2��)PL����0g���Ag��v�$O�����c�*��9���X�_�:��(��W�}c�^[P����8n���s�1J;��&���9S�K�j�������0�'����f��a(��3�&��w�R���q�?�v��J��G�+V�|�te�q��'N�$e_|q\����"m��ZE����5K9�]�}�����@�U�������cm����`����I��Oj���LZAVC�^�Z�'O�{~�-�X�4D�����$�r�y���z��s\{��"��fl�"UU*��.�u�$)s�8u�8Q���������U��#��9*}�e�w^,��\�/H�<G�.��jm�&0C�g���;�P��������o������SO����n�Q�7� ?X��pgK��R��u���������-�Z��|H�+K�t:��X�M`�Z�J��v����
�H<���q�TYn>/�l���[�t_��j�������C��k%I9W]�<P�}TS8��U�;������������c���S�b�T4V��/J�����8M�e��/*���f�V��@��y�y����mO�q��X~�Hee\�$W�9)�����Hk�0�7|g��^��m�^#��uR�/E#���I%R���g��&
�jE��f�7���y�4c;�������B�7����
�t��R%�=��+$I��\����+����O9W]���_W��_j����6{vB~_��3G�u�d���w�h��4Y���+��T�t�*�,�$e]tQ|��g9:wVh�.������ ��k
�>}Q�f�dO���X�y����Wu�4���Jk9��v`���Yu�y�J
��a)��R�*���d�9�2����q�]��n�eJ&���Re����u�����
7(��Kds�b��d8�4i�Vt��|�-�^��������R��s�����U��T��4O�_����K%I�a�����q��0y�;N��&�7s&X�z��1gE����e�P��v%f���!
��<����t[�q�!9]R��,�`
�@B���Pi�?���l���|��/I��l��MZ'm���}���y����u�}�U�������U��k�p�}2#.{5E��H��S%IY��Y&2�<S[n�A
��}�e-��w��N�$��Y���������()��T�6|+}��(�:�x�(3�+S��k����m`US�X�,�����;�������Z��b��^u�2EFJ���v(���U���
m���e�����VG�S�����J������q�-�kW��7O�M��~�I-��g�p��P���\�R�]vi�}��0����c{�[�����2*J����4�6�ns)�,EH��9���������I�\�%t��$����9�(��NU���.����[�
��4�>7v����<��$)k��FeJd��[t?{F��*0�|�f)���[t@r���3@��U����ai�m8=���X !�k
�Nks$�@M�g�P��4L��Q�M�*��j��
�'�j�UW���G���p:�y�Yq����w�Y�5s&X��rg�3Ti�������>�e�teZ���jNI`-
�@B�`�)�j�h(����$w�`yF��$U~��B�7���������6_q��'L�C��w���l���?�������='�O���g�����7O��
�\.�#��-9���@1X@kVQbNW��)�U�s��_�~�c�q���Q�e�"
�@BW���bm�dS�t�"���ee)m����� )�:)���T�������������hT�/�\�O<!�:=�����k��h��=���kW���S�C)����H@�l�l�Y�����4�����i�����N�,Xe>$)�
���f�:������6G����'Ir,�n�8M�yG��$�f���5��*�>|k��s�Q~������$IE=�h8lq"@"�d��h��+�*��� >j�\Y���F�q��[�cn�]f����@�sX�%���[��z��1�N����S��(��s%I�#��8I�xG�R�m������TU�����5�3���N�?���c[:&�(���T��3
(0o�<��[	�`�9���/s6��;����� ��
�2���GN���Q�q�DZ����"a�f�4�����^�zQ�@*\-�m6�}�tP��`�`P��>�$���8M������:)�q��{�Q�\X�@��9�(���LJ�����R�<��J'O���]�Hk����R4b>~��,�5�I�7��6���a]�?�to=���R��e��6Q�O�����=�Hm�,�����
d��U��{Z�Q�M��#U�����������%IY^����c����'U����<��l���	����C���!�{T
[�	@�E���WH���?���$@�8���!EBR0@��lVmS���LqIv5�H��4VR	��'Ir*��|��yG��$�L��h4Z��Pa����V��4�����\�������T>m��q	��c�@��94����+{��iO����C_�����m�`��@[��:h�*���m���X�%Y����$y��8I�x���t*ZY���V����{�b�"I�s�=����*"��0e���;�P��/+�����HP�ls�����%=-��6������g�4����/N�TYF��(���(5gZ��9�U��_�7O��>�H��4������c�{�]���R�,����$����C,�`��_������,RQ!��|�TU�\��}��T���.�9����-�
Y�h+�6IK&�w�~��w}�Xs��I���k��q��o�&M�di������HA���,3'X�����SO�$���)���Z���:=��~��IU���������^�����$��!�Cs9��U����r�����r���m��*}�%�?�@����7�I�
����e���L
hi�sV�I��dO�w��C~���fv�]��]YR��c�.@<��`M�N�9$�&v�t����Z��}��/� �0,�;�R�@�<W���ykt��,m���SU�|##-M]^{����b�����#F�7m��&OV���*\\�����$��8!�+���U�d�J_~�^V��\%O>����W8?����[7��t�\���2�HD/�TU������eq�.��\�a��a��D��Z�h�
j
�:�%�:��,��������PPR�<��l
��xK�,���|���xi����?�#���i�V�l�?��$���o�u�a'j�����o�4������s��I�����*G��V�C3e�q�6�����K��k/����z�:EJJ$I)�z)��U���J;��F��U�_�-�\���oV��g��v�����a��Y��PZ��Y����v;R�5���4N~MVnoks$���K�&E�����J��S�_B`E�Q�#���-�j�����Wp�jm<�|IR�������,N��#e��Th�z��W`�I�{�k�!&��J?�d������/����o_�?^�g�%#%��{d��o*~�1U����~X�7�������5�>e���4���eZ��^�~�c�f���X� �����<��0g�, ��k���VG��+�km�dQ��K*��E|�&�	����������b��:��4e�~�J�yF�/������$��8b���������p����r�u�!2����^[j���}�6���*����u��r�o��u-g���og������t�T�FX@���������#U����L���1g�om�-H��=zX�A4"����+4��1'X���G���+����Ku~�5))1H�82�>�,�z���s`�6�[�8��3��3U���\�T�:K��_�a�uO@�t;�|H�����^�|�fZ���f�U�Wu�y.�����6@�r��
J��dO�� ���^���|!��k������T
��/��/I���je]pA��J��S6�+V��k������5f�ZJ�>J����TH&����������?g��^]�g�iu,@x����om�����9�v�zbm�dP[�%I�����.��Q��d�93:I���9�(u���L��z�Zm��j�O�"I���V��z���8Y�1l6e������$��8����#���O���W��oR�I��kN
�������67�_?5g�]��@[`O�N)��)���,�`�bs�:T�Ok�$�pi�
��GE?�hU�$��}���?�mg2�>���3t��i��:O��_<P������--��H�F��7gy��9+�n������n�}c�@k���X��6�iO�z.�z�N�.`�����\-�%E����� ����������x$M����|�"��M[ ���.,�$�T����{lS�N������<�����q�iV�A�J�9�tQh�z���w��#���_(�m����)��Z�hI[V���v�I���^z������V�������3[��{�4��2�X�r�~f�0Vl��~�[/�O�����j�:�=�P���G��#eF��
�\`u$9�0�=��<����O���'�,����gN5���K��&��,��_�9{*�p��Y��#.��{O�F���_!�m�:��$l���k������[�f�s�����o���n����?>���������X�L��s%I�����h�����~�I2	������`��}W�'��a�Y	�6���X�����j��\��E�q�����R[��mom����`�!I�,�������fZ��me������5o��0
�,����e�T��<^��9��J���"��*>�T��{��r��cq"M�:T6�W�
T�t�\du$@#{����7���~)�����r
���m�`��@k��X�����H*%���7n{>�C�gI6��?������M)��buMdKM���cT>e�|��S�I��mN
������3�,�9=�����F6����}�_�K�s��8�,��`ks%�����$���2��4��{�	�����-Nh��,��9����7��,��`U����F�����c��@R
���A:�Fk�$��y�$��GZ�@syG��l6U}�����QJ�VG4�;����v��T^S�����,�Rk
����n��<@k��X�?���HJ�js����H6��2U~��$�3t��i4�#7W�T�h���}W9�_nu$@���IZ�hT�s���{�8Te���Z�[���l���f�>�yMg�:��PM�#���&�h�+e�]�����q�@�	'H�6�����4�;��`�5+X%}3]�_!�4����RR-�I�4��i�y�4�������~���\@k@�L���~�Nks$���y�$��GZ�@���rJ�q��i&4�;����������-�fbm������t�C�������aH������i����Z
�he�����X�#�����$���8	�Xq������E�������+P,�}��x�\)�4S�3g�C���W��������k>2��f���Y	hV�����EE�Z�L���hUr��Be��&��Y��2�N�#)=O��icM!��_��2�_ ev�6��p���}R������'sv�+�k ��^sR�4X�2��O�t���`��hT�=���cG�����C�=/O�����?_����:��Cv�����*�m��E`�e��RZ>3~����N{�o}�FZm���@k@�L���v
�,0o�$�s��'k������W����7mX�
����@��I���m2g�=������{Ki��_���-��Y�h
Ze��?��������RAA�JJJTUU��5���~���V4����������$����*~�1I�{�P������*y�Y�O���	d������1g���h{���3o7i�a�f�uR=��h�VU�5m�4�����g�}��u��(�H��4�i�����?�������$������@k�6L�����u���+�8��H�f��`��������+=���V����e������A��n]. ���p8��/�X�?����V�h�����Z���$�P���W6��mk�$���nS���������%�geY	@�\.y�9F���#��i`@�sg�3Pdm�=����A@���a��
i��[���]�}�5��d�*
����������m��~_j����Z�:��������w%��!��Z+����S�=�H�:=��R���8�x����w�Q��ij��~ a�s�IZZ�s�w�6����?OZ����h��+�J7XHJI_��`�=���uEVN�S�^{�����={*--���9s�h���***����5w�\=��s��y��P�~���+�h�}���K�Qj�\�R���,-)\^�Hqq������0f��*���q�i1N �xG��l6U}�����*g��VG4�'���K�g�"�<��Hh���`�Y������y�JK���~���*�����IR4�������������z����;�c��6l�n��V�t�Mz����?h��A�1c��8����P�J�yg�]��L��m�DV����x���VV6k���+���c
@Bs���=p�*�����W��h��.���K�L3�W-�.~��Lh�~�P���J�jI��mou*$���U`���X~�_~����$]t�E;-��������?�e�]t������\'�t��/_��<>��26|'�2�yk���$��x�Dm��)��tJ6[��������+�����w�h.T�k���]w������M���t�MR�F���>{Y�H��dK�w� �����n��z.��d��N�NmVu��@2J�n���O�%I�a��K.i�Z_|�����7�|S�������5q��XE`�*�����4�o���pH]��i��T��C�r�������]y?,��X����/V�m�)R^���K��}��H�&0����q$,}���H���ki4�2�-����#�s�$C�3��TH4�sVQ�4ZR`�Y���833S{���N������������o��h4�W^yE�>�����b���	����Q�u��YQp�jm��
�f��$���:����e���$���n������_T�M7�������`�K�,)P$�)�@l�����it��!�m���
g�:@sI��P����{��������r�����>�����v���1J
��U�|#��X�#�D*+��Z��_]�U���S~������3|�
���{���O�9����@�(1�;��Hp�5=���9�d���KW(�;�x��������b��-[����]�v����%I?����<������+����q�zs����h$��[oU��M^����T�j�$�}��j�r�����[o���<��r��W��t���N�J)Plu�6��c��,�����	(�(-z�<��J��(�����BR`eff��|��^�����b�_���Y��kF"�������`�!��1R�����^k��C`�\�uW��qt���T����0�$������#�;W���NO>iu$@3x���/�6Z�@�9����@������R���[�gw�zjM& Y$uV���%I�hTEE���������WK��,Y������~����r�����`+_���+W�9�n�� �"���|I�k�@e�vZ���y�J?�4���c������5s��d�$9w�U��!E��C���?<����������O�s�]���@���1����`:C�-��!�DQQl���|���]:�Z��W������
Ry�������?��s�=��7l� ��'��[�����O�f�R4�G}�
6�s���]��w�����$��N�:�/|3�\�R�}����[�`0���l�����������Z<Ouu�~��'-_�\�7oVyy��^���k�}��G{���l6[���D�+0gf'��7��/�$IY�������8
��4H�!C�?_[��:n�����z}�������`-}�|�����?��Xh%�tg[I`��[�+J��*�uy�d��X={�T���i�&I�_|�!C�����O�=��#�0
�t���j��)r8���V���W^)�0�F%Ih�����N��;��SK�.���^�W��{�n��V����5������[o��>�G}����^����1c���+�T��}���)��^/m���D���F��'��k�asz����e"���3I�{�`����u|�)��_�VU�'�A����j���LQ���*�me�zj��
@��%G���9�~Y@�/PlNw��1�dR���*�6���K��<�H�������3gnS�u��k����w�}'I�1c�<�@]p��m����G����Ryy�������A���{���r����J���^y���^���4a�����z���4h���d<x��,Y��{JKK������g���w��k��fki$��
��Oc�f��b�^����SE�A9:wV�.�X�+u�������~~�n*���y��O>Y�����-��]��L)T%���{��+�:Z���lks ������gm $}��'�\W����o��{���\i��	u�X�hT�~����������J�RRRt����={CD"�q��6mZ��v�]��wWff�V�^���������u�q�i��9:���c����z��Wiii����rss����b�
����������Z�^�Z�?�xLs@K������^:����P�?;����|;��RF^�S&����$����h�r��RE=��o��o�t��x�����r8�Gv�g�V�H�j��bi,$���������,W�eq��R���*�6�lVh��#G��P�~���z�x��m�9��#��OH���a�F�u����hT)))�8q�9���:v���������K.���k�j�*}��W***��o������]t����+���^�z���n�����2�Z�J�}���/_���M�<Y=z��w�O<�	&�5�Ce�9��R���{�09��?������|du��h��W��?_���)����������]���u���+��`:I�Z��'�^�Dz�6���\xw����lR��Y�E*��|T��L$��/�JMM�_|�o��V�~�����.��b��3G����6�x^[�u���k���:��sZ"��*,,��w�]��=���'�|R�;w�;g��t�I'i������g��u�����K�h���Z�r�n��V���_))�?&��ri��1����t���{���oVQQQ\�@,�4Wz�&����9W���^��R�~*Irlq�V�UW��xT��W�����q��3��k�
������K)P,9�R��������J�)�Z�Lza��x�$������:@K:t��.]�_~�E�~��6o��h4��;����e�]��X�������=4h�����^��K=���>|x���zHW\q���k�LN�S3f����#|Ovv��N��]w�U~�_�TRR�)S���/�I.��y�l�I����-L��}�hU��yyr����q�R��\e_v����O���Y�^���c@��m/�m������>������b�9�+
�:���vt�Oj�G*�7�W�K�R�Z��mi4 ����Z}��U��}���S�HD�?�|�s��v����}��
�G�E�I������o��K/�I.������Z�;w���c��O���={6X^�=��/�eHv��w�����I�{��?��-h�]s��{L�O�����?lu$h��5���#�M��������6Z���I=��5��I�Q�L���>�Bi�R���H@�j�X�`�������{��wo
2�A����uX�4u���`5�GQ�k������	���()���Y�E�wX�����/T�c��������C@�������I:��� ��J	�8�F��3���_�Y��9�$��7~�v=�n��, ���A��9�DDV�z����=?����K�GuT������������Y������������$�0��
���k�$�h0����%I�7@[���{U2i�B�������������>����R�B��K���5V�@���B�}O�s���S�lvk2����|	��$"���}��-�����
��s�����g��`0����>F��n������k���$�0�����u9�I�_(ZQ!{��r����q a�\.y�9F���6��4���t����,<��y�_hm&�������[��i�����S~���ZS�U��6��(�JP?��C�����k������Ya��E������%��	��)�j��{��$�
�a����=Z�TN�O�9���@�l\n��O���N~����� �8k
��~ks��aul���Bk���w�[�n�Z������O���eeez�����1b�Ei�aB�X����3f�7}�$�=t��i �xG��l6U}�����*g��VG�V�����")��L7��(�*�\D�J�7�;�����r��Y�6��(�J@�F�u�SRR��C�F���K�z��l��lMu�]w����=�����Q�,L.\mN��7�����~����U��<XY��Y��#7W��X�P����s�VG�V��c�pP��Ii���h+��J/�-E�-���-���2{���5��K���mw�'�w�u��DAV�}Q�$��n�l^�x<;]�%-^�X>�`�s7�t��nw����e����u��+b�?������bm�D.+��OT��L������e8�V����=Z��U>u*X�RR�7�W�$X-e�f���!9=~}s�������}����7g�:�!I�gI������X	��eUiii�^��r�t���e��y��
��~d����/�<��<������c�&���io�]N��
U��[���r��
���]���[oQ~;�>z��\s�*\T${N�����s��X�B�]���
�"s�:Ty��Y��:D
�@������P�TQF@V��������"����z�+**���)���t�I'����������W_����jHL����m~�Pe�y��bm�x�X�T�{�����Z�p:��������Q2h��������R�w��7s�2����{����X�D�����H�w_9rsc�$2O�T�Vz�j�f�R����:�nu2���_S���s"�S��Fn}��m��R
���$

�PZZZ���`��kT������f�E"�3F�/�;g����+��O�>-���g�5��?�mgM�x���K�>\��.��?�'6�-=]y��/�!��8!�N���U��w*�8�AX���Z�&�4C�.�h�~����[�F��u��HH�H
J�>� �5Xn
��m�z�rI���I�Q����^o������^���b�k��e�]���z���az��gt����m��N;�Q��X�B'�xb\�H^�s�w���U2$��oi�����s�=�hEJJ�0@�f��==��X�&������V��E���<��������S�OH�R��K2�f�\�R�+W���7����6{=Ht��I��``}����
)Plu*���_S������c����@"�+���*(��h�/������k��n�AO?�t�s<���;������Cu��!n�h;%���x�C_K��E��ZE=�-��K��\�����_@J;�@���).V�����k�?�)E"J?�u�]�ls�u��o�Y�<����j��3 Yys��������
��s��X�H`%���\��h4*I�����-[�����5��__�yK�C���������z�n��]u�U-�?H��I?�o��������U��Q��W�p�����+I���#�}�L�Z�$ 6��������/����TU�����u�Y���=[��������.�T������J����:4fk@��-`�}��#PS������cN
�
����R����f���sk��mT���k�=�}��c�oG�q�p�
��]y��������7��F����������)��b)&*��N��|��*z�1)�='G�����/����aJ@C�=T�.]Z�^���W����{=Z]���\#I���
9w�%f{;��S�y����'Tx��`hSjj{��(1�=`�p���[�H`%��w��^�����>��������O/��������;7n�8=��Cq��(�Z~5�6����5:���)1��,�pXk�
Sx��f��~���8a��(U��a�)��SU��#*��m
�
|P�~�=7W����|����R��O�?s��~�A�{��= ����� n*J%E%�&���N$���_�.}��y��i���e�BV��o��4{�����/���ct��������=OIIQ�~�b���)S4n�8E���s��~��y���}`{���C��H�������o��E��%��QMZ�p8�q��J?����4YFm��i�TU��j�6�O�����?IR���������}�(��U��;*z�Auz��F�./W�=�(\\���N��{�
2R�y@���1gu�T])��Y��5Y�T*\-����,�f�4����2ge������J.l	@cP���F��{������9s�FT(�����{>t�Py���g��Y�f����R8�;7r�H�������@������n=��.�$�V�7��8
 V\������B7*������pq�6^r�$�����������s�5*��<��2��Wy�i��%O?��{�ivG����� ������Ai���;G��J���N����Ho�C�F����ZHh{���v��~)��\e��Z�BJ�X�hY`%����+77W��^�Z�J������C���I�&�{>z���d\�`�N9����sC��[o�������	��HE�I��T��y������+�4��$�X2l6��r��'LP�[o�;b�����)�i�����^_}%�������W�����������T�/�h���>�$��t�R�������^e����GQ�E��@@0��#�m�f������K�Z� ��n0����H=1?�x���N$&���v5��Q�f�"a��,�5`%(���s�=W�����o�]C��a;���?��E���������O�y�/��B��***��v�a�>}����b����I��[�\���,��F)��V,��SU<a���N���U�����N'����
�P�	�f�U~���7lPJ��
�7RU�@��;r��Ci{�������������?�?{�����5�)>KZ���T�Y����WP���"s�������,@21�X���,�����c�_��^o����{��������\P���W^������cF�����wz����u���������~���Y�f��-e���L�J�,��-�5��H1��'���e��)������1������)R\����K��.���J���+��C$I��3|_���*ZQ!{^�R���I{����u������n����,���t��R���9����]����ks���1gXh�V�������o��7�Xw��n���ku�M7�s����H$������+����k�����������f��q��>�hn}�����u�]�/�����
��%h_�9�������Yb-�p�$�u�a���Z�k�����OV��OJ��yy�����x�����>�o�e��PwG�s�H�<���0�&��������G��}U-_��2-h*wMACma�&PdNw��9�d��6g0`m�
`%����^�/��3��=����8q�z�����L�^�Z%%%��s�\z��7����<?���6l�P�����Yg������h,bHB_�.}���H����?j���x���5I��0�'7Na-T[��4��$�x�<������>*{v���'}�(�r��s�(RY)[Z�����CIfVs8{�R��'����U��#�4qb���������_dm�dW[(Z[0
���s����`�:v�f���7���g�Y�|8��U���W_mS~��];��9Sh���8��k~�OE�TY*U��<��G�o�#��y�GuE��$��#�z-��b.�*�`�$
��5s�.o��.S�(���[|������sgE�������pY�*>�LR��$)���$I��'+TP����1j`4����C�h�X�~��.�~[jv+m����siiiz���t���������e��{������cu����C�-���������J2j^�����Z�����{����5�^�F�u�$�C���: �2N9���
��w�H�<��|��'�1�������R8��]vQJ����5`��:H�_|�u�G��G�hm�� a�`�)�h��BQw��9�d��5����I���t��"-��$r�)���SN��+�d��_�^�`PYYY�c�=4`����5z�h4��k����`{����<������6O�
,\(Irt�l��i��w�(�k�Eyd�T�?�$y�����a(��k��/Q���������oL��?��)�
[� ��`�X�HF{����H����J�K��N�
��P�>}��O�c@���VZ���2����+��\����=h��I��g�0���^�Z�T�{��Z��9u��J�gh�e�)R\,���`h1�X�����aH��������l�5��
��F�~�t�s�q�i��R�'E���0���fu@���{��o�-?K�+�s�]%{���Y��E�$X�8�y<r*I������B�7����$���X0C��/s��3c�.�������>zZZ�����R�&��$�hT*Z+��\Z���4�����$�T�9#a)Tem�%8�hj���h�oM�S������B�6)����a�=`��qm�w�H���?�f�P�k���5��s%I���/Gnnl�?�8IR�'�(\\,{6��6�t�xi�����R�O*�(et�6h��E�g/K��_+\-��T�(i�Z�����#Mr�c�����$�.E���.S��N�X�
��}����fIt�hT���WIR������em @��9R���w.�o�LyG������[��6,�������=�T������2N?=�{���6�|H��K���E�fm��/H���:E��S����a3��>��<@k`R�[�,7���V'��,@���t{��9�A��w+0w�$)s����
g�^J�k/U}��6]q�z&[jj���3f���o$��K�<�������9�,�����O�@$$�d��X��$��o���zI�6��qeJ)���
�eN��,����"�As:���Ht������o�$�=��r����D��������z�z�J?���]}�$)h���K��<P�������#Tt������h$"�f��{����\s�}��}����r�����5����X��T��2�����*J$W�4�J��o�mR������V/�l6i�aRNwks��?�ZD���v
�v(�x�6�w�$)��k(����.]��������Up��<�9rsUp���^�F����c�v{\�w [z��[��r�R�:�O����=�P���|����C�J��^��,?X����H�av�s{M���yr�|������J�>hY$ n��p@��iO�6GK���;m��jU.]��{�eeRu���G�����1;�9v��}TU_��;�P�e�����$I}T6�'n{N�<G�����o��`?��$�{�	�����o�h��1
������/���6~
����+Plm�v�
��u?i��%�S�u���Xl�eRN)�|���E����T@|P�h�js������H ��;�P�H�P��w~������=��s��������U��*�2�,h5J�N����#�
���r�N�
���7%I����u�!M�3k�8=���}�,����`�����������~�X�@bh�Gz�y�����om& ^(���p���VT�U>u�J�^��
E#)V��_Z�^��=�D��/����m69w�U�����9��a��|�����
2������2#�{w�$��������}�^[���VU)���v��M�3���U��#������~R�n�5y-���+���9�q���A�Z�	�n�"sz��� 19=�R��V�,@�W���bm�X�^�^�.�\��S����[7u�0A�'��������'��YR(��������E�M��Y�����e�������g�{]4Q�SOI��.��Y�\�]v�w�(��}W�&��c�5y-�-���H�B�R�*�\�*��qRJ���@��-�jgm���6g0 E�R3~�HH`�"����TQj>�,3g"`E�a�g�V��_6��O�O=�HY��p(��P���J6��]FZ�<������19����n��h���W+���[t��NP��e*�4I�'����#���?g��W��-3S��K�����
��}W�/���w�%{ff���|����^��3��s�������Z'M�;��S������A>).k��F .~�P��?��OM�^���U*�<Y%�>���uMZ#��C���g����1N@�pv�\�������ZU|������
g���K�(u���]S������s����i���a���c�A�/���+�l���SF����"���`���+���6���H��
KU~
���P����
�l�S���y����o+����xc�s{N���F�HKk��CQ��������6�������j����X�H�F�V�%Kd���$W����w%I��\�=
�P�Wh���j�?����NSJ��1Y@����X�b����(�*K�cX��0�T�TY.�[&��I�����a�:�|`����
_}�J��6������$�����GU�I'����+�2�S]�zK�:H������>�H,P�7�H���+�_����y������K���x@y<��$'w�9����SE�9
����4
����X������gK/�,3`vh����IR�����1�';����z�F�Q2���O���1I$2G��:u������U�|y�k�����G��~6�G�7����n����(� O;s����Z'M��;K2l�F��<MZ����K�b�`�������CK���~��5���I����/IJ�w_��H�P�i�Tt��J�ey��{�9����_�?�����R���\�R�]v��>����E���G$,}��T�Q�������Np�����H��&�Fb�,���i���H��l����������y�$I�#��8	h��G�{��-��=3S�#�P`�<��{O9W\�"�HL�e�|��B�!��Y	X$\-EB�_g�;�GO�?�����h�ns���b�,@=�UR��<��|�P��R����+��,���'��;r$X$I�ls�X$=z�y�����Z	X`�G��7����^������.�qT����9=����
X�:��Io]-��������o4R���*�ys��H��SY��/���������z�
�f���#��h��#Gj�?�������|�y�VG`���H�,��d���(����nFl���!}�d�[@��t��,�`��[�m�UV�j��I�F��0e�y��G�n���/��-�\��{�����������Z`�<IR��������@���m7�����U�����Fo��Ho/]2M
WK�Bi�R�D�F$�fu:��!i�����OJ�6������m�-���[��
�u*}�<�L��#�����
���5�^]]��_e�~z��)�4I��9�8���G#v3E**T��S*y�i�>XY����5��s�=�m���m1C��#U��c���A�����#=�|
Ke�;��X ��i�RE�T�Q���\YR�=)�`���P�	�?��X�:U5MW�����
�5`@���*>�Te����c�����<�����?���O>��vu~�99:vlR��.]��M����)u�}�:��z����$�)�
PW�5s������:��KK���W��_7y
#5Uy��/��A1L�.v���!U�I�"
�h�V*�s]�s���
������_�.����%�:tk9�L(��$�D�u�a��O^�����.T��/K��x@�CmX���M�PH�o��u'����u�;�����$�%M-���v7����?�o�4�;�D���3�t�"I
�^��5k$�C����h;���p���AU��)m�����]���v������f��������c�
h��9f��H��mu/���m/���R����Z�	$���R\Ru�������E��g[�h*
� �<��f=��@J��3�d�EeN����o=5i.�;��A5/�J�(1��?�&�Br���+I2�vu�<Y�*0w�~=�@u}�]��������*}�%IR���7�?���m���K/���V�����W/u�:U�#�7O��:����f��[Z�<���7}�|����X�7����R��������SO�����u"����|�*/V���+�_��X�H���7E**�o����R��_��t6y
��xr��_�@��I@<�
�����K��t���������f��fk3ME$��/,����������6lQ�g>&I�?����RS���w��_?���W��������{
o�"{^������������S�j���*�v�~5J������?K��C�6{�vxG��o�t��|��yyJ=Z���%�,�Z���(�~��;���9J�c�&��5J�i�T2i��x����y�������JR��*�6M����u����6��,Z��,O��9`{�8�|H���L��k3ME$�HU�*~�U�#�th�e���dH��a��C�s����W���\)��u�������K
<u�*-�����2�I9���d�Vt����KU��oJ��m��J&M�$e�+#%�I{�Q�{h������R��O�����^�P��;j��S�`P�.�H�.�D���:�p�f��Q��h��8��s���5p�2N:i��D�a�;�d�
���M=����w�F}��u���M���_T��K���?��z�F�?�P��u�t���k����'����T2iXH
�s���6~/�R�]$���\ �j��`HpN�9������,H"���H���rwr�����/2��D.��s���\�A��8�dE|>U.[��I�J���/�^�V��t�"�����c�O���������6�7s�$)��������RS���'�:�Pm7N�Dd8�r���}@�����z~��|3f�|�TU~��*�pa�6}�a�V�RJ�;��r�2��w�������6���c���E�����6M���������R$"W��J?��&����Q%O=%����z�Z�t���u����)����C�8Mz�u�@��)��$Rkj'�`!IQ�I$�p�"6�$��hz9U������+?����r�6w����uR4*IJ�w_yG�hv����U����M��M���.2P���7{���;Vi����{��{�p�\���Z��}�U���*w�xU�]��i�\��,
�-��i����f�P���*�4I���c�����$yG��I��$����S��w���gV�������1c����wo��U`�<������rK��ZB�������r)T)��M?Z�
�R4"�(��$�sVQ��$E$������%I�����w�����[��U���$I�N����~j�[���;z��\w����+\Z*{f�$���O�{�=IR��q��gg���_]���������������m����3�P��I�������=0o�$�=dHL��7Nw�%��9
�^-g�^;�����U�t��p(�eY;�5n��������{�M2l�f�O���U��c*{�5E��g��R�)S���_��%�t��~�<^������@���@lU�J��y�igm�3�^s)�B�J��*�
�T�x�"6�$���
C��P��3���7����w����A�g�����b�XJ�uW9w�]���o�������&IJ��S�g����]��'����B6����Q4R`�"I�{�������S���%I%�=��kK_yE��=�89�5�]~���"[f���U��s��V�>�D/�P+z�P��w�z�*�7mj�#���*z�Q���Xm!��,Z_�9�����b�7������9��jf}
��T~��"��Rn����0�����SOm�B;�>z�
�Q�i��y��
|����gKv�����~* I����s�U�}��x�D����5���)RV&[V����7��.�P�>P�]w)��3�����\�DT������1c�����R�Yg���'U2iR]	W��X�Dk���{�:�0�\}�������+��R��S��)�8a���Z���Y]a������ �D�����J7�I��Z�	��1gE���9�qZ�t�x)��u�����. IT,Z$Ir��U���I�'�w�h�{�|3g*����%I�c�������K��������5K�k�(�G�z����$�
�a��|���n��:?��6�T,^��_�-=]������Y����'�T�;�(\T${NNL����Yu�=>�H�uj�~�r�u
�?w��G��{�ee
,X�h(��=�u�AJ�����`��n)�e`��(� �m�^�����ev�&4�;�,��,�
Vm=�b�t���*I�S��%I��}�%[��	�:�P�����Y��+������������p�}��}��
����I����;����?_��2$.�N�����������7���#�gd���d�DIR�)���r�d��P�>����o��������L���w|��F�_I��p(��ST���*{��`U���~1B�����=������^-#%�Y�`�<9R�z�_(ew�:
h�����,�<T��H��`m&h�S:w�T���|������*����K��h�����I�l�zK?�?TM������W������[$I�c�������S���`��r���W�h(����	=q*��$��G����
������_e_tQ�k���U:y�$)s����i����7m��b,P�?(u�=b�~SE�AU|��$�=hP���8��<����~[�'���t��z��yZw���������Rz�j�����)�~�����{�QMZ?�hT�K�(\^��{�J;�`6[�@��X������r����RY�W�#�h�
7(
5�{F���s��/�0���V�k
�EV'�Q������^amh,O;�!I�.�VJ
R��$A$���?*\P ����CgI�-������g�5����?��@	,��eo�^�
��������$I�K�*R^.[v�R��7n����.���S%�&�`EC!m��rI��[7�c\��u��*�0AU�~����R�G���MQ����VT���+g3
���������6���J9r��E�A��x������0@]�N�#7�I�n���x��7�+���h�EJK��FJ�������d%'j�%�4�>��'��k�����TK����[��1�I�����<0��$�He�
��C���F�.,���.Rh��p��C �?X& IDATj�D���OQNqI���2:Z�4N�o���nmh.������9��J��h�J�\��H�.I��X��q<�����*��)��s�����H	�p:�}�%*��N�<��\���q��?_�Y�d�lq��y��������>S���*m��U����Z�\�����kv{L�4C��O�{�J_|Q��/�<����X�����8�Y�k���8�4?���_}�Xw���;��$e�q�:��B��M2N;�,�z�mu|�q)������S��76{��=�1"��eD��Tp�]���>}ds�t_����:U����S������S�����X��<a��s�1
��������G�<�X@�������))i�M�!��a�����,�,�2E��"9�uS��?������Up��*��6���S�����r�9-��������|H�#Mr�u�@��5g6X������U~ks
E$�@�/�
R��<gK�?�m.�������UWY ���r�B7���g���K���G�y�$I��C����C����)ST2i���~��o���v�m�gg�e_�QG)e�]T�r����_e�~\�i���A���V�g�XS�*RY��/G#�<��$)��S���W�]t�<X�������|y�:�Y����lI�g����[�����SU|����L�	-���U��o
��f�����9R6�7~��D�7��b��F��:�P����5O�/(�n��;����6�\�?o������yZ;t��L�"g���
�H���Q�Ng�JH[��
T�������h#�34�n�=�����/~�i����r�IR��1���f���k�������G��W_U�X^�$��P��/7�>���������[�9v�G��P�d�DIR�(�[�����;���I���7�<��J^xA���Ji{���hC����'�*�
��_�Ke��N#\-�n4�s(���j��`!I$�;U�./���?Wy�SU�s��~5����Op�QG%�/�$"��P���V��T�o���N8A��RI�{����u��*�2Ee�'K�����r����/�$n{6��/�X[��N�O<��q��[z�FU��
|�Q��JIQ�e�)m�}��z4VE���`�?\��]Z�N���O�'�X����?Vh�:�22�y��f�_I���O>Y%O?��7�L���#��*>�D����C�*?�U[���6M���N�_�~���7����}_�#��HK���c�=�e�s�lnw&�pi��q�"ee���0���k�{�����'\D��Ux�=��v�_���+�,��>�~;�XU.]���z��
	Tp�^4Q��o����U��w������z}�Y�,9��B*~�	�f������H�I�l?^��{/���&�����/%I�f�������{�����o����cc	������3�Yk�9D�a�b�(yD�a���_�\{�Rw��A����T��#
���6^p�6^|�:=����;/�q�����j��I����^*{�Z��R(��W^QZ��e;����T����F�
�����v�_/G��������.�w�y�����oi$��
�I�G��h�:��
K).��.6��*��Xks
�o@�F�Zs���x�/�{�7���H���@6�:�����ZU�����l���w���9������G�$u��~))q�7�������\�T��.�!��{=�h�?����k�^U�|������HY�l��J�w�f�e�l�8�t=����v�v��e8�u�����$)��SU��g2N?�,�z�mu|������1}�h0(G��r����5�G!{�v
*�h�<C��8%�Pp��*��
�|�����O9����o_yF�P�^{�1e��<��$�;r�R���A�D���{�=U�X!����M��pa�r����}�_}��_�����|6�G�c�(s�8���|_K)}�yE��d��Q���tO��T�?T��#������'������N���5kd��S��6�~���Gi�n�I����_
��p����M���P��_7i�����������k|Oh�f�;�$U|�E���8�t��t;��V({�Mm�������9f��:5��pi�6�+��Y
����={�)i�U|��
����<M,f5l6e�����U����*�
|��Y��T�!��QJk��������c�Q���y�����urt���K����}����F�y�J��C)={*�Ge�v�\����1�7O���e��V�;�lT!h������'�����pX�����s�������%I�Q����K���8�E_zI�9G���OvR�
��a�X��li�>eS����	�=(Z�7��`�2��!���z]�����d���^�,��6��i�[���,H`��=��9�>�+�Q�}l���ti���a�m���V�i������E����a����������S��wJ�<G%��q�������OW���*~��zX��jm<�|�N�,I���J9:vl�&���o�U�|���Ur����%���8P����/�2��W=��
�h����jIR4T�f�m�Yg�d�Z�A�do�^��|������e���CI�g��&���p�;z�J�{N�o����H ���������.����������;�����(a�"��������� �
J)-��)�"����;����cvG�
����>�s�=����{�=����8�[�22�3�����L��������������ZJ4w��]�h���d���eS��0e
�s�H0��s(7l��+g�T
O������E��1���&>��r�����b�a��1������*��#��7��=Kl�F��>�S�TUS�B0���G�B��nW9��������o7L�P��y������z��u(�W'r�RQ�p�Q�_O����$��xx6s&��=V�-���A�P�^
�����>��0$V��K��6l�'�?l�U�_Sa!I]��,�(X��W^��m[���
4{���m������,Z�z�.���!���s7�8����t|$��/�<���e\|����v� �	��Y��s���D@�v-��\d!!xu�hW�m�0������~�*�O{��?���|�V�13��b�^��iD���G��v������;>}��$���������W)�r��S�����TXH���6�	�����@"Aw�4��T���c��@��C�W_YW� �7{6EW���sD,]����������������W��u6�� u�4�������Hd���
�(�rU�D
A�o��������������������������N<��a�Y�
�,�����.��X""""�(���&c�(�.��X�P)}���F����������q���<y��ux��qG��{�u�'O�����
T���a��_���e��h��D�`2�\�
��M ��p!�/�lw�}�P��E��e}�Y���,g-�?����C��d������P���1'Yh(6��A"����;y�f�\���`�o`9�w��f�������m�&���3��0cv�Mu���G�K���� (W�DowR//|�[��lr�NE(,���'�X����L��]�F��k�L��1'���x��B��:rg���sg��W���
��������8�!3ypp����z�NB�N��A��)�t��)S(�v�����8��/� h��;v������cb������+6���+�M����k��o'g�T��y�:u����'k�x�11����:���<[�6���A���""���A k�8Lyy6�_t�"�:P��Q��]�2?�����:>�_?j�:uO�����x��I���"���!C���{�qq���E�T^� �:x0��G����};�
�����w���A�'��Q�le���"�-�K~�7t�Y�5o�_}u���V�f������CT7�7>�����SSI)�x4o����S�b��x4����]e��N����F��1v������L��z��JX��{�����3�.����>.}\�
���Cb���8|�*A[UaT*)(������������,YrWX�U�0��"����A��<8�'����	����7p`���6n�����5�
LR��h��!�S'\7���"��s��"""""""""��fy���\�
��-��"�k����T6�������������������������\�,�0�����+�K��D`������
H����Y��Pn�w�U"""""""""wE�j�����7:��		Fc�������gpm���3���Z�m77"W���S'�������]�/YB�������O��X�?��f�~t���5~<��'S���6���D��4�>�{�Xk�6s&���u��1'������A�g�VH��1$'Sx��O?]a�y�3y2���>>H���ksv6EW�Rx�8��<�P���f�>���q�}\!���9�Q�$�X6������g��%{}b"�������L
�f��(""pm������o�w��r�+�|Cr2WW�^�j��������[�6n${�D���5nEW��`�]��L�
��o�%�����m��Z�������'|�g7�*
��%k�X>����C�����7��Q��A{�0��8����8q���������;E�/���#���G�}�
N
0���t��F
���U�"�(<��w��8��{����`4�:hEW�����:yrU6�*
O���R!��#r�2��7����>#��7��8��C+�e�G��� �Sm�*��|������!�"t�OS�l�����^gbHO����H�h���r�;wF�1-
��������V��PT����q�i���_�����+�{	F#)`����X(i�=-��7��%K�Y�j�N��
C�j�.CH�u�p�u����������o�8k�j��,���A*�{j����mQT�nu����qk��7�$���=Jb�v�8zyh��mw��5
.���V�3�����o`-[F���^�����/Z���Y]����=PT�V�~��{-2;��_w����K/��Q���V�e������m�H1��_Ew�4������;�Tn�`�� ���5�?��L��|�������wP�����}��p���^�DD*C`����T����w�nr��u�`4 �& }�Shk������Y@��S"�6}:Y�~z=H� �"��$`�H<�}��:��w'm�0�.^Dw��%`������H��p�	����LF�?���-9���;p �u������u����9��`����
N���VI=�����D�PYR77�:t�`�2�k�T(�J��������	;����K����(7m�gX���p}��{���������'��_	��sd>w��3o�lLyy�<��]��]�W�vV�?8���S�l��|�j��������=���Qm�R�K�s'`���*��H�xw��w�.���O�[oQ�|9��x��y*�E��"*
�f�*�O�L���hv�����v���q�������	��KQ���������|�Z�r|_}��B��M���y���+�qC��%�������cUQ[���3�N�&�o_������y'�'%��1��l��s{�)j8P�0�N�9|����@��M������iS�s����=9?��w�nN9B����������Y��cHH o�F�(w����Q�\	@�/��,?�8z4��N�������E�f��Ck�{(�L�k���~�4��������$
~C����7���k�,���d��)/���d���M�^��C��#h��qy�!��)��}{��+�}{�w�,�����wh��A��A���	}_~�,�Z���i��9�@����o�p�CJ
y����7Nj���/\��G�V���aw9�M�"qs���L��K���_f����Cx�liw]Rww�m�@\�&�o� ���j������O�>x<��m���������Z����v����cHIA�o_��Y�d"�OK���������C�
����9�o���(��^"k�8T;v �e�YEqq�����v�l._�P��/H����4��E���`2�=vSn���dx�h��J������������`�k�G��e
�=
"�����`2�`��b�d@��~+""""""""""""""""""""R>��	{�4w�""q�D�������H�z&\f:V�W������9."""""""""r_���)�[�TY�2__�:vD�z5�K��`�H��4�9�W�6x�i�z�b��U����SO9�.�\��+��3y2ys�����N{��f�n<[�rJy���S�lk�<aB�o���U��_���6K�;uB�b�M�?����I���1�dr��#��	���
�t?U�w$h�|z����d"���)�|���s	9���:����)S5
�TjwY��[�LF��K���R����i3�����o���{��#��oQo�^n�>�#��l�����FQ�I���=z����w+���6}:.�jU�_���xw���zu���x�Y<����d��a?�\f�d"e�@
�.�����	�;�B	�f�^�8�����l�v����������Me���I����?�<�-[�^��/]B�����;� �����l$nnH�����J
�'��o;��[i��k-?�8q�&IY	^���;d����2p ���q�9f����$..}�)i���1z4��������>�K�,���O>������+�����>}\y�f���
9?�D�������[�8��*�n�9�������~�f�tW��Z�^����L������p]�Z����J(9'��6u�~f���[o�5v,������g!O���f�6s&�>�P�-Z ������j�|�us�<g#�s'r�
\�������d��j���.�L&���'~�;T���
���Q���z��rX���4d���>��C���������&M0$$8��U�f�~���E��/�����J�		h���Bq�-H\\��������_��\V��i�w�D��n�Y)�*<u
���$u�H����u���%����+�(����SH��1���=~�&MJmWm�h������]O�G�3y2�����|���QUc�hHy�U��W�|�K���8|��o�LDDDDDD���z�.r~�	�`����;�������5O=��n��&��|V`����1i���m��"��J�l����������bD� ���7%,"""""""""""""""""""r_�R���H}w�!"RA�������x���-����a�����9U��78�\n����7����y{�V@�f�����������������)X���=�W�F��x$R)��T��}��c�TI��g���1�����W%uF#	m�����
���_U"���>H��+D�Y�y�I��jP�NG��gqk�������"o�l�{����Uv�a���Zh(�L�IH@e~=;����9]�!���N\\�W	E��s�n]�����ew�q��������(����Dqw���-X@����#"�c���V�[�@�?�3f���Nj�mhO� ���@��nr2��`���c������e�����T*j��7n�>�P}��W�3cV��e�Yf�=p�������������:E�c�P}�>��`��v���5ww���!	��m�@����� ���gH��en���Q�  x�8?���wW��������P��9���|^�8z���.�]�q#I�;#�nRR�����\����ku��9v��I������kH\]�y��=d�q+W���7�d���.!b�z��'�X��!I�1?��
0$&"���������R�L&���`��.�Ze+&��u�`HJBQ�:�cbJ	�2����q�p�9j<�P]��g���[e^���8��(RR@&�N\�j���-�����:E��e����p��;�����u�q��e�Y0���?���n]���
����t����CB���r����:�%�?�@��:������[����-�^,Pm�N�K/���������:�?���I��SV���"��'���R/;����!+�k!! ���w���$��"R__���"�RtX�?�@��Qx�oO���e�g�G��_����V�p����f)��������(W����
�eC�/\(��1/����x�lI�={�R�z�>���7IKC��f�Vx�<qO<���6s&���Y]�I�#c�(r�M3� ��};�/�h�G������A&���|��8���A�bA_~YF����
��;	�8��Q����Z��gw]0W��t;w���qP(pk���c�n�����g�vDm�h�uHDDDDD�~A(*Bs��m�P���1/������9s,�g"�#1��St���e���h+��D2������	�7�C�B�k)<����f��0�� ����T�X���EY�>9����Co�q�������xF�:L
qM��;u��c���Q���R�"�G0�Po�FQ\�M�I==�����8�H�231�t������y�8}��[*�v_�����%"""""""""""""""""""����,8��	/��[#�o�����%"""�_�`��F��n79O��u�[$""""""""""R^��#�����������$�m�������n��
�4������������dD.[FL�����#k�����J��}r2EW���?��S��zy���-�
H4�'NX���- `�������	�C�Pm�d	��_����F��7��7c4��(��o����T[�������+����s���\�o��v�e/��4R ���_x�o�f�~T�7W*�2dfRt��Me+���GEU*	1�tf�������+�\�W��,_�j��2R����T*d���6j�p}�����N)���+���6�={���k���-Wz�2d��
�����S��h�
������qr�L!���,�����,�".��� ��N�w����h�!|��BE0�I�Y` ���;������l������m+#�*X�0�g��xw�J���d}�y�g�`�(X�
�F�����3xX�w������{�c��
��W/�}�R�l)��J��'��8�Q�����s �#�|}��?����1$&�;gA�G;��6Qt�2��l$����lA��J���$���>>����:A�_�0K��o�`r�L1�J$xu�B����7mj��<����}���+!����n��Gw�4���}~C������k��Q��'����d����?�zyQm�:��M�^O���RR(X��L�V0��:��a	���E��Q�6�}�P���g���-���&��}�er&MB�q#���{*�V�����3��zo��>�j�����)����|��s�u��M5
����t�2�Mq ����O���������|��%l�4
V�"��.^D��TJ��\����3��%x4k��Z5II��l��{w���My�e�����:��r����M��G�ffI��D��9�X%�����*��z�%�+V������XP���������z|_}����/^L��q�d����D���d��#��4dT[�������I��5C�u+L��?Va�EDDDD�E�J%�3gl�J<<p{��{��XBQ�-Z�=v�!����u���X����M�����
&�m�y�:v$|�|�=�V%�s�(�|��+a�f�u�EE��f�>4X=�d9^�'����3������o����T49v��$������+��	��[�>��	-�w���76��))$v�H��wu�~BR�z��SH��pk���cu�/cHJ"���o��V�����Q�(<q�����_��DV���v����]}$yd$nO>�K�:�=��Uk'����o��jR(�b��(X���_E0l:��kWG���V��cv6��4tg��;{cn�MeH��	��C��U������r��c�������<4��Z%""""""�_D0l\��u�""""""""U�K���"��>ED�Q�%"""�DA o��Rs��\��g������������1fe��]����q��*�?����`�����*C�yp0������Y�����;n7�����p{�1d��N+��OT6Px�$9?�H�G�7o�V���W�NhBY,�L&r������"��� ���Q�]{[�W���%us#`�p2����~��_�;��9f`^�����N)��}{2?���=���r�	F���F�0���\�<"�&Mpo��W^)��X{������s�x�kG�����n�[��w�4����=4���D��E��2`��4������e}r�%�y��	N;'%	A�NR�.�L��r�:�A0����)Sl�I$B��yd$����z�2>�����-�X�-Z8�����K(W�D�m�7��J�6������?lY��Sx���N����F#��;�\$r�r|z��tAH6S^n�?n���B���������%��{�����m��h�E��(��.���	x�}r~����'���+���.\ ���mZ�%'�������^�8��f��@������}�L�j`����������q�D.'z���w���).u�8\�����f�>�f�"��C��Vj���a�k���9�W��-y�g���#��WI6���p�C}Q�B���o�5f�3g�	N�]��)7������,���;x0y��J��qx�hA����.\@@���N���aC\~��(W���X�x/P"��h���r�:t0�6m�k��93fPP,��+��:�k��BC1���=r��������{������@�P���9S�Px��]��8����9���W����y�J����G��I���:��|�I�����,8�D
>�z!����-Po��`0X�5�b��s�9����g����	YY���P��z=�:upy�������,�NH@���d��B�~=�F�R�.Q�7�R��Me�?�8���79�'c��#d�D���U�d�J0dg#Z�T�<,����` �eK
O���X�_$b������������BB�z�%<��EQ���e�H0��?���E��5�<`�������7<Z����Wm>�NS�|9`�{�5����8A��Yd�G��V���{���������)���D���x}L�|@����5�������roZWt}�B��;}:��G��c�w}b"ys�Pm�&��|��M&2>����I:��}���^7%)K���,^2������Pw�"�O=�f�n2���\���?��!��k����	���+���<��v�7{�y,Wd���9s@���Vx��(�H����?�6A�7_����o��S��UX�AyI �A�g���������$��&���j��^=�;v�����Hl������OH j�Z'������?I����c3?���_'`�5jX�g����3i�9���Y�.]��v�}�|�nc*,$��/0���t�K�:�*�O���VcR�l:F����5��A���g�1w�2kEDDD�W/��:Q�u�R�j�9��-���
:q�]j��C`����8��'��?�)���_�($"""""""""r����?���[D+n�=F��-wdrLD���U^�����C����6l �_?���G�����I�E�j1i4EEv�#��$x�x\j�*�-��,�q&>}��9x��_~!c�h�}�-��>��#�X����,U���Z����11H}}��"���t�f`��x��V[d:^:8\���ad}��S����S�o#&�
cF�m�s22d�.0���'`���||�z����#��U����f�^���+�O���RS�zy!��\�dB�!%��7Z����Dm�Xj�������Sez���������Y�YX7���U$	�/����?��7����X%������gg���#n�?N���]�\j[������v���;`0����(W��8c2_�$�"����g�6h����m	U�]�������9x������������5��_ o�tg� ����kW���'%������^CQ�:�O?]���=z�Z�
�,�P�T�{	$|��:u"o�))D._����GHh���b4g4f���J�����w�"E�h$�g�2�k�(�Q�6���x4ons�����;���3��[)�v
��u)X��.]�zy9�ETT)������yt4��
�-+SWU|~���O?%`�Hr�L!k�x��*��O�����:��x�����<H����5lh�fyOM�����A�|B���hv�F�m�_|a~����*[�g�3`��~J��?�;x�=�pQ0�����xu�H�������B�(�%��?�6f<�E��T[�
��G��s~�yt4nO<aw�7#�H�l�����Q��Q�s�=�PX�,,�tJ}w������;-�A���	��y��u�
H��)�rs)���g�DB���?G�?��� �YYh�\5�,��M*�<�6j�����x���cq�T�Q�N���=������ys�������K�y3`�~����^���C��1������/c*,$m�0����c]4 d�<��������O�<���Et������Q��E��ORm�Z�5���;�j�&��o��~�}B�g����H���>b�O>i�,8���0$$��U�Pe��V���d�O���x�k�<8����!A��|��/!��O��7���h����gn{�!#���S��������f��\��,����0�]
B�{��D��=32�R75�.��I��Zh(���:}��Yh����m�!���g����V����z<Z����9��P��E�W_Q�t)K�R��y\~���T5���'N�TP�P9������M������'(W� d�$��
]��'|�R��'��o(�v��1cp}�!���/�OJ"�D�/��?t(A_~i���`0p�F
��(��)#���Fc�'U?p�B�����x����E6�o��t�.�%A&>���������6m"���H4��gQX9G�_D��b�_I\]q{�	\6Dn�3�I�#{�xT����z�z�����=Y�kc��}����nG��Sx�8����;}:��@j�:���C��yy���E���}�{�N�r�J��6�%����91����Bw�"����I���8�^ ���E���
��8��=��\��Z���}��\��H�����!����w���o���a��E����p��ch����C����*����#"�y��}���n#�L$���e���(x�mk~����i� EDDD*��x�fN<�^c��?
�[����j�v�Bk�zy���n��]oQq���$M7cS,�}�Dl�����K�p��<���������=:�.r��������CA����������n�����������HEF#7��A���/�f
2o����*E��LL��/����1o^��
O�"�X��cG)��3��A��_�Y` A���|�,0�:����R��Z����Qm�z���A�i��O��)Nz�fW���`���+eB*7n$�sg5jP;&�)�i��[�,U2�T22�@���7�
�uk)��>5�� �P/'���C��L�[o�7{6���K��i�����^���<"����E�&�����B�gYc�"qu�^vv)yN\��h l�,��|�i�	 ��')��/�,���yy\
��:		��bN���$u�Z�\N����
�G�����z����)5�/
��~}��������%��_��������P��Y�4p��[�i����D.[�W��H:��}�5��BGP��'	/�����:)) ��[cF�S��-�F��uC�q#��j?��z�2�����^��S���Q�,i��z��������g�E{�H���3H��������=�~���}�/&��W������V�����`�rd����q�L�I�GGcHJ"z�.��.;uB�i�#F:y2���0��Rm��;urj]UI������'�>�(5O�,u�k���C������AUR�>9���3�GF���[Hd2�����7��+�{�-�$�9���%��/�R�����ys�Z~w�W�Z��WI�o}|<�k������w@{�q�<����zYY��s��8j�f���/��I��Z�j���i6�+V�
-���F�����t�u9�"R^}�'������3��!k�X|��%�X�w?������-������R����������������PEqq��K�&vZ�V�+�P�x1��G2aF���~~�~nr2����s3_|Av9�a��={�l��)�h �8��^v6�����(� �����Dm��W�\���R�!��������)*k��'N�I�'��'t����EDDD�M��H��
����l��1�������~��������Z���2������+�����l����s����(� ��bb�\��n��/�d"�K�("h������cU���X,���o�MRA�'��'��9���/�x����Ch����'�D��A�����)���`���],�������uSS��{��`�j�{�D���u��oo�����!-
����-��J�l��&9^���o�P�����S
"����6���3�.���z�U��1#���d�L����A6���^���6_Sn�d� x�x�>���r�����#�P}�^�>��(X�����X������#�-��ro���z�(�F"�N|���f�_M�W_���)5��"e)��)�W�vll��vn"��)<��;���C{�0��H�;v��N�v����z�>&�������>��T��5���]H\\�/C�#��g��>���/�}{��!��_���p{�1j��������-G�5�v�G���	����q���� h��!��o,��!'8jTU5��G0�P��A����6�����u����*j����k��o���}~�~��dV �L$���j�:���zyQ���*Y��oC0(X�S^���H�x��R�k�DJ#	�?oI<f+����NY�o&��_I6���L�O����K�:V��1jy�g���
��"U��1��r�fML������r-����5���`N�Z���{"y���!;�������l������F:q�[��$�X8�77<�5���uv�K���������zd���,��;��{}b"7x��*�f�x�<^|�f�dI�{�&�
Zj�<4��m�j�����(���"
�D��I��Zx8&�������>Q�B�i�?VDDDDDDDDDD���OLDw�"�/�P%A��"��Q�-N�*��T�D*E��������y������x���Gd��)�N��������lZ�i-&����M)��o�k��}F�7�8��Q�g���w�A(WR�(	m������	=����a����W��~��3�R_QL�9P��@���Mj�^o#�4�x���`�r�����qcj��&���X�J�jQ���R���c��5f.��S��Y����h7�WL
W�����}���3f~�%Y��!���nb"2
��%�{w\x���/;�����Vs50A��d�7�_�h�y��C0���&�����?�5�As���>�,0��U���f�����~���G�@��Rt�*a�f��q���qy�j�;��=��R��)�3g�GF�iS��}������.��Q������#$u��1'�z��\���/��\���L������(�����cu����O>�0H��Vs��j���R,|q���I���,@IN.��n<����	��;�>���r������~�\��E\#��@^����������6m�z{�hI]���?iiU���*��\�V
�������)`��\����i��;I��G��I��d���(W�&�������*�rY���u�d����xw�\%u�H~�"�����J�T��kW�J��p��f��i���K�z��"����Y�(X���D,o�BR��Ij>l�{(�x��n^�;#�H��y4��U���*1�t\
0��N���Q#2F�&{�D|_y�����M����KI���G���s�k��F
���VI�&���%K(�z��c�<�PXh~��|�i���d�f�������;�lG(<{��F����S/'�&YUE&��W���d��Rw�
1�<b����������z���������E���l��aa�����d�yA�����#6���L�B�������Qm�J<_|��2�99dM�@���:�C�q�d�"A �}{�������D��cs��1'����Q~�)!�~kSw����<��fe9�H���C�c���������&�G�q#�}�"h4�J�+C{�q�<&����$%c]��{Sm�r��+�~�<&���G��I�~�����`�R�������Q�d���,��2y���-J���Q�]�f�>���#�6h@�3g��>�t:���b��wH�����/�d#KI)5_u/������m���������hFw�<����������o/$��2�+�x����mwr��%��7p{�)j;�PYU���I��|��>@R���m��;�z�.�jQ��Y��@��k�����{�MB�NE��j��0�������f��TJ��4���v�WU22���W
O�t�����|b�3t��!����p��>%������Pe	NE��dkp�j�l��(I������4W�p�}�B0�A���M�����)�v����\n����TI�����@Q�5������|���G�h��������������8�:R��@��F���{�z}/P"
��Y�"��L!c�H��{�:���L
����=~cZ�?��h���:�����q���'��nC�������H\\�����u��s���?�<:����#
������9���S��9QZsT[����WW���Gb�<�13����cV77��x����������'%}yd$5��z[k^�b4R��I����%������;�����6����d}��m�,�%DJS"�9�g���I��X�Ann��~E�hE��R��z�0������,�,SEW���t)K���q��E��-������8����bWs�	(RC��-vaH����e�pm��.]�>Nw��5k�Y��PP���pk�����6������:s���:����ftEDDD�c
V���R��SC���;�F\DDDDDDDDDD��QDE����~��iS�l��z=�3f`��B{��%8A0�(X�
0�W��B��N�5k�i���iL"��	�.J�������Q��	�g��N�_xw��z��k��`	��j�s[:tpZ}.�jQ��E�qq�^���!
Ej��D01���������#��K	�J��y�h�H����U+P(�������2�l��%g�d����K~ �H�����s�KP�����"���(l�f-^���5n�Z���H|�����i�|>�OH==�x��[������F�w/�F�<2��ta��+�����h�Ew���{�h����(���M��?Z�s�~~(������i�D���o���Gd�m����K������������L�K/Q7!���B�i����P]7���	�"�m[��^%���+)P���rh��yT�5�Z�W�6�BB0fd����[�����~YP��ku������I����I��6��B}���=����W�/���CQt�I]�����}%���;`ys�������CQ�&�c�@�Gn}v�{�-,��~~��I}|p��*���V-��'������/+E+���oH}|��6��7����s�;BIFsg	��:t ��_Qn�D����F#9�AV��o�3�I��`�b�;v ���=�
����p\6Dw�,I]����!~C����*�URWW<Z�@�u+��;qk����x�kw�[g?^m��T���y�		h������N���o�e�]���'$ ��t�E"�<v,)���@�/�eU����da�G��N�_���z��A��?�\��jV�G���g�v�_kn� �
�f��v�������i~��=q���_w���3�u��}'��Sss�}�q�d��daa����z�%G���:�������\������6�U��8����Iy�U4{��\�
a��J��Lj5�G���
��+a�f��& j�f��~����Q�ZE�7��s�o���s_��Y@5���Zh(�V�r�*?�����m#�X��R����0�'�$�����2�������K��Yv�UU&+V����S�t�S���)X����FQ�:�|P~�F�E���`�Z"�8z4�!�#1��
���������CRe��m#�}�R��=���0�����L|��U��[�b��G����X�/��,0cf&��{m��	
��n>}���/v�#�����3�_}���it�O�R�^��g�VK�#���� ��������I
�G���"<��2��`2�>|8>/�Lh��=���i�}L�~J����=����0fg#��%l��el���q�Pm����)T[����k��,����6l@{�(K�Z���Rt�5����9��1&��-�W�w�n(W�$��_�9�����>5����x��i���:{�����&�e���O�^��]��OU	����.u��R�.E������=lnzUSK���b�Q�{+�����6�yK��d��Dm�b�H���	�:���_���A�G����=��CB&����&'Sn.&���2%
^]� 
�����/�]/���nO>I�������{������Lf��b�����[*�:iOE���A���h����<$����m�6mB�aR__�
�o�0��4���)y���7t�=���^���C����9y���"��~��<H��U~��3���"����J����Ia��!��g(�v���]�����{U5���`�J��z��5���[�]��f��{�Y�^B0�(�7���o��6���3������i����K��g����5&���=Dm�d�l��fM|���`��'L�Z���Hi���5'������R"����9������;��k)X�R`�C�:sG��x�k��s��=t����������w��P����{��4��Z�>!��������G����/]*
�DDD*Dw��?��1;�����u�o�@d
h9������s�S��cn.���1=�����4qx��N�9p��e�@"!b����������Ws��<�`�=��V�6|8�}t_��E`����g1i4��#I���"�N�N���s�R�b�D���D]""""""""""""�%��N����w�k�ZX�'N`HLD���g��U�E��Dm�B������=�j��V�G� �[���o����o��K6��c��''[�)E/bHH@���� }��5m��k
�Y@>}������w����Y2[[�dq����-Z������]�>���c��<SA�
����i�������-�u�bX��-�d����O��w,^����,�l��X��:������}��e��W���Bk[�������M��_��"(�J����OR'6�R�":���b�����}f�m��uKP��(��������
1������n�s�z�n���?0/��q�I��Sx�(�����Q��a�W��y����e��q�8A�[oQm��2����������u�B�o��������^J�%��d}�5��G#����l�^�p�8����&��o	�2���"5��k:�1N�M�^�~�������p�����������GEaHL�ey���O"�����������������	��m�zxTi�a?�D��_"���#�_������}\��~J���U^gyz=��,������H��0$$��p���0�6nD�R�����#qqA���u\��n`U�=3l�t�'OF�};��gI�=��6�Ox�ic`������9�J�l��n7�nd�7i���!T[��s~�AI�D��2���+����I�:�����6m�\���B�b��=����m�C��������gO�k��R���c����\N��)6}'#�/'��'�_�Nr��Dm�d���N�\�����N�k�'O�6|8Q�7��}���g���5�]��D��+��t����a��
�Ao���.^D�g^]�T���6n����q��C@ET��ws�Z5���v�,#T������`�?����H"����/\H��k�������jG)`yu���2e���N�B����XQ�+w������;��<n�
���A���-��@��s6��G1$$ ��vj%t�$�G���q����	x��r����c��A����3�8\���/�����%�u���E�l��a:\��P�Yc�9x�|z�vx� �gO��W���V-�_�0��M& Q(�����Y��_���
���,����7�BA�G���7�/����
���U*����k�_������<yXnO?M��c�6n���;M���h�A��I����%��%|�<��!w�4\z�!C*}+	8�l��a���xw�d`m�p��R�A]��	��x���+0����#tg��\��2gP����-�9,��\�r�J�~���������gN��
Roo�N��231����h�U���[�j������A�k���`�����n�������~B�y�='�L&R@{���e,Y���B����}b"�7@&�vL����~C���S�������L����?��Ce:������4���z,]J���V}�E����I����r����>"�O������W��&�A �M��v9\���Yp0�� \��%��_���0�V���$����D.&SDG��������M�
�Py�6T��_������=v%4�x�9�\��?H�=�8 �MV@��yZ-���������O��h4��EV��"��������e���m�D�3��=z����	��7<�4����ss-k�"�������w�%w�r�M�����5��,Aw�R??�$���p��n%w�4����s�=�[��U�Z��J�1;SA�����*��R��M;��
��0��u�M��%(W�Bw��=;�p7���[����v8��w�^(��E�r%����}���FK",G�vJ$B��������;���>�3�CQl�%)s��?�vmDEH$����`�r�;v`�����nDDD�>��,�����Y��h��x����=�X���k�2��JXE���������o�H]&���+��}D0I+^S���6��������������,]J�����QM
�}�`HH@Q�:A�I����,��,�
8�8�k���H��%�����ODDDDDDDDDDD���w�nV���H$K�/�N����hM�P�83�3��������k���85��f���/�Q�_O��oc��H}�u�,8�j��3q{�1���RS����W�����]�T�,%d�$�?���=�N�F��i�mAc�:@����fADb�Ea��$	��H$�>������=J�/�P�b��(�3��
�:v���F{����*	&���j�&�����4�U���?E���� �{����?���3��5h@���=q"���[�Y4{�"h4�##^lT��j9�PX����)���vmb}������{�$�M�����W�A"��c���,0�[�}\��P�$����	�^3g����%�Z]"�i��Yo����b`I�����Q��5lH����\�����-�+��s�N���[�~�T�W�vg��Y@��K��E���$��"�3f����U�Z"�WD���/�Y` �7��A���g�V�6o&�Y3j_��<,��b�����vFX����������'�;�[�,������dG�������\�,0�1bb�{���r1d�8G�?�u�p���~�W�hB�a��Gp����F��C���$u��z�v�\�{+��p�m���������X��>��3����.�2F� ��wq}����Qm�:��}��m\���������N
�X��|�O�^v���z��
Po��r�:���ED��={Hl�A�s�,��/�]�X��I���E���Mt�F�1=CZ�_|�����W�����4�J1���=r��;�_� �J������SQ�XQ�K��l�z�Y�]���Zd��x�i�j�F��W�S,c~>������w'���)<y���\j�*��>)�"O�u�����[�zzR��5b��S,]J���:T���]�B|q���K���n�<,�Zg�p�Z5�11��n-�/�x�n�Q������3i����AQ�.������{G�%�E��m^NJd������)X���	*�7�T�����>}��7k�5kf��I[��w�����,,�ici��h�6n$�~}4�wcT*�y{��o�5���7	�5�)�xw�l`m�pO����o�%�8P ��/PDD8\�W�����y�f�����ZE���Q�y;+����;������o�TXh���I����F&��v�J�O&�M�����%��������c.��x���������k���W�����'*���G��<�E�.�>b��a�.�,_@������2W� �O
�-#��on�y+W��"�[��d��������"����drx.��������a$���v����B��?�;u*�NG����}�%���iIp<[���gO��V�\���`	�`��(j�2'�	@��i��D�y3���Qo�j���d�����mN$S�����Q}\7j����
x;yL�^4�w;E~ h�0$$P����=�4�|P��&�����1fe��gNi�w�.�N�B�~�(��	AP���������|�=�u��:D��������f�k�Frg� `�p��C����>|8��G�'&���rV3��/Zd�����o����z���j	�ZQt�*)��B��W������j�f0q}�a����X��)�������
����e?���������C�o��k)���{F�e��%�];�7n`���$�u����y�8�u��T%���^r����A�:vD�i)/�L��=Ny.u&�W�>&P	��Z������5w�r�N�I����:vD��J����dR���3�<x4k��K/�������"r�b'����`0���+:�Z����C��>� ���;}����������G��I{�
�-��$xw���
k���������w��������n�����q��B��6���I�k�
������k��Gw�,Y�}G���V��n�7>�S����<~�Cey�l��zu���(���t�$��W,14����WqbU�(����=t���P�`�\\�6�!�H����s!�O���^�D=��&�������������x�i���}|<���qm���������{����qy���usj��[���
����/X����������r �T�W������j�F������>�0�����������{7���I�=�p���G�������x���-[Po��K�h����U�D"��I<�4!|�<�����W��(��m�?���C���g�Vw�i���#�� ����Y��,1��&d�d��x4k���;�|�A���8�����������	(^�RE��Db�rp�_���c���S��{�_Di���Z
��U���������.\ ����h�CZ��
���;A����x���={H��Z'�8�
�2�^^������B���Wpu����}�)&���#���D����w�iv#���S���Z������CBUf�U(�\�����l*	��h�����=Pm��)/��
�;yT���A.���w���uk4��z��yu����'�TT2G�$��
�T'q�_yD��2?�p���n���=��}fH}|���q7�zxPm�z���`�R��w���S�6�`���JB��Dm�r[��z�n0P����{��=��>��U�*.4i���������v����1��Fr�>
9��������*Aw�������:�}u�W���?&{�x��{�6m�
Z+<w���3�Z���	x�]������;Fb��:�M��R��]�������1�-�Z��7g��lu�����M�
R�AA�>�0E��h��`�J��A�j�0�p}���N+��wo�k�:L:]���s��F<�7'�8@�x��a`���rE�c�<�������`<Z�D�{��\=��>y�����G���J�H$�
D��S����=#����k���/��������
b�NL�V��D�LQ�w��<�+��'��x9.������2�iU8���9��H���*��j�����D��W8nd�jI0A�EQ�n�;g��G�����0��������=1�^"�������[.>�K�z]��z��r��� �#dr����sg2?��,�R�����Jrg���Y�k���X�x�j�K��K�����MuTF��I���A{�(�={�]��k�ze�3��S��_�9����=��e\@�w�U�EE�7kF��6���������8�PT�<*�����6�0r$�S��;}��
��������F"���o$u��!9��~���7�������4	����,0������{�OH0�P%�{������������X
���'�,w?A��;�<��^o����=m���h�����t
O�����1i�(W��TXh}E��x<��U��!=���~Z���_O\~��!C��5��%K��#������K�x:9��w��f������e,(@w��m�I��5jT��T��KRR���Q/'�i���L��I��e^�r�5��Dk�J>%��	�8�����7��9OCV���������]��z�'O���w�8���oF��1fgc���`�2r�LA�~}�,��C�U����9i.��K���A�s'&������������H��4��e�._�������a��Z5�>��������_FG��f�T�6��R��� L�{��h@�z�S���B4�wS��P����l�Rn����t�C�{�/�@�}��o���h����+����rp�������
�;��9��I���:�b�h�7C�������\Q�^/��k��V������<�������nu�+���k���t)��~k�w���O�����#I$xu�p�y���+-k�,��� ���[6k��1�A��'G����X����?���M���:P}�>��}� Pt��m�9�R��m�=�
Hv��c	�� �&'W*�/<{��b��G�VN�k����|�%T���\���`�?���Q�YY��+��L0�.��qcB~����K��m���=��oPo�F��%H��	�3��2�I��%�����]���#������%�����!�J	�2�)�a����q�4K��,�|�+���6jD��)6�{�m��D{� �������m��K5u�����o����:t `�H<Z���z�9r��g�%�B�����K���K%x��K�R|
"k�����P��=v��5�Y|����&�KDD�?���!w��u�q����X[��R�^z	���(��E0���#��t�����K��|�]������GS��_����j��0���Kxu�D��9(7n$t�44%������n�V��y�4ys��9p��Q������}{�[�����F��������t�f,�W���	���d/��h����\!qq�����-�w���n���"l��*+���qo���#�/ZD�G��I�u?��G(�����	b6$��_�����c�@��pu�TI���W_%c�h))����Q?GH$B�����1��#�,|z�B���h�+�����{��*��N"�������J��H�2i�(�|��*����:��K��d�9[�����H=<���t���t�"f�>},B?G�l����>C���z�%8���A\��l���F"���������%�������
"������{�&����"���D,X@��N+�XP@R�Nh��'�M".��{�
������U$N�������Q�[�0kV��}B�]��;}����v����7��DJ�~,YB��I�.���,X�l��a�_���R�x1��8�z�"r�2d>>V������]-�[���G�s�����|���AP��Ar�~j5�/�H�M���(YC����>�(�M�0��#���t�NG�?����C��v%m�Pt�NQt����G�b	`p����I��X�cG��&������Lg���3�r9����]��4���X>k'�bJ������(W�(#��F��3�:�,_n��������<I���N8��dB�s'}�g��UR���o�3y2�����gU)�q�	<�7G�?��c@�{J�U"D�l����x��;�����p!K�V(��3Uq �O��N���d���E��id�
�L�P�1F�����yYY��c�!	���&���u����H$��t!g�$����+�)�z}L��=Jp}�a�j���A�s�m���{[�MlEK�M��[)�~#�Pm���#�!�����#$�o�z�V
�,!x���m��(�U��9�~(�{w�D��Y(7l����9v�Y~%����`���`�r|^y�\y `��{�n��D��@��}��	�;���+-�"�w���SOQ���GG���A�fM���[Q��')`HI��^yx8�}T���+�h�ED�]������N�(X�����+P��l����p{��R�49��=lx�������
�5kPm�l�+����_���Jn��MB�	���p�VK��ob���������4��)��cR����>�������v�8�W�� �St�b�"�[1�t�?��%��-x�hA��V�V��a��Y3�&-��3������E�,���7*�W4�,g~�>�z������h
O�@{��U"A��5����G��l�7r�*|z�(w���Es����#�����B�Z�CC��2����*L�Vr��}�U������k�F(�WGo��X!��<H����.%�H�<�&!�z�>2F�Dg[]�����K�"
����>�G��N�~|�!y��q���?��kW\���;A�'��w)�r���z�mk� =g�T��x�)��O�^h�`��{R��=q"��|�xA2!�}G��Z�����Z�%���9e��G���H����,��'&b�AZ#�HPT�~��e��I��<�Y���2��G�cy��<v�=�N,��/���G����'���q{�	��z��g�������S�#^:��		h���2p ��1[�7��{����3�S�����!?��, ���C��y��F��Ad��O��(��*�_��@��� �:m������?b�S��=p���V���V�3i�%��-�6nL���������(~�to��Z�l��<�6`��B�{w�s��ba!@���:�n0��U����K�k���ON&�[7���n�?N��y�*�<��j��{��v��{�cl������?�>��S������O�~6�+��nEw��M��������R���y�2T�6���U��c~��Z0b��$l>}��1z4�}����X=������/^l�LL��)�lE�&L���DJ���$����36IA+Bw�2��l��vk����r�
�U�p{�Ij9b�ETA_~I�'��1j��;#���`��WP\����D��gW�=�4��U+4�w�������iW9U� ����$��}�5���1K���p�Q��>�k�}&l�4��{�#
�DDD���J
��Ehb�J���������������S����V���w��N]��o��n]��{��C�>��l��OeG��Z!qs������9��Ne���������N-��}{�1��]��������W��d�W��~�#��	��4��#�����K/aHH@�������F"��`��=�1'��>}�Z&_=Z�pj ����I�E�h���#C�[�����4���KNj��������Z.��}�Z����<���������l���{��^N��d����W��d�������*��nn�>j�&j��+���[�����BCo�I�~@"�����%s��s����?�||�����=Po�Fr�^x�lI���e�� 8=���x4m�,$cF�={J]�4����;��$nn����o��p�>={�1r$��T��7�����e:���-RC{�zx:mI�:�����=�.���V����EE�7kf����)S�_�N�?�����|�1io�M^q��{�&T[��!��k�F���O���(W���>�"���#"��)k�=����l���](W��:��N ���3g0%R)>�z���O,_^��\�cF�����MlE���g�V��oG�z5��}����A��_�/\T���w�n���6��]F����Cb"����?nF�W����#�B�&Mrj��Rx�4��L�^^�|�M������e~��6�;s&a��w������G�.�9���plD�D���*��"�����O�~f�����S�9Sa�E����#N�x�}��vQt��'���]����$��}Cb��I$�=��m��R�>}��;���SA��H��}��zn�w���L��j�f����]���h��a)��H$�;w&���P�_��D��Q��mC��N���`e��1+��9s�7E���
TfAP�+��l���m~?�������n%����)s�R?wU����sg�f�B�q#�����&�X�lY�B��H��cr&M"}�p<_x��s�X\��������|�!9���;u�+��D���G�&e�+��Er9NO�zz����d}�5��&���g���`4�7o���Q�\	������V��
���`�b
�.�X��|9�N���Y�|9+V2qb���?����xq���H���S��c����C�k��5v,�NG��qH��/�Vm�j�_�'ae2�hD�k�;�i���M�����#J��=v����}�����+l������g��\�����������ccA&s�8������G�k���q5���dO����$�m���������r�j|z�,wU�H�M�����A_|A��1r$�-[�RA���+W0��"qu�����#����}�U�f�&{����'�������.	�z��I����K��y^�s~�	0?�8K���^�F���9�j��
���w����H$xu�L��i���m$-&���7��YHRoo�**N��������J����2F����8��X��m�U��������_R77���O���cLK#g�T�d� �=xC�mEn
�R�n������E��L4�����g����j������vJ�����>b����''[���(.��!C0���T��F
�{���S'dV|�{��Y<~���5;���YYh$������O����
F��=�Z����:	�����3���+	�6�jql�O?�n�<����R}��J�&���a��'�q����}�e������I�B����;\�W�v�r��%�
*oF���q;�Z�����d������G0(<q��=RSQm�H�_���X���DZ���{�98�]���������7����*V���f��Ba��[��.<s��c�H��������^��>��BK_ p�h����~*���W��7��������
Q2���3����B��?#qq!�������l���~�!-���?G�s�e<J��j�ygHOGw�t����_~���5d!!Dm�d��2R�~��_~�`���X��Qa�gW���N����Pt�2�n��A��5��mD��H���D��Qj����w����|_}��^/4yp������#��o�����x�E�{����))�N����I&�������f�~2����-��L&2>��r]����NU�&�x������wR����Qo�B��%�
��;w���K�z�N������L����hF�b�U��k��;c��u�

H������	?�icw����3g���n�'T��-�K�z����VKR�������<�>�{���
��<c�9'����a�s�,$��o�1K���$�&�����M��P�?���(�r���?'����V��we7��
#@��t����i���/� a�n���#��������������@�c����R��E����o�Sj�z�n4�w#qqq� �~G"���HD�_��x��N����y����b�D�$�]��m�����gX�����RDDDDDDDDDDDD�q�99\
	)�!1r��
3���I�C�K��U*I�S$v��j�&>��"R���R��������)�I�p����L&�x{#h4���+w���H����cc	������1wcA����Z��tA�~=^:�i��n�]h��`�j
�,)��=l�L��
��-��k�����N�j�� �ZD��\B&N$���$GP��K��Y�=�x�Aw����/�����kf��L�yyN��7cHK�Zd$�L���:����������h25O��������"R�|�"�(oQ�r�f�:vD��F���*�U�F�������<���E����\���Q#�6l@��:K���t!����UE����Sd2���#�3`�V���"��q�8�O>Y����R_������������Y]_����������Z/�R��co�?�I�!���m:+�L���/�z��m�z�a*(��~}j:d��Y�}G�g����T�����4_�2y2�Nw���E����=�5���*J�������t�0_s���>��������O=E���OPq6Rg�;gio���c�Q��I��o�^���@LJ%Roo�egWYr��6mP��I�w���'���uC�n�������������0�&&�����	���S�:w&j��*�K�c�m�"�����
�����w��l!�������+�L�x����d�M���W�;��1��r58�Fj��8��.\�����I���x��R�������+�����)��N��y����u�,2_�R�����7o���yd!!6�Q�T�Rs@��I�����4��{-���;#���;�i%�n�z�.B�Lq�l@���$'2�����-�(��4��7oi�Ai��f|�9��~r9����O�~H=<,���'�A�*�1��\

EP��q�(�O?m�&\
	���K�C�����������
5���G-?�����������D.Zd[=*7zCRA_~I���������nF��`��P%d~�Y_
���T����>y�:x0��>K�C���Cf&���
���O<o���I��uq`/������O6�������@�K����bb�Q�6H��MIA����Sa!�BB0)����&���]����#���n"7���;����l������5-I|��%b��2��RI��cHL$���<��z�n� }�HK@���R��`n0i���$}�(r~����f������k�=�45�uz�93g���;�7iB���+�Ww�2��!�Ez6�J���Z��u�bQ�I��j@��zv�n
��~*B(*�F���o������6r�����������.]"�~}�H�}�J�"���8R^y�����rB&L `�H����._&���@.�^zz��!#�|=���~�����%o�n��V,�/UV�BB@�|���z�n��@]�nm�,4���.!����A���[2��^;�?b^�����N�J��z�&���RSI��A�!���	���J�7��_Z-5��sj`�z�>���;u�����EE�L��%6�'���vL�����6��m����
��[9?����!?���o��p?���7o��U�V�vJ�qM��=t���.#l��d"�eK���N$���=�~��7dH������}�Q����������M�f�&���,�6>���Jd�%�~C�^|�v� ���]�T���V��m�f��H}|���J0	��?����J�O�F��A��X�!!��7�����=�a��9�)�gO�LF���X���2.���$u�jY_f	��FrS�������G���1[1���������V��������� 0�����3���$�i�, ����H\\*��(.���
1)�e�+o�I�"�iStg����#T?t��lI�};�/��<"�:IIN][x���>
Fc��P7���;��k�����!3��jaR��\��r��T*��77��YP�����������d��w�@",(������:u0��6k��$A��8�, ��ii����������4�Y	%k������T�V
�/'�o_P(�Z���?0�����!5E��D���K�e�K4���~�����S�t+� �����kqy�Aj�<Yj�V���'u���z����9�
%�SR�Q�6Ba!Q���6Y������^C�b`�I*i���N�Bw���1o^��\�L����t�~�-�������MO�p\���m������>������;ss���C��	��C��D93fX��7mJ���W�fU�2d���h�\���K�v�a*,$�kW���#����M���&�
��}��>p����1dg����?��E��V��yy��������xu�h�:��I�\�<*�:������v�P<v������M�aX[N.����En������}6+�s*"�ys�8�>�,,��U�������2����c�A �I
���p��Nuj�wG<>�K�?�(��o�����}=��(��')��_DS�(P��A���J'�D�����M�[oY~w�[��W���9���W1uPDE������.�3f�����<~�n7G� ��W�Y���7������,^�@���N��'""���$[�{���8p�G>"���NL�}�����y�H}�u����<C�#G�b��O�{��;���mZ{�cHK��J�f�+$���r��2.�		\/��l���m���
7���w�D,\�tQ���by�r�&'[�q'���2F���U+���
�"R^{�����W/�/ �AHl�u���o�P��C
�@B�Vh���N���)PX�r���'�$]4���3��(�D`(�nz���(��x����98��l�E���x����R'.�)RMCF�Y>`2Q;6������%�����#&�k����H��	���2R//t/��sH\\���X%�XCf&����d"j�v<[��k����!��6���uxw�Reu���5j�����E����S�h��������z��"�EFb��"j����sz���h������	x��*�K0��y�!�*��
	@	93gr���l|W���M~��M�\f��:��}��-��V�b�}����C��x�J�O{�r�d����G���	�7��b�@U`T*�m�}L���B���[��
Il�����#"�q���I�����m#c�(����6jD���-�A �~}�._����z�)��VR�x���s����O��nT*�z=��\��^=��-��\�^Cj�U��kWVkAH0��?�@Q�&�.\�����=_z���[m.���`���}��i���%c�(r�M3�fdT��M�,Q������E�z=&�
y�j�:w�.Ii���$��B���#,AB%"��X
&��;I,^�U�Ut�7z��*�?B$�_$x���&���a�(�|������w�nv�[;vD�ys����`��x�,!��W(X��#+�,��\PT�N���r�jIg`�;�	C��^���,_N��1`0���7���
�.�[T��I�s��_�>L|�}?|�<����5k�������%����zeD_%���|B�w�9�~}R�����[��&��,S���v������~�I��F�zRS	��GG�,��8j2T�3@�h��������6�/ZDJq����$t��z���~��3JmS��Cr�������Q��?���X�i1��;{���sK�k���$u�B���=�5�u�����o���N(+�L�xI����G�u��S��b�qH�EB����S���.\ ��GA�'r�
|z�����_5Ki$���A���e\�:u�3��@��.$u�@�J�"�
��7�AN��d���A ��G��9C����q9�7a,( �{w�Z2��,��=EW�`����������N����P'!����^J�}��p�$$T(�N��r��x�$'���pJ�`�p���>H$ff%���i�H1��'��n�Z=�	���(W��</K�������������N���E�����5v����S�H��CJ
����+���������������fJ�'���4���>�EW������W[�=+�+���S��Y�8�J&���&N��dO������������1-�*�������I�D��a�j�._�����1$%9\�����e�k��? �����KNP�H�|
"�QG��U$�����R����F�����N��������L&^x��}�?������yV��H�SOaLKCL����@����S�VY���?$�xn4x��F�.����j�8��O8�_|A����>��y^���Q0H�����H}}	�8������cK<<���[���d:�
P��)��O�,b���P"}pm��Zg�8��J��@��8��lbz���3���������^|}l,H$������������0�YYD���4gI�c4������D��[���=P�Yc�{����#��2�'����c���A@�~=�_}���YP(���7|������gu��+u���]���'�������9���������ps�J���bHO�ZD�y~���r��%���<� 5O��Y�S�b�C�`R���4'OV(���0�t\��T��Qn��[�����r~6����K�.�v��1�t$u��z�$Do��Gk�*�XP�j�Fs?��Y�^^�IL��Xu��5d��>&����w�NV�+�;s&�c�Z�	|_{���~���w���g��J��8y�G#�h������"
�����]��G(��}�Q��9WU�*��Z���c�������8E�����=�b�7�.����,;X�m��%w�_�z�<A��>����!""""""""""""�,93f����x��I��+�r�D�6�����XU��4�={H(��T��I��������F�z�n��z����E�OJ������""""��$�d�,�Z���^�f	PeA\""�UJ�}d!!�MN���,r����-������'&�zM�W�vg��������	B�L!�����[�{�9��:cN��^x��
�Tj^[N��r����u����w� ���t/���I��	�ft)M|��h����}{\|��2r�A�ujcg���gd�>���d�S��k��������~Xf{��~�r��n��8���Hy*��n�������7p`��q���f|_}�����^�����]����x��
�l��<"���t���O�>D.[�������ef���ls�9j<Xeu�����PT�V5��d~�>}�����Rq% ���s8���d~�	BQQ�����E��LTcR��X���]/���.������TX%��PP71�������_���?$����z��c���$���8z�G��#��KT �p�C���V�	���%�E���j�>>T?p��
��������P0��K���9Cl��Uz������#R??���Y�vJ2�+j�6K?�H0���G{�8�K��������R��K�{�
�f���&�����-���S	>�'IO��?0b��o�
T[����=��`�&'c��#�[7�����/�K�VY����I����;��Do�fw@��R]�-����\n	�	=����PUAr��,]ZJdgHK#�Q#�D�������]���z����r�W�F���q�1���d����*�Ld}�5Yc�6{6�o��P=Q2������M�����G�����|�}��_�6~
��/�c��z�4���R�%�g��3��!k�X��u���5�.]"�~}$..���q����h�Zh(��l������z������*����q�g�E^������z�N�������y���:d77����>��yr�"oJ��lL
���0�����SS�Q�6�V@�S�p+�o;���ww|����.R�b��=�a�f��������o�!����M��o����F�(�r��e�*��;� f!fb"�6l(�Z"�tf�������3g�=r��������R���5k��:�W�NT[���>�j�6�������_~��?���CsN|�H<���<���s�}�L��IU���`��#��2'm)GeR���5�������"������6]���-#�_?dAA���/WR�Z�=�n�GW��	���s�8q�Z���������R__�����D�}E7n��!�Fc�X� ���#�Q#������es
���/5O��PZd��d�[%'6g�7%�)���ib}�,����Y�p;��\���JJ^rM�GFR�����V�#	/��f�<���={�|���]3�?�Rs�'E��l!�C$������t������}��7u33�*�0����%E�/�?�����;��Ok�����oC|�&]�F��E�Pj���A�_x�z�����O>����(I !��1?��3�iZ��a�B=gR2G������q�^�1=Cj*��8t��#�����3v��'N��s��#�������CB����u���Q%�K(�=���T$..���)�X�$i�,8��iiU2gi���z������;���-�2?���9s���S}�^�$�� ���]�ZZ�k0�>r$�����;�j���7U��������B���e���;�j=�1/��!!��u��}	���2�$�~}j���]�2}J
	�[ST�D����������7k����,7v�������
�y�d�~�PT�__��Bj?���O:�
`Ns�fM�����>!���CQ��>>T[��f!� �=�$�'O���}�i���'�{�)�H�u��N�d|�	��_j�������������8����Q��F��o��2}��Y"���Cv��tW�S<�?|8aS�:��;�j���5�j������v�8��|���S��3������/��+a��Bo[fd qw'j����� ���*U�P�$���j6��N��!+����)X����I9����k!!��J�>l�w�<J�W��8qNO(H��b^�7u����	�@\�&;�����09��o�������W�(D��XTl ED�`}+6T,���������H�^���{���������)�;)�}]\�s�r�����<�s
]�d�c���N;m�y7W��%y~������iQ��k�O�/})���6��`�&���*66��>}R��[n�onRH>{w���������c�4���������U���L�g��^������>�>��W���uu���/�{}����&C`����WE[� �v�1����
�=Z�0��R��wf��qI���S��r������wn�l����`{T��o���`A�
�
�e���)VWg��7�j�M���������#c}����LK��3g��&��0��#����^4�.i�)n����~��6��|���EkV5��n�Zu�]-�{6U�������������������4)�����q����
��4y�=S��c��<���\tQ�~�c���^u���~��Iyy�>�x���������<�f���%_��a��LX3�m�9s�m%���3�moK��yi��N�$�.]2��6+�������;���O��Y7����M�X����6�x���������jM��Z������G�5j��O6��45��I�D�q&�b��m[�S9zt�M��n�<[������+sV6OV�oj��}����W�9m>���nK��)����j���o���HU���g��g����M������d�9�d�/~�����
9y�������t?����%<��?L��|&�:�����������4�^����Oq��$�AS}�8#K~��,���������5���XW��+Z�**R��W����g����b����4)ih�����XW���=��;��&���bCC&��2�?�����9��K��8�������}G��9iZ��e�)��g���5����w�Y���i�|7�?��a��0gNF�v�&lm�����}�m��4uj*���#���[nI����s���o����d�9�d��"k~ou�s����6Y��i��<?hP��������~����w��i�6*`ac��2q��4������V���6��3�w�����!y�����&;���[�W��������7M+W�h[��},C~��� I��g�>����{s�F��-��
j/-a�/��:5���I**���%)��j��}������o������;��M����){���'�H��<������u��r����.�?��M:��Z�;����Q���$�s��Yz��)��/#n�9]�����/������}���z}��|�E���R^���ME��Y���f���@}�8#�~���������D���g/
BX7$h�g������3��S���G�����*c�y&�k��6���&�z���g���*�K�d��!)��f�������Yc�PSuu�x`j{,�K�ZL�c��>�x���O�����i
I����#��pa���o�y���������=���O��$)4(#��~���

��)S�f�/~�>�X��kzRY��S���%�6���|&�/��%CZ��v���7�ks-������0}z���i�5/N����b13�8"���W�vXsX�f\-��7���sZ�^&�:I�Qw��n��O���^�z���C3��;^���w�3#�����O�G��W_�^'��*t�XW��Y�R?}z�������B��=�&����<9�w�-�������3���l����s���o|#��8"#o��-�Z��(3�����|�@���3i��R�_7yr&���)VW�����{2���O���~��6����#3���Z�ky$S��.u�y��}��63)655_cO��a�_����z�:�#n�!Uk��RK`�+)�?��G6k�����C�V�j�vo	Y���N���5n��������4�E����,2I���
%]�����u��6y�����/~��b
�.rQ���g���n�8��6���o��0�u���
������_�.5,���,��������r���]����0a�C���P����Gmz�6t�����a��f=����5,����������N��4�y��9s�������:������/���O��E��f�V�L�S��|������_6H��,���3�CJ����A�k�m5�����yM,h�[V?�D���{
�:e��sS��O��-A���Y������c�i�=Y���Jy������G��`A�'�0�kXkm@f�SO���/��������W����u��_��CM�]wm��k�W�e[����d���?�k���^vY�|�#��eS�����q��L�i�4����{���7���6{���an
������|�;S1lX�O�����u�'g�N;%

/
�������}�zSw~";���f��u'f��_���s�����m�iQ�
����3����i�]3����e���������4����i�R?mZ����2$c�~�E�g��`��~�]M�����}�gS�)��?K]�������0wn��:j�����Y���g��/�O����#K[PYq�uYu�M����o3�	Jm��wf�o~�����nT�rJf��f�'?���}m�~x}�����7e�-������v�^Y��?sf�{�(uI�MY����I	�;/���t�s��Ua����
�e���)��e����n7
U����.��}�&�b����}�}�R����]�f����n�\��od����b������d2A��U�������{R��%�&Nl�`�����'�C^6�V������6-�}�n�����2��=v��}���7�<0��]���9m�������C�B!;���&7���a��������<�����T�bCC��O?�n+7���	C�&�b����/o�I��i��L3&����{g�Cu������I�;��{��i�����������~�����]�����B����,}?�����xq�J�MM?cF*�o���T��z�em{�������G����3d=�����'�������2d�$���oOLOM��I2�����W�{��������S-��M���������'SVU�-j������pa���o��NM����O���CBs�*�-7���b������&c���?������VA�hk'����@�T[�I���a����/R1|xf����;6�&N���=k_���;6#��>�w����.���{fsL���W��E��f
]�d�%KR��K���v�R�/})���e��g���k�<��&O���z�����N���J��w��5A}?���>��vVk�7/K~�����a�_�bCCf��}�?>�������g��?��������iYI�4�Z��E�ZwVT�b��6�/65e���i�3��5r�������3����S���1^�����q�2n��
�,��o2����$]8 ������o�����/O�+������y�fM������8��4-[�$�v��r�����b�����!C6���~�������2��'S����W�*il�������$��L��+�L���U��wN�;��f��&��Wj}4�/�$Uo}k&��s����P���n��7��9h����-A*����n���������mV��=t�����&���b1�w�9u�?��_�>���%��e��qF:��[�<�D�\���3���Rs�=�z�;2��kZ����_���~��>�Yk���N;���5�"IR?yrKpf���u���s���|O�����q�2���ZM����we�UW��I'e���yOh=V?�T����IEEv�5�E��-�:G���G���V��>�9�%�������O>�Nc�l�X-A��B��]#F�q��L><�������t?������O����G7�=}��>�����Y�����_��G?�.5�����<��
���������&����2Mxr��Gg��W�PV��^r���O��.!vk�.
]�f����
�_�$#o�5�?�MkXk�O�yg������y��t=:I�u��=�L��������>�������<wnK�����$-��a����E��n��:*#��j��:wn���AzI������5��k��R>hP*�I��������4n\������2��C��x���������g����3��[�d��{��H�.?eJ*N�������i�5+���e�?����=4�X�i�{]j�z�UYUU^pA��������#F$�����f�Ce���J�~�s��9�v/����/\�����3��R��Wv\����W�Z��cY���g�_����Z;I�~�St��?����)+����i��L�i��=�|��������l�/e����w�-c����������9�d�������hQ&��������3��K7�s�������Z�W�ygfsL/N*+3���[~g����~uj�z*C.�4���?_k���f�C��*M�Wg�m�e�����^����c�d��On�{�V?�V���
�~�u�q���~�����������k�~:�w�-)+K��}m�^�,��.h��b��v�<dS��Yt���{��mr�u����������h��g��%?�i:��c�<�D�-R�����NH����a��v�^ls��������o�����x�������f����|n��3�YO${����r���~��9�g����vK������V��=�=�����;d�bSS��Ky��[j�`��~��2��������S��[��*4,X�y��T:������/���-^��9�8lX�	��}�\Gi�����nK�wl�I{�=Z�bu�s���2%S^��4.\���sz�pB��kW3�;.+�����y���W\�YkV���S��N�$��L�w��~���>��T����55����XS��d��b���������>�����6;w{�s�iYz�%��������W?�`f����f�|r���7�}c}�X���vK�3�d�/~�>k&�o	����e�}2�?�i�1f���Y�fa�K���_V��?�a�����	�-�n�g?��^���7��|������t�j�K���Y3!f����������Yp��Y��o$�z'�}�n��^�'���W�rHRV�1�?�.����$�v�9u�=�aW^���~w��,��?��x$y���.o~��7V����0xp�55}������I�7A;Iz}�����������'2��R��N�t�a�����t��R��1#G�l�3'u�'g��^�����0~��v��:���������������=��O��A?uj��u��?�Y�}��92Uo~s�^zi��qF���2��'�����J����3��+[��n��N�^������7��!c/��?2��/_tQ��vZ���QV\w]f�yo�V�����s���:���UU��o�4L��~���e�7��j��/����k�W&o?/_����6��S��W�J�3���o;������g�s����;���M+W����S���������6����6�G?J�O�]k�h+o�5����4�\���������1�����W^�����������+S��wf����m���~7���t?�������_���Q��W�D�����-ag�/�$�?��,����������C2��;������G?���~�e���������O���>�\&��sR(d��I-�G�Vv������v��~�������o,����2����I�M�Ve���i\�8�����8��,��_����L���$��3���.�5�KY�4�?H��~�����yMj�|2C~������e�u�����>��4���zCYY���Wm�0��CR��e�w���_�b�~|�������#��Z2���Ss��/��a��LX��������:���P�u��S1th*G�L�������q���������Y'������������L{��S��Gv�;�����b�p@V?�@�tPF�xc����E�2q��kj�=H����i������c��g���0��A��3�(������}������O<�)���
��!�d��WY���m�|������Oo3a�km�X��G���&���g����L;����w_�~�������U���O<�nAc/�c}��5t������_��ozS���;�������=��{����f��~��?��s����L���'����v�c��Y�R?yr��B������m������%�n�%}�<3}�<��z��2;.\�f!����dI&���+2���������|y&��C��o�����_~y�\|���c*R(/O�w�;�O=��>�]�o��A��	'd�Yg%���1"���v
�]���d����n��Q��gK���";�������0wnV�yg�����B!�9��qY8������?��M��^V?�X���g
��e��7�3�U����k�>�<�H������?������,=���_�����b���u�������g2��?��������3i����<;���&�bk-���2�_H�W��9�|����{,S��;ij��[nI����f������������j����A���lY������I���X]��;%I�~vS��_�WO8)���������K
�;g�������WRlj������`AF����~�a%�c[$6�����O��?�1g_�k�;3]z&���U����K��� ���e��Ym����*����W�����y��S����3&����W�-��	����R��i��7����{�M����3/9�}�I'e�o����t��G�R�ZkW�\�n��w���7�W�sO�tP���O?�E�6.]�	���X]�Qw��n�I�Y@T9zt�M���7���L6,
s���������`��w��Gm�	�j���g�������
��g�_����kj������k\�"�>��,����4_���z����������q�����3��������e��2�����i�t�b1��:+K.�0I�i��2��;[&*�9��,���6[�d�1�d�����o~sF�tS��W��i�����'��]�:K���&���rf�O;�g�v������!_����3i��R\�:}�>;�;��B��d��Wf�?�buu�\ziz�|r���Q���oV?�P_rIj�|2K.�0=O<1����JRO���{��t�i�m2��i��L;6
s���
����x��;�������lY*���b���S��13�8"�n�5I2�����3;l�I;��2������aW\������3a��4.Z�$�u�Ir���<�

���7����[��<�D����������#�'{�'9���P�TlE��+��&3�:*��Gg�d������c���u����#���Z����_H��},��F�������G3�moK���I����\}�{2v��wg�����e�O�[py��M��I�������y"���w���'I��O�����<9������W:�����hQ&�bmm�\zis�uEEv�=;���k��}v}��iZ�2�v�%
3g��>�d�_��N���k
+o��yB�:
���w��>���8����;�U�E���/����6���\rI��	�u�=����%Y�g�&���bSSK�p���6��p���f�)�����f�c�e���i�93C~�������l���}���{������&��n��L�m����5��T�NOYYF�~{���OY��_��G>����M������2��#�$�;,#o��%�dm�b������j�k��	2e����ti�
ee~���q��m2�� �n��Qw����k��������M�x9�w�=�O<�����#����nZo�������3�U�j�2����i��}��7��o{[
��e�e�e��E�F�qG�zh�����
�L��#���k�����u�c��������b��L�{��~���������������9�vM�O|"����_J�e��2�����K_����O��v��'�L����k�(��f5���G���/C.���?���:5�����~��t�k�$�,
�����C�ZCG���2u��R��5;����=J]�KZp�yY�������3b�J�k�;����]�$��c/���i��L:4M+Vd��������M��Z���k�O���A�6�\�a�d�g>�noxCF�~{���q��L1"M+Vd�����moK�&��Ss�������O�����[�E��~����2$�g�l���������o;��F�����L�p���W��y��_o�����bf���Yu�
�������Ad�w��%����������.t�E��@��k��1��:5�~o����t����m-�lC�����{�I�>g���?�qi�kWM\k����k^O�tM�������}���\�X,f���i�;w�o|�����������'[��UUe�/~��;��.��x�;���k���c2|�
�[�����v��'����:M55�8|x/n�
�Ki������=�q��L:4����~��t�w��:_[(64����tiF�{o�p@��W,f�-�d�������o��u��m�j�+Y��?f����i�����2]��3}N;-�O:���������dI�I�l�bSS�~�cYz�%I�����_�\7zt�O��oL�[�Z�J�
u�&e����XW�������}m�55�y��,�����u���{�)u�%�60d��%���e������CMY��a���9��,��_���C2��;J��bE�uu����������,��/�����~��4�����]�GY���Y��������$�N����E)��*qU��b]]V\w]
ee�:���`Y��g�����=3���My�>6vGZy��Y������;���?]�I���gg�[���'�L���5#n��E�;��Z����C>�������Y�V������X[����{�I�3���5���m��~��k
]�f������!c�R��Y��_'�B��yf�]��L�k��>�X�������u�������OV?�p�t�������Y|��Y���_��W������t����#����l����~w�_ye������2��HY�>�a��,8��,��S9vl�>�T��������3q���O������>���yO*��k������3a���������_���c���?����n�I����lY&�bmm�}��Y����|����6-e]����
�e���ICC�>�t��������'����o����d��?�e��]�z�n	�j���������3�I��>��I��Y�����>�.��PSMM��-k�W��-�={��-a��BF�rK����I���������v������GSVU�|-ZS�1O>�.��w�V���'��g?K�t�a��{���X,f�~�e�:!5�O;-C.��C��H������Y��i��3���S��W���������YI�B�.�~��-A2;������l�b��){���5!�I�}�0~&��bMM_|q�}�)��m��=�z����OJ��2������������tPj�|o��CJ��}.��������?�����;���R,3y��S��������?X��^����C~�����G���u&d��{*:��U����������N;����>�Y�A��b����Y������rH������O����l���;������F��{$I��-K��w���*c���T���6���	#G&���A�{���cl��y�����?�i\�4��M��%-}O��(3��W��!o�ss0YE���_z�g���W��E���a���~��������_�Z�}~�=��@���~��L6,)+K������J�A��~/[��e�2�����re�_qE*G�*uI�V�~��L><I�d����oS�J����2���M3��x����}4S��+����'�of���j�SOe�k^������o�v��w��8��M���������������_�2}N?}�j���/f�������Q������
��z�;3���Y�k��'f���$6)��T�sO�tP�����tXU�<��=V}%����~��6;_��1�w��e�Cj<Isx�s���{�$I���g���W���GK���U+o�93�8")3����i��3y����S�,IY�n�.q�1�s����`����k���vpE[����}Q��[�#��>c��L�a��O�������V(4���fRm������]vii�������zt;j������%�O=�>������_��`�R,S��}������L89��d��tpqmd��Gf�
7��G\}�����X_�%��E�-K�c�M�]w��q�g5<�E��~��u��� ���vQ��e�����o����:,���&L���<���#�<0#o�m�|_[}�}��N`��k�M������-666_�O��>g��%��e���7���#�h��;����=+��&]��;�O:������������sRs�}IYY����Yr�E����3�����3;���2�������[��������:d���/t=���>�t��/O��v��/L�C)I�s{kZ�*S��?�O?�$�92��Li�p�$Yr�%�{�i)t���?��������7��5�mc�oL=����{oK�������{��]?sf&��bmm����>}�8o^*�
��3���
f��{�a���������;l��\��k3�6,c�~�d�D��~���~��t?���\�n������,���V�c]��'c������,��_2���K�?cF*�|/����uV����-��ozSF�|�6����tiV\}u���5R���[3�cK��I/��Ra*[���F�{n���My�-�.g��g���#�B�9`�
��7,X���~u��K�O|"���9K�����Gj�x��YW\}f���)t���S��b���>g[hX�0
J��2~��v�W�~��L7.���m[��^f��}Y��?��Gd���oQ��K�����G�$��LI����u��G���oni?��ayz�k[�3z���������+���������i�o���G���a��1�
K��yr���}���R��JlX���W\�Y���������X�����������2����������������,u9���_�r}�;I����U���	-i���-��}(�~��vg�O�����F���[3��oNY��a���UUmV���e���ISS�>���NL^�2���.J��N��q�����3���O������_�n�&��s?��,����<����_JV��b�SOe��P����}z}�I�Y}��c2��+JY�6i����E��n*�M��},�9g�B��8���g����a���tIY��)t�������s�-DqK����M�JF�����g����_�_�V�SN��K.i���]vI���$�}��r��%���\��d����������M������3�H��ti��
l�b��������J�]w�������E?�a��&����Sll��SN�����U����S9bD��j?+��.3���$�A=��MK���2����5�N8�����C2���R��w��_*��>�i�����3�������o�1��bf��Yy������I����K��=�=����h����[����?��{��a��~��T�}w���wY���-��>����o:���V��OSMM�{���q��,���S������O��k_������bj���,���R?mZ�{n�w�bCC&��U�{��t=�������~��L=:ilL��y��tYg�<m�����{���+�L��7~��v�,����3i�����9�m��R��"K.�(s?��t}��2��{���+o��y���E��k�*t��f�Jy�>�=^�X�������J�v���nJ��c7���k��~�9�p:��{�>�X��S��CY��������M�w��]����7�<0IR1|xz������w���{'��UV�A�8�������?��8�����eL} ��KI�r�>}gR��e��]�0�An���l�s�)Yz��I���fm��w[3X�	`m��b���Ljx{*w~U������$}G'�C��`k�T[�){���g�I����?������|��_�������v�0o^�}��i\��]���dIj��/��e��I������yf_xa��4������#�?�������O��%y���UQ�MK���m2v�,��?��k_K�O���k����z�[���j�	�C.�,�?���a[�vu�n��Q��g�d��^������K.I�SN)q������L�}��M���7�{�K��}��U����@r�g�����k���3�C��S?sf&��45��g���0�MWF����G����&��}�}���V��~���fi�����K]��iX�(����4L����X~��.	�
�0{v*N�����m\�$F�Hq���UUe����r��{Slj���<K/�(I�e�}2�?�)qU��X_�){�����J�O}*�.����n�����vK��)�y�	�����K��������pa*F�H��&��@������W�q��$k�f��&?;h�7/G�Nq��T���q��%��������R\�*����-"��p
��g�#������I��X���d�o�^�@�}��:������S����!���.����v3��Ss���:4c<�����V���mYu���������.c�=��,��OS>hP����-��_pAV^{mz�tR����m6��k����������q����>��T"k������������R,3�������-ih��q{��|�%/y���zu���/����y��t�s��m]��ISc�?[s��']{����2��CS}�]���/g����$����2��C�$�>�����V�m��@��g�������_�>�U��=��V���z�M��G����O��v���O����GS��r��R��Uk����q��0kV_|q��z�;����l���c�y��nF^u����7$I:��sz}���u���6,�3g���;2��_N������n���m2�����3��c������T���I;��Z��{|�/�|3y��S��I�/�����U���e��1I��qS���W�vS����5I�<�X���{	+b{�pr��������vU�����kRs���z�������~^�~���u����}K]
@�ijH.8,I19�����<������T�yg���������.g�W,�������G����K:9����|yI>�+���q��-.xa[����2�]�J�6v���<�H��y&UG�smX���.���|$IR9zt�_u��}��+���c�M�����P��������}���n��Cmz�_,��w���?�)�n�����l�*��=����t�_����&����buuF?�p���W��QjM55Yu��Y���g�5��i��vs������?��m+o�!3�<2��g�����r~����&9��I�a��f��}�S��_��iEE&��g��y&�O;-C�[��`�&��}Y��?f��'�_{>���^���jJ��e)�%��:�Pz�K�f��;�q����7�i�2����i�]3���K]�6a�O~�y��T*������O������:5���I�t?������6��X,f��������_gYY*N�����]w%��V����| +.��]���^�@����-��)S2i����<;����~��������O������������Y��N;��q�>[���i�=7K~��t=������)T�U,&�>Y4���������[�����
6�����G'���Sw$e�77�v���R?sfz|�{�*u9@+�Yy�
�w�Y��4)�n�2�7�I�}�M������gS��si��n�1;��~_�B��u{�����OV?�p���g�k8P�3�d��'�q��V��?<���vw���g������K���n�$I�7�!�n��E�+��63���T�����m!L��������v�e��]��qFRV������k\[���},K/�(�O?=C~��v�ec\��d����K�A;����Wll��vH��)|�%i\�0�����q�='��lN��+�
��[u����&q�����>��]e0�����+��;�.� ����,��7�e�}�$Uo{[�+�v�>��,���R?eJ���������1�n�9IR��g�_ye��S(2����8o^V\w]���w����������e�������i������t�Vut��a�SV�xb��m�1����s�����=����u��$Yy��I�n,������S}��Yv�e������oyK����
8��8��R��v�PH^���?���{������u`�P����k/�W[;�k���P(���G��d�	'd���f�	'����3fd�o~���k�{.�~8I2����=�����f�}�����e��3���_�"M+W�����e��{����L��	���-��jk3�]�J��x�;����$)����
!l�������?�����6�N8!c~8�#F�l/�Yy�uI��xG�����T5`�n����P^�>��D��3�w�Y�_�&��	��B	��x3��u&�W�bq��]���)�?-���#����$]{�a�l�z�pB���7Yu�m����$&����n���3���/})����|��S(+{�cV�tS����>���]���B��������M��~4uS��a��t~��R��W����u����
��b1�~���O����Gz�xb�d�UW%Iz}t���=���w���3R?eJ����I�*X��+��}�e�`��+��U��������Hy��q�
���/e���Byy:��c:��K:��s��4._��_�z�����v������w���S�������a���'�={��g�v9w����~�Yu�
Yz��x��-�����Icc����������B���?�yV?�Xj}4S��#���6�^��$I�c��a���ukY kK��9�#�[iV��>��,<���P�n����������h5�<�;/��y�����Y�����P�ti��>�C�B!���L�q�$IYUU�x`�����9��,:���������n���)��Z�����T�~{��{�u=:�F����:R�PH�Ol���H�OL����^�����J\����[��<��,���$I�s�t;��Wt�nk���������?��	���MV.�__������PQ�A��~�w^
�:�P^�>���e�9�d�g��>���n���^,�lMV����]j���9������6���:uJ��%Y��o'Iz�rJ�zhi���u���W^�){�����3�Mo���nK�����K�t��R��K�+���XSHjK[����e��(�n�1����|;��R(uQ�[�d������	��h�~������$��~3�����>G��"#G�PQ�$�_R��-�`{�i�2�/����%=�?>�N��nK�={���gg�W���g����/O��NZ��5����+R��_���WW��Y����[S?gNV�|s����{���Q�J]�6��G>������S��[�+:B��������|�W$�������_�+���u�������/�������o��������'�}�����?�I���)t�fq�6Ru���2$
s�d��W��q�e�w����K������_���%n�:����=���zWV?�HfydF�}wV^{m���;�Q�
[������k���z�?�����ui+�T���PRM55Y��?�q�I�����{��(x	=�?>=�?��el��}����������,�����Zy��I��o~s��D�=�4~|�p@j��/����T��_I�G]���q]8 �~���=�\��~z��:HK������o����*�%;�rfRV��U$�����^��������=�L��I�0bDF����[�d����������R���(TT���'g�7�����U�������I�����{,�Y�����e�������3�5�I���4��mI�<�y!���RW��q���c��X+��*MK���S�$IE��L��<�~��L�������4.]����_����nJ�t�[:��mW�| 5����_��3��jo�B!}?��R�t����Kh��c�����09������b�����2�
oHq���8������T���k�����W�*�-�O>9�����������R��M�CI�#�(ui�����3���3���S���I�.������K\Yk�vJ��n��`{"�b-��o�$�n}�:X�����������{���������ZmoX� �y$I���o.E����yO��uV��>IR9fL:���%�
`���o���%��6�����[��?W���El�q�:�����qSu������������������:i���[�]|���a���h�:���<6e�������[�n�f�����.u�=�o{[��sN��Ky�~�����4zt���-Yu�M�����$���
�W��(��7#n�9�����=�\z�#�.	JN�E��:5�n�-I�X�=�, �y��Yx�yY~��/
�Zu��I�������!CJT����_�T��mYy��I�G��W�v�ol���e��'����^���d����6_y��q���z��}���:��$��5*+K\������f�M7%Iz{l���_�+��T��O=���S1xp�����l��]vY��������$Ie�lzsL�w^V�tSW�Hy�-����Y������mV�O:�n�%����:��R��M�[����U�������	����C�
7a�M�oS����<�u������m�����T�RcE�����-}�
���[��B�������
9����B�z���P�1c2���2��CR��N��z��K\���������}o�g�������l�
��`
X��������m����ON�E���~�l�:��������0!�n�!=�?>IR��e���_����6���C���eI��B����C������/M-��>�d�?��y��T:��[���u�.i�T����?���e�p'�.W�f�3���a����`~f����&dj�)���e����S������B!=�=6����,����8��,<��,<��$IY��z��%�r�T��,u	l�����T=�L���	��\�����u�gJ��6��I�n���5]�n~(��T��H���c��;���+���CI�=�$I��<2}?���u�\�
x%��6���[���[����6�b��X($e��P��]Ve�>�S�������'������t�k�T����SSs�=)t��!]�^�@�K`	����k�IS���$��I���wSVU�+�~�B!���������i��2����e��J]�����bccV^}���$I**K\�M�s���i���y�!�W[!X@�����4.\����I�rX��,�M����$I�K�$Iy�RV��H��V\sM��X�-�,^L�f�&NL���&iLs�UEe��`�#h3+��6I������PH��w*eEl�`mf�5�$I�������+KX[$X@�h\�$�w��$���w�����*J]�m���s2��;S�S����_���E�E�l�����Go��	��������IYy��`�$�,���g����U}�$�;�)=��%I��
%,�-�,`�5��f�q��q��4�06I�����#J\[4X@������?��T�������Y�Tu����Q�$3�����F�~��2�&M��>��3g���.}����;�����u���K��*�y��G��c�e���I�A�e��w�^{��B�P���0�K���]����G}5������� �W"k+q�UW���Fy���n�����?��|��_M���;�������'?������5k��><������O~2���Vg��WgY�nI���e)+���A���{��u��$�;*�C{V	��@����6'�|r���?��~+W���~������W\��>��k�1cF�:��<���/����3s��g���s����6��kc������T�O��]?���{�� �Ye�.��������?�E�W���3fL��c���������#��}�������??�v�����v��W��U�e�]��K�V�~��v�aY�pa����k\�4+o�%M���g�J\�4X[��������[��~���>}z&O��G}4�/������9�e������=���e�������4iRK�K�.����������3�<���G?�Q� �	&���Nj���4+��6��OS��$I�,���-��E���o}�U�w����������C[������w�+��{oF���?s����G?j��n����x��-�����|��9�����[����������tn���TVV��_{�����;��66����-I���G���s)�`['k���}/+V�hi|��������6,�^zi��.� �-j���9��V�/~��9���_r�C9�E��+_i���4���g��7'I�
]�$�JY�:X[��������m����}-�B�e�{�������-�+V���/o���|��<���-�����s���+���>��woi�{��y��g��66��k�M��.�;�����c�hO��@��{o,X��;vl=��
:���On������������n�~�{��=z��q=z��q�����kc�,���$I�cNH��X��hG��@�_}������
�
:�MozS���w��U�V�[mo~��7���v�u��IMl��+����$��qLK�,���-�c�=������n��:thF�������3�<�&u��<���\���������X,�Iml�	��auY����r�n-���hG��@�>�l������Q��p��oSM�6-���-����g���|��Q���[����U�2c��6������k���2g�	������`!IR5 )J\���R@k555�>}z��#Fl�9^��s�=��u��<[��c�=�s�=�Q!Z�������| uC~�$���
�o�������2���0.L�XliWVVf���u�a���j��?�Mj{�y����6lX�����
��|yf}t��/O���&I���";^���n����\��U�[�n)
u������97����q6D{�6��,X�`���8qb��������Y��r��_u�-Y=���mj���O��j������0�K�.}��]���97��\�/~��|��_o�sm���������8���.k�8����,:��-����[�;u�������s�vMM�f����\�������Y��&_(R1dh���I����V��+������K�v]]�F�����e�������'o����.6��-LUUU�����7�555/{�M�%�v�g������c&N����>�M�6��-�����S,S(6��V�z�s�Um/gC�Wm�����\@�*+u����VaW����?�F�c��Y��m�����9s���^�[X[��]�f������O��Q�x��;���f��$;��S���36�/<��j���@/�z��g6��g�}�e���F���]���W�Z�i��m����MKuuuK�{��1bD��l=`m���c�V�{��w���3gN�N�����������&u
���5��������V����5)
mR���(u���������-��n�-�bq���n���V��;,UUUmZ�<�����[����w�����[[����w�Y]�����U{���%��>/��ya���)��b[��ijj��A��p�������9���^���>8w�}wK��?�y�8��6���'������������9s^1dk��2dHV�Z�����Og�]wm��6��W_���>�d��������QG�A���s-l����|��n����=��Uv����
����G�����im�y�k������W�\��}�{�x�����V�W�}�kK~���-����TUU���������/���Y����~�U�Yg�������8�B��w�y�+�v�y��j����������}����|�q�mS�X,K]����|'_���[�}�c�W���:4I����k��&g�uV�O������C���O�w��/;F�Ph����;r����bmoy�[r�-����t���~��9��S��[�$��U���_�*_����z���}���������1����Ks�]w��G����;���W6q��}��-����*���/]A�&s}�����p}�����p}[������1��}�!��b��Z��`MMM9���r�u���///��Q���W�L�2%K�.m��k�����[s������5o��p��2e���;vl��b&O��*�*I������/x�1x���~:���[K������^��Vl*����p}�����p}�����*+u�������o�	'������1�'O���>����~����n�����1h���q��}��[���������3�<����=��#w�q��+��	���u��%���s�Wd�=�x���w��3�8#�<�L=���m��Qy��s���g���/����C���}/<�@F��!�[��R��9��cr�1�d���y��2k������w���e�]r���K�.}�b��Yuu��)����s��g������?����'I�=��#{��W��d��`me���������)++�����}�����[��R��EJJJJJ���n����W���
l�\�����=l;\�����=l;\����P,��.��GY�`�"�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�%�UQ����6mZ~��L�6-�V�J���3`������}��SUUU�����W0k��<���y����������+Z��5*S�N-]�����.�\rI.���<��S/�_yyy��s�y��9��sSVV��U��*��b���-�=������y��2{����wk�����s��'f��Iu\MMM�t��NU�=�(u�%�������.��]~��9��S__�����2��
��RWW�y��e���%��m�,�HUUUY�re���h7�|s������������}m>�����o~s���Z��h���y�����kr�Wtt�l�
�b�X�"`K���8������G������w�}��~�e�}���)Sr�a���;j��L�:�t�n���g�]v����[�~���3��L
��+�l�����s���WRQ�`K��w�#o~�����;������)S����M���~�U������|������{���e����1n��R��f��\v�e-���������	��-Luuu������5+���Oyyy�]w�5{��W
��F���K.i�>��sRVV��%�F�[�{��'�������3�����g���9������}.=z�x�s����O�SK���y�[��f5��(+u��[�jU���������7����WI2��|����;�����?�x�{��7K�.mi����OE��;JK�����s�!��o����
><{��w��c��������s���C������=�C�v�}��?O�0!_������{g�����KF���>8���7����o�3��&J���)'�pB~��������~����3f������>������w���7��[]]�����Y�h�K�����c����>_������;�;��Ny��,\�0����9sf�����{���u�]s�i�e��m����	�������;��������������g���������,x`n����y��-�3g��y����cL�8�U�[�ny�;���|�;ijjz��s�%������9s6����*��b������w���;��=j��L�:u��Q]]�#Fd���I�!C�����J��}_�����t�A�����$UUU�1cFz����}G���������k�<��#-�C9$�~��3f�������������L�0��y�������NEE�F=OX��R������-�WI���}m�������<_���Z�+W���7���}�.]���6��K�.���+r��w����d���w��c��W���<�����g?���x ����7�>x%��n����?WTT��N������7���?�w�}�z�[�r�z�����/�s�z�UVV�?�AN>��V�?����j�����Gt�b��{�������;�g��u�����_�~-�g�}v��u���E}oy�[r�����?���Z��d����o��:`}`A�7o^/^��~��gR(6����c�������E}��r����g��p�	������
:^�,�`�-j�s.[�l����:��C6��/�������`=`A[�ti�����i���
j����O�������i��Z��������T����t���U{�]w�O~���:g��]����.�����ki���s������,Y���������V�b���?�]��u�][�kkk7����W�j�0�6EY���������k����i�R__�.c���^���/NCC�?��V�~���I]l�`A�����������<�.c����O�>}Z�uuuy��'7���~�U{��vj���~	��x�[���}����8y�������+���������jz��mQ�9XP��G��w���W\�����]�:��S[�/���,\��������C�����s�1��y}l`A	���+_��Z�MMMy�{��k��f����������}:��y��-�E��}�{_V�^���L�81'�|r����;.������`}
�b�X�"`Kt�=�����E��?�x�>�����A���?�a��:thv�u��nkjj�;����p�
-}�B!G}t�<��x�����s�cV�^�'�x"��v[����<��#I�W�1~��g��>��z>{��w~����CI�PH�������k>���g��-�0 �>�h�
������/a����6m�f��C�P.������l��}�����;_��s��5jT������Wg����9sf_���������'�����V������Q�RWW���'�������]���k�����W6DE���Y�^�r����_�B~�������e[mmm���W<��#6h���������G>���\�����EY�h�z�2dH���d�����1`C�����UTT��?�a�{���z��8p�+3z���z�����[2u��
��c����>�SN9%��u{�����}�ky����_��
�b�X�"��)�y������Og���Y�ti:w��^�ze��1�u�]3t������&��w_����f��%���k����5�}�������	��C����/��P��P��P��P��P��P��P��P�.Je�������Z�#F�H���KXl=jkk3c����!����{o����n�u�]9���K]l����u�Q�oY;����CU��(�#F�j_u�U?~|�������s��G��_���r`�����s�������W��D������>/�����@��@��@��(u����1y��d��RW�m�{2|�RW��`�e�c�M�*u��N���V�h~��7�����-�c�+h���Sl~�3"y�K[
[��R��E�Y����B��u���@��l�b�`k#�%�,�5��BI�`+RQ�`{R,����b���;t�B�����|�@���X,f���Y�bEV�X����R��������{����#��wOyyy�K��5���V�VD�������=;����.`�566f���Y�|y��G�2d� ,�TY��mQuuu�O�.�
���X�"��M��xY�b�c�P�:�z��6�6����`+W[[��S����������(u�-)��={����*++��g�TUU���21���X,���1555Y�bE���[��ihh��y�2r��V	l�����K����W����U_�=2l�0�W����2]�tI�>}RWW�3f����e��U�R__����V	�������d�����������R�N�2j�������`��e%��*�Za	��6����={
��Z���g�>X�X�F��b���Z�UUU������������Ul��N?,J[[X�F���^�WYYY�J�����EXl6X�F�7� ��������������+"W�@��P���R,6?J[[Xt(X@�(�����P���R,6?
�����,�?{�e��q��Lz%$�&���)Dl*M��
= ��T+*�Q)P8��5.�IDAT�� H�W���H��|D�0�3�$o�k-�;{���yf2��g���(����'O�d2Y�
>���
������[{�����n	N�����g���\��<<<l^�,(������{�|�N�4�f}XXX��UY�,
�
*X_���/7�%����dh(C\�n�����o8p@�T�N=��cwg��t��e�[�2���c��m���=���T�a������<==�|~||������***J���*W��BBB��m[��Y���������_����/I��1c��O����`?�(%"##5e��x���rss3�#8���G��%$$�
8,55U�v����[�m�6m��MG���b���?����z����N��?��3��}}}5|�pM�8Q�����u�V}���Z�f�v������<���QCO<���q:T��������6m�d3��[7����u��O>���{O������G5k�,�;������WPM&c�@�A�H���jO�8Q�&M2��2��w�QLL�$�z��<x���^~�e���������S�Z����n�o����@����u��i���JMM-�z)))9r�����|������?���}��7���k�g���K���������S?~�>����?_}���{�=>����W��������5n�8I��o��'�xB����h(v`P
\�tI}��u����������.66V?���u��Am��U���v���O����-33S�y��$������+  @'N���'""B}��������c�|�?{�l��W�T���'N�r5Z\�����_?}���4hP���:uJ����S�z���5m�4���*22R�f���/�������bt@�������DI�����nlCp��;w*55�:6lX�
��X,�aaaF���5k���,X`tKe����<<<�z����s�_=��:}���?����K�/_���~����[�$&&����w8��C�����o�>EGG������u��;�K�.���_����u}ff��
�����h��=�����%I>>>E:���_C���?������L��������5w�\���{�U�r��kNs��a�q�&M�g2�T�^=
:T3g�����:8�FTT�^�u��7�|S�g�V�*U�s...���{�i�&��Y�:��Y�����qqq�<��{�j���z�����q��*T���_~Y�7oV�����iiiz�����,X�@�V��$���j��qE>��G�����K�|&@aX,��0���0���_EFFZ�>���������m�����4Z�|�._����k���=z�:u�$OOO��y��wgw��U/��b���V��O?��fn������sO������k��Ev6o�\�����[�n��=j���\�tI�������S��z���>��6m���y��=��g%�,�x�b����@����
�)99�fl2S�l������+W�5233s�LM�4�����={�K�.�q\\�����<���_����k�y��6�R�����:|�UO=���\�"Ij����}��B���=��c��u��"u�%��W�a/W��JOO��-[�w�^]�|Y����V���w�����"���{����C�r��RSSU�\9����]�v�Q����sDGGk����p��"##����r���N�:j���BBB�\���C��u���?/������o�^�5r�#(Xxx���Yc�~��ruu������u���;wN...�S��BCC|-%''k��
:p�������
�K�.E�/>>^���������$(88X�[�V���}vid�X�rNrr�����(""B			���SPP��5k��M������5=z���n��s��I��V����[;��5##C;v����G���U�PA�j�R��������:WEEEi��-:��"""����>}���AFF��l���'O������P�&M����:tH�w�VDD�bbbT�|yU�RE��r���/_����������s���S�����Y3u��Af������]���~���+99Y!!!�V��n��yyy9�Vff��m����w+**J>>>�\���v��J�*9���6m������v������]{G�����[����F�����K����:>}�t�������l�2I����>����o�u�]z��������J�������XP����jO�8Q�&MRZZ���}���{6aWyxx��{�������U��]�������K�j�*���;�@���kk���z��G�0��9y�dM�<9�}k���7�"33S���4k�,m��]y�o�����#F(000�~�[�j�^y����#��5j���~[w�q�C�:��_~�y���6
��k)##C}��>��C9r$�>ooo=��S�2e�<==m������i�4g������[�B����9r��}>|XK�,�����;v(===���*U��Q���3���30`����[����n�/������Z111j���N�8a�{��74~���������U�V������?��n3w��Y-]�T+V��������������1b����*U������S�n�f���P�fM�:uJ�T�F
�<yRR�k}�����eK��Z�h��_]���+T��'Oj�������u���\�x{{�����4e��|�����l��Yo���~��W������1cF��&M�d�>|�}����z��7�x�b]�x�fO�-������{���/������Zf�Y]�t��)S��K�{>|�����_�5������;V�?��\]]�|����{��Ci��v����~[�������s]����>}�h���j���]�.X�@#F�����dffj���z���t����L&�z���w�}��Z���+l���z�]��W�^+,,L			���qZ�r|���8|Ftt��z�)�����W��-������[��������O?�J��H��2
���Y����z���r
�����-]�T�7�/��b��~��Z�n�w�yG�v��7�J��?���G�m��:z������<��-[j��!��eK��W�d�X���j��1����3n�8�v�my�_I��t��wj�������+W���u�V����o_�=:��+IJLL������wo%%%Y��;�6m���w��5�J�"""��#���������~�I
4��I��e��|��$�����8q��5k����x���~�5jX�+W��;��cWo�<��M�O�^���K/���������^��^x�����~%IW�\�������CY1}�t���#��+I��{�����'�x������M��
���?�3�J���Y�x�6l��>����z��w��sg����9�����]���Y3����9�����O?�N�:�4iR��W�������0u��U�?�x����Z�p��7o��~�)�}���7n�z��Y������?T�n]����y�_IRrr����{�l�R���J������w��z���s
���>�V�\��o�9��GY�k�.�q�N���[�J��Y�:NMM���������;w�f������t��IR�Z�4i�$g�f�l6��[n��w�����H����,0Xff����>m���:�V�Z�Q�F����Y��������k<;999�����4h�����u���V�Z�5���W�.]^�GT8k��U���g���U�PA��7W��mU�vm�������^�����c???5i�Dm��U�
r���������^A��_o�]�\9��[��gY,
4H����u�J�*j���7n,��������%e�������e2�T�vm�k�N�k��Qk������/�)����������6m��m���U�V����s���{w8p ���d����Z�^}�Um��9�}s���7�|cW�XQ�/��T:bdSSSs9����N�:j�����o�z���<nI���Q����z(-Z�q��Y�5h�@�[����u���z��'�:;##C����	���js_PP��=�j��6������G��3~<s����/�h}<����_����k��U������3����lB��V��6m��~��9>g��7o���������j�����o��u�����7o����^����.]�#F�y���Q�&M��U+���u��i����9j�����O�������
������o���#G:\/--M�����5k�s!!!j����7o.��������{u��)�k�&���7n�������p��b��
l�������W�������9s�����)�e��M��������_.��GY@l���Z�z�$�u��Z�v�"""���j���������sU�\9����d
2D�����������_.��S���j�����s�N�>���H��=[U�T���x��}��<�������o���w����������E�9�:y��`�x<<<4f����O�����{��o��c��)&&F�V��c�=&__������[���~[�t��7k��U�|������������KZ�v�6lh���g�Uzz��u���g�Z�M�4)�y.�O?�$I<x�����s��i�����o�.]��'�|�f���~�={�h��a:}��<==��k�����:v���m��c�������������c�*--����f������s����#�����C��c�m��]��Wtt�/^l,����!C�t��cGM�6�:NOO���������g���y��d2i��E�X�b��� �*U�y�?���6�������^�v�m����[7��1C{��UBB��=�?��S[�n��������^���������<����"?#�����g���T��(<<\���;��7�c��6��������?�?e�}�������F��}��)22���s��Y=zT�?��M@��q��i�&����������+���>Sdd�:�m������:v��z��e���z��.���Q�F���#:{��v���C�����9����Y�Q�F)##�:w�w(,,L111����n��#G�(""Bo�������k�����;��u��i=����������QC_������w�^���������
��sgI���+�h�"g<5�:s��x����� }��'��������M�6��[n������k��9�|������C�����K�.i�����{�������������'>>^���+�#5VRR�N�>m3�[(g~��?t�P���VXX�N�8a�L&������			z������C��w��N��Z��5������j��jtp�;u��$���o���/777��}}}��c�)44T��r����%eT���+�����<�o��6l�BBB��!((HO<���[o�U;w��$-_�\���W���s�����j�QR�vm�\��+W�X�U�T�����#��*___�z�����[���o�����������O?��l���d2�{��Z�n�Z�l����K���;�+V����r�q�����7h��H��<yRRV���1cr���>�HIII�?�$�b�h���:p��|}}���?�K�.9�6h�@������m�H�z
�X�Bw�}w�=�i�F��S�5�����OC���4`�������]�v��_U��}��?n�8�]�V+W����{5r�H-[��f]bb�hl���/��[o��|{yzz���7l�`s�6m��{���^�����[`(�������.�q�z�������J���?�E�i��Q�?�R�j�Y``���[��M��X��S'�_�^��Y�=Z����3 o��M6�i�����wn����9s�(44TC�Qff����5j�(������'Ij���~��wU�T)��Z�j�u��.]�$WWW-Y�D��{o�����l^����z����T...���O����z~���5n�8���_��wWDD�$���^�C=��c�����&��Y�f
S���m��L&u��Y����<�%K���9��O>i�W�Z5�_�>����;��?�����mB����;���&X2?����d��y���#������C#F�P��u��{w������SDD�*T����4^dd�M����[��dW�jU������!33S��������O�������+��jPP�f�����r�=����'�3��
�H�+W���Ks�_]�^�zZ�p���������&M�8&�%K����,�{a�Z�J�7o��=<<�
���|��j�������m�y�����V�
4a���_~������r�M7����~u�i������Z������_]������R�V��������E�)  �:w5�+?&�I.�	&���os�=��3��+e��L�:���JJHHH��W�rqq�G}�:u�X��y���O>�$�����f�/^��5kZ�.]�����*�=S�L�	w������V������[�W���Qdqss��_�P����;6������3G/^��_��<�����qc�����T}�����=s�����{����]��-�~u-��?_u��-�A��C��b�
���|�M��c...����m>�5{�l�j?�����_]�K�.��������4�Y���:����gR�g������������E����j��������^�u��o��E����m�+�����kW�1���,(^}�U�������nS�=����$-Y������WO�����7m������9s��x��qv�_��)S�
����������N����36���+�<���)S���J�*9�~j��aW��w�a���_9�h��/��}�Z���CBB�x�b�������wK����+}�������+�%K�����I�����&����RRR��]�v�4`���yzz�x�_������r�J�x��������=����6��e����w�����yooo�?���6�=��W/0T�Z��~�Z�je���,^��B&I?�����W���<y���8���>��b��l���WWWM�>�f��O>�9+?^^^9�2p�@�qq|>���aU������������~�z���+6s�=���k;?���9r��5��G
>�)��'((H����q��3������L�����,���X,�LH�����@a777
4���=���8,,��I�j���.�������l�wuu��O>Yl�t�m����|���^��u\!1116c__�"���ys��_����Cx�����������f���������^����;��������S/���u�������_�v��O<a����>S�5��p)q�������{��M�
6�������c�r����_l�>��C=�M�6�������;x�`�j9K�~����o����w�������A��

�V�����<����k6l�`3:t����s�=���q�'{���6c{�����[u�M7Y��.]��������W/���e��6��r���l3�6��^6cg��?~\������t�\��-��o�}���S��~IY�^s��-r_���w#66�T�
��[��D*brj/S1�eU���U�|y��w���f�m�6��]�tI_���l�����[�������@�]bb�������ew����c�MXE�V�T�R%����u��rq�?�1$$���=��m�E}��
�)H�����[;��������5��e��i��
��{�.\������Cn"##U�B��L�4Iaaa��������oVjj�u��Q����v�n���D-_�\k������u��i���)��p��������w����V�v��v�ZIRFF�v����]����X��m[���^���n�*)+��b��dGq�������u��s��K�.6s;v���vuuU�v��>���K-[�����-?)))��k�u����[n����...


��E��s[�lQ�
����b3.�������i3��=�^)))������H�������b�����os�m�������o�mO�0Au��-R_������+W$e�&%%�������������k@X`��M�:��z�������:u*�����H�7N.TFFF�z���.��c���������!��&4�����RP�QA�
���#��{�y^4y�d��5+GX������^k6��d��l�RQQQ�l�U�7o����P}����4����z���W�3y�J����
:��i���,I:q�D����}_�.##C���
�w��������T��j��e��������_���/_����+<<�:�]����BW5j���X/^�y�h������:�E�6XWC����'[�gI|>�l��r�&�c�~�#�����o_>|�:��+W��;�����#G*--M���Y3������0���JV��K���;��r�d.W�d*a`����[
���n��c��S�9��|�������<�W�;��������E����E��R� ��xzz����BU���k���s�=zh��=E:����M7�������;����������R�Z�.))I�������^�s��w�$����?U����v5��bbb
����wz]{9R����ke������\1�G��+Wl��	,��'��y)�{RY
<�V����o�gn�=�^������;�c������V�X�-Z�}����o=���E������[�z*�kC�L&S�����W_�������'���c��y��I�0qb	vT��J��$����m�eA��O��H|||����T�~��9������n���A��Z��|||���e81}�t�Z����g3.lpEY�=�%��q=����r�_U�VM���j���n��&������K...�5.��E��T;{0�$��QC�j�*��%��'��~U�Bu��]-Z�P�j����////��f��U�Vi���%�n�p�{cv��bUfff�kJ:���K����������E�)7�_/�_O����z|_w���`�L&k�WZZ����U�bE��8w����0A�iii����f�sww���~���;�}NRR�&^�?�5J:tp�����������@1������$���%��QP&��^R��%&&:�'{�On�Qs���������+j�����O����g�T~~~6���j�g��U�_�p��N�����mE���4{�l
<�&�*7k��)R�c������1��~����5kV��/N�v��_|a�����w���O>Y`P��c����S\�����������������T�R���&����z�-�i��Hg6i��f�=��0�����%��%���d���s�����������S����O;�u��i�q��
�!33S��
��?�h�3������t�m�9tVJJ�������>�H}��CgH���#����+9B3s���T��z���p
S�Knt��t%n�,I��c�<�53�#c����tx������]\\����c���Km��}��:v������|��6�����[Z��Y�f|��Yc)&�_�s��������[��`ZZ�
�g@����o���Kw�yg�k����Z��:�<y��{�9�����nI���QZZ��H������l��h���BBB
���&88�f\�V-�����5|}}������4I����>�0{
h3��z�G����g�V��
m�����v�������9����b�c�=f�Ye2�����j��v�S�d����wJ�����%!A.���h���v�btp���w�C�O�:e�R�F
�L��������}�u��eK���$i��}�TX��������D����7�:t��N���-[�����t������(���^z�����E��=�f��?\j��}�\\\��O����~wKBFF�<���={���k���cM���G�:��u������GDD���s���k��;�*W�,www�����JMMu����w��k������W-[��o�����.\���'�c777��UA��y}��g6s�f������>����������f��s���2HJ\�^�����L.7n���
��n��=�|����/o��?���f��}�k������n7h���~>�P�K�Q������n�Z���JLL�$���_�x��*U�d�eYHH�n��&k��ah���K������+��l����X����P5��g��1�:������5h�@����W_}%)�wd�����������\��U�PA���v�������P����j���]km���f���i�c]hh���Yc�������S���N�������w����N���}{����~�I�?��]{����c��9�'www�j�J[�n�$���j��
����]�-����l�:t���6�+�����o�m�^�Z�%G�gnV�Ze3

����]u'L��>��f��7���O?m���������~sx��U�4}�t��y��z���r�m��!�m��u����u�$I�]���������i���z��'�Z��_���u��cM����T�������^+e]�j��=�����gO��������t}����2e�C=�e]�t��%K$e?9rD���3�+���u��k���?Wrr���.\�����������ps����m�t��QI��u�4u�TM�4��Z���������aj����H�l�2���[�m�����$I}������j��7O/���������u�}��
��+W$e`���_�7vj�;��S�|��u<g�=���9Bs���:��ku����%I,�;���~��3g����+�~��N��z��S'+22R�t��q����b��g�}f3������9}�tM�6�fn���?~��]����U�z�rx_������B�#�&<�d2�s���:�������dl�J�xQ��v�h��
$I^7xV��0r1i�$�L�B�>|��(U�M�������\�R����u�������X$W��en��E�����k�.����/o3>q��C�G�m3~��w�g���(�n��6���:��*U����o�����s��9M�<��Z���:t�"""�sC����������K���n��6mZ�{��}��\������'>>^c��)���}�v-[���u����8q����?���6m�����9s�&�F������{�:�X,z��������:}���M7�d���K3f�(p���5o�<��r��#G�t�M���6�By�����q�l�y���w�qqq����'O�����5k�~�z����O�������������O��7����R*##C7n����i�
*�@�`�����o���}K�_FT�L���j�����P`@)p��
4(����G�j��a6s=����+�c��l��7�ls�{���oG��]w��p�I�5���k�Y�FW�\�{��=���4�����������/kW	�h:S�>}d6����k���su���z;55U����w}DD����oWPVv��M�y�������g�X��M���[�qFF�����(�k�k�7I7n�233�\��������������5C<�����wo��gff���	�		��!C��3u�T������w�yGS�L)0t�Zg���/���������=z�*V�ho��A��{�bbb�>#!!A�f��g�}���f�Y�&M��{��4s��<�W�V������aR�L���W�������L
0@g���s��b�#�<���w[�|||��OK���_|����?��Co��v����;�#\l���
���W_}�'�|�fn���5kV!�.}���O���Z����3�p���+��F��=J?}Zrs�G�V%���uk����L��F?�r5�����QC�N���?���;����S��]��			�������/�KU�XQo��F��6L7n��������7N!!!����H}���:u�bbbd2�T�~}:t���]\\��gO�������hu��A?��6l(��m��Q``��������U+]�|Y�t��y�o�^O?��F���
��OHH��M�����WK�,��1c��eK��-m*V��=z���~�$����JKK��������a����_Z�s��Qbb��L��5jX�������_��W_���%I�5�����~�zM�2�:vww���K��������{N�W���?�,)+Le��Z�|����8<��z��7��W+V��w������q���u�������4~�x=zT�c�[iW�\9eff���+����^�u=��C�������y����M�6���9sf�?I����^�u�P��'j���;v�n����S:|����_�e�����Wzz�u2���������5q���j�����y�w�}�^�z�}g�����[������Tll�&N��g��#Gj���Z�z��� ���^���
��
���M�N���?��U�VI����5`�-Z������k����0�S�N�U�Vz���5p�@���-[���_��u�l�x��wU�J�b���\�pA�������A����������[����g���`����z����s�����������Z����L-_�\�G������k�T��1c���XV�^��z�&L�a��8p���Y�������h_�;���B�?��|W��GU��W������x��w��E����@���
�-[����~���;��{w�F�JNN��'���d����C�/��r�#Fh�����k���`���{O3f�P�z�T�\9EEE��������?~���;gw�$=���Z�|�,��(������^�u���k��{w�������o���w�m
INN�����w�}W!!!�\�������'O��X�u>��5���+Z�v�z��mpWE��wo�~����)IZ�p�.\���k�B�
�����'���j]3d���WO�'O.�����5d����[o��o8��d�_|�-Z�������Q�f����>[���T
6�O<��?��:���?���V�j�T�re�������JLL������|�A=���F��t�:u��
���8=���z��T�vmy{{���3
��o���<xp�����K
��3�s;w������������+((HRV���l���]�.]�p�B�1B�����������c��r��
		����bbb�#������W/����:�g����'��f�Y,�������������x�b
0@)))���"G����~Z�j����W����~XO<����1���+5b���N�>]��O���'N�f�������i�&���O����gk��y�Q��t��	��Wyyy����V�r��=��
JOO��;x���������t��Maaa�+n�}���v�v�T�~}�7*�?W���6��~�$��kW�;�1��h��M�@�qqq���_���_6l�$EEE)***��~~~������W�|�uss�?��^�z���#�����<�����i��iv^\��[7}��3f�����{�7n��������k�����������/EFFJ�-Zt]`I��_~��n�M��m��?~���?�c��A�4�|���v�?b��={�:����������/�T��=�aj���S�.]��U+�j�3f����6a0�t���9s&����P}�������K���������K7n�,�RRRr�?\k����7o�������j���F�m������'O���������+0x�,4h�����!C�����6�]�pA.\�w��l.0��\�rZ�z��{�9}����
������m��������|�:�_�~Z�r����~�����$���?�=f�Y�������s�o�#Fh��������\?+$)((H�|��:w�\Rm�Z�������'�4����b�(q�:I`���Y������|�M�����]�����������un����}�v=�������s]��r�J���{22F��g�����k��G��R�����:�q����g�>��3�j�*��f�Y�:u�G}�1c�������S�?��u�l�2�0���\�rZ�n�&L��o@M�&M��W_i��%rww���Y�fi����q�*U�`��{����^y��8%%E�
R||��gwww����1c�*U�����5k��?������ ��c�j���j��}�k�5k������O?���c�6L'O����SU�~����{����u��E�l���zeM�6m��~-\�P:t��l�w����z���w�}Wg���c�=V`�r��i����}�F���M�*00P���
		Q�=4c�;v���w��e�3��%e3=zT/��r�A^���������_~U���Z�d�����|�|||���Oj�������O?��		����
���,�\]Q�R�Q��K2yx��];���!�,���e��I�&i�������k��������M�Z�{��U�&M
}^zz��9b3W�^=����L\����jO�8Q�&M������y�f���GW�\����n��&���)�&>>^������G#///U�VM:tP���������K��y�f]�tIQQQruuU``������-[^W�?�.]R������(Iz���������s%''k���:p���\�"wwwU�RE����+x�F�����������VTT��f�*U���-[�E�F��T5k���S�$I5j����'m�?z���l��s���d2�r��j��u�>��;w���o����pEEE���E����Z��5j�:u�8�u=�����-[t��yEFF*--M~~~
		Q��
��A�|��m����s�������8���
k��]��o��������
*�Z�j���[���]��oDG����[u��9����\�rj���:w�\"���"..N��USLL�$i���z��W�^������)��R�[�~wFFL��|��2cc��\.RT�?��[7�+�z������mU(e\]]��Ku���������o��N=��U�XQw�}��m���+��������%I3g��3�<s]Kxzz*44�&suuU����cG�[1\��uU�n�b�Q�jUU�Z�Xk�e�����!22R���u��y�b����-[�e���^YJ���z0w�\k�UPP�F�mpG�Ff�d]M���q���V��	�i�N����h=�����@7n�8��;W���:}���,Y�|����T�={��������;�
`�����9�:~�����g\CN��~�$��Oy4jT��\��U~��b����@)��'j��1����'k��Arss3�3(�E&��w���7�x�f���vv[@�0{�l�;wN�T�N=���wnx�����v{f���n�$����<[�rN_(�\�n����8p@6l���[u��Q%&&��)�<����@z��1��7�����|���6l�v��]��e���{��JNN�����C��7/��R)..�&���������]���������K���J���
����SO����6������6m��o��z��'U�B�:�����M���7�
(���Z�h�-Z����G�j���BBB������/k��=Z�b����g����O�~��A�����Sxx��m��X���B�O��E�����L�D#��)�)�
kIOO���[�u�V����;v�&N�(�����������ph���G��
o���vh��e�U�V1w��$m�,I�����NPR�B�IJJ���S�~�z�������u����&O����P���������������[3g�T�F���3��d�X�.Kf��{3b}$�+39Qib���i�$��C���l"�f2���cG���O���W�F�T�|y���(**J���~��'}��JNN����A���?�l6�`����+<<\+W���
���������RRR����U�|y��YS��u�w���m��6p��8j����-����c����������X7�P(�{���!CT�~�\��R���T�������W_��A��q�F��+V����g�y��ZJ�����b���:'O�4����_��w����>�[nh��L�.]�5pq�L&����Y7L���B��w��r�T�P{Q��,���$''�G���y�u.$$D'N����w��WDD�C{�=�����:��w��4iR����u����z������9e����!y��h�\&5������n[,��#5�+�y���D��o�>5m��:v$��o��Dxzzj���j������%e�V�Z��&���BBBR�s�F��q�$������arRC����nu����w�i3�j�*��\��i�$��s�B��X��
n`�D����f|��!�:\��q�$���X���B��V���8""��N��~�����L&yu�`t;�A��n,nnn6���4�:��'#6V�n�E���XMKf�$��Y3��t�����p# %����6�
*�	�>	�V)e�Cj�X�����X(Q6l�W�V��N��I�'�%���Ua���krw�k��N8��G��@JLtt��-[f3��gO����'��,����V������b������\�n7��c�*::�:vwwW��}�kJ���8%���$��sg���Xp�[o���;w��>==]c���g�}f3��O�r���n���-[��L���)��n2��X�ne
Xp������m��s������w�^����X�%K��]�vz���m��S��^{���j�f���%=���%�['I�����������M�6i��M�$�t�M
��lVTT�N�<�����*U��_~�EAAA%�2�+~�J���Y�����`Y���L���2�,8EJJ��;V���o�]���WHHH	t����KC�������_?��%�,8��W^Q�F��~�z<xP�����U��}���O�k��%�%8.i�VIR����O��%^���W&w��[d��&C�@Bv�����[o�$%&&j���:y��.\����xeff�\�r
T�����Y3��f����e\�����%I���2�/opG���,������m��m��
I����$�:u�lp7e���u5���e���
P$m�*I���f�;�` )������W� =*J	��*Kz�a=$m�"I�j����X�]|�1�}���mHnn�h���.���&#�@YB�P��4%�Z%I�
�����^���G.�n`��c�2��e._^�W��������(K��d2�
��������$��P���������d2���,X`tK�	k�J�
�Be��j2��!�F7(=,���^r�RR��q�$��G���X`$I���:���R��+���J����a���sX,YW���>Pv���tH3$�J���!�I�
����C��5���a�Tq���+l6���_r��|�@YC@���|���90��n\���Rj���:r����;'��SG���
�w_rr�6l��(..N���j����t�"W�������k��}:x������������u���_�~���V\\����/:tH���JII����U�fM5n�X+V,r��8}��v���K�.���+
P�J���sgU�T���222�e��<yR.\PFF��4i����;�W�GD(e�nI�O�w������d2�
�!`����jO�8Q�&MRFF�>��#}���:r�H�}���z���4e�yzz���i��i��9������B�
z��75r�H�z<|���,Y�_�U;v�Pzzz�k+U��Q�F��g�Q��������M��+V(555���j�R�~�4j�(5n��:��I��U+�=#F���#�<����Y�f�����j����7o���������6m�h��	���;�}WM�4I�'O����]��������z��7�x�b]�x�fO�-�����$y4k&����p�#J����s�=�����\�������k��-Z�r����$I��S��}s
��*""B�<������3f���O?��;�����/^���'j��y������];�����[z��W���i��'N��?T@@��M�fw��u�V
<X'N��w��b��;t�]w��;���%K����p�]�v�_�~:�|a[\g��U������R�������O���^�!�?W��]�!J���A���_U�REU�TQbb�:����}�������5o�<����G�:}��$�d2�V�Z


RTT��?nSk���j�����g?���9����T�Z5����d2)**J�N��	�:w���w��;v�Q�F�>��>�L����1�����5k���GIII�|����=+����)���������d3����Z�j)  @���:z�����m����C���<==��w��
8P������U��R�J�����|7����R��M%Z����J��XP
,\�P'O��$
<X&L�	�����k����?��:������g��/����O���S�����Q�T�R%��C������u��sc������/77�<{2���������N���C�k���������8-_�\S�L����%I���2d����O�L�Gr���h��q6s������u������}�v����Z�xq��*U�d
[�j��O�n���^P����|��>WW���/G�U�.]���/�g��6�VqqqZ�t�&L��K�.I��m����^�g���nv/������e6���c��_������k�?))I7n��<@�g��P��-��Js���Z�b�i�XQ^�[{\,��kq@`@)p5���w���1cr���>�HIII�?�$�b�h���:p��|}}���?�K�.9�6h�@������m�H�.^��+V�������6m����c�Q�F�}���i���0`����Y��k�.�������o����Y���/[���
�_|�o�=z�G�z��7t��Y��===��W/I�q_������#==]�
�	��<y�&L��k�����}�Q�~��


��#G$Is���c�=�V�Z�U���Kruu��%Kt�����������(�R��Sfl�\|}U���er%.�����Y�k����M�&���u_
�z���s
�����[&L�����_�\_�V��������E�)  �:w5�+7��?���v�rwwW����^��o��F{�����q���k��_]�j��Z�l�������s����cs
����6m�$y�|3�W(�,F7���w5���X��d�����zJ��d2i��)��R����m�m��Y�j����~���w�q�\\\���)I����
�p.��/��}�j�����M������$�����S{)��3gZo{{{��7��{o�f�t�]w�����$��������l.p�������p�����,���
���,��IO�f�jt��g�����"o��7W����Z��iS��{�����%___��YS���$�>}�p���V�Z�����SDD�*T��c]�*Ul��/V����������l�����+00��3z��m
�����_���m���_�~���w�a�u-q�FI�W�Nw�r����.P���@�6m�^d3v$8*((��k����h-[�L6l����u�����*11�������`���Cf�Y��3f(99Yc��U����~<��a�Y,�?��
���z��6��uN����(9W��S��u%W03Si��K&��:t(��PB�JWO���������it��-$*/���N���������M�<Y�f�RJJ��5���|�j������O>����=[�g�V�6m��W/u��U:tP���U�08`37n���W�3/_�l��Z�j�����?���?nHm���e0�6�K��d2�
�`���$�y�J��g����7/����������S�s���5k�.^����f~�����s��~�m�L&�h�B}�����C��I�"�S���(��c�:��8G��u�$�����S%V���"���K��$�9�w�}9���U����P5n�X7�t�|}}���%���j��Ev�����?���K���w���]�r��X,��k�v���7�|S������3U�n�"=��DGG;����L�����9�6�9�`��y����/��J'���&C�@B�����f���i���<x�M�Un��Y�P-�����k������~��7���i��
�����~��Z�n�V�X�.]�8T����6���{N���+���k�.�~����	������N��A����Km�s��������{���B�m���7n���G�b�����Z�j����m����...N��{��;&__�B��Mpp���r������Sk����(���'I�����J1K��dl(C\�nP�l���z;((H����{���{Q�L&5j�H�G������n�:�p���p-Z��)��U�V-����G�^P�$m� Iro�H�*�
\?\�nP�\�t�z�n��2��v�������;���.]������#�<b���a�F��c���m���b��Nhh�����w�S@qH=yRg��SFDD���LL�$yw�Z���2�dt(+���60*55��}��������%IR���m����������'����Z���6m��{�J��;�_~�E}��u�[�3�~��R��7��{�1�>\o���T��N�8!I��o����U�\�|��;wN�'O.���^���|��6����^/���z�!�����S�N���9�I�$��������������M7�x]�,�X��&��}�� `�S�N�����T�?^�g��s}DD�������h�kL�0A
4��A���Z�G��b�{��g3��M�\�6i��f�|�r����rss����C���w���}�$I�V��}��7��J�*v��������J/^��/�h�@�,��J��Q��w�}�l������bt��e��a6�9s������S�l������g��y����k�$�Q�Fv���g�|�AU�ZU�F����������233�a����[���u���[C�������h��:>r��:v��>�@?���V�^m�/99�f��l��e�`���y��6m��'�������t��~��'=����Z������|���c�,II2��qc����?W��]�q5�@���wo�~�������s.���U�vmU�PA���:q��RSS�k��z��i���v�
��9s4g�IR���,%$$������������S��U�<w��16A^;w����;s]{��	��Y�f�A�����4`�]�rE�t��M�2ES�LQpp�*U�$���*22Rv?n����$I������bl3�!���_~��n�M��m��?~���?�c��A�4�|���E�{��]�p!�����4c�=��������j����>}�,K�k�����k�����}��}�������w��dR�j�
UJ��S���f�T��t;"n�2I�w���^@�]};0���9�+WN��������Y�f)&&&�uM�4�+�����;t�'�|����K+V���
t���|��/_^���^z�%��Q��o�����E�i��-:|��bcc���lw�u����m����?j�����a�RSS�\o6���}{���WC�U�����e����V��]%Z��[��(^&��b�Rh��}j���u�w�^5i����������#6s�����+9s(�����y�f8p@W�\�����T��v���~��N�q��	:tH�N�RLL�RSS����
*�Y�fj��q��]JLL��-[t��EEE)))I���
V�
��Q#����&�S��:��LH�!??�b�o�~��K���l�V�&�d2{-���L��o���I�<ft7()E������|yzz*44T����V�V�Z�U�V���,��������m��R���,�+UR��~2�@U������-I�l���N�&K��d2��`�[�?X`��,v���I�kY����eX�b�X��O�X�" �]���S��+����64������
��m�q5��I9p@){�W�^I�G��r��0�@�GP���K{~�R�7gINV����T���T}�<�7��O
l@�sq��dl(C�J���K�>�>�)Uz��vr�����&�Fn^Fw���,��I�������4����e�����{�����V���<x�HMn7��`�LZR��nW������B_V��0Uzi�3�5�����JM���{g]-iiJ��U�����A]�<`���,7��k��]�$%��\9�7jd\c8���
�����uK����k�22d�X�����$e���_/*~�
I�W�N2��{}�X�?�����������0e�*m� �I:d�������P����d2��+��V(N���9�r���z���u�5V������	�*����RQ�
�����%Z��|$e5b
R����^��@�$...9�222���f@7�9�r���z���u-_C*_���+[�+��#�����w�%����
8��d��l��KJJ2�p��������L&�A��/���������]�����%�I�]��|c\g\�n�����(66�:���S``��@������}}}
������}����u������Y�-[�\�\�6�u�,�����l����*www������Wrr������A��z��+)9��u%��W�	��������p�!p"��V���3g��F�ru��
@���g�����fy{{��g����u��7$/;���V�P������_�Y��w�f.��?%I���;�7"y'2�����S\��"eSSSu��1������_nnnrqq1�K�)33SJHHP\\����s�	��d2�;\���$Kf����%7���X��u����IHpz?��s�7y{��K���FD�d�+WVjj�RRR�s������Vtt�q�@���+$$��6p�J�����%W��$��%KB�\��S������kx6k&s��%R��X����fU�VM'O�Tzz���@�����J�*2�LF�'�L����t���}X2������_cI��A�����
*��@q!(nnn�^��.]�������B1��
PHH�W������=Fw�?75�m�?X^��RL���DPL<<<T�zu���)&&F111JKK��b1�5�����|}}���/ooo���s��YW�`i�\c{1�$�
���X,J\�^��MeX@1sssSpp����e�Xd�X���it[`�d2�����+�LJ|���O��hl/�H;zT��2yx��];���@P�L&��K�-5!���[�3���t��{�~��s���%!�q�v����Qbu���P�.K�� %D�GZr�����g�-[��������|��7�.(:�J����CFw�?!��7i�IR���*���N��`.^^�h�����"����g]����>el/fW)�V��'m�,I���nyw�������,����u��(U�ol/E�q��R�$yu�`p7�,q1��M�?X���QTI[�J�����kp��������J����5�I�����L��z�S�Y��l�$yu�`p'��!�p��!�����,UnR�s���S�'����\������$��K�6(��7����k�h�nczp�����~N��/+f���T��;Z�=`�N�?X�n��+�KQX,%���$��P�V�X�=�7j$�-J�.(���9�A:�w�����u��+����v������\]Uy�\�����]��HK�~� e���O�q��!q�:I�W���_�2�,`�����+�Yj}_���PG
�\�u�)i�zI�w��w���!����^�R������J\�N�������8�,��p)%�dkF��z��l��dIO��A����_%R/��q�d�w��%R�Y��wl������������oW��e%Z��kW�K�&@Q��
���������]��]�R�~%[�8%m� I���S�N-�z&�I��{g#�\JB���}R�'����K��Q������;v4��������R����>��Q�Y,%m� I�����nJ7W�Y.����d)���e]=�J���&��!eDE���)����n�T#�R���������.o\��A����$��o�����nJ7�(%�#���o�<�J��Oy�V���Y�~�]�x@�		%V���,I�����j�U`P
X2�������|��������3�_�P���f��}w��(c��HM�
��$?c{�$m�"I��p��:v,��.��r
*�zeX\#%A��E)�R���dd]�n��{�������+��q�d���w�`tK��,�qvW�?���L&��_��l�$�7jD�@)E�H���Vn,�>W�����|����,��
�y!�k$���W)+e�5�C�;@^��J	Q���RfZ��=�#���[�u�7	k�*���d�XJ�6X�X�Ri�i�/���4�vYg�Xta���:eX�� y4jdX}��,@�{)�zSK��b��v����]�5�'i'Of�_�����I��T�=���%��\�u`��RJ|���P�VGc{�c���$y�k��W^1��F.F7@n�`y������$��]
�����
J��K���|��KYW�����I\�N���������"���Hi�����)��W�K;wNi��I..�����vPJ��SRL���W��J���)y��|��M��#:����������"I�l�R������2�,@�R�������]mE���J�p�Dk�Z��P��e@f�t�O)5�d�^:�u��+��p����%I^]#F{=���\�����.�������]��{��?{w]g]�
��$i��+�-�/���
���(3���� :�#�G�w�pq\��q�Q��]�ED���*��HAJ[
��tK�fy�?�F:l]r����9���$�y�����������:eWW���.I2��c3l��*n��e�{�������7��1�zJ}3�;k��#�+W�a�������@X���=�'&/~S�]X�f�N��L������6����v�V��j{�u����������n����2I�:cF�2������|��u��[���ak@[���g��V�m����f�\���������=��K�(�2�.�,I���6)���|��i9�����s1�����^Q$o�()�����OF��O}�c��t-Y�b�����#)���T��fZ�~kxk2i�j�0p�]w]��y�T�Wy
Uh�n�Ym���X-��U���Tu����,�LV/�&����a���~��I�VX`x�%y���[$����[�,���u�X��w��$i9���f@dp���9w>89����P4$v�&����jU�v��Yw��u����i�v���@cp���9Go�L���.<����J���d��PI.�7��-�rq��k���������l]�\��9s�$c���L�����[45�q�m����,`�]�������b���j}���4qb�m`h2�l����;���T���#�}��o&_w{{�o�)I�:}z�m`�2�l�5+{�����x@�]`S������#M�m�a��Vu�`� ����m���=g���g38t,\����ny�~��$I���)��n���`���6�����W�a�,������<r���d�N�^I.��pO,�v�j�}�����g�Zq�%I���9��au�m�n��~�k��<�,����9��������_4$EQ�\�r����pC�d�[n�����F@=��n����yt��Xm�Tkn�-e{{����������,�c�oMf=�\W��'`�@�6gN��e��

�����?_�,����v�&l�����$���W���,�c��z��)����d6
K���>Y>?�5��V���9s�$-�`H2����jI����������d�Cj�}�����������]47������T�C���$�����}V���g��Z{��\�0������u��/��b���f��,��G���L�'��k����{�@�6gN����!;��7��
X)��{��/K��X�]�?h���$I�GT�J`P���d�I���-{��lS�<����L���I����+n%���/>�<p]�s
`A���C�\�0ijJ���V]B`P�G��9[�'
uz�k��d�#���������.K���u�\s�mI���(
#G�-��)�d����7~3�m�}�J+~��<��7T��:}z%���e����L���d����tu$�]=�-ck������6I2��/����n�
�Gg���W�<��O���&W�[��a-�����A�6{v�d�/})��=��6�e��X:���]��N����%�����c��t�Ri�6��:5g��h_�s�����S��CA���I����c+nP{���;�����j������u\�2��k[?��:cF�M�������]��O������I��9y�;�I�������+���X��=��m��`�rFNH&�Y��C���o�����pS�,`�0�0��`MJv;��.0�t.^�;~5���M���|�Aiz����P%X[��{��~�tu�'o�#=g�����P�6gN�d����y�h�m/X[�O�K�����c��&v��g'IZf���	��f`+�~��<����=���4"��>����X��j�0��^��YQ���Z�sN��d�j��V���Ys�mI`��,j��SN��~���>��.�����C��w&?:=)�k��2��0Tt�Y���}��w_�2�5k����e��q���E���_���O��*<zo��U��dXk�r��w����3�������J�G�����%��s��/������k@�d���s�c��P�]�M�~�uI�Q'���g�Q��b���L�Z�<���}���`.\�$9rdV�^]q#��
X�c��l��k�M��~��2�%/��}�}��k������$ICCC�:��|�C����Y_Kn�,IY����=������^����oL��L�Vqj�}���=o{��R�=�����'�rH���o��U�nu}3��d��7�rk����k��q���k���P��3���'r���'Iv�y��s�9����+n@����Y�s��o$�c��;bT�:�>Y��k���$I��i)*n@-��O�t�M9���z?>���3j���
�Y��d�]��U��Y�������w�����o����,�������bx����$=XN�Z�������N;-]]]I��N:)�|�++n����+�+?W��������[��/g���W�a��GW�@���!���>���q�I�q���+_�J���\K�9GN��Sk�S�`�����$�����y��������i9����P��*w�uW>����~���>���+l��h��<����7TZ�:/����N�����4��x)��b���9����n��$��32s���[N�_�,}�v�_xG��2�v���6gN�d�����&`��������nH�><\pA����������w_�O��I�����Y��$�GYq+Xl����o���?����g����'W�g���y���6�{���[�6}k��=g��d�W�.g��d��kw`�����Z��.Ym�c��e����0��b����o�����$�'O�G?��J�|�k_��>��J;���=��]����P���;rH��zk]s[
`P#��l^xa~���%I���\����W�
�~��'\�tw�'o�m=g��������������N��v�k&C�,6��E���|������m�a�b��Jr����mW�L�h���$I�QGe����Kf��P��&Xl�w���y��'�$�����/|��B��~��9���6�{����W����)j����������O�������'����>I�r���`��.������?���?��?3n���
=��I�2i���kCD�=�K����_�U�!�w���+n}�����`��q������
��{bar�YI���e�x��lW��
��.��{�I��vX�m�o�b�=��������R�f�c��yO���n�-x�V���������>�e\2zR�s�o�!I2|������U���,���=�^/I���v9���4������i�=�d��_��'��[f��I����[&��,�5=;1�f�d�V�|��;Y{���d�:��Jr�`��.���tttl���~����>�����n��}�{=f�=���~@���/���/o�m=g���eCG�u=�B{��?�Q�S����c3b�����f�Mv�QGm��45m�����}��}U	~uv�rq�sG>�����V�[�57��$s���`+��f������\���iD}r[�%{Y�,`�Xs�m)��I��	���U���5�fE�����g$
^�`m�]�$i�6-EQT�6U0�=p]��/']�js�����y��+`�k��u�u!�v����E��y���gC�^�e��fR�u�\{�I�VX��`akW��G�-y�����]jto`H*�����N����=�q��4O�Z�\l`a����d��v�T���7]�?���%;���IQ�-{�������ny0X���^����,��k��������_���z����	���f�N�����}�����,�~�}E�����u��n[�L�-�>gN��u����[�@?�bQ��U��d��/w�n=�����$-��W��R����=�6;%'��.�U���x����!-�^u`����+�|���^�:I2r���;6c�����L�>�<pmR����c���-^f�K�d��iY������N�4x`G��_.��`��������5+7�|sn�����7/+W�|���=:���k���L�:5Gyd<�����o�I�U���j��V]~y��w_%�cN9��\�o������:?����_�:�>�h����xk�+V�/�K����|���O�L�4)�{l���7�e/{Y���iw��-��|���yTm2�%�T�{���k�M�l��wg�G>R��b��4M�T�<����C�=�X������.��?�d����(�2^���O7j��k�>�h.���\|���n����w�#�x�;2�_�@��e�fE����������������a;�Xq` 1��,X�s�9'_|q��[���UQ�o8G�����.�F�Jkkk��L{{{V�Z�E�e��U��8VY�y���s��g��s������|���N;�T������d��d���t&��=��cj�0t-]�uw��$i�6��6�@ck+,[�,g�uV���o�_m����/|a�:��|���o��2y���5�Y��r���s�=���;r�-����c�^�@�]�6�����������3s��gg���}�3@w�U����/oXK2��~y�U���'I���W�&N��
0���B_��Ws��gg��e)������������x��y��^��[�6�G��!��C9$o}�[�$�=�X~��_��?�y~������3eYf���9������?������w���~F�?�s��>��G����Q������k�$-GQq` 2��������(�������9sf����d��I}�7q���v�i9����x��|�;��������;7eYf��ey�{�k�!g���s�����W��*O|��y���M�n]�2���$I�,`��
eYf������>�����)��.��&M��>��|����~��|��_�M7�T�lx.e��]U���e=g���e�7����t����|�k3&#�9�����gk���/�9���W����u(�"�{������.�^zi>��OT�6������?�yL�3���������$��7������[v���ihm�[0x��Bw�qG����F�W���9���������������Kv�����A��7&��i�a�4O���^��L`m����?��C���I��s���%
uzSCCR4�'��i���$I���^k�`Y�"�;;���������#F%��k������I��qD�M6�,B�\��~i�sFN�}@R�e��/�pww���.I�:}z����,B�/�9�����T���!����7@���G����+�o=:#����|��e�����{3g��,Y�$�l�M>��|��U�`�[���<��d��v,�=�`��WI2��oM��e����o2j��'���������	&<���,Y����-���+���<0]tQ8���t`�[�~�yt�=��?�1I�|���u��J:��U���`��������N����d������U�Ve����_���,����n�-��O����z����@��]��������>k���s���g�F��%��6�����KS�e���I'��m������},��{o��HQ�`E�$Y�zuN:���s�=iii�yjo����;��7bT2v���v�Z�:��&��Z�zu������W����������F��UCCC���7��#���%K��o}+���K�,X� ��w^�<�����V���s�������yc��o�}�P��`A:x ihH���U�0`���w�����$IQ�1c�3>��?�a��[����~��y�;�����O?=�vX�����,���|�� �fE�9f�d����0t�X�e����+j������$�/zQ���y�`a��x�����'f�������.���z�=��h�*I��f��s�99����$s����y���.��qk6���Mn�,IY����{�f�)}b�W���>���f����u��`������$EQd��I����k�����OQI�7��
O����?>��
KGGG�����,���g�����7i��efm�c�d�1�d���5�+F�������9���jkk��=z�3>���o���k���es�1O������������{�$.���<YY&kV�\�����	��������CA����nH�L����|����i��������
WOg��9��---�:u�3>v��q��+W����<���IWG���&#FVZ�M���'�+V�a����o����`���1c�$eYf���������:IRE^�������n���-	0@t�In�a��D}�:���Ec2��>�l����K��vX�gy��2�UC���k�����3�����N=f��������(�$/y�K���K�.��=zt�u����cr������d�K?���6I�r�7������:(Iz��.���|�3���1^xa��[��������x����,X���~;��C-j�K��9'���`Z�rw;�~Y�M���f���'eY���W]�$i�V��X��`����n��?<7�pC����������y�����(r�������NQ)�2;��C�x�E��o�=]]]Iz����s�z�(�k_�s�|Pr��j���������&���?��)-�V�\6��;��3r��'�(�ttt�_��_����'


Y�bE����EQ���O�{��7���9rd�L�R����,����,���������c���������jj�������#_��4�����V��t�I���K/�4EQ�,��\����>���{��3�x�{]r�%��s�a��(�ZV�lK�O����c�����m�]�$i~�����w�m�o`���~���v�i��������e������/����g���Y�r��w��^���/�Y_�-����9!9�M}����^���������j�6��&�G��`�����w�����}���K����5����~�������9��������S\p�;vl��'�pB�kl���{�1�%���.Tk�V�,���:�:uj�N��E����}�����u��F�V��ju�Z�5���$i1���0�0��x$���IWG}����>�>y<��W_�u��W���L�����N���u���3�0���Fr�U��m����ll��w���������U�@�e`k[�s�rH2n��d6�Hz]}�xf���Y@l�q��rH�����<�c�{.�,�A�cm�y���=���
u�6kV�d�w�+���G+n3�U����,X� +V�H{{{����{y��5h&����FT���*��w��(��?����;��E]�+��"s��Mww���(�tvv�a;`0�0�5������{�I�c��hnN���U���0�U���9��3r���,��eYu%`��\�s6�����6kV������0��`�X{{{�9����3�w��(�$1��\����@�V^~y��sN��Q����$�GY�,��j��������SE��HY�)�"|p��o�L�0!���U����������E�vU�i�zK�9'k����f�z�+����V
�Z�*��_��;|�$��zj>���f�����PK��|�bQ�-z�I���[m�k�f�m�%I���w�����<�i���|�5��-a�������]�6EQ�(���]��W����ku�nU�y�k����v�vr�<��C���nK�n]'N��7�1EQT]	*e��|��$IY�6lX�9��ju���s���6;V�����pC������_@���f�W�N�E����;�����P7eW�������X����8qb�usss�M�z�Z?�U4V����l�{�����{���WW���L��X�^������/���[��W�[��y���H�!��-�3O�����S��.�d��yY�hQ����L�2��Z@�uw������<U���Yp�	=k�u6b���8zt�s�?2�Ucg�yf���w&I�=��|�����Pk���n��
�~���k��L�;d����-�hl��7��ny��y
���������E~��_�?�A=����=���PC
`5V���j���$����&���W*nCWC�������9��cS�e�8�����o����_u-�F���~���������O��~x�M`h�J477���/��?��|�3��������?���:('NLss�f�����d
�[��s�E�44VZ�'�no��?�9I�:mZ�e`�3�U'���3fL&M��y���,��v�m����,����Z?��������oN:;���vi�y������i�:�;wnN<���u�]I��(��~eYn�=��)�z�����Q����Y���lY��W��WI����-���[�pa�:��<��#
W�eYq3�V�:{�F��x�?�I>��J;�~x�����{�{��E��(�E��,3e�����w�}3a�����V]��������[n][����O���+�$�v�-M�o_���	2��o�{.�1O������s����_577���F���7U]
��'&�[�fe�M�^Cc�
���Y��$����������6@U`���Y�R�e��(�|��_6~���{��U������/���������L�Vu�B�jh����#G��[���
����^�����5_����)�a#�.������$i~���8zt�m�*������$IQ�c�=2l���@�Wv��
M���j���6`�yd�M�����v���
0��e�Y4T�`�[���g������_�UW%IZf��[&�?�����EI��,3o���e��(*n�[�~��������3�����=�><����=�_`���������g��9y��'2k��u�QU��~�,{�����Y��=�W

���/$
���n���i�������;��3s�q�%I>���d��9ill���_ew�Y����f�N�4��E����^q`(�^(5v����#�H����7��SN9%���U����@�����$i�1��&�Pe��=��|�_HSSS~���e����E]�'�x��j����=g�U5�6{v��e����CUS���������&M���s���g���y�����v�-'NLss�f��(��������P������U��eY{��I�VX@E`��5�\��I��m�.�2eY�����<�Y�,�r�{�`R�=g�Pm�z�\�8^��t=�h�����I�2���3M�n[�<��c�"�����=�_����\������9����k�����r�[��i���
�����nH���93c�����������j��L`�Xwww�``������OJ��~�k�:}z�mj�{��J��,��":<���/I�r����O�J��s���57��$��^i?��6��� �_��*��P/��S�����*nP?MUx���9o�
�Q�c�e���r���g���/I����=�*��~���9����������o����^i>@=�����(��-mW_�$u�qi?���#��7#<���U1���N>���{��y�^Pu�$���s���},?�����[����0�t,X��y����l���q���+z�e]r�%y�_���������*�q�}�e����g�}�������W��g�U@��_{m�����_�����Bggg.���L�2%�}�ks�UW�-������'��)S����.JGGG��������(��ms�$IZ�O��	��ak�v�i)�"eY���;�^zi�9��������'>��n���3o���|�������c�9&���/�����,�������m}�	�V�=g�U@�l�j=����MU����o��xG�8��\w�u)�?������s������v�!������:*S�N��)S2l��M���u�r�]w��[n��Y���?�!.L���
�8���w�y9�������*t��`hZq�%��TuQ�Y���$IZ`����0u����3'������O~2��zk���������}/�����$����e�]���;f�����Q������,�f���\�2�-����C���k��%IQ��;�����O:�{l�~b��r�V�����%K����O����=l�=2l���0T���x�+��W�"������������+R�e�X����������y����~�AQ)�����w\�8����e/��O���k�EC�=��k�����;M;�����Z��������~y��KG}t�>��<��C�����������;{�^l�[������,��>��
oxC���7f��w����O����������$��;.�>����PK�j`��w��g��3�<3=�P������=;��rK����tww?��744d������3f��/��+��
XEC�=��k�3'I�:cF�M�5X5���;g����9sf�d��uy���2��,_�<mmmI�����7.;��Sv�i�>���P�r��NE�=���nk��[nI��L�^qj�V�
><{��G��c���@�T�EC�5��j�����3M;��a��Ruj�����=gQT�H��}w��)��j��1~��u���0������9��j{��_�RV]zi]3G��?�5�j����{�EQi
 I�
7$I&|�����5�k7.��=��9T����e�Y��Ju-_�uw��$����i�m+n�`�Pu��l�������nJ�2�v���}�����,[��x��C���=gQT����nH��vX�M�`��,[�\���[�$Ec�
`hk����$-/~q�M�`���x��l�l�S�]����=���T�c�������,���~��I����{6��,x��3����zq�U���Ys������g��V���e�����z����_���?$EQ�c^��4�Q�\?X�d���?3���9s�$#��7�\}u�m�o5T]�%X@��f�J����Qq�{������,�b��g'IZ�<��&��`�����
X@��V���?�9I�:cF�e���.�JYu��);:���M���u��Z�4�����w��v�[.��,x�W��������K_�${��GW��f�FQT��/�g�J����e}�	u�-F������nyPO������,`�����$�N;-cO9��6084T]���|��CG���Ys�mI��3*n�GS�����>����c3v�����.�:uj�8��w�q}�0$��*�jk�C�
7$����.���U��A����]Y�}����3�?�xx��\s�5�����O<1;��S�=��tuuU�#��g'IZf���	.MU
��HY�����,���������?��#��'>��������������������@�����,���R����;.L��N�^�,J`���G�;Vu���g��
b555e�]w��q�2b���X�"�-��%K��}��(�L�6-MMMY�jU�.]�y��������eY��[n�q��9s�d�����\�����3�I����/p������_�j��k�I�|�s���g���(�������-����z��1b�S�o���������o|#w�qG�d�����O�=��������:��_������w��;��G>�����u�9�r�VQi
�t>�X���N��M��y]F_�����n5����(��{�����������K�L�2%?������{o��vww�_�B>���%I&N��9s���`m��o|#�~��S�e������3w������}��&��?��}�����;��3���O������Y�/>�l�o���W���V^~y|�O���uW�u`H����Z���/~��|��_NY��i��2{��M�J����|�#�����e������O���-{�;����:������~��?�����������k���$I�a�U���j���x��(�|�K_�6�l�E��?���������~�q�}�C�v�mS����k������,`��]w��;��3I2r���p�	[|��(����������Oy��#r�	'�,��e����k��������L�������$�`�k���`v��7'���u�]3l���������r����C�\�$y����*`(+��@�������[o�{n��e�^�2�����>u����Z�hQ���#��~��O��e�Gy�i3q����+Vlu&��S�?
`���|��<t�1IggeZ^������[�V
55���-�2=��V����6l��f&�`����
X�����I:;����u�1u�/�
�6��^�\�o��������z��%���s���n��~��_�^o��vO���K��^�;v���������_{m�d�k_���~�m�������!��$)�����?��-�����\y��)�"EQ<���]w�����.�lq�Pe�
�]��9I����+nd�jh�=����$)�2�f��[���tvvn�}n����t�I)�"e��T��'�����v���$��)S��8Y�^���t�^�5���$i5�lX5���}.eY��W}������������Y�n��~�}���3�8#3f����K�$EQd��iy�+_���/Z�(s��I��Y�i����0���OX���S�����v���v��0�5U]`�{��_��O?=_���zG������|��9rd:��L�2%c�������j��<�������2w��$�h@k��	����6��_�z����$


9��c��s�����\��eYz�y�^��n�kn�-I�:}z�2���V|��_MY��������-�2�V�����3{���|O����(z����v�\y���k���6g��9��S�$�o�}v�a��D�XYu�4K���,��g*�n=��Jr���V����9����o��oY�hQ���a=�'e%���������������{���/�ac�?[}�5I��'���{�]�����3�-o�[08���O<1�w\.���|������_��+W>�c���{��W��U�9sf��k�:����=��r�k�f��7&I&��d����:>|x���7��o|c����������'����k3v���?>S�L��q���0��e�Y��[s��)��M��I���U��l�*TE&O����'W]�
���sk�=;I�:}z
km��Pu��l
���`��Qq�-�Tu�O������z�K_��+��KV�u�%IZ�O�K@_3�O���k��,�����8iR�<���}�<IY���,6C�
7$I���K&���%���CR4yi00y�������\q����[3��,_�<���)7<C��������_����h���$I�K^���}�m�?Xur�-������r��7n�������VB�������6��}�V���W�``0�U_|qf���������
V[2d���Y<�
���}��TeWW���OI`l*X5v����mo{[���RE��HY�)�2MMM7n\F�YuM`����I��Ui=:#����:����>�;~U�eZ[[����''�|r��w�45���?)���%���<q���\����k���$I����hl�{>�@d}������?��O��W;��C��������UW��U`s��������^i����+�H`��u�]�$)�2EQ����7~���=Gak@i���$���(-/~q�����6�yO�s*X5��#��^�7.�|�m�$��bk@i�3'I2���7���6<���fk��M�E��w�=�������X~|��nk��[oM��qD�m��jh��I�����6��������4��c�v���:lX54u��$IY��?~�m�,E��T�s�$IZ�OOQ�` h���`����g��������e�����n�!�Ru�>�n���s�=y���p���\�23fL&L�����?S�LIccc�U6IY��v������-+������u�\q�%I��#��[&[�V�}�������$��>��\~��7�z?��O����.�^{m����t>���c���)������}�<yr�Zl��X1��Ey�����+*�n=��Jr�|�j��SN��~����?�W\�O}�S9������U�8��,\�p��|��|��_��^��~��9���Rx+$�A���L��YI�������#��=b�}����u�`����o�������~��|����_���|����������g������;g��������%K��C�,���ttt�S��T����/�����l��A{�������R�^��m��v]�����J�S�j����t�d����}������K/���^����/S�N��I���������'?��u7���o���;.Gyd?�����ni�_OL.[�,?��O��O:,���E]�����_��_�]`�Y��lm�g'IZ�O7~��2�Ucg�}v����zE�r����/�w�����j����u��o��~����6�d���y��^���>:��zk��>�����SO}�h@������-�6kV��u������Y�@Q��D��lj5�������6��{���F��h��\{�����'��W�����;�s�$1��sk���PP�`U0e��|������{?w��wg�'5��f�
x����g������}����z��--i>����0����?��UW�7^��l4��d��
�<�A4��������_�kf�QG�>���<�j������B��f���>7n\5E��������F�h���$I�����7�>��)��;��9x����,s�M7m���>��6��w��}�����$c^��l��wV�����
]tQ~����'O��C=��F�[����nH��~x�m`c����/�8��~z��


��W���o�:e�s�_y^w���^�<EKK�����:����0�����C=��qGGG�-[�;��3�]vY������
><\pA^���UQ������j���$I�!��6��6�1Xl��}�k�����g}LQ9��c���}.p@�wX�xq{������s��y`�+�`���U������}�W����m�?�Y�������
���z�������w�y��W�.��:��������&�WI���>����`K-=��,���*��r������1���v�u������(�tvv>����3��W?��O����$3f��E]�=����J��~|��W&I�O����=o�o�����[F{l�s����JeY������;/��w^�����y���s�����?�y~�����=I2{��r�!����2u���<�
������\vv����$;��'i�o��l��,�\KKKv�q�����9������|$'�tR���?'I�x��������w��q���I������N:i��g���y��_�'�� �����rk�_��r��4�������`01���N=��>}�`��{�����A����'I.\�/~����g?�'�&M��I���^}���k�$-������6����B������q������|�S��[�����}�;���,��R�}s��9s�$�G�77�A�us��'���NK�����~8����.��Rq3`��|������Mz�����d�t>� ����-�l�=;I�2}��+X���q�2~��<�����{��G`5U�e�M��u��&=���Lv97���M��?s�����r��[w�`Q�a��U]�:����jl������75m�$i�0>#F�h�����?���u����,�f���Y�t�F��v�m+jm�f%IZ�M���������|3s�k���_S�v045T]���W��U����x����n��*lm�c����#7���~�u`Q���9���6��+_��44�� P[m�f%���
�WEQ�B��z����/~����]��a�����>�F�Jcc�f�ijj��g���>��n�i��g���y��^�������kll����������y��1o^����i�6��z�jV��jV��������>�Gy$IR��s|G�����6_��s������O�K_�����>6l�F�+�2��{o.���|�+_��%K6���������~��T�{��<����s���ev���$i>��4��Y�[���1�U�������;�w��(���	��!��(��x��7��o�1I2|�����7n\���+Wf���Y�r��~�����������+~��,���*����m�c���l��g��.���|��_N��F�����f��	imm���V[�n]����=����������;�������>{v����/M��u�m92�f���o0�5g�����r��gn4|5e��|�������#GV�p����?�/��\u�U����b��g}|Q�o����7�)��zj&N�X��@�v�uI���{_F��U�yf��W��j�V
��=;�=�X��QG�_���iii�����2eJ�L��}�C����}����s������+������Gg����u�]s�Ae��1U�*��lY��uW�����+n�i
XP3�j��{�I��e��(r��������!{��w��{����\�
7$I���g�&N���s(�.�_C��e��%I�������=����F�h���$I��i7���J[���Tu��l�����&L��	��u<�pV���)�����������r�Vaj�V
M�2�������	��-z�[���++�n=��Jr���V
M�>=c����+����-�/��I���a��ui���$��?>��u�n>����g���m���(�jk�`f��F��w�������,���=���'��a����r��4>�y����RXyz���0���O|������s�����|�>��L�6��ZR+MV,�����K�cf���Yx����������@����Q�F��+��K_����??�{l���/�_��_�S}j����N���nB�vJ��)��$�Vu���h��^���/xAn������o�o����93��sNN<��t�A�8qb���7��Gyd
�0P�x�g���1�c�m���2���/eW��g����*����gJ23�@�BK�(X-!�E�b	.�/��b[�}uUX~�����������@JU�H@:!=3�Lf����,Q)�<g��s]^�<g����c�����>i�v�4��V���jnM^}@�)`�R�U'�n�i�=�����o�<��s�����[�yEQd���}�Ac�f�{�����E_��������%K��{_N������h��j��(�������~������R�e��H��eYq2�*���]�<��Jv���W�f�W@u`�Xggg9���|�����^�f�J�4o�}F~x����{�)u��r`���?���t�M)�"EQ�,�444d��v�N;���7�8mmmU�����[�$cN:)����+NP_
�jh�����W��[|�$�y�{r�Yge�-��8�UQT��WR�e�o�9I�6}z�i�OV
��5+���)�"EQ������/W�A��w�2t����O<�45�u�=��Pw
U�����d���s��gV��:n�%I�2eJ��*NPMU�zzz�$EQd���7n\����,+y$��sNz���������$m{�]������j��z����	�Z+�00=��Y���U�{���W��j
�jh��I��O>�d�I�����[�$c����~���m�r��8�����O`������I�&��C�|������������� WT`�^�(���]�d�g�i�M+N044T`���>�{~�YgU����,�N0�t����e���N�@)����N;-x`����_���;��H�:n�=I�:uj�I�X5����+��"o~��S�e>�����N��?\u4���G�m�%IZ����$CKS��3�<3I2e���������ss�%���K/��^��L�2%���OKK�:����?��q�2+�>���m]wv���D@�)����~��)��}�VQ)�2eY��{��������`0X�==����������hiI��__��C��
��k}�e��3�?Y�������2l�����(2���R47�o'
���,��#0��w���|s��m�}3���*N@�)���Y�fU��b�������$m{�]q�AV�����UG�~�,��-��g���P
U�VQT�`�t����O<�47�u�=��@4U�e�3�����K����>l--���$I�������n{��,���K/��'�P���}��d/���b���>kV�d��^��;��G�^Y���w��u�@�`�`Qn����nK��?���:��
/CV��t�M5���>��l6CO��E�����$�S�V���LV����~)����E��+W��\��}z�c���,���vi�l�>�/��N���:�Q�m�%IZ�N�8	���:X����X��[J�����=���k���5oX�MR��J�������o�)�,jOV�}�3�Y�����������~�����IV�am���9���:"��sg��y��j�<?f�d�YY��Cyx���;�,jMV��O�K�����'?��\u�U�3gN~��|���LS�?:��h�e��:ihH�b������I�46�����u�����u��]X[Z����v�)?�����������>��/�8I���|��d���������%I&=�d�6�l������������);����O4T���/��/9��CR�e.���|�{��:}l��w&e��	���
X�g>��$IY���w��$i�}�
�S}�jG����{f��6J���3'w�}w���K�g�N�����z}�,�2
���f�m��=����*L@_����$I���W�j���������,{��g+L08u�yg:~���������'�H���.6���LP+
�������������Ra�����3���z/�,���wN������o�@�(�@~���d�����7�|���B���3=��a���<���hl��SO��^�3X��9s��| EQ�,W��k����\:n�%I�v����K*N�����+h�:]www����|�������<���)�2EQd����z����0�����I�����8	nMU���n���^GGG,X����$�-�J�����{��}��U�kv�zk��m����������`����sSE�r�'(��wFccc����e�=�����x��t�����%-��Ru�`�IQ���K�^<����������v��O��'K��6+�z��{;f�N����[�a����O����PW
�jl�m�Y����(������Gg��	�e�]r���g��w�QJ��a�
7�O�Zi�����t�)�kGV���;������N�4���d���u��8fL�}�u�C�,���Y��$��<3c�����`E�`��I��`A��}w���Mo�8�UV��,����nJ�2�&ON�[T�!X��f�J����M'�����fMU���w�Yy��s������ioO��P�������v`��������K��Eu�����q��u�TCV�m��v5�[E���S��I�5gN��>��a�x��)�j��i����a�������������(R�e��-��O�����oO��L����~u�i��DV��EaUY�5)�x9/`���g�IXk3`�P�Uc�l��:�_���g��Y�re��-�7n\F���^�,�V`����s��{������{r�%���/��%K�������������!�LO{{��{oX�:���NV?����)S�d��)9���r���������G�K.�$�{l��:Z���f��9u�������+���i�z���e��U���k�0aB~���f��)y�����w�;;��Sv�a���u�1{v�|��+��:mZ���d70x)� ���3�8#��rJ�/_�������+�����oL�{�����7�mo�������m}Hg������������tuu�'?�I�y��l��fU�j���[�$c������H�i������i�:ko����n���$eY���o�8PkeY�`�M�Vq���k�3fL����>Za�V<�P���K����]v�:DQT��L���s����\���$@=t�zk��e��RVq����:����������Gy$����d�M*NCCO{{���G�Y����_zi��m�����XDY����?�{^E^���V�
������2����4C������K
��?�����>�k��&EQ�,�l��&�c�=��C��k�I����g7�����m�mFzh�����;��3��{y��gr��w������^�e���?��?�(���	��K�d���$���K�<aB��`
����Q�Uc���g7���,W=�PE��HY�9��#����}X���oN�����v���HC�X��_E��N;-�_~y��@=,���$I���TqX{��V����eY��w���;���?<��rJ^����a2���L�����}��$�X���*������C/��(����d����z��3b��$�����������[n���6X}FV�����UG�Ae��_������-���N� E�`�`J���'IZ��+[����eg���u���:�X���q�mI����J��1�`}4T`]t�~{��e�=+N�XQuX3X����dI:��$I�,�eYuX;MU��~�������z?��}�������sf���.���������6��O2�@��W�J�2�&�y�-���zR�Uc^xa���o�(�l��&9����k��;�����*���O������G?����
k���3��sY��3u��y��I��=���nH����f
�j��K/�=?������^s���r��'�K_�R����/V�@%�{��/�Ri�����t?FV
=��y��z?w�q4��o}ko�����y��e�M6������o�1I2���*)�j7.cO9��{a@(�kGV
�w�}������u�]7h��������tuu�,��{��9��64&����nJ�l���f�!�T��������#�<�$)�"�n�m�
�A���m������9s6h���?�)]�<�44�u����0@)��������;�Of�7��|��E}2�V��7'IZv�%��FU���JV
577��������������,�d&��������$dMU����dUQ��O>�'3�x����M6��Of00-��73���O����s�SO%Q��]QT��LV
m��V��,��w��7����=��������{?o�����m�Yg�������1c`A?U�U'������N��a�����+I���������{�����{����i��mpF�s��*�jj��nH1lX�v7O���q�����GV
���e�����Y��$���7s��'f��x��/~��|�[�JQI�=��3c������/<�����i�{����NQuX���v����$EQ���;GuT����u�q�u�����NOOO��L�|��������>I����'�����v`��a�����;eY�(�,Z�(�zh��������Z�w�����|��9��C�h��$����M����:������L�
7$IF(�`j�:�Pp���f��v��O>��(�����3gf����t�M3e��l���9rd�.]�g�}6w�yg�}��$�-�*�2[o�u.����#�\����_�B�}���z::����R���u�������:���:�|��s��W�������sS��DAY�y��gr�5���w��L�E�[~��v���+����o^����e�]�g?����l�g�4���u'�Xu���;���������\v�e)�������$���!'�pB����d������:h���$I�n�e�a��~aSS��pB����`�~OV�3&�������~6_�������<s�����O�4)�zh>��f����cR�U�m�%I������o�i�S�U���'����O�<����3gN����%K�d��Q�h������g��6�8)k��������$�S�V��?X�|������W�
�����g��4����yM�q����:�����@�q��I��=�H��Xq����}���3�~�����u����?L��N�V��/�(�Nk��A������3��4C�����(�kI�����N��y�4n�Q���4)#8��{` R�U�%K��W��U������7/.Lgg�:�(�"_���k�``�^�$���+I��O~��m��8@�����)���;��3��{n~��f����=�,KX/���_&��i�8Q�0��U����N�:���y�����NY�z��(���?��K��� i��/�$m��[q`m(�����>;������^`U��_|�s����`�S���������O}����,��x��9���������~u������;S�L����s�����n���tvv�(���5��\�W��UU�J/k���Y4sfR���:��#�,�����/)�����>;�sE�o��y������n��f�a��${��gN9��<���9������?<�@����������;�X�����]]y��L����e6yr�������A��^`���+r�UW�x�Z�x�;�j��_�������.��>��|����SO=��?<��w_F�U������;��xq����_�j%��O�}^��`��w�����$IQ9����{�Yg����g�����c�=���:+������UT�
���?O��8���y�;+N�w
U�~�����������k���k��g��$)�2^xaV�\��!�@o�AU�`�+�kGV
��??IRE&N����44��Agg��M�6-m�Q�d��������()���^�(�g'Q�����f/-�5j���3j��,Z�(EQd��y�8s�m��-�z��2}���	*����O�������������4)������XE�`�`�����{����_��1c�d��EI��{�g666��?_����i����E��N]w�|�[���`���[n�{�`����g��I��Ww�q�+�����{����xy���$��we�A�|_���Qo~s�����z�k_�$)�2�?�x�/_������y��_����>eY���o��2n����w�u��V������.<0`�e��_�2I2���.m��W��z+����5T`0�4iRo�UY����{���#�8"IRE:::�����/;k���9���R��i�=�������k��t?�L�a�����U�������v`�PQ�o��z?_s�5q�~����'&YU����=�~x����<��C��o������.����z�w��_��L�<�.�0���rK��e�����Rq������>�����/��/~^E���/�,�E��,s���������;��������>��{���EQ������o$/`�M�^q���Tu����c���?��tvv����M7��}��g�{�:��|���9����(�$eY�v���WIr�Yg��C��/l�%W\�_�j�����\~�]I�VXCWQuX3X56r����7�����?���'���D�y����yY��0aB����-o}�[k��g>��t��S��E[[�����{�X���@���1cF���w��o�����g�y&eYf��7��i��������]O=����(����)����{�N;�q����X�������t�A9�����l��[nI���2��+N�PRT^AC����oN��M�^q����:�X5�[����'�_`�����<��3U���{��t�{o��U�VT�������>��|������O>9Gyd�
Vu,���<��w������{���,���vi�r�����`�Awww����\s�53fL���w���N��{�Yu4�:��?�/�����<������:*�2.�\�.� �&M��3r��'f����::���3I���n���_���b���i������:�����g>��|�;����$)^x��,�<��C���>����~����O>9�{l��������Xm���u��*N�W�U'���Pu���3��L~���t�M9��S2z���/<YPE��LOOOf���3fd��7�������o�68/`���k�Ix)Xu2}��|�k_��O?��/�8�zhV��_E��,�,]�4����s�d����Z��)W���{�I��L�RmV�����w�����������_��_��N;�,�$��a=���9���2y��L�>=]tQ/^\e|0:x eGGF���I����UT�LV�6�l�|�c��������+��~z����eX��v[N=��l���y�;��k�������-���$I�.��h��CDYuX;MU`�7��
y���s�=7?��O��o;W]uU:;;{�)�2��/���^��/�<+W��01��������NK����}��9s�$-S��}7k���ill�G�#�8".�%�\��3g���oOQIVa���s��-��7���K+��������*���)�[
����c��}�{_N=��\p���G>�����c�Zk���$���O��������3��������
�������������������?^uX'eY���������m����_(��g�����}�{�9sf~��_'Y� `�EQe4X']s�����R��]v�:���~`�����O~��3g����NWW�j�WEQ�,��e����*�~��3c���S����zk��e�]�0|x�i�O`U�W��Uf���K.�$���O����^,�jkk�1��3f��HQU�����BV��i'��Q�UgO<�D����d�������d������d�����'����?>#G��,3��{���K.Izz��s�O~�$i�k���^�}��s
�����=?��2s����5+eY�l�UY��8qbN:���t�I�8qb���NY��;wn~���������3|���7.�&M�n�������ciO����{�������N�Z���k
�jl�����~�e��%�j�W/�^�5*�|f���������km�����+����47�pC����W�mnn�G�}�C�w�}���$�^����j����h��cC�S��i������U�~OV�}�;��-�*�b��8 '�|r�9�����Vu�}��E]�+V���]]]���+r�W���N������=��)xQ�m�%I�M����;��0XuU�e&O��3f���~w��j��#����g�l�Uccc��b�l��f������>�E��v���3����������#�`Hk��/�$�{�Uq�^����f
��`���y�;��3fd��w�:N�;vl���w��#���{��Q�F�����;7�|s>��O���o��~�w���O�����*"9
�`�(�kGV�]~��y�[��a��U�Om������>�w��]imm}�{��~�e��Yy����/���g?��2k����Mo�Wd�!���J�w$I��O�8
�����;���#��3�8#t�Z�z566�����]w��_�����/��"X�����k���{������Rvt�q��3l����*RT�L���#�X��466���x�����^���k�2@����c�������T��u���&�����Q�E������}~����������������Kzz����q�Au�_��������X���q�����E�`���nH���1#����T�
���+h�:C�O<��6�x�
��OY�Yv��I�Pq`�+����Q�E��|���}�0aB�
VQ��X����~��--i�s���@��Tu��o|��}>���+JueYf���������?�A��m��4���|@���:��,������M7�����O>��0��7��33�����������>��`Qs������������>:���{��x��g��s���w~��>�,K��2I����)�������3��k�
X�TOOON<��<��������������=��~�8��>�	N=��e���&I&�uW�����D0�4T�����r�5��v��.��[o]Q"`�[~��Iww���2M�a���:��,j�?��?��/~q�k���������DI�m�%IZ�NM�d����v����t���C��j�N>���s�95�����?��:}�����G]�<@��q��I��=��8	]
��s?��O2c���/y������.��foM�t�M�����d60x�e���nK��N�Zq���#��g`��f�����?>+W���v�A�{��^+L�7eY��OL��Yu����3IssZv��n{��|�[�?P�E��={v�<��,_�����i����(��
�0�u����_\������Jv
�*Q�e~��_���o�<����g��E����������o�:�:����r�a�e��������7������#*L�W����$i�2%[\tQ�E���5��P����
`�QWWW�?��|�K_���>�����LQY�`��~��SO����$��	2k����][����s�A��}�w���^�1c�T���:n�-I���~iy��
0H�e�	`�(����~8o��s�=��|����X�n�r-�4x�����}�kI�G}4�g��{�Q��k��G���g�}���������<����0���X��:mZ�I�zk�:�P��?�1��O�-�zi��K?��������'�~���Kk�wm=��S9�������^�j��r���g����0��u/Y����&I�:uj�i�W~<*���V�X��?<�>�l��	&�K_�Rx��,]�t�K��;����k���&y�����s�Ae��9����������8qb����`�w$==i�0!�[lQu����0����y���z��9��|���Mkk�:�:������>eY�����?��7���#��%K���C�����{m������~�w���y�
�������?��E������G�$�S��m'�(�����;���j�]v�%�\��������7�!EQ�,�$��~������}�umy�����~����|�#�7o^����u�5e���7�/��h���g�w�S����d/P-X5�����K�E��}�s�]~�$#F��V[m��<I2g��J
�n�������Oz�f��5+�����6H�/~�$��OZv��n{��������>�!��:�������{�G��<p�g�7��k���<�z�/O���I����2l����!����v�0�=��sI��(2q��44l���mmm�����<���qG���4n�y�����8��Tu��l�����������-�==zt��\W�W������H���w�EQq�����S�UC����=�7o�������������l������,��`A]_N�>kV��u�}�����SX5��[$Y�p���>�E�e��1�=����u�-[��y�v���@���I'e�w�[����[�^`hj�:�`6m��455�(��e����4��.�=;vlv�e�
��=��Yr�e��n�w��q�JvCSS��1c�d��i�����$g�}v���w���m�g�~����w���(�$�vX�f�����R�X����3���������;�����v<�Xc��G�$EQ��G�	'�����u�q�=�����Kwww��LQ��'>Q��@E:n�5I�:mZ���

u�@�y�������d�}�MY�z���W^�=��#�_�+~��'��?��?e���y���z��N8�����N�����Xm��U����(�Nk�Tu�����.�{��G}4Ir�=�������o�]v�%Iz��>�����_�b~����X�geYf��w���U��}�,���P���`�����s���������>�[f��SO�������,���5���E/���7�1W^yeZ[[��;��5wn��~:inN��)U�`+_��`���I�r��w�#�H����g���)�"Iz�/����,����SN9%������������f��yy�����cu�Yvu%IZv�%
^�
�����5�����O~����W��k��&���oS�/������>�zh>��g���uNC���.K�}�U�{�1�T��A�/��
���
��U��9���s�9'.����<���Y�pa�����&�d����j����
C����N�l����1�yO��6���y����`�z���@���bc���{�Qu IOGG��pC�d�	'd���'���_��xc���4��U��NU���VU'�5k�:���z��,����,k�c�~�$y�)40��_��O)����,��a�e��e��#�����J��u��7Y��)�
�����������<������+�k�������\s�5������c�e������HY��4�(���3�F)�Y��%IFzh����+N���=�
�Q�U'��zkN?���u�]�]_�����r0t�X�5��c*N@_P�U�����|�#)��������)�Z��,�keOO:n�==K��lG���������!#���������V��`���W^�}�CIV�]E�[������c���������^tQ�>����j�g�4m�I]vP[
�j���WeYf������?���:*�'ONCCC�`,�93I���vi3�f{��&��L���`Q�U'�����f����s���_������������0t=�D:~��$��_�"��zU��(�0��w�}I��,SE����+�`�X��%IZ�NU~�MQuX���f����=��^�]w���4%���/�/���V~�I�Qo}kM�0�(������$IQ�b�-*N�P����2w�=Svt�e�/���IDAT�����X5��;��/Z���$%K��2eGG��O��X�]#<0�&�t������f
�jh���iii����3g��,Z�(c���:���� I����g�O~��4@=�e�	`�4T`05jTN<��$Iwwwf��Yq"��E������$��;��4����0��u�Y������������l9�����U���z::���k��|y�w-�����+�v�1�_���������f
�jl�M7��W^��>8,�������93p@�����>�������s����u�O�U����v�m��v�m9���s��������������5���K������u���6�� -}���3����$I��{�hk����q���i��|�/Xu��W�:�^{m:��<�����[r�-�����(�r��>L@-,���I���i�j�L�����UG��)���s�9'���������(R�e��xA������&�}�I�1�~��+x��+�2�z��r�e��,�E�$J���s�f�������k�g��5��$O`�P�Uc��{n.���$��^m��fy�k_��7�8mmmUF�_|q���F{l����5���Z�|y�>������,s����������^u<�,���$�f_�r��|rMv4�Y��MQT��LV
�x��Y�pa��HQ9���r�����D@��������;�$��=VQ�IC��|0IR�e���y����
�Y�?���eZv�5�[nYu2��0�uvv&I�����o�-=,
������d�������|W�}�%IFyd�w��w���)����^�;�� D����O=5+�x�~K�"��9�~�j��:�X5��v���?���&:n�%+�x"
c�d�/|�.;���>-;�T�]�*
�jh����j����O��G�����l���U���]rI�d���f�)�T�`�*����)�����������g��$������;��P�T�re�\~y�d�;�Qq�GY&K�K�������|i�	`�(���O|�����{��'_��W��>���c��:�zYv��y��c����EuY&I7�$#�����Ps����u�)`���������4GqD�������o��?����?�cF�]u<�u���_M��%5�1���O�����'�[ulhJ��j��P�<<�nZ�)`�<1\c3g�L��������?��s���s������x���2eJ������u�}�I'�u\�����#K��6I��
7d�k^��K������}?����Xu|���f;T���MV��|��)���sQ)�2K�.�������?^��
��zZv�u)�����6i�o���.�de��c����!FV��e�����?^��Z�y�@���@�-���$�����w�����U���js��)���������f�������wY��_�tO�$IF}tM�00uw%=�����W���OV�}����:0�u�zk^xa]v5m�e����.��_sg'���twV���{�{��[�������f��Qu`�[��%IFvX6��k�k��_�����;�K�_���[u��3�UI�T�
``eY�`�}�{3���*N@-t-_u����o�W���l�]�	``�����GI�����Ruj��c�q���-w�6�X}�����s��L���k�k��O&IFrHF���>����?R��W���,�>6�_�%�����;����u�@}�|������W`��r������$��_H��[�|g�Fe�A�|�`������d�����������-������u��W�Y�$�m��N?=Ecc��X��K~���S���#�N}C�zj���������+_�������Zv�uI����W~0,~f�q���;T���l�m����S@�P��������������Xq�FW�����$�}��,0�(��EQ$y����(���/g�`���������dw�m�%IFp@%�X7+:V�[��C�����>��`��}@�������yO�e�*�0l��4���T�����B���js�P�k=�x��}z�7�o�)��ei�t�l��O�?@Qd��{Q���Y���U����$�����csk�9`�Q�*���&I2��#��?Xq^��u�5gU���>��0�(���?�i�d�a�U���Z�����M����6���q2qj�)`hQ�]�>�<�46f�AU��X���8y�d����TOV���9����C�f�m����~����g?��|�I'mP6���?�i�8���,[V�%e�$i�:5�c��n���}�qXk�9��AV��|��)�"I����|�
�������)�` Y����g��������ek��c��YXuQ�eoiU����ti�]w]�d��7g��I5�U���ck6��*����$��N��<��8���@����U0�-���Rvv�y�����^�
��3����N�����:�(�@���=�0�,���$�����w]5���U��1�F�T����q2q��S���d�����#Fx*������>kV]v-���$������>��hE����=�����,�D�r�}����7��$t���]�?����lz�����^u�	0���Xu�Zm���k�x��Gr���(�$�k^���0�-���$I��{g��}�.;[�LI���(j��}�qX[�9������������}��o���~��k=�,������G�=�������e��(��7�i}�0��e���\�$w��u��'X�:�����/�:�������,` P�����o�(�����,�$?����k���q���#s�I'��,����S�XQ�����]V<�P����T~���%�c��Uw#6�:�+S�5�X|U�eZZZ��o~3�m�Y��������g>����y�i5�.��������&�|`�Q�B��d���N��`���,��������v�!|p����g��I�5���,����W���a��l��_�]����U��vL�xw�Y*X}��Gy��eYf���KQI��~���6m�Z�mhh��#2z��45���:��t=�p���3����8jT��x/`
k�6�@�U�L�0a���l����^��%?�A�d�!�(�x��I���S�n��UGX�OV�m��6)�"I���Zq�W��e��?��;��I�Q�W�=�s'�������$/O��S�Ucs���:h���y�u�K��%�_���QoyK��O���_�H�~c�).X�
}����R47�nQQd�����q�j�`�\������!�Tm�?W4$
�U��`��==Y4sf�d�����y�;*N0tt��:�4����k�:�g�7���GM���u�QU�RV�P�5�������������d�X��]s�&IF��mihm����uu$����/�:����o�q��js��`0�u/X�g>������{�����t>@��9�=����M�N@_S�����������4)��yfMv4o�u��N��l���}�����IvxS�Q�B��d��U���)�`@[r�I�Qo{[������V��:n��d��+���PuX_=��g�O�$u�Q��^,��Vm����0��,]�������hQ�w�|���,]����J��)5�0Xu)���`�����3�3����QG�����;6�3�O���I������b���,�E}j���&IF���i�8�����2�������M��?U��/��Tu�
X�����.+~����9[|�ki;��H����U���Hv9��,/j�����
��3�/�<I2��C�_�A�Xc�H�o_m��,�!����s��OY����d��_�*I2���k2`�X�����Vm��,�!���[����kMw#Fd��G�t�@������Zm��,�!d�O~�$i���9����h�e�4�[�����9���I:�V�duK�]u�Vm��,�!d�UW%I��zjF��m����f%O?Pu��n�m�N�P�0D�x���x����)#9��8u��}��5�$;Ym�?7r�d�VU��j(��P��eY6kV�+j�k�u�%I���'�c��|@�b�F�W���,��R�P�g>��,�������7�u@��:V�[���N@Ez�/���.K����[���k��i�M3���k���x�kX[�9��)������,=��i�������hh�:�:[�xr�'���U'yy�KV�[���N���s��v�������<d�$�0��QTTA�j+����m����������W���*�o���
���2��@#C�@�3���c�`�s������ZY��������ZY���@A6]xa�d���d�
����!y���[l[�!Y�W�-��g�i*�J6|��Z���9��_�$�u��5�����������w�������&XO�}��y�=��KV�n���%/�K@-<9�5kQ�p�b�S�,�����/&I�^���zh�rJ�Rf���)��5���'�����L-�~���
����$�����i=���<�{]����[�~�z���0����%�J�������28���0-X���Zskr�_&��?w�,`<`S��g�������%k��aJ�R]������T�������6[k������[S�,`J~��l�������������%`�{���NN��b��,X���u��I������k��iV��5����f���X�������)���K�$��8#��������,`1�L���`*##~���M����$�N?}���}C��m�$}�n��~U=
`��,`Bl��W��Yg%CC5�h�����O��H��~����E�xn���n��`b��?]�������Q��6�y�z.�3Y~x�]��mn����[�<X�N~���]}�d�;�H���?�������&�^�������ow�&`;����������Ei�o����������^l���\t`������$���Zp��7�[=�`�Lc����T*Y���e��;k����o'If��������I�7���5��X0��^{m�����%�q���~x]���a���w���%Y|@�-�/X0�u�[I������7���Y/yJ

5������y���c�Sl��kjK�Z�n0}��i���+�$����3��X�5�[=��&��
�@���.����wg������t��E�x���X�������.3���@�o�)����gu_qE������0{v�����2���=��Tt��=q�4�0���:z��s�����9����k0��}M���^t����Yt���Ieh(����$I��{'MM5�l�u����?�y0�mx�z��O�.-���u�O�<����,���k����
iX�({�\�RCC���b��z������Z�$���L�u�%I�Y���+����jn/�<���0�]��G�iF�7��$�u��5�x�!XL2����o�-�vX2:Z������x��k�c�'����S�M������,&X�x���dt4���S�3�f9�r9�������k����'�����cA�
��3Zet4�.�(I��K_��SO-�0������^����b�<]��d���nU������>�<�����x�+��Lq=�s���c�]l��`0i
�uWz��:�Tj��}��I�Y���rKK�r��a��z6w�&;XLJ����y�+3t��u����7�%�x�������@O�ln/�Lv����o�)C���R{{:_���f5�X��SN�iP�\�\�������l�l�,&��K.I��:��,���
nLV��0���������&7XL:�J%]�^�$�u���&������?Nyc�]����4��&7X�Keh(���vF��k�1����oSjiI�)��,��z�g���mN�]��3���<��O��s��KV�I'�a���dS�`O�l�,�0>��J�����_I���K���5�*��f��������������w2:Rl��M��������`�n�-�w��RKKv���0{v��������{]�-����{�X����|%I�y����`������`��~�v�X���)�0>�����`z��2p��5��7�I��~�[kr?0un��e�d���v�X�H�w���_�bM3-J�)��4xn�#I���[$���Z:��LM����o;I2���3���j��z��)����n`�.z_����[<�����Td`��T*����$��w�+���Rp#`�U*����nhJR*�N��8i�]l`j2�0M��W^�6����|�u��K*�����*ij-���2�PC�������T��k����o$I:N<1������7�S=K
IcK�]v�,�z��������kf��_]�<�~7`�t$�R�]v�,v�<�o�17�pCn����|���������������+� d��/�.�0I���>)5���d�,��?�����L��!���&�)&�R�����LX��������'>�n�!>�`�u`R����R��I�n�e��+S*������W&*�E�����X���n�)�^zi�5`R�t��I����n�
�������E�����TN���
0Q`1�:;;���]t
���n����.�RI�W$If����������9I��b�Le��)�f��a���?<GqD?���{��9��������?���W����������%�������Ql���;��SO�+^������)��[���{�-�����=I��lY�������������
�����_Hz�������gs{�=�:X�������
�C*�J�.�<I������W���U?In�b�-�i�.E7��`3��m�ex���������]�����s��>����M���*���f�T*��5����K�$��|e���5�v�@O�\�������c�4���������du��uu�v��X����`b�&��{����U����e��w}��o%����XsK�li/��0)l����$�'���_ziM��)5��Q���������[<�}~�
�H�
/��G}4�=����Y�jU���#������9s
nt���KLv���.m��}O*�����?���w�yE���*����������,c���3p��Iccf�~z�r��������xj�]�~`����>�G��o���q�Ii\��.Y��
tW���b{0=��S�R���}.I����)��U��r[[v��Gkv?L��Kn�(������V����������g��7��M�zf��U9���jS`�����ygJ--���?O��9EW�i��/$�,��f�d���K0�bZX�hQ-ZTt
�ig�W��$�|�k�_A�tU�����_Vl�9K��K����d��J��u�h�o���9�?�i�d�[�Z��)=�s�1�.+���b����n�����KV���|����$���Z:���d���o~3I����e�Yg�4���/M����0��rq������T�������b:@=��)�{���w�;s���������!����n��t&�E���1�S���~����&ihH��_]t�V�7U�����w�c���rCq�Pk�`
�^�M]���p�2���$I����a�����L4�[=[g'��Yl��`�z���L��W�%k��__��I6`5w��;X0AF��O��~�$����Rc����a�����?���P����S�6>X=������,� �W]���������_,�L)H���dx��&U��E7���;��?�i���������������\}���z��%K������@�u_qE���u�+�	L=��v��U)il*�K�1���b;�tg�����-���v���#����O~���u�Y�����	n���|0�7N��������$I���N��0�
�T�=�LN�x�]��3����}��Y����4�a���qDM3`:zr����@}�`����/'IJ)��N|@CC~��)54L��0�
�V���b{�a�v�}�]`�*##���w�$�]uU�_���A�z7$?�T����&U��V���b{�a�����2��)��������:P�U�&w^]t�g����@=�`F����$I�+^�R����M�s�!��N-����;��_Rt���~��?H��W�%���K�$���R�<�����.{'����.��c�B���g�����������x������`O�l�(�03���?�QF�����.��'R���#�L���u�������k�W2<Pl����gKg�=��������$��3�������@������_��)�����`Pw�J%�O`��u��������1���b���M�]l`f2�@��(U�
7dd���g
�Y��L��#�'�P�<�L{�������(�@Q`�$�������������|e���u���
tW���b{�I���.K�4.[���k�Wno��s��y<������^q���_=�;��P4X�2:���0I���_M��G�j���&����P*'s��H���/���O��#m�^t��J%����>��I��bz�{~2kQ1���,���&I��=6�����@��&��������t�`�2�0�T*��]�T*u����w�$'�X�L(�`�S�����0���d8��t]|q!���������������������0���DF6lH���&IJ��u�n?���x`]3��*����������l����3�,�I����OFF���~���;��;m�������'�B�lVJ^tj�%f6X�H��W&I:_��������������Tl&�r�������;�I�t�rJ�m`b<9���Ql&���L���Y���dt���e�l����N��#m�S�����X-���`r1�0O�����s��KV��'���R�,�������K6�-���@�l6���1�0���V�����L��5�)��d��g��~f��W&����OY�G�
�L`l���
�����$�^pA�w���B0���s���ISh�����Sl&X�����'##i�w_�WL���:wI�P�]���E�����*I�y�)7�����-����g�Xt��x�_�%�/� �T��9���I�X��#w%���c�M�`0�����p��~F������xq�_����2������*���\tx&X����-��Ny���v�UI�T�����N���nyL]�=����I^�g�vihJZ:����0e�^sM���������[�������I��b��dU.��X�l��8��b��6�V���b{�d�Xt�����'?I��|�e���+�����b{<����l��,`�t]qE�V��[��#�d��;�y��r��u�e����d���n��9��n��,`�z��>k_��B���=6�r��l&��M��E�&K�Hk���~D�`23��[�w��$iZ�"��R��RKK����-��e��z�����Z�X���^sM�d�>�y�zW�e`������Ql`�`�2������<I�q����aR���]?,.�����Y\`l`������28���K���^E�a����`o�����]��l�,�&*�J]rz��&I�~��)�Ju�d�zj���'������[�>��l`�`�4����}��w^2:Z������[�_���d�W$�r�u�I�Lq�J%�?����_5�������ny�]����%�y���=OT���W����)n�������������7����g6��]��o�-�E�+.�mnq���a����8I�����i����P��k�g��d�^��.��������d���k�M��w\�M�����G&���b�<�r������'I��=��&L��Zg�`[�.�A����_��������^�46��������]���&��'od�z���O��0�;id����	��������R��(,�������@}3K
����	0�`'��tS*��)�����N�{~��1���/����tW�7�[2wI}2���������`'��xc����S���_.�
�Ie4���^�<�XPl�������XmGQp�et8�o�`o�J�usg}�&3X�*����VX�V�����m(&��)il.&`2*]�����3��#IccZ9��:<�G�*n�*I�:&)����l�.SY��7&IZ:(������\����C��?Q�����gLf���F6n�o|c���-����'IZ�8��l�@w�l�m�
`20����}������k$I:_���+LjC��?K����_s[�l�,&���`�����$����%�����z���K�_XX�Tp�������[$�s�n@b�)��V�k^��c�-�
��~m���[2gq1���O-&���`J����[�$�/~q�m�����y���A�Z�I�\t�+W����rgg�_��������Zf�������#�o�9I�z�a)��;�G��\����[��9<P=[
`XLQ[�?��&SO������?��-�e���0��`�m���<������W����$I��_\��)n��z6�%g}�~�ms�����0y�`�m���R��),�a����pBa�S�������J�,)�3�,vX���&I�^rI��<���
�����Z���n��z�t����;dd���w_������0o^����G�\�����ed�z6w�7�d����I�����_���]�lX[\����
��f�2p��I��C)���5�]=_tjr����.7&s�_�Lx�,vH�m�%IZ>��SYW���$Y�G�]��`�C����H�����h1�]�T���b��(��������K_Jeh��*���$I�!��d�}����\YtX�<���G����u�EE���a��4.[Vt���]��uN��TL������
E1�0����I�Y����E�
nS�Q*������7U�3>���o�]`&1�0E���f��{�$�~�3i�XS]W�l�Ul�i`L+W&�J.�V�W#���J����������,�)b�7�I�����7�X�~��s}q��wMZ:������1��_'IZ8��&���z�]�����?��I�\�\��`L��M��7�5�y�cA�xz�G��,�)b�X]�%��5��Y�_S=[f�7(�,��P�T����hww���?I�\���/K���5�zLZ:������x�?�#���_%��EW�J�����jr�C�����ICsM"�ScK��	���c�Yl���'��U��>�������z�pNr��j`��*�J��3I���?N����h�r9��������:�fI`<��#�dt���\N������Z���/K�����I��~W=[`5f�i��3I���u���&?�T2:\����Y\\603�x���+�$-��W�������N���T�o��e�����fXO3p��I��}��vw�llN|]����\t��fp��$IKX�]��eV����������w��uE.���������#��0���=���^�&����lz���K(,��`�������8*�J�������eI�}NL�~W};����%���'X@�����2�jU�5�at�&=�����eE��^`��������L�,���4=���}f�m����9�-V*e����eVm�f"X@aW�J��7����z��Rjh���G��| �S�$��W�,���P��[oM��x�v�����������4)�j�.i���}\m3f"X@an�-I�r��c�~������yVm:P{�����hr�����8�������t��;�m���}�z��G&X�N��+������'K������z��d0Y��f����s�����N��O�|\��y���Y�`����
��;�IJ�����N��iL����>'�DY
gf�����^{�������&s�g����,~��q=���~���?8�}��`�4t����+��yeh(��d�YiZ�$)�&$�{��$��C�LG����\��!s���	���a�����|��~���rV����g������/��,�f���-�����z��t��i9���y��&4w���`L`�4���z�z^r��6�V������y��d���_����:��7����T*����z�������h�~��$I��G�&�����_���G;k�3���<�o�my?����1����tP������:������v���3��Gi��]MrJ������y$���Y��G���
P��;�Ied$���j�y�d�q�������{?��RSS��sN
3`�`@��u���H�7V�?�`�_7�!##��T���$����ub#`*0�I��&��O~��%��L�r�������3�,H���z�qd�|��l������}���S��L��f���	��X��oc�|�������i��,���2�O�.�LC���n�,Y������P���?�����u
-N2'�g��;����>�����Lf�I�'$�O�kJ��.�M7|=I2�� ����d�Lc�Igx����S>�l�������sL�_�w�r�Zz���������~�[j�3�,��RI6��U�B���YnH�=q$�}�'2�qcv����v���	���v�W���9����;~���S��L���>�9X��CwT������6�Rr�����4I��������W�,0n���I��wrm�x�uI�����mP7���
��|���'SI�l�}i��O6��]����5����$I�1��4�XS��p���$�Y��J2zV2���>*���=�f�ge���h�??mGY��>`Lq�WW���R
JI���w�����T�ZFj�]���>)wt�<�XS�����%��������W/�MHk[�_sM��/���-ih�Q0���������Ied���~(���	�������5�����7�^������r9s����9t���0�j��H~u���d��?���W%I�{P���k'�^��1�P#����������2:�������pJ

I�4!9����,_��^_���j��f�J%���?���M�}]�>��yy���Y��3�zu���4��W����Rnk�����0c���d��������o?�d�	��[6')'�W_���{�|����5~�h��)k������~wL�]?�[���?l�[G%����b��T�n�P����$�{�����|B3�X���w�
y��oO*�1}��g$�&-�f��W>�����3�'���J�s���,z�;'�.���P3����J_���Y��%�����oU���oex�w����r��{��u��5��=�r��7>�wv�%��|t�-3~��3�L�J����>;.�`\������#�p������d�$�In{��c�����g\��X��$�hOO*CCr��/��_�Ji�?���7����9)U�������r����(���u��7�%�a�_�F`Y�����������}L\��TJ����^���#�z�!c��w}��$s�5����1?��bf��U�����?�g~��g�����q��?�4o��?��a&����<��Of���jr��7�������<�]uUR*m�����1�K{�HZ:��K

;�����{�=
�a&�G���������@��<��[3Zj��7OMv?=�_wN�z�v���$C}��G�iC���]
��L�J�����g���&���'����}.)����L���c~���^���?h�a��[���`���	�s�Uy�]���{���e������{����vX2�y^)+���;�`��T*y�#I�t�|rZ:h��t���
��1�m���r[k\��sW��{��Q�J��h|�@-�`F�����^{���9�vm�o�%���,��W��p�v�����C�n�K=I��X���d��{j�3�hOOV�tRF7m�����9gL�WI��y�j���_Y�.�%m�'�^���q�����n���E����Wm����rn��to��������S���uyhe�\z`��Qc{�:X�8���$��w�;����o�������1^������4��?S�,f���K�w��$��������U��{%�6��:$��x�����������=���l���wT������������CL��1?���c�{x�z.�?9�
;\���[���f���w�������g���
�������gg�BUFF�s�UI��_vYZ_�����{��&msFr�G�m������g�������]w��4���[�����$������.�QJ�7����R�Fi������wm��G>ob�5a�����I�����=�xQ���;����@m�����2��{SF+
zo�RN��s��s�������\smF}$��`:N>y��/7&�����@��bB��w���7���k�fpp0����������:*���E��`���s�{��]��G�2��������J����!{���i��f��$b�	q�e������-����?����;���|��������u��Y7��$I�4�RF'<c���e����������]�_�La��200�w����������uww�?��?���=_|q�=��:5��ghCwn��;��5������{K����$����!�i���������;ltt4o~����o~s����n�e��9���{�q��-?{���r�)������K_��zW�)o��/?;���M-�T����������f.X���������?��|�#��%K�TG����o��s������$���9��3��_�:s���{o����P~������['����+�`�IIK2���,h�kB�O�46���#������h��0��y������[}�����9��s���\.�
oxC�8��s�1�����$k���'?���w�y��u��w�}�����|p2������3���g
2j�;�_��_���������|�����K��?��?s�I'm��_��_����Y�`AM���t��>���7�w�\��}?���5�gq��'��R)-���Y���_5q���,�mtt4�������c�XJ��6�;������,?��O�$]]]��������f]a[z��i�t�����9�7/I���$Y~������L��S�,������c�=����{����?~L������2��$�]v�,
1�����������$����'��rGG���3��Q��{�X���������|��)�Jcz���O���5�\����tttLX?����p�}�U��}/K%
w��h*��N�t.��~�����m2����v�m[�?�������%K��������K���;����>�
�N���s���`�������O��/O��l�,�m���[�����������e���`M/�����W��7��7��N�KU*y�U���"I��7�8m��2iZ�kZ|Q�.��+X�K___V�^��g��-�O��]w�����9�J%#�4,U������M���t�������������vbO�����n��T*�-�����h��q��t����?�����3�������W
��R��$|>i��:��k��4��75����C�����_L�����������T*������m��#}��<��c�zf��U;�[�_�����c������+k���J����`���#������E��`1.O�jmm�mmm��sG|����y�����L�]����?q��|W����'�sFw��RKK��-i��W<�,��������������e��}}};�i�Y~lG��f��+5��������e��	���,����u�������c```�w�m/�����;�����������q������;w��g��7��M�zf��U9���v:X�����z{{S�TR*��|GOO�6���-��E�v����E`jY�p�VcWCCCy��G�u�<��{�U0��b\�����n�m������u��������t/`�0���=}���;���+W���}���Xt���>8���w������s�Yg����z(��w���MMM���'���l�~��U�������=O���X��k_����?����W_}u*�JJ��v��������N8!����q,��Y����N;��0�Y�&�z���[�q����:*.����{��5�\3�g?���m�����DV�X�[�\�;����>;���R�T���~����'?��~��Y9��3kQ��J�����X�n]��c�twwo����s���>��x��s�1�����|��8��~��>�
6��k���~��eiii)��X�Z�*��v����]vYV�XQ\!`����������{�>�~����`r��5k��?���2w��1=�X�NLs.��>��|�C���?���^�:����d��$���h.�����}������|w��%y���_���o���y��__h���b��p�E�&���`���=L~������0}��&�C=t��+Opf�|�y�k_��g���g��n�e��������
ox�V�Wmmm������L/��a�r9]tQ����l����H�����z����a�V?[�`A����}��ul
L&��)�����W���/�8|�s~���#g�}v������u�L>�E`z8��3r�gd��U�����dpp0s���~�����>:���E�&XL�+Vd��E�&�r��Y`PW��+X��,��u�Xt`�v�e�|����=05���������{�>�~����`�*U*�J�%�9�E`f1�@]���`PW��+X��,��ue��2�@]���`PW��+X��,��ue��2�@]���`PW��+X�Uc��(6l���^����e����R`#�:�f��-��;����;wL��b����ks�i�]���.�,������r���V`PW�E��,[�l���]vYV�XQP�ZV�Z��N;m�����l�,f�������X�"p@Am`j{�����k���ue��2�@]5]`&�T*������>���,I���unU_������<���?��~�c����c��3�PG]��F��a���������9s�]��`��HWW�n�1I��
7�y���-T�r�f����K�����3v�*1�P7=?�a����//�I�`�I����>��Xt�"<���������9�vm������;�����;:�2}��5�=��AJ�Ei��R�E�J���ATD�p]YQP�B� $�J
�����p���d�L2!�_�pN��<�s�3��xN.���u�����?v�������W�K���,p�I]�^��z�]�>~�56���I��+�����d��h��d��(`�`0���A��������`yv�"��;Os�!(E&�I���JJJRRR�233�=���Q�����������=@�H��f�InO`�$55U/^TVV��G����(11Q����$oooU�^� ,P�d�>��3g$''y�w����-�����T�;wN&����@�$%%)33S5k�������X��k��1C���R��u��$����O^^��y���W*����9sF�j����������37yr���|��2����,��L&�.^��'����Y>>>���������&���L&���(--MIIIJMM���&;;[W�\Q�Z��8%��R��C����Sri����9���o��R�����Pzz����,�y{{�F��^(�������&???eff�������4�������,9;;�qJP�$&*m�nIR����\���'Bis��@E���dQ;;;~��������k����?$$$�i"P��n�$����~}��n`6�;�����+�,'''���X\#�����%I�aav�e�����dRff��5///;M�������xs���%��D�/�1-M�{�JFc��N��wI`�N�l��������&���{��d"�
*�O%/_n�<:w�k��1�Ly���nuy���|��[�1-M)��&Iri�@���z=����V-�������m�&Sf��j�P��Ge0�=*���X�J��u�$��0��P&��6��~�$�����<	n`p�IHP����$��0;O�����3&'��C)���2�i����F�4h ��5��/no`PN$�����o�Ko����K_�����HY�^��;p���x���\\�\�^�����H�_���O��iS;O�{@i9s��������=R������iS���f���H����M�6M����W�.WWW����_]�3���s���}���,�o���LfJ�V�,
����*U����+V���H�F�.\P��c���<:v��8@�r�����������HIR�z�4d�;O[��a�z����W��{�%�<yR�v������)???5n�X������[��ONN����u�����)==]�*UR``���i�:u���N�"ooo���[��?�)I9r��t�";OJ*e�zI�[H�+U��0@)#�r"66V'N4��������'�-�8qB��wWJJ��G�"��������s�N���K�v�����e2��k���������e�4i�$���/�����4p�@�?^E:{���Z�l���[��{��h4�tm���5l�0
:T~~~E�c
���:h��m�;u��
6Xu��/�����+**J'N����~�Q�F�|VnG�W�(n�T����w����$���2�
�5�%�a���������������@���S�*!!A�T�V-�������z�-������k��!
�����z�f��1�k��Q��i�8����R���������o�-p]rr�>��3}��������c�B����z���S�NY=���g5v�X��_�������K��Z���>�~UT���1b�F�-I�2e��
&///[��m-n�T]�1��3x>��]�e�,��+W�h��Y����_�������D-_��\7j�H;w����������7��X��F�z��e�~)I����U��|}}u��i�ybbb��kW�]�V��sO��_�p���W����V��|}}���O�d2�o�|���u��o��V�{�.������=���~�&g
:T�'OVbb�bcc�������������R���$���/�
���S�Z������e�d
�����JMM�$���k����6�w�^eff���������C^���N�:<�m���I�����������M�~5l�0�7NAAA���Z�|�^{�5�;wN������={���C�������w��g�yF���j����m111���/�����?��F�����F��U�V%����!C�(99Y��������b������}�j��9����_9r�\]]K<'����Xe8 I
�6MN��v����=����t}��������R�J��7l���cu�f��4	��`P�
��_?}��'��u����t��w��G\\���}�k~��f��m��$=�����m����c�~����1��>z��gt��!m��]/��R��+I�R���z�-m��]�+W6_����k��V�;���_�5k�H����4z��������������%KJ|&���
$I�w�E�P��������*66�\?���v��oQ����g(�+V����:v��-Z�#F�}��rss�i��S�*))�\w��Qc�����5jh��y�f��������i������/-\��� ����k����6m��'NX�??W�\�?��Os=i�$��U���]b�5{���	��,e�:I�GX��'*>'{��n��E�����j�i`K�����`��$P4;v,�F�1O��{��W�{�����:h�������$���>|x��6lX��{�15m�T�k����^~��b���K/���k��6m���W_���uVnO>��y��;w����_��M��,SS��c�L��v�!e�I�'X@�#����l���C����W�����5k�s�����-�����:t���=�k��)33S�*UR``���m���k��^�F||��o��K�.)66VF�Q�*UR�z���E�����G�s�N]�xQ���
T�v���I���EGGk���_%��G����>�w������+**J�W��BCC}.���k��-���TRR������qcu���D�%''����:r��������&___�u���))�L&�M�IOOWDD�"##���y{{���_w�u����N988��Wyv��	���SQQQ��5j�u��6{����h��=:q���������*U�(88X��{�\]]m�����8���C/^TLL������K�R���h��:s��.]����5k�L��w/t���Gu�����(!!A�+WVPP����>U�\������i������RRR�*W�����Kw�}�K|~I���_���Vzz�U�fM�w�}rww�i/���]�v�����������W���;�Z�j6�eO��mSLL���[��:w�l������$i��e7
�*�:X`�;w�X�����Z�t�$���I_|��M���q�������������k��(+��
S����Crp�G��������2�a�������������SVV�f������[�A\����'�|R��j��au�?��SK�,��5kt���y����#F��^(4��`0�{}��	�0a�M����na4������O?�������s���Z�R�~�4h� ���8onk����o��={��{{�&M4e�=���E:��~��7��x�s�07{.���h��Y����t���<�<<<��K/i���rss��-))I�'O��9s����go�*U���j���V�y��1-^�X����������v�U�������W^��{��G���O�����o��v������U+�>}�|��>���c�{3g��Qpp�Mo���w���8p���.h��%Z�r��o�����������A�i���


�z��N�:i��
V�-
u�����g%I�k���3g$��\;v�v�����-Z����W�n������3�4i��-[��W������C���?4q����7�����}�>��C���������3s��`���{����w�^��?�P�-����-��h���X����>}����������CM�8Q:t(�������#�������Q�F���_����M�c~r�.����������4e���?_/^�w�����t��I�&��;�������Z�
2����F�f����>�H.\���`0�����lu��l�����>h�����7��a�RRR���i��$��,JHH(����z����������-[�t4�[���������_%p�1��(��_$I.M����b�Y|z��c�Jv��.��r >>^��w���[o�&##CK�,��U��d�u����s?��3���+V�q��)�1B����/_����[���9��={������5�L��o�������D���{V�=z��M�V����H=��c�8q���g��E�z�j��S�N%:/%%EO>��������IMM��i��c��^��vv��Iu��5����bbb�������C�9sf������E
�|������s����V��m\?o�<����2�z�jM�:Uc��)����?o�����7��z����_�e�������k�1c����K-^�����[��i�4f����{��:t�f��mu��$M�<Y�&MRfff��RSS�h�"������S��M�:Uo�����[[����u�v������_5x�`EGG�.''G6lP��5d���5KNN����`�
2������h�=Z����V�XQ��P\7nT��=�����Z�l�~���3F���~��%&&������[w�5&�I�W�������O?���.V��b���u������:u����233Q��FQEEEY����E>�����.]�$I
.��,�rtt�}���U�VI�������X���%}�~��������`����u9�{���F=����W���j����4i"777���2���=;===�5ooo5j�H���S���U�f�<k"""��C�BC?l)<<\��sO��WU�TQ�����M��[W���z��7-�������Y3�i�FU�T����w��O?�T�~���y���J�*�(t�d2�w���WAAAj����6m*GG�<�G�!��p���0s���`P��u��m[��[7O�O>�D�~�m�3��twwW��
�6m�(888��4**J�;wVddd�����i���A;�����o�^��9s���4�U�V��E���T�233�$����^�zj�����k�
�	JHHP����z�,\�P�G�6?���j���Z�n������?��a��:;''G��q���_�����sj��aq[ff���y������0/5l�Pm��U�5J��w��y=����W5j�PHH�6l��s���s���'���Y����&M��]�v�_�~�����s��SOY��d�
4(O������5k�V�ZYm��I�z�*���+W�K�.y�����7n��s0''G|�A��������{w�����@�n�Z��7��������T=��S���[U����M�i���}f��d��-[,�5l��Hg�]�V���7�s������M��-$$����h�3;�]����$�N��n`��-X�@k���$�n�Z��������}����}����T��yOzz��������B�wuuU��=�`��={V���:r��v����{����s�������d�w��e���7=��?�����?������>k�-�-Z��s��3g��G�������#G����������{�n�<yR			Z�f��"//�B��6m��)S�H�����Ok�����Wu��!���[W�\Qxx�7nl���W_Uvv��}��.��f�������_�$���G�������u��a]�rE/�����y������������;'777�����x��N�<�]�v����:r��:v�h�w��Q���*t.GGGu��M����?���d=zT{������u��)���k��E�"������o�A7��s�&O�l������O���><��_�\-\�PU�V-���Z�j��g�}����?�8����?��y�:u���3u��!��������o�v���c��)))I��-S�v��{�F��y�%''����SBB�^y�I���_�Rtt��9��{�*::Z[�n�=��c�o�������=������o�����F����+66���s���8qBC���=z��m�f���z���yW�zu}���������G�k�.]�pA'O��<`���z��7-GGG
>\�����g�=zTW�^��^�n�:
>\999�k�>��6l����EDDh���:~��bbb4e�y{{��._�\S�N-p�s����^��h4_�]��~��������C��o�bbb�e��{������Wk����xh�u��y=��3~������/���H�sp��m����,���W�3gN�z~��G�@�~��������+W�w�^8p@qqq�������c�������G����WZZ���;gq-�P���^����u�
6������`0�K�.V�OII��!C�u�~���C�t��u�]��={J��!�X�aav�@Y!��������GyD��-������^^^2d�BCCu�}�)::Z��Uo���f��u���v�����+00�����5l�0���K>�����+IZ�b�"""��i�<{���8�JM�[�n�\����k������ ����y�������>�|P~�a����b1p�@��7O����u��Y�6mR��-u��EIRTT�V�\���H��0���E��Q��w��I�,�92������5k����4�|I��dR�^�)///�Z�J:t���Q�F������MEFFJ��9�r�J=��7�)$$D'O�T�������[���S�=��G�Z�J���~�������k��G����p�^�Z������k����RSS��W/�`�1c���,�|k���Y<��l�bq{HH�:w�\�9�j���C�

Esss���?�G}TC���y�$I/^���5|�����r�z�����6m��;��3�����k���������z������M��m�f�`~~��^�z�3g�BCC��o_�Feggk���:p��U�'))I���I�_�^��U��&88�������+rrr������SO�������y�g�y�L����/��B�=�\��W�\Y�G�V�����sg���H��}�]
0 ��*I����EP�]w��
6�r�������^m��I�<��/^lJdk/���E�^��5�y��|�����m��Q��9r�{�1�`���:uJ�As�����?��vWWW
4H���W��������Y111�R�J������Z:;;��Jn5j������dF�Qc������K��>�����o�������9s����O�Ok��(L��J��Y��Ap�p���z��Z�dI���5h�@,��6�|%$$�tO�f��&����������<|���V�/�5k�h������������*W���-[Z��M�6�;wn���U�RE�������o�Y��Z�\�������W�|��n4y�d����@�3f�~u���G�����B��n���������|�zXWA�,X`L��O?�	�{��W��W�;�f��IV�WV
������f���z����Y���
����|���stt��E�T�N��+W���������'Z�;-_����W7��������v�Z+��������?)@�VF��o�U~������/�������W7j����gFff�>���|��?^��-3�...Z�ti���988h����_�~�w���=��+WZ����|spp�W_}e��������g������o���:t����~�\geei��uE�S^�~&��c0�t���g�g�����;w�k����V���c����[�W�Ae���cPT�����>��*�G+U�)%E�r-���T,`���d�1%�6�g2����-�;��#oo�B�=���
�!�4--M�/��,
4P�v����m�lz~n�|��E=z�h����c����]��gO�z��}6�����u���Kt��`���]�'��v��V�<����Y��g�-D�����kWsm�s000P�-��o���:p��$�����W_}e��R�JZ�x����l4�}���X�����JKK��D%��m[�����unnny��7~�o���W��^�z�}��V�4f������K����W���J������k�������Z�j�w�GyD�Z�2�7{|-Zd!����{N
4(�|WWWM�0��y���/�����O�>��7����i��Y\���/������=O��������.�����;������g���xfqm��Yo������^{���]���L
<�����m2[A������b�s�����6oV���2�������m�O�>28��.*F�P��RSu����cT8���e�����rvvV����^?`��_��\o��A��
��L�����c���	8�.++K6l0�NNNz��K�����~�a��V�\Y�j���s�$�N�DBB�E�U��~�����aC���y����k��~��'���X�>///��SG�N��$��ck���������*U�������[o����'K�222��gO}���y^'_~��j��m������-;;[�R��m�8Q�������=z���/�h���g�RRR�������~���}��"����������S��A9����O�z�J�n����c��������w��V�����2v9rD���
�X�e���_�~V����O���S)))E��7n���	����w��.H��\��c���Q�F��}�����oU��-[Z��j�Qzz�E}cp��\]]-j[���:uJ���?���m���eK}��V�1i�$EDDH�;����?/�\����Tff�$)11Q&�I����*���ex?���L)��''9�qG��``��5o�\�+W�z}���-�C�
r�������c����/EGG+111OEn���JKK�����3Zk��=a�Z�R�j�l�����[��I��������aU����jQ��1		�zm�����[i�����D�����k�����e�8�K�.)111������X��$������
�;��������A$i�����?�a�������+V(<<\��s��������L���������#��]A<<<��m[���K�rrr�w�^u���b]���6m�y�Z�j���9bu�L�v�������V���"##��C�k{��1���T��6www�l�R[�n-�l���������������>��;88(44T.4_��c�UXEy�-���|*nnn��������(������U��]-�;�V���~�)O������_�r��7n����_������C��]�$�L&���������*��X^���%8����������%'�{�
�P�����;�,��Z�j����<t����Wbcc5z�h-X�@999��1>>�T�N�<iQ'h�(r���������A]���0��X%)OFq�Z�����h��	���O���X+>>������Z�x�Z�l���8I��*��7��3�5GY�����3����+))�Xg�q+o��q�"����;�X�t���<X���uQ�r���Qbb�|}}\��������*��"�G���O��=K�����uvv�����u��u���I�&6��|���{E������R�3Z�ha�u=D�0Ey���$���Si�������O������HJJR��]u��1�5___�^����PNN����,I�]w��7�x��3GI� '!A��wK�<���<
���,��12�
6@����_�=�+W6`������<yR�;w��J4cqC�
�;��A4�qss+���*wUq�?nT��WZ�Mll����t����S���w�������������������=rKKKS��������UZ������+'�������4����h����Ph������Z�(�K���Q��Ka�]~*U�T���w��5��8�e���>�fJ��t���JMM-0�3?)))�i���t=��c��g������V�\�-ZX}��3�g888h���rvv.�L�uc(��`(�S@���y�d4��A9��i�qTp`���A��g������<"���z��G��_5h�@�:uR�F�T�F
yzz����"pb��iZ�fM��*���$�������.��������~U�fM����i�����;���%www988��,X�@.,Q���(�T�vm�������/�	��R��:w��-Z�f����������k��Y�i�������V�����URF���5e�S��e���fsqq)�����%�)?��/��O����"���J@@��9�+++K����Z���gDEEY��	����R��=�a��5���O���{�>'--M���7�����w�]�yJ���>�"�����]���r��fiH����{���z/ �,55��{r��5g�;v�\W�ZU_���t�R��_~�e�g*ooo�:�����f���K�.�i���b�
�@ooo��=[}�������u�J�����:th��z��7����������~}��7����YS�N��/�XhP���'K{�2SZ��JLL4�������J�#q�j�J��<�<��G)$$�Dg6k�����X����������_�^ar���9�����]�j����g����;W��s��Y��7.�F�Q����/��b��������N?�p�����PZZ���5k�f��U�3$i���yB��]��'43?������4��j�*r@���[J^��L{z�o��8�;���-���W���vpp���O�5K�,����g�s�=E>�4U�\�����.���E�:u,�.�g�R��9�����O�>V�-�s0++K�{��i@����o=��z������4���2�L�z��	z�����[V���������,9;;[�'..���/0&  �����uk{��&  ���<`�^^^rvvVVV�$����E>�8{
���gQ�~>Y#�gz�3a�q��Xj�����###��g-���!C�X|V��7O=z�����$��"���[�);[����$�1c����AK�S���~��R�`��:t�H���=k�R�vm�5F�Q�w�6�-[��:�J�>\����A���={��oy��ys�����v��t���������z��i���<�|�M��R�-4l�0
>�|��������u�w�Oi��qspp��a���[V�������#G������z���-����<k���u��)s}��	�n��1;q�D��i���8 I���QTT�j��a������|�������E�����#G�(33S...V�q�>]W�vm��X��l�R�W�6���m����{��%�9s�\;;;�i��V�~������_Z\���O5p�@��(o�9bQ��9pkJ��O�P���������	l�,��������\��U�7n�hQ�k�.����8egg��F�Y=��c�e�z��d2Y��u�����Pjj�$��?�����U�Z5������;���$=���r����������_��w��b�\�j�f��i�===�����Q�F��y����;I�F�������[=WY��q�R�������g4��?��6n�huVjj�E�����BBB��

��u��������}��[A���Z�����[o�e�>��������_5t�P��FDD����6����E�Z����;%I�����e������o2��a��kw�}����P�w��)S����k��d2�	����5k,���PyyyY�w��q����eq��>��/�l���xyy��?�(��5k�h��i��y���>}z����;�M�6E�P���_/I�����+�C�K�)++KK�,�z�7�|cQw��)���!T���V����������C7�fe
ggg����:;;���ou:t0��������q���yX���W_}����"��t��h����>3���3G���7��i�&M�4��}J[q�+V���*�X�v���JNN6�!!!y��$�K�.���s���U�!+�v��Y���_�^6���c�Y�s����h�j�g�}f�y�������_[���?������u�����aC[�V!�o�^����SyB�n��/����q��M�6M�'O��6v�X�;���7����x����6mjq���_�5NN��V�i0t�����>����`y���y�=���<y����
]�z�j���������>}��Y���o��c�eggz�����@U�re�����E�?b��z���:x�`����=�����M��4��U�V������_����(M�0����F���������~��i�������[K�,�����������c~��v��5������5r����.v����K��.==]�������s���6$$D��������z��wJ6h�����^{�\�L&
:��!a]�v�w�a������3g�o����;w�Mg�����e0����~k*t3999=z��������U4���4a��<A���[�N�7o6�������g��>���<���_~Y|���C�S999��u��		Q�*U�8TL��N)i�����l�R�l�$y��"��K�.�w����8qB�����6`�U�T)�ZGGG���������O/p�'N���/r�I������e���[�k��Y�����W��uFF��t�bu���W��~���7]�t�������4���}{�����;vl��cbb��{w���r�<y��cW�~}��=;����}��G�:''G}��U\\\�{��7I=z��F�M��������N�:U����/��C���v���g�}�"|/00P}�����I�&�����<u�TM�8����]�pAo���v��m��[��#T�jUs�e�=��SJHH�����}������/�����Q������7�xC�|��M�k��U������cReK
6T������hT�=t�����1�Lz���u���5OOO
6�Tf�h��c�s���5e��������.6b��������/�hqm��A���O�1u��o�>%&&��n���q���)):�O<Qv��|R��T9V�"�f�����9�{����][g����U�t�=�h�������9�#%%E�}����c,U�jU}��7=�����u��;v�bbb4z�h�������o���I���� ����
����V��������_��/�$��������s�=�������b}HH����,�-Z�H�Z����W%I/^T�v����/k���j�������m��M����x�b�9R-[��j���j��
��!IZ�j�������l��J������o���9s�����'�v����III�����;�������&M�(22��>�7o���������,Y"oo�|����kZ�v�V�Z%��0�A�i��E�����g���~h�Z�r�}�QM�6MM�65�KOO������c���������w�*U��h��k���}{����0`�|||�k�o��Q�Fi��m{?����~�%��{�����o�6~�x�X�B�F���?��}*''G�������t�R�_�^���2d���W���u����CW�X�f�����_��O?�Z�j��w��y���S��-�/�����D�?��}�%K�h������z�����W_�w��j������u��Y���/Z�f�$���C=z����K��K����y�fs���g��U+M�2E�z���\��c����M�6Y����+((�T�++�.]������-w�eDD�����}��'77���	�[o����z�|m���:w���y���h4�b�
�1B���3�

���#�/k����,�7n�^�zi��u�����O!!!E�S��v]A!���I��E��x9xy���������*
b� ���,�����k�����?�w�^u��Y����]�����u��i���Y�quu��E����h��A�={����/��`����k���j���*U����8�>}Z999�}c��UTT��X�����k��2�L��c����7��wmxx�:w�lq�V�Z������O�G���������?V``��W�.������3!��g�}��u��5��������T%��C��G1MI���`���[WU�TQ||�N�>���L���}��A��0aB�=�^���}�Z<�?����I�����h�B/^�$���/���O�������T���5l�0��?�1_[�j�V�Z��5k�z��JNN��3g���j^��cG=���z���1�����j��I�������������7�P��u�������+:::�����O�>�����o*::Z3g�4_��w����#��UK�������t����]�u��A,��A����.����Q�Fi��Q�^��������EGG�	E����_=����w�����u���|�;::��������d�_k���-Z�H=z�PFF����"��_~Y���rww��s������a�l6���^�Z�
�j��i�4m��|o;}�����S��1c�h��m���_��f����s��v����������?#\����~�A�*U*��-[�(;;����#G��K����S�N��aC��������u��m��aC;NS����$���V�W_�y��=������W��w��Z\\��������<�W��������x�����/_�
X\7�:z��v���'NX���������|:u����_rvv.�����u��4i�����h8p@�w���S�*T��$=���
0�.��4������]�vy��:uJ;w����G-��z������[}��A�t��s��[7���������~+�����������Z��4��9S��w�s������k�""",��BCC�|�r����>���M�fN����Pdd����{����s�Z}��3��7��	�1�:s�������{�������_y{{�s+�����l��o���K�t�����KG��7����QAAA��T����]�:O@@��-[���~Z���������(�u����W+00��zZZ�"""�}:::j������/m:�����B�{�������S�N��?��~����U�V��{�-�I���?3^���/�q��R���f�I�� �___�_�^~��E��\\\��gOEDD����Z�ji���z������v�uw�}�V�^������f���W^Qdd��}�]���)((HE:�i��:x�����K�j�������j���f����#Gk�����MC�5�K�.��q��T��6m��q��P��Y3}��wZ�x�\\\�:��O?��+�uPP����k�g�����~�ms������{�	��-_�\3g�T�j�n��N�:�����v��
�4j�(�����v�]w��+Vh��y�f�������9�I�&��������z�)-X�@�/_V��-���V���-X�@w�}�\������0}���:���Rh�J�*��������5b��y�����������3g��������W�Z�a�,��`�'N����*0����MO<�����O}��6��v��������,�u����_|Q���s��W���7��u``����c�i�b��vM���I�<BC�<
T��d���=>|Xw�y��>t���5kV�����u��q�k
4���S��D��a����������{�����lm��]��k�����;��C���%
�INN����u��	%$$���]5k���w��Z�j����+W�h����r��������$???5h�@-[��P�?W�\Q��u���*I�1c�^�u;Oe[�����}�"##u��5���(((Hm���*x�v������w����R\\�U�Z5�l�R-Z���x6U�N�={V�T�vm�9s���'Nh�������`P�����u�}~����w+::Zqqqrpp����j���&M��^�zE��H�c�]�xQ������������qc5j����E[i������+������$����k���:|���������*U��f���������Q��oG'N����;���LU�TIM�4����[&��[ERR�j�����I��I���;�������%-_�O<!�F�T��{��JIr|�kU(g�����Cu�����zyy�k��6=��U�ZUO<����(U�V�K/��i��I�>�����+*X���M���p(��������s�=�����������j�5j�F����V�����~��3�������2���7/��+Ij���Z�lY�}���x�W���9����_#F���DPz2���N��[���FI�GXX���
������=Z>>>��s��i���v�����g+++�\�{��v�����}��'�z��1�����@P���N9W�H99e��d���������P��=�[@@�����#GJ�&L����{������@�0�L2V�?p��>���k�=����n	�g�VTT�$�^�zz��W�<�����%I�3f��AT^^r��.��P��@9��+�h��y������'5w�\���K�J���~�5k�h���j��E�k�.]���^����kaaaj��yi�	�;IIIap3f�����'��eLIQ���$���s��v�``P�8;;+""��c@��������p�B5m�Taaaj��������W�����Z�r�>l����[�������}y{{+::��c@�I��E���s��r��8!��EDDX�����K�*��@�m!5<\��&��`�i�B�����222����C��O>Q�&MJq2P�������w��T��R7o�$y���z/@�!�]t��]���Z�z��l�����K�O�V\\����������+�N�:����}�Q�i���cp�3��4x�r�������<��
�,(c�;w��l�Vs��{�;�����O?���~���+e���r������*}T&=��7�sPP���
�X-%<\�����*��������=�[G����$��0;O����*��l�n�(I�
��4�[���`���e<h��Y�����$??��ha�9�>��[@��k:���L))�E�:���h�1�0��[@���2�����Wn�[�m����y�n�X�- e�zI�o�~�6k����d�=����/�#,���PrN����'�k�.]�pA������S�����}{����{<�[V��+�8|X�����}���*cQQQ��k�v���]�vi��=JJJ2�^�vm�9s���<xP!!!�����>�|
8�Xg.[�L�&M��}������K����P����h�rr��o��u�$�-���_���5�����[5}�t���S/^��999<xp����������������.99Y�}�����{��������M����t�cG�6�gX��z`K��v�{�n����v
����3gj���69�h4�W�^y����-[��������u��U��o��e)��o�~eps�O�>v��-9�{���������K����'�����kOOO�����i��i�����
�q��)((H��!Y��/�k���s��I�RSS��gO:t(O@@y��~�$��_���������]��e���@V���VHH���m�v���m��:}��BCCK���d�/����4I���>���Dm���X���������������7�������'�|R����}���3g�H�.\��3fh��	��P�r�]S��}�$�G�c�J��[����<���:|�������S�����R������_|���pI����f��U���N����$s��cG�3���k���y��Y\�9s����J4@YI��I2���������=�<��@�z���iS98������G����_5k�,�yF�Q�������{��`0�����W��uRR�~���b�P�R���$y���y*'{�����/*!!A���];����%:o��m���1�u��U�����;x�`m���\/[�L��/�<�����wJ\��Lz�m�.I�+�~Tt`U`K�,��+$INNN���/���P�3W�\iQ?���2V�}��-�
6(%%E���%�	�~LYY�<t����e����&�����XT\\�^}�Us=r�H5o���������n����{���T�N�9sF��������m���s��K��=2&'��reN�Z&=][��S@@����#��1b�bbb$I�������mrndd�E��i�"�o���9��y`��J]�^���J��yPT���j�*}����z��9rww/��iii:w�����5k�����=Z����'%<\��X��CV����a����g�}V<��M������d2����
,�5j������m2�}����u�$�3,�����p����1c�����������1�fg'''[�2E:�����3�+::Z111E�s��	���vf2���f��/]*��Yg����.�j����q���CV�y�f��3�\O�>]6;?wX���[��pww/�������	&��,�����Z�
2��������7P���_��]����g��2v�
J��
"==]���d�$=�������{������g���Z�iii%�	�W��U�$�z����Q��upwW�;��Y?`[`U�������%I����3g��{���Y����E>###��3��%%<\�Te�$���c�i����
`��}�>}��~��wU�^=�����������|FZZZ�g��/����~�H{N�8�'�x�&���\�����%I�;�upk!�������{N999�����k��Q��+wXUjj�L&���g���xfq*00�&g��l�(�Lri�D����{p!��h�"8p@������s����t��22�L����,EGG�j��V�eQZ@�SSe��.��)k�H�<CC��7���u����7m4u��w��A�i��A������e�,�����V�Z:{�����s���u��9��q��������[��WTT�T�^=��������}�����e�"##���$???5n�X:t(v@^rr�>�#G�(..Niii���U@@�Z�n��
��%%%��?����G���yxx���Ou��Q��M��~S��;�={����+�v��|}}U�Z5�{���V��M{���h��:s��.]����5k�L��w�i���}��.&�v���,PD`�H7nl���m�Z�?222�y��h��
����������SNN�f����>�L�������C/���&N�(777�����4y�d��3G���y�V�RE~��l������������k��=�. ��Z�j>|�^y����Yu�u��������r�Jeff�688X��u������iS��3g�(888�=��r;}�����s��3335{�l��;W��1
		��q���c�x�{���4a�s���;��������h�"]�|�bO�-�@	_}e��+��u����v�nM`�HZ�l���W��m��i��V��t����9c����-l��]JJ��|�I���7]����i��i��Z�z����%I'O�T��]�
��.&&F�?��:��3g8�����G}���/_�����k����������������o�h�/��O��g�}&___M�<����k�������N�>]�:���={�������>�������������n�����������$���-I�{���k�*�..288�y_pk#���G�y��E�7r�H���_���7��C=d�����{wM�2�\�]�V&�I����k����CCC���U���
�d2�w���WAAA


Rjj��=����m�7o��#4w�\EGG+,,L����$���_qqq:u��E�O>�Dm��Q�~�n:Ozzz�k����Y�����e0��g�Z�WEEE�s����g��4iR�}���/5v��<����U�Nyzz*--MW�^��d2�
<��~�����Kiii�]\\,___%&&����������7�����~���W�^�m�V�F
U�VMIII��/p������9��aC{�`5�nq5k�T��5�������n���x��B��o�^����$�:uJ6lPhhh�{���K����/��@��`��9sF���O�7�"@*..N������������7O�����x�
�;wNnnn=z���j����=zTC���M���F���={�����39::�K�.z�����u��!W�rRR�V�X��'���c����T���W����i8^FF�F�mq�G�;v�Z�n�g_RR�v���U�Vi��Ey��V��9<l��5�6m�����������y��:t��1c�������JJJ��%K4n�8]�rE��k�.�����={�M����o(::Z���2d�����~��������u�V����!%<\��f�I��,������?��|m��	����M�n$i��u��y�����V��=KuV�Vr=����?���#������Y�f)--M����$�L&���K��������U���C�<{5j��~�Mm��Qdd�$����Z�r��x��|�			���'U�v�����V�~���G���C�V��$���_�����v����u�������������o
����0}���p����nnn����Y�w]vv�z��m~5a��7.��9ooo���z��G����K�����!C��U�VV��r������x�b=��Synwww/����!u�zI�gh��'(�Pdc����9s���,I��q��L��7�|3��QQQz���-��1B�>+p+���W��W7�<y�����FI2Z��1#����<<<4n�8����|���~�iVppp�fwss���U�n]%$$H������c��Y�/�����\\\T�n�"�W?���:d���w�}��}5j����K��eK��g���Z�h���G��o�n&�I�c�(��?��_���x�n1`���[�*---��X����Z�vm�g�i���2_Q�����[o�e�6v�X�;wN�������$IF�Q+V���#t��9�����BC~ng&���n�)*'7�`��7g04q��B��M�6��k��Z�����s����G����9��O��\�reu��UK�,�$m����ks�:;;�t�����O�_{xx��?�z�]w���\?���$i���������c�{=<<4v��"���%}�^]�6�L{��l)����?����2��_?�={��uW�\��>��m��_m���g��1��m�~��W����gk����]��|}}u��i���[�sww�?��J�*������t����(�W�����=��5o�\
6�j��w�i����OZ�����:u����S�dLg+���������*U��Y����E��u��6������,��������Hg<��C����d����j��M���u�&��
�r'5<\��~�=�{���oh0��S���`c`�X����W�
��%K��srr��:����������[Vc���������[�E	����7�F����K�j��-:p��.]����D����7666����09::*''G�4s�L���k��Q�[�������l�"��d��	���V�Zudd�U��k����P���_/I���S�}��y���,����/^���zJ�'O�����]����h���
,�!oANn���{������,�����������������h��	���O���au�����{�f��z�����_����=[�g�VHH�x�u��Qw�}�*W�\���iQ�=Z�G�.��W�^�j]ppp����LYYJ��Y��j�i�7����3g�=��
6���=z�G�:q��v�����(eff�R�Jj������^������r�`����=�ZI^#������UXX�<X�s

����Ou��e���/������{�j��)2j����v��~���Y�f%��0qqq6?3!!��u>>>6�
����{�L))r����]w�{�r�,�L���U�~}{���~��<�W5k�Thh��6m�;��C^^^rww����y���p�B�z���i���Z�d��N������Yc2���~���_~���u��O>����k���m~��h�j�����{�����J��G�RR��gJx�$��S'n�;\�E���+�a�s������g�O�>aW�Y�n]�z���G}��QDD����m��A[�lQlll��+W���M��r�Ju���H�����aQ���k���[���[�n���x��LQ���v��f�����,YbQ�������U{�^�Z��M�6U��M5b��L&9rDk����?��-[���%%%�������'���U�~�	���W��x��=P6��]�������U+���U����e��VE���;�_����g��V�=|��Mf0j����4i�#Fh�����?����XIRtt�.\�������u�����'lz>�FNB�����$�X�D�5k�y"��`����+W�_��__���V�KLL���{Ke�:���>���e��|�:8X~��L&�����Z�����z/�����%�Q���~PN��pc`Tff������+�����H��{��������w����E���ju�5j��;�4�'O��o��V�)P���K�<CC�<	n�����j����������+>>^�*U*pOTT�&L�P�s������w]���-����Zo���`�_{�5�o�^���E:�vg2��+�Le�;e�:I�X�X���7�Feffj����={�M�����{���������q���Q#���[NN��L&M�>��ZHHH�k�5kfQ�X�B~��������_�~�:u�>,I:v���v���QAAAV��������N�/_��1c��P�\��_���uO��-{(_���oQ��3G���g-�'%%��/�T�����~IR�&M��q��A=����Q������]qqqy��Fm��E=���-[f������}��{v``�Z�ha��?�{��G��������j�������-�;::j������5_��}����N�?^������+W����j����Q�����H�������������={��Z5����s��������#�<�U�V��-X�@,P��uU�J����������4�����4h�	&X�+::Zs����9s$I��WW@@�<==������O+999������F�7=w���A^{�����{�]{��i��S��Z�F����?�G��v��$���k�8q�&N����U�VM���JLLTll�bbb���]���RV����C�����`��H(g�����������]�,��:uJ�N����w���?�>�����t��.]�t�����5s�L
:��s�}�Y:tH��M��d*�,�����{�������w[��������Y�X�nu����$��P���/{(*U��M�6i��q������f�������������b��_|�����+���CU�V-t}���5l�0EFF~u��)S��~�5J��w����f���T�^=���K+V�PXXX�����Q��s�&N��'Nh��IE�PQ\����$(�&��d�!{8|�����Ns}��!5k����egg�����4h ''�b�	������}�"##u��5���(((Hm��U��
m�����:z����=���eff���KU�T�]w���M����Rjj�v������+..Niii���R@@�5j�&M������c������IJ�1??)'G����s���	��$9>��*�@nnn


Uhhh��Vppp��o+
#e��r�^�����S�����RN����%�
7E\��J^��L{zu�^��pk!�
.e�zI�����z��R�gpu�ghh�����,*0SN�R7m�$�
*��m�< 9�{Pz���S��9����U+{�H"�
-u�zI�G��289�y�o�d
@�:wNI�����Sf=/�$y���YO�0`PF.���p��� �X�cJ�R7o�$y��)��s��vk�Rn���Y?�0`PR�l����T��j,Y"��`���q���R��%I�aa�_��Ge �X��v��?'{@Y3��*'&�����)}�^I�'XX��Kv\�N5j����2��\���k�,��@yC������_2���Y_���*��j���3������%I�_]U�O��4�������`�s�d2�a��������9pkK	�$y���y���_�6���gee�a������|��Ud�?��'$GGyt�`�q��X�����X\KNN��4`������3X�[ZJx�$�-$D�>>v��}9�{�"���V\\��NLLT�*U��p�����<X���v�P����+�F���Vf=���$I�aae�@^`6�;+++KQQQ�Q�!Xn)���:���F��u��7m���l�Ko�G�K_#�!7779;;+++�|-))I'O�����������$;N	y�L&���(55U���JMM��d�X���)ggg;M�hLF�R��%IU��o���Wf���U�[�Ve�@^`6d0�s��Y��xVV����g�������U�jU{��@2T���2xz�o�P��6�{T4�U����G�puuU������j�QHjx�$��C����X@)����/�nq����]�6��l.e�zI�gh��'`N���<<<T�^=edd(11QIII�����XP GGGyyy���K���rtt��H�2��u�R7n,�����V�}�`��`0���Mnnn
��d��h��d��h`�`0���A������1-M��t�19��{;T�$�V���/�#(C�A����0K��]��d9T�$�=���O�2����m�,�����K��yDA���y�{����`y���y���6eLIQ��]�$��P;O�v�d���rE9��e�/m�N)+K��k�98���XP�l��s�;���Gh��]z�=��@�?H�nn2���Y_ooUz��2�XP.���K����V>��������`��v�}��2##%�A�:�{(u`�����K�\[���������G�Y���<���<	�
'{���y�t�_���h,��Y�OK�<BC��'�X���w�Qz����gZ��'�Nh$�d�HQ���,��������b],�O�����^]�	�H{��J	$�N
�L�Lf����<�����w�{����x<�'���z�r9�?���<�X���&ON��9�(�,���/N�c��T_�/�$���Xv�{�z������zm--I�����t����*770��/\�$ijn.�	��f I��7��%I
`���<��?�a����by=O>���+SjjJ�AU,`,2�;�_�GN9�����sS��-$`�0�;�W\�$���iln�Xn��.����*�0V������$����L9����0���.��z;;�q�uI������0`�J���)�]��m�I��{]�!PSt`�)���������V<{��&I���O�T�x>C��O~�{y�]�*�Ccss��X�s<u��I����S��P���w��7����T�,`�rww���:I2s�����_��m��./7��r[[��M��}�-���,`����$I���)U��d��m�`��_pF���/�\.����'mW^Y�����O�457W$���s�������W���=�L�K_Z�L�X0����$I�_��l��Q���Y�R*�*���c����X��9&
�Rp�rUE6�\.�m�Vcss�m`p��a�k���<�hJ��i8�������)�����Y����g���ev-^�$i8��T��W,��,�HO|�[Y��O������C�l���$M��q{�]���I�2�}��X5X��]]i���$�������o��`��*��7��r{{��O����.��h�`#���$I��K�������)�l���������r�b���^�$iln�X&�V�q<���]qE!�M�`��`D�y���]ye��v�]�R�b��s��n��*���,F����Jz{S���d���.����.����%I���\p`s�`Di[�0�,�`0b�[�2k���$I��y��6[M��zV��G�����Xf��+IR����f�m*�.Xl�5_����/${���TH.08`�Y�[Z�$����L9�������K��{V,|��d�r9m��&�pB�����F�Hbk�jmm�������g����������3c�������;�<����~{n���<��#�����i���>����NM����h��dI�-[����q����#�U�
{���r��7��n��7���o�9k�������3�t���z�
7��_��W���+s�-����w���9sf����9�y�{2e����K���������s���w�����6mZN;��|��MSS�fg�G���I���NUcc�m���V\{����W��n�!?������[o�	'�����o������s��g��_�z�������������W���N�W\���[�re>�����.����������lX�_��'������*��~�UI�����e���
������_�r�����np�j��I�f�m2i���X�"K�,I�\�����>����u��O~�����������y�����������;��q������K[[[������477�����������J`C;�������d7qD!���f�`���Okk�����C�����477g��Y��|���w�y���?����$IoooN>������9��6*���O0~UUU������>�)S�$I���r����O�O<���I'���nJuu�`�r`L+�[��E��$S���T��9�J��e�4vX�����VM�0!x`:�������A�%K����y��]UU�������G?����{���j�����},�������U�V%I�������������Y�/�y��7�������-op���.�x�;r�A��������$�����0��z�&�*�g������S��<9[��_J��EWxQUE�=���~��Y�zuZZZ��/})oz��2s��Ay�{��?������~���W�e/{Y�����w�UW��{�y�g�:������_��?��s�����{���|�+��}�����������-\�$i�3��0b����v�-�f�JU������{l����:���2k���.���|��'��E]�]*���O�E�N=���_��,X�i���hoiI�457�`��]�b�����w���l������^�u���_��7/������TUU��SO0���_�*G}����af���Y��?W>�\N�5�$I
`#��1n��)��|������^:����}�Fgq��.����~��roo���������:TO��q��[X>��2�5�=��C��M�������[\z���u��f��qY�vm����������V[m�;`�Y{�m}�W55����/PU�)�}oJUU���L���r��k��f��=��c������=��3���Y�6:o��q�m��r�w�����;
`0����$I�?<;]vY�mFS�c��E��d����R����:j�������n�������L�>}�2w�q��w�u�&=�M����������������y���u�Q�f�m6����?>�z������g?��w�HR��I���$i2���j�.@1������n�������?��|���u�uSS�&�>��g�ss=���Y�|�&=s�=�J6cW�������S5aB�_�����������:��������p�/��������79����������o�����w0�u�xc:���<���g����$�s��T��66�?Ic�������o��u�������������vvv�������q��
������w�Y}�y�����fN<�����t���+V������+��m��������3L�|���\w�_��k��}�w��jkiI�l��������<���)�;�0�9���1b��59���s��w���4iR.������.�����������/�������7'�x�&=s�=��
ox���0<t?�@���7����OL���EW�y�:;;s�q����o������K/�4����F���cUmmm��������32c��Ay#W[KK�����_cUE`huww���N��E���������.����7�]��z���6����1Z�`j_?����\p^HM�:���9����?��?�����s���#�������������u��$Y�|y��j��~��e�\���^�����������S.�+���g�
`k�F�r�����O���{�R)���ws�	'l�;kkk��n�������w�wd�������ks�}�
�g`t*������==+VT<�������+���3�5J}�����?������w��[�������u�]��X��rK��]�����f��[���i�_���+Rjj������������+�	��1�5
}������������/�}�{�����}~����__q�9��37��+��b������}��[Z�$��~u�o���0vT]����/9�����;��37z���s�1��yf7m��E����^��r���������	���m��$ISss�M�`�"���w��x�����}���0hS�N������r��O��/������,]���z���y�k^3h�>�==i���$I�,�GM�\pA�����w�����s�����>;]tQz{{�$?���r��G�-oy��~��;��g�1��'?�����
z7����;��dI�s��-K��O�j���p@���`U���^����������4����3,x�wl��v�5k�s�/X� ��rJ� U����^y����+��r�zN�2%x�~f��Yy��������������=w�yg>��d��)I������'?�������W��e/{YN9��M����Z�$���e��u�uh�3'�?��s�S�
y��������E?��c���#�x���r�)��~����\sM�=� /^���:j�{��;7�-z��}�k_�����|��I����|����9���]v�%����}�������M�>=?���S�,�T�e�%���j�����k��K������T<���
����1�_~yN<��,\���~WWW�����}f��w���������	0f���$I�~�����,�
TUtF��S���+����f��w��}�c�_�������l06����/Z�$ijn.�<�R�\.]���/�K���?��GIOOO�M��}��'|pjkk�����~{��g����n�-{��w��G�m�e�������=�x"����+0
m��O�P�b��w�}����]`�koiI�4v��+�%XPO|�[y�#I��{����hln�,���V�{nz���X^��>���*�����GI���I��]���TM�0��US���9�9`�k_�(I2n��3n���-�@U�`�koiI�457��X0��-J�4��Wh.j�.���k_K��7W.��']�kRU��9s*���,���w���O?����CI��I�d�pc�1�m��$��}���SO�Xn��*��;�by0��`�hoiI�L|��3�(�
�]UE�J(���}��$Icss�e`�3���������reJMMi8������VSt��roo����<�D���,H�4vXJ����a��y�g?��o}k����`PA��\�$��u��l�]����M��SO�x.0�,*�\.���%I��w������E�*�cC��wg�#��4n\^����2�@E���$I^��T���(�,*�}��$I��y���WSt*��}(�����\�xvSss�3ZO=����$�+�n2:���C���C���TV��;O|�[��_���G�>�����o3~���)���q��)���z���z�I�T����SS���m�MwG���+���Ul������C���1�--I��y�R����`4���;�'$�S����PUt*�����&���`�6�������vm���6I�d�A���V}�=9j�.0������3�H�c�
}��5)wt�z�����5�yl�5�'�~7�j+�	��Yqo�Yc��d�`O^pAV�[���)�J�`�������4f����@��.L�Lx��t�C�W�������6_���s�+���)����k���x�
T.�����$����W���+��Bwg���>�~o(�
����e]����GS7.
�Rt�������C�@��ZZ�$
�������0\tw�����j�.P�����^vY�k�V<����4I���\�l�kmk�������O>�w��J`�2��y�}��Y��o������rnr�o�n����E7��a���rZ/�4IR����0�����O=���<�S����wK��e�V��W���,`L�^�$��-Kjj2s��T�_t%
���w��d�����YU������$ix�+�_��������0������X���7`8���;k����]M��V.�S^����i_�(I�d�p�*�[�
���;
`��2����,�=;�7�P��R]]=���<�7�M������k,��nUEH��?�����$���������l��wm�
�1}��iz�-`t�)�@����$I��>:���g�-�J�?�by<W��tw�}}������j��RU�`�3�mO`��5��0��6TROw����u������>���5	�������N�457��J��|�����z�c(\�-����5US�d�~�]�
�n�;�k���b������k���Y��O���}���=�@��q������<�g\{~����v���;k��T�,�y�����_������9��yc�S�%������M�
�J1�<G�\N���I�i�x�v�}�3�'O����~�sx������)i~�]J�d���T�,�9���/�x ����3�LUSS���}g��d�c���-UE�����$I�+_i�
`{z������cx���X���7`(u==��Pl`��)������?mW^����n���$I�,�!Q.'K�O�V��������b{c�,�8�����_
�/���W���|����?&��P�-�Q?���Xc����������������T54�
0�=�X��8%�fV�]�k���Vl`�1��P{KK����/����u�ml]�}���%�}��.E�*��\m����n�P���;���PX0���j2�0*uw��5���(JM�`�+wu����by�>���K���4vX�r�����w]1�O��u
������e�r�~��w���g7tP�'L�x.�X��_%���\l�ZX�UUt�������_��&��������nI��Wu���//�@Qj�.�Y[KK�d�/|!��8�r��RJ5~�`�tw��G|$���b:�JIUu1�E�'������/Z�$iz�kR��-���k�V�����@�U]���[oM��O�j���p@�uD���j���0V��
hoiI�4���RMM�mL�X������;#���/���F�==C����;�$���C�0V]�_��[*���c}gm}��0����g���{*X*e��GW.`�jO�=�����d�����2X��<�7~UU��~���j���cjw�%�^��!������RUr�Y����S�8����`ikiI����������-��V]c����v����.�}�VSss�M��}gm}�=�<X��r9m&I��/�
������m(��WStF��k�M��X������[�,��M������u%]�t��l���}�,���m�����������
������F�;��������P\6�0��FkoiI��S=cF���x~��6S������vk�;'o������U���o�l&�3��FkkiI�Lz�[����VpKwG����d��������������n�`zz�������(�=����N���8gN�uD�X���`��)�����'���^���_�:IR����z�����%�r�������'������0v�����Wy������g767W<`�����������
��b`z�����J����b��S�f�?�C����o�;KUIJ��n��l�_e3�`�0������$If^}ug�.������|����;��R��z���oO��)56������� )���������C������$i<�����
n�`��J�=}_�6���,��m��$Icss�ML���|][_\������?�����������$I�,�!��6���S�V6������K��+�
�f`�{���8���f�l�m�<���c�C�&w]Y\�����J1����-J����gf�sNE2�_���j�h�PX��wN�%9��*���>���J�O9�P���I����	�_p�TwG�9q�d�W�F����tm--I����n�`���;k����,�-���������*��~u�u]�}�,:5E�R�r9O]pA�=�H����~{����S=iR��F����]�����>����X���z��y��o/�C������FW'��7���O,.F;X���v��I�q/{Y������U'f���W<`�k]�wn�_2i��f�5%/;���0��F����$��:+�����0X�;��OJ^2��.���*���X��������TJ�\?

0�t�������_M�Z��������x��<������;���>8�����f�{�����������+S�L�^{��C=4�����Ok[�(I2n��S3mZ�eT]}g]C�=��g��z���x�����r��7���o��5k��?s��,]�t�s�/_���>;?��������9����O~2��e��W��g?����x���?>�x�;r�Yge���[���V.����R^��b���\�$i�?�b�c���I����v����������
���k���~57�pC~��!�[�hQN<���X�������[��7�!'�|r�;�����mR���k��w�3?��O^�s�����7�����g���3g��M�`�x�C���~������BrF�����oK�z���
�eC�V�t�M��/Y��k��&�sL:::��<yrv�e�<��y�����������imm��^�R��Q9���y�����/�x��������N�4iR�,Y�'�|��{��/��G��U�z��*���r����$I��1����e���w����X�X������"���yi2q���C�V�������Ay�O<�7�����f������9������|��|�s��w�����]t�E������O?}�����/?g��������O~2�m�]�����/�8�����e��%I���s�I'���n��I�������u�]Y��#)��=V�LU}}��]�}g�����ZE*�W��	&d��y���>�����Y�ti���g����/9?�p��.������.�|��U���������������g>�'�x�EsV�\��g���/�[��V��U�TUU�����r�u�e��w����������7���0��pa��a�l�W�Hwg�Y��z� 2�U�{ln����^�:---�����7��M�9s��e,_�<���1��y��7`����<����3����'��W���������5k��_��3'��G6�����>���w�������+W�h#G������n�`���;
`��V���n�5kV����������imm���3gN?��|�T*����p�{��^�������������>��O�T*�`����W�����k�������3�������$I
`�*]O`5�]j�.������\������������.�d��%I�G}4�_}^��W=������,_���z�]w��y�6*���|g������_��W9���6�Y6]ogg~���u��C����U�R5~|^�����V.I|5Y�V���k�NX�`2�5
�������p���}�F=[*�����&��w^��K.�d�X�^z���#�8"�Ri���8����-J[[[���6�y6M�o~�5��EE3��9&����f���L�����;�
�>�F��o�=��������K��f��~~����n���
~���;��C7:g�����;���K�&I���r�w�����w���.L�Lx��2�����Ruu9d�s�����s���}^W����d�}*�	�n�F�;��s���Y�6��g��������~�,����~k�[����}m�m�R�}��]��_Yl�-UUt��]w�5�z�w���������?�����\GGG�-[6�Y�����~��t�ygR*�i����0���m(��`0�5
<����w�a�Mz~���NMMM�uoooV�\����X�"�r�����63f�������~����08�[Z�$����Sn�`�2��"5/�������MMM��|�TJCCC��Y��w>������J�M�zv�����?�x�/_�I��s�=��
�!=�Wg��������g�]vY��q���g���<p���qIDATk��V.�;k�+�	0T`���������n������;7�7����}����.������-+�9��M�^h>�hU�M~�������
�+�	0�`��������6����p���QX�h����%I��9&�;�X����3����V<`,��|f�j�c�RUer'l��t@e����Q���~�uWW�&�c���/��J���V���[oM�lw����f�b0���*U%G|8)���0����?����s���������d��x�{��O<q�����{��7�aP������O�����e�
`�^�������6��Q��#Rmmm��|�\����������6�w���6XX3f���3�]��}��$I���7`(t������b{�T�F�g?=������c�=�u���_WUUe���������S*�R.��$���y������[ot�C=4��hP	�k����{+���`A�����i"�X]L��%}g�,��bk�s�=\/[�l����g�������|���!;��S�����n������k�M�
�9�?��t�|s��K�4��[�\�1`�������{��Qc`���="u�wl��w�y��������;��#t��d��%K�����O�h�����TO�Z�L��b��}�WU���	�t(U%�SL6�H7��.���\s�5Y�bE�L��<0���3n����
����;������N�,]�4�<�H��v��z��k�p����o�����.��������.��r�F�<��#Y�ti�ummmf���Q�l����$
�gg�k�)�
�����������)��n�`=��C���<��l�����_�����Mo�m�����m�����w����:jH�m��	�3gN�����{W\qEN>��}�\.g���{�����_���s�3�`������J�����~7����9������D������n�`�^?�U�Pl6OU�6���F���w���~w�8��L�2e��}���3w���v�m)��)����+��y���s�q���K.�D�Bw�q��?���z���%K�,���z��s��o���zh�O��}�}�e��E���N��F=����r�V�,�Q���ZX#�����������������q��=��3����&IJ�R��*�JY�n]���wd��UC�������������*��C�
)��9����;��SSU���YTUU��x��{g�}�����s��W�������0aBN:��|`Ku-^��GM��>
�Rt�,������g����������^���o����.����J����444���`f���+V��s��M7��$y��'��/9_��+����3f�}�{_�9���{�z��r�5�d���{�g���/�������4iR>���h�G>��|���Nkkk�����}�9��|��}��?��Cy���5������L�>�E���c������NJ���W,�w��$I�������X.�XrwK�������ln�������4,�n������$I�T��������'?Iooo�g����
oxC��O<����=;��rK��r~��2�u�������9����?
���������m�]f������������<���I�%K���C�����c�=�P����>��|�;����?��L�:�E-��O��>��|�c��w��gf��e��'>�?�����_���y����e��
�u|��|�`ty��?N��W�=�����\���O�JV�W\����e��J���������9������%=�����������>�R)���_���?<�3�]vY�9��$}#Yw�yg��c��)�;��s����-z�)�����/�����*Gyd:;;��<yrv�e��^�:��-KOO�������/�?��bz{{s�����K.p���:3g���I��d���^�z��r�Wd����3�n������>����v[��{������c����f���g�����C�������O���b�c�O��<zgr�{��_V��q����&�#��-����R[b��I����O����������o�mz������{�k^�����Q�?������9s���K/��'��U�V��_�zu���?>�3o}�[���}o�������*?���s�����?�i������w��OtO�6-^x���*�������J�L:������?
�����;�����_�]9��__�����uSS�?w��7f��u)��I���:�y?WSS�]w�����G�������s�w���NKcc�?w����E~���d��q��S__����o.��������\SSS������;���y�69�:n�)���TO��q�7@0�u���m(�#KM��OM�3�:::6���������'f��6<	=q������Y��
7���K+����[����f����������w����W���.�o�}>��������u�	'��N�=���n�!=�P���2y�����/����S__?(Y����pa����9��a�w9���;��Z?N
�&�X�&MJ����<�����W^�$)�J9��C_��;�U]]=-G����~��9����<k��w�Q-`��]�8O]pA�==�\��_$I����X&�Xs��d�_+����w�5V>��kX`�����U�r�]we�=����{,�]w]J�R�d��y/���+W�=q���+0�<��w���k�n��_�0��H.�Tq���d����y����_��TUU�\.'I�=������|���Fz{{�$�R)���?]�fMz������v�i��o=O=����O�L>�����*�]����K:V��5�����|�v�$��*���5,��L�����g��I�o���z��s�i����6?���s�9��T*�\.g��w��_��
���C��V�T�K^����:�����NzzR��n����,������l��4���.�1��.�!��G��������6�l�i�������[�r��R���O?��u�%��=y�dX����pa��i����0��:����b{���X�~x��_���*I��r���w�!��]�z����/L�TJ�T������;�p��~�������w��`��)�������L�<9_������=�{�r9GqD.���TWWo��\rI����$I�T��G=��6������lY�����Y{��I�������E�r�rI��U���K��:X��z+I>������N��_����;�n��r�G�U�z��>�e�e�����>�����.�FY����w�����Z��q{������x.�Xr�%�}�����!��V�l��v9���6��o|���`����w�mmM��>�[mU��Rmm�}�#�����w�O��(Uu]������-5"�F����$S�����s�)�
���������R���*��XS.��v��I����n�P���;k����,�
�^�$��-Kjj�x�aE�`tu��u��y������$
�������0�����/�W5E��r9w�uW�-[���z*)������O>y�#Q��Ey������^���'�H�457W,�g��L~���m��e�.�;��.F�1�u���������~��tttl��`O[����k����J��7T>��s���C�S��L�f�s`$�X��/�����,X� IR.�7�]�R)�r9�Ri��#\��'��%I����S�����z����S��xFwG������]��m��	C�~�����U�2w���u�]��UO�Xm�-�F��[oM�����81����j���b
� �j�;'�H�yi�]`���t��3�����_M�4)�}�k����f��iill,�&0��/\�$i�;������w�6���a�OhW�Z���G��W�R)g�uV>���f��qE�F���XM����J���;
`@q���������R��R��O����'?Yt-`����i����f�_uU���@��=�ka�����w�����x IR.�����3�8��F�P�mo��'��rGG�����:������<��/'���|n���g}��VWWW��T*�%/yI�g�h�q�u)wt�z��2����\p�����RUU�2x��'��}^�4N�L��	�K_[�,������[o��uM�����+�L��?�����n@�uw�����d��v*cX�5EtP��\.��(�
0��.L�4��_p*�\N��`�5���a9����{g��YI�+V���o.�0TzV�N��g�����6T���I�}_���1���r��g��OL�|�S��o~��������;��re��:n�1��M�K^��w�X./n�}I�����j{��������a;�u�	'�]�zW�������/�g���|�+E��Q��w��GYHv����������_�ry5�I��ry@���V�|�;�IUUU��?�3_���r��7����t���Wt5��\tQ��z��TO�Z����3���*���[���7>i�<�y{1���1��J�R���o���9��r��W�����)Sr�d���J}}�&�������0��/\�$��{�����+�
E�n�;�y]2��}��V��^�:��rK:;;S.��$�V�����`}S��eX��<����5��J���E��`]}gmc�=��iX`]��y����{,IR*�
n�W[KK����H��I��h�������N�vk���9�����SO%��*��������+�$M��������ZX��X��/����z*�R)IR.�s�QG�����>���i��������0��������g���]���U��$�����u�ELV�7t�k��������a9�u��w���%�R)�r9S�N�E]�9s�]
����|%�z����m�M������qV-M��2�9��d���>{�����^�$)��)�J����m�
�Qo���Y��?'If^{m�&N�x���3S��X�\6MWG�9aF���]N���i�������c�=������s�	'�*�}��$��}�M���[�a�{�V��d���v�UEx>&LH��J�����)�J7����pa��q����0�==�U�Pl��5,�v�a������
l���~��/�����3��P5Ex>tP��������K�f��u���Ue���/��`A����K��w'UUi�3���l�U��?�2���L���}gmce���\��n��r�G���.Kkkk~�����c�-��\�SO����%���O+?���N������y��Ar��*��4����aX`%��>��\q������?��477g���E�`k�����;5�m����O�/UWg�I'U<�-����|��d�n����K�>�2Y�m�`r�!9��s����/w�}w^�����������[]
�Q�}��$��c��Vg�UpF�����������U]���v�i��O��'��k���{��O}�S�����r�\t=F��+�L�4��_pF���j��0R�]`Cv�u���K�R��rV�Z�������?����L�:5������R��{��w��0��[�<k���$I��y��`�1��i�����K���J�RJ�R��\.'I�������n�{�~�S�m��g3�=�-�q��I�q����3*���Z~O������sM�Yg`����={�jK���`x����,=��B;4��_h>�o�-���_�������t�vk��v���+F�5_�$��j��l�m���&M���N�x.Ck��}�������.g�������,��4l��.]Zt*�m��$��/9�O9��6�]}�n�%G��.��*�$I��O�����$M���`4���;k���3`0,�_}u�����wO�N;]�Q�����3�0l�`Xh_�0I�4~�Mm�;����b{����0|-��g����=�������$��������WI���[����k�L/������U����}���eVO������by���&]m��,U'[�Y�L6�����L��O�j���r��I�4��5�l�����<�buw��'~=��ue2��O'W&�7l����qH�[*�r�����F����$�����%/)�
�E����i�$MS��@1���~����o	+���6R������n�h�n�3_�5��b
��-U.�\���hV��J��W'I
`0��:���f\q=(���z����zz��\.o���R����/|!]��[���'�L��=�[m�q��S�\���*��G������n�;k�R��f0|
��%K�l�3���Y�|yn�����g?��7��R���w�=��~v�i�!h
0��.��O~��������/%`t����?�\��i��`��X3g����^���f��9��?��.�(�~��s����-oyK,X����k����+�L�4zh&|�rKuu����T,�bu>�w������>o���>��k�`
�7����q�3o��<���9��cr���f���EW�hm&I&��=�|���`����;w|y���������C����g��$����s�Yg�`��<�d:o�9I���\pF���Xu
��`l�XI�����I�r����;/7�8�W]�����%/I��;]�Q�{������j�.P	�n�mv�e�,Y�$����r��G]!����������V��'��$I����`xY�4Y������G�NXT���J����*K�,I�,^����V}��y��3
��d`L[�<��S�r��g�5
}�����������l�4���?I����$US�T<�v��3��c+������}�W5u����.g��d�����icbk�������S*��$�'O.�0b��������$����M�v���F�E�}������WhUE��/}�KY�n]��r�d�]v)�0Rt\w]�]]��a����[�u����m(��������|�K_�9���R��r��q��e���EWF����$M���T*����k�V�,F�a;�u�UWm�sy�����?�1���/���\.'IJ�R���w�����������n�X��~����0X����y���oI����r���v�-���g�P�roo8���a�!���$ijn�L#��~�,�F���2y������2y0��������T�R���\.���E]�)S�rC�����8��z��=7��**���+�!
jz,/��2K�Xy������������v�<fje�]4��4��{j��@EA�0f���?&GAffm�������k��>��v��`�k���?�Po��Og6L��������T��nIV����m�����*����_���}��'�y�{����'���=
(H���I��)S���W��������9l<Z�;��<��5}3��.��7���Ul��g�����J�80C���1c����f��Q��(J����G��m�)8
����XCG%C�,6l��U���W�H���I��)S�
�&���s��/6l�����Z��7K��j���g����	km�\���������������>wn��n}��$I����T]����8�,I��I��^���s������)�������������:���T�G�'�����T�%��z�G
����8uj�d���{=���W
�a'���s�x�,�\��-�����3j|R��{�@�Xg���4M��$���a����K�5w��vM�=��,��Ul�����k{O�4�����l�C����SjhH��	E���ZU�U[_l`�*���CM�T��}K�RV�X������i��$I���TWWpX�����NT��-�Z�\.*R���i�6-io���K��&I2h��>�	��o��������3;�����	���.�z��W�R�G��J6�������
��0yr!s�8���d�}?w����	���-�:���������<������;��C%�,��i��r��'�tD(L���i����$��Rmm����>���}6����g:��vK���ff�f�����Y���WX/����S��T~��_��'����?��/�<55��`���qG����92cn�-�R��H�Z����������
�������~u����|�S�J�\��~���v�iE���8uj�d��)���h+���umCq9���o�V���?�#�<������.:l��i��$
S������s-U%5u�f*G�/�J���>;IR.��^@O+��)����?�K����N�R�@(w$���������I�T��*GM���k_���1",�O<�{��7���O���GV<�\f��V<�L����n����c���z�w�M�'�m�;���w�6.UE�+�o�}��{����$�GK��>-�J�����R���3��������d��z���):@_���W����sL@�8uj�d�O~2#>��^�W��I��a�>�����s=��d�#{iH)8���6J�DVGGG�|����������������$��>:5�o^l X+Z:�A#�z]�@�$
�n���,Z���x�����)����s��������������C�f����w�}��N;�T*m��+V��;���>�������:[m�U��o�����=�I*���J����4hP�8��8�^Z�:���bs��~_���O�����R*�R.��$'N,8U�����s����k������x�6�l��O?=��3b�����l��\p�����������������w��G��*I���I���N����4�~��;�:X@��X���y������4_�������r��R��<0�m�]�{UGGG>��O��/LGG��^��3��s��\��������~�:��u���������3�z�#�<������O~����'?��a��y��X��#�w���hj���-���$4eJ���������G�n���:�����	P�X;���+����9.L[[[�t_%Iuuu.����X��8�������K�744d��q����������O�\.w�?g��w�q��/���{�9�<�H�L��y��u;?x������inn�?�����E��t�M����L�:5��O	���/~1K������<���l��<��~Y��-U%��������b�����T*u+hZ_�R�k����\z��y�k_��)+���^�����v�-^xa^������_?���>������/|!���I�����z��y��G��f��q��+r�	't+�1bD.����t�I���M�,X� _��Wr������#I��?�9������}��>7�i+��i�:5I���?��W��
Q7n\��g���iY���Lz��1F��*�k�R�����*�Z�N�0!_���s��h�Jt���v;���3}��4�%�n�����g?��'��#���+�tc]r�%��'>��9������to��f�����v���u#F��y����v�-'�|r��o����>��w��}N�j{���x�������g>�����#�+�����O�<��(��b���~��.�*�J8p`��1c�d�}���G�=����RV�'�|2>�`�s����V[~�BS�L������|�;]�~��_�����5��w^�s]t�K��^��o{~����?�A�d��9��s���p���E���I��T~�FmEK�Z[_l��V�X���?����y��G�o���9�����7����
���5^{�M7�����:�a�r�i����U�W�r9Ir�5��[��V�
�N�dUV��)'�
�����)����-�b�-X����v�m���n�����-Z��k����n���vZJ����7n\9��L�>=I����o�1'�t�:�*W�SO�i���������X�`����Kf���;zg��t��
��~NV?2l��n�����|����b�-�x����n�����y�G�U��$7�p�,�'�:��,�����R?aBa��4������z����?�H
����������?����4�e���_���x��6g��<��s]�������_���u;������^�r����Y~UU�AGQH��'��R]]!��t,Y��5[��x�_�yE������;{T
X����n��:(��~{�d��������O|�k�o�������u;w�������~���N;�������n���������+RS�?E��5N��$x�����-8
��������'��-6�������/}�K���������l����5^�h����-o�Vlu�1���c�Y���<�H�����n��m���8p`�qkkkf���^{��i��$��)S
N��meVm}�96v[�u�m�������i+����N���GMMM����NZY&N��o|�)�JI�+V�]�zW&L��.� ���/����6?����| ����
7��u�G����z����;�����n����z���	l\��r`�	h_���v��m(6�����k���|'�r9I2a��L�<��3e�����>���{R.�s���f�������}�{_���3�<3=�P���;���w���{v�q�|�c�{���TU��m��e��
���^|���|%������~��y���7x.T�r[[����>���'����S��K�A��<X����cE��X����u��;���������x��)�JI��O>y��;��Sr�=��T*�����%�\�1+��)Sr��w����l.������������>��G����}��W�K����������~O`}�[��������@�r���9qb:z��9����S���g�`�gH���dEK����I�k�f@�����<��Y�pa��r��
ox�����r��9s���G������K.��q�r�E���*If��������a����}o����t�[������6`��n�������vK~��>-�JMM��vZ���x���+�J���Y�UM�V����z=|���������q�2|��,Z�(I��Ce����g�jkk�I'�����g]�F��������������4hP�������+�_~y~��_�\.g��9��������/\���v������/_��=�
�8uj�d��.������VW��E��������{����?����l��,�z����$�R)�l�M������v`=��3=�g%z������j��	����2z��n�m��V9��cr�1������[�����t>����.�n����V�4���w;^u��hnn^���������p�	�u���?���?~�g@�i_�0-���$t���jh(8��UX�(��XTdVSSS��A����/�g��e=�g��>}z.������#G��n��[n����=��|��������u���h����������/.�jll\��/��'
�F���#Gn�>�4�zk������S�C!�J�����~��P9���:��
�z=���s��]��������u;���>���W���]��.���u<�����?�u/.�z����;������'�a�NM�4L�Rp�m+�j`l4j��:�J���r�z��477������sSSSf���R��m���\.g��/��r�1����UUUy���G}��������O>��u����v<k����9w�����t���e�w\�=`c�����[�J���lf�]w%I)�� �>ytz�����Wb`l<*�k�]w�z�������w9���^�~7�tSZ[[�$�R)�������f���Y�xq�sc��]�=^|�3�<��k^��I�'�x"������[�?�p��q�����"�3�1�CJ�O���R}}&O����$����5���a[��L^��l�s�=3r��<���)�����?�AX��w^J�R��r��	&�`���|����[�b����n���y�����3z��<��s]s����x���4�O�S�����{�2���m�������lu�e)UW���{����7��y�JG�����HR[�7s�H���of��*�+I�?��|���M��{�����?��|�+����?���{��)�J)�J9���S*�z:n�6_��f����c����<�L��-��r����
o�e�]�u����~��~���w;>��c�9ll�MK��O�����Zp�m-�z���%5��@��*:��|�S�J]]]J�R��r������SN��%K���%K����|g����v�Q[[�O�����uuu�j�����:u�z�q��7w;7n�j�;��c�_~��)��/��O<�[n������6G}�ze��I����4L�Rp�;m��k�:��+6��b���n�|��H�\�*�������>g�yf~���f��y���7o^~�����3���1c���(�r�k��������c�D�����v�������+���[n�%������*Gyd��v����������_v�9����(��o~s�
�N�`cS.����k�,6!�M�k]}R*���U*�����p�	���~�U��$���w�TJCCC�����+���r�����������6|����r�QGu;����'�\rI����u������C����������y���S]]��{.�����}��:�l��r�m�e��v[��?���r��'wWWW���{v�e�u�l������_����|0���{ay��w���������g��>����e��T���yX��%�J�[{g���'�~2x���_��*������V��r��W���h����v+�ZUpU.��l��n��J�n�Yg�uV.����]�#�<2�'O��i���]z��y���s�9���CIM��~���������|�����������/~q��WIr������Fz��$���s�����/������9,��_�/~����?��3
-�`��b����4)��^���uP�A���(���������{��/������_���:*��{n����t���B�U��rW����s��g������E���~��:(3f��:w�m��������3v�����g���y��'��]��Yg�����-k�S[[�k��&'N���t�]�z��������7.����1cF�����;a��\t�E=�i`���MK��5�[n������������Yg��\X�%s:���$CG���RU��7����_����G�#�<2w�yg~������c�x��,X� K�.��!C2b������9���s�QGe�}�):v�=ztn����r�)�>}z���-[�x`���������|>������W��U�:uj�;����9��������~�����kR�������S�$�������W
N����s=�������M�FS����8��m�����7�����g�����[o�5k�~��ay����~��?~�z��k���������%�\������w�9���r����T*��x�o�9I�0eJ�I�r�*���|s
��`�n���r�	'��N���Ks�]w��'���E������C�f��7��{���v�-UUU�x��!C��/~1��{n����<����?~�����V[e�}��{����^^���i{����:
�&*F���:XH�&`��!�<yr&O���sjkk3q��L�8�W��q�hjJGSS��]��_'I�8 �C���|X_+Z��>������kmC���5Q����;���I�Rnm-,C��)���u�l^r�;���}7����f��U��_}u��W�#Fd���^�|XWs����-wN�o�w���j��_M7��$���?�������R����>�Z:�m�NN�z����(�FS��h�����?�����{��7�����E����O�,�JY�bE/�VY1gN�?�`��a�dET�m��k]�b*6
_��|��|�����^����?�/���^N���I�{���-�(6T���������W*������a���z(�r�� _�zU!����0�^���I�AS��*_k�s�S�Pl�+[�����7���y���t�[���l��V�a���?�����{�����,X� 3f�H[[[�{I2v��l����|�K~��,������>��r�}I�Xl��1y������������g@%�����������J�v�a�\z������pUUU]�}�+_�:����?�����7�����>�R)�=�\>��O���O/��@���r��uVV<�t���2$
�&��\�)�_�,��w��m�w��H[���/9I���6�l�L�>=�m����7p��q�9��#r��7���|g.\�����ill��g�������=�xV<�tJuu�������>�=`�=R=th��������N�P2x���U��l�_���JQ�Xs���<�R��$���?�N�W/v��G�7��M9��,_�<g�uV&N��}����#@�j�:5IR�Az�����G���5w����d��������������$I�\N����X����[�	&����J�ttt�S��T���C��7'I�L)8	l\�������u��f���"��{����[m�U��j��^�����������T*�\.����}����#9���;:�4mZ�d�,X/m/��������������`��$I�T��Q�V{M]]]����$���k�o�m��;��3f�\.���o������`-�O���������}���
J���|�I+�G�%��f^�����.�������WE��{M��b
0`��:4���K�T����_v�-��23f�H���B��Og���'���eh8�����
�=��?%7���s�����Ud�����^/Y�d��l���7o^�����=W�z[��7'����z�4rH��/��e��?��s��-����l������������,�7n\��\.����[�5�~�����#I��?�q��-]�4�<�HJ�R�d�����4M��$v����/�6^m-����%G~��,���*:������z���3g���\s�$�,���������{��}�����+R.��$c������z�r9�+�M�Rp���5u�����6\E`m���?~|�������kN<���J��J�����|���9s�K����kr�9��T*%I���3i���/����Y���)������������Ul�j��&GqDy��$��7��������1cr�1�����O�T���>��v�-GuT�������v�m���;S.��$�R)'�tR����
����S^����,��/�$�����^���my�����m\���)���^�`�x����7��r��k��&_|q����}�k���[�d���J�477��+�0��[�U�\��Q�r������������G�tf��)}:���4��m�S��J�����[�5q���u�YiiiI�<��c�g�}�]�������n��G��T*u{�q�\���n����>[m�U�|*�����EMMJUU�>�z�-3��o��9P	��W�Uum��_?,�~����[[��$^x��^3a��<���9�������4�g����6�l�SN9%��G��f��VT6+������O������5��D���u>=[���ze�Y��U�X�j����W���|�+y���2g������=:�m�]��� M��'I�v�M����������@e�X/��v�)�`���MK��<��$�?)��EU��/5�,�j�2��$�?)��EM��4�������M���}94��{R*���C�n.��M�|y���o�5.�\�`kQ�X{��g���w���O��Q���@k{��,���Bf�tPj6��������6��@���m��6[�������h>�����#������w�q���+:=�q��$���������gsK�R�_��>�E[���Nxg��}3�f@��^}3�8Ul�*+V��o��������a�����5��rJ<������V`
9��y�
N�W[s�����X��T����M�\N�T�z�h��|������3~��|��_��Y�
N	��*��i�:5I�0yr�i�[U�U�Pl����3f��s���;��r��$���{��|�3���;���;,W]uU������:j}���?�\J������ZWV}�9^���k2f��|����g?���~�������k��6�-J�Y�U.�S.�3}��L�>=��_��7���9��S2��A�IGKK��i_���f.���$I�A�j��>�}i�c�?�(:E���s����
R�X/t�A��������\w�u���+s�M7���=�R)IR.��l��\y�����+��v���SN�)����v���OP�]rI����2{��)����p�g��O��_):��lX�0 '�xbN<����;7?��r��W�o�[�t+��5kV���/�_�B^����]�zWN<��6���Pq��tS�����S���><�����<�k��u����6%[��4lVl�*���r�!6�����|�����W_�9s�$�^�����r�����?�qaY�=�P^��Ww?����}��L}����G6�,��������k��#@�P.'_���������E'�y��S�[����{���|�+y���s�
7��O������\.�\.���%�\sM�i*G��w������7��=�(:�+�'Y������F�H��k����}������g�}6���wr�A%IJ�R��*O��iI��CM��_}�
�����
�^����e��a;vl������;���EGX�r{{�f�H��>������$
�'��LX�K���E�x��>���LJ:�^��`=������+��� �g�.:�:{���=�~��BfR�@��dr�$+�N��j��2�����������W\�{��'IR^�$�R����5�yM1!��}��,���$I������<��AS���U���y�r�>�Y~U�N���N�a^���T���k�����~�+��"���o�������T*�\.�\.g�m��;����z���e�]
N�RM�c����q�����
�����;(9��b��;6���������+����$.L�n�W�J���7�)��zj�L��R>`}5M��$4yr�I�xm��km}�9�=E�SO=����*W]uU}��$�K�V_%��I�r�����N������>�MK�4L�Rp(^[K�Z;�����-�jll���^�+��2��rK���jK���rv�q��r�)9��S��;`=�/X�����$i8��B�@%hk�\k���@����Q�F����o�^X|���j���9��r���f���EF���e��������3�nfSSR.�n�]S��V}6��k[����d��E'�t-���*���*����)�R)����J�R?���z��y�������o����Y��_2{�q�2��f�-y�OE� IFl_tzK�`%I�\N�����9��S��w�#�l�M�����q��$��w�3�N=����H�k^�g�X����u�����eS6pp2r|�)�-[�5b����mo�����8��8�&�i��$����=�;��4���s�E2f�b�@U�X�>�ljkk��lBZg�H�?�����a����P�����f`�9�?�*:��(��Z��iI��	R5xp�i(J[K�Z�zMM��E���f���'�r��Xv��I����{m����,|���q{�o��,�=m�SO=�Y�fe���Y�ti���6�,c�����n[t<����<��7�m��>�7����d���3�?Wt
�?�������k��i��w��?���y��g�x�V[m�C9$�y�{r����]@�W�=�dg�Umm6{�{zuV��qi�}6R�:��C��z]a���'�����mX>�`N=���w�}I:���6�g��������?���������}��� )��NM�������o�*W[s�:|������kSUt��s�W���}���U|U*�R*�V{��+������������+����@�jZY�5h����@ekk�\k�^NM�����E���w������jU	�v�m����+[l�E
������7/���z��$�*�Z�|yN?��6,�w\a�X�r9���%I&O.8
T����bs�����������N�*�*������?�����Gv�i�5���O���.�����477�T*���=�z������g��7��O�[�?���%Kzm��Y��>gNJ������9���hO�L�E'�M���;�������S�X�����d�����=��#�_}������7._��s�g���������$��%Kr�y����/����IX��������Of���u�0�Of����M�Zt
 Ij`P�*��\.�����*��~��s���f��a����1c2}�����>�5kV��r~��*�����k�$UC��T_�ks���3������1���u������,�)���zX�)`�*����k����$)�J�������W�><]tQN8��$��������5&L����)*wt�i��$�v��u&N,8P�������%#w.6�������c�u�<xp�;��
���c���!C��}��
�H�?�P���K��!�D$ik�\k���W�Xs��M��J����������jkk��;�d��k�6-I�0qbJuu�*���X������UdV{{{���������ttt����)k�:5I�0yr�I�J���t���O��b�P�j��:#G�L������93�r9�R���j�U��r�
������gO;-M����s�V�]� X�������o$+Z�N�f�<�N/�"�����z��E����s������n���,\�p��@������+�dV�v�e�~���,��=tc2���S����&��E���Ud���!C�d��e)����G>�;��3���������|���:<xp:�����i��$I��I����{u��W�*������+m-���w$;���,/g��N���"��Z[[�c�=6?��S*�����c��5�\�����>MMM9��s���'IJ�R�?�����-�X���I��o|c<$
�����u��m�(6�������?�����%I��r~����U�zU.���455������|�����������7)�JI�����{�����R^�"M���$i�2��4@Oik�\k�zJM��d�v�\���)�J)��y��g��w�;g�yf8�������b�-2h��466f�������s��w���)�r����T*�K_�Rv�a�b?���{�M��%�><����8@YU�U[_l�)[��$���2��|�_�*�*��ill�-���[V>�����r�tg%�g>���y��}^`�s�e�%�������Z��?I�0iRJ���>6v�M�}?OZ��d����\k�zJE`%��?��L�0!�}�{3g���"�UV\%�zoU�U�\��Q�r�����o|c���U�?��,��w�t�����y��z�w�/):��k^t�_��$�sL�|��\u�U����r�=�����%��*�����~���w���9���S__����K���$����f��{}^����w����v�[�K����,/g���f��z�FQ��$���y�{������ill�]w���3gf���Y�lY��6�,c�������A��6sf�f�H��3���M��!EG^���s�~����6%M�
4(�rH�1�e5N��$�?��WP�ZW`���65UE���i��$I���'V�M���kr���v��k��2l��W�����s���wO�4i���������=�+{7*��.�JZ����e�w�������-�:��CS*��$����3e��W��]w������I�R��+V�HF6~-<�{��tt�����4��u��?l�cr�'�N�fu
E'�MK�`%I�\�*�������]w]����!CR����2c�)���A���yOt���I��B�������N���.����+X���S�$#���l���������u�c�C?Pl�xUE�kJ�X���%����$i�<��4����t����T�M������u}}}�I�$��s����z����_t����;�Z_���`����z=|����PQ��MK��2%�R��4���5u�
��$�):@o[�xq����%IJ�Rv�u���6�����������g����$i�<��gAo[:7������E'Y�����, )��s���:]w��W���n[�}��r���2c���|��Y�hQ�{'N\����r��y_�B���������>��>��e����G�N�2J��;��`�s�9)�Jk|�\.'I����W<�\.w�����)������w����i�;7��3��[���^�Y����9���@okm�\�����fY����!������P*��J����/g���EG`
�MK�4L���(8
l\�V`
�25��,/���r��#������s�a����2i��W���iU���'�������bs��B����������L�2%�R)Ir��f���[�}���2h���1"c������U��H���I`�+�����)�6�`r�!�t��{�����{V���_���K{|���K��`A�N�������S��'��$i\Pt�����s�Xl�uQh��)��EG�|������:���CS�����!��-���E�X��E'xy[����Qt^��H�9�����K��_����SN��}�'5-�\G���<��$/5ph��#�N��*�����xqZ��;I2��_N�v�������n��d�{����R���y��Gr�������NSSS���3j�����.�k��2`��W�wKKKn���������SWW�m��6�y�k���;�������?&��i'�Wl���;���bsl�`m�.]�����������1c�����e��	y�[��~�������?�s�=7���������k��o�|�3��q�������4uj�d���'�bu`
,6���b�f���k{o�����w������w�;s��y�k[[[s�m����[�������N��y��z��w����?>��rJ.�����������i�=;��=��3��tS��a��^�/4��I���St����������-��a�R*�z|�R��+V�������/�Yg��r���������[g�-�Hsss�}���-�Z��n�-G}t�����>|x��������J{{{�{W^ye�-[�k���W~��)j_�(O��[:/��y�=�O��S�$?=��kVW_t��W�`����&��e�]���������[�<��L�<9������3u�������_��������y�[����j��1��W��c�=��������y����|�;]����?��_��|�+�4}z:/N��>�c�����o|cjF��������km}2dd�Y^l��d���Sl�*���XU����V������������kkks�W���NZ�=[o�u���w��xG.\��3.�����=��x����������[w�n�m��%�\����>�������s��i����6�l}>����%I��zj����N=�m�3�v����g��@����SO=u��ijj���?�{��'K�,I�Y����;���������}oZZZ������NX��_�����������n�.�����_��'>���t�M���[�$�/�E]�/|���X���X��L)8	��UX������Ul���_���-�����s�9�������3����u�([����2m������NX���u���8��-�:�4iR;����S*�r��gw��{��^�;���J�����?��<�$i8��b�@kU��oU�7�J���
o������z��)����������h�����n����>��g\w�u��O?��u�o���;vl��s�=����/=�
65M��'I��Gj����0��V�t�
��������������_�����;���^�)S����}��z�3�<��n���x���������3�-[�[o����u��Y*�r�����K/�:w�
7�����P���_������[Zz}VGSS��a��^�E�������4-,:Iwm��y�N@��������:����r��G&I>��O�������ioo�:��_p�������u<v���=z����^��������xP~��Y��3}:s�[�����_f��,�g�)���������~_��$S�L��!C�t���w�}��?��]w���X=��;��v��^{u����{s�����[n��Y��|���92;��s�<���t�I�f�m^v��?��x��v[��/�������c��4�v[�d���&�c������6K�z<�^���s��u������Im^t
z�&Q�U]]�v�!<�@�����&Q����;f��e��?��}�{/�~����9sf���?����l>����s�Mmm�g<��#����n������g������8p���J�r�)���z��:���J��#��j[Y�5x�d�
��&���}e��]��}��������qUUU&M�����knn�������>:K�.]�us���v�����W�Q�F���_�k�?�z���q��$�����_��h]Y�U[_l65/I�0k����/,`�/:::^R\u��g��{�M��J����o��G�m��6������{s�UWe���]����������g?[��e��u;4h�z�,�J�������{�s�����?�^���0zB��iI����N��M}��5A��-����s�v�9��4�c���)�����s�=I��7�<���/r��w{��o}k>��O��3���~����?���s��W��SNy���U
8p���F������{������o��_������K�d�,��iar�������=���:�:X��~_�5������O�T�*��0aB��z��J������_�:�y�kV�����s�UWe��y���~�u��_�b���w�T*u������q]]�zg0`@����������bE�y����xqajw�!�;�T�|*���N����/5h������X�-�5�\��}�s�={v��T*e��w����N������~���X~�JUUU���og��wNGGG���G�-���C=t�sZ[[�;������'l����N����:4���}�T��7��%��j^��n�g�C�<��~x���E�`SQ�XS�LyE�577g��9�5kV��r��rJ�R�z��p��0x�����{��N�����9�����������
�^<���e����g��=_�����9������<�����4N��$i�2%[|�����kk�\��/y��
����������'"�����������s���G�#�*M}}}�������un��!�g�}�y�C9�[�]w���k^\V����^9��r�`�92#G���}��5�,�4yr�I`��V>k����P�����R��U�U.���6���k�������_\��N;��j������v<w�������O�G�d��9Y�bE�qUUU��b����������nK�4(�����|nP��bs@Qj��6�ry��8p`��1c�d�}���G���>:���������U����>�u<t�������/\��%���$k��Y�5����3&�F7���������%�������O��)�[n����ks�x�;�g���6���%s:���bs@Q*��������v�-S�N�:^�|�z����������%���������������~x���-��73����Y
��RUU����=������N�fu/�kY�$Tl�o�}��v<g���������7�|��\�������6mmmI����y��g��V[���?��O����{�����k�u�%Ij��M����6���!��uV����e����a�d���fy��[$��_t
(��~�
oxC�������$�1cF,X�#F���w�}w��������!C�d��I�����������)�����������v��c�Y�ll�:�/O���'I����3�U�*8�����u�c�����,��T��3r����u��v��?��:��b������v��C]���{l���.�l�fL�6-3f��:5jT^������l������[ZR=zt�v���8lB��;���bs�)��g�8��n�^xa�/_���]z��y�������#�<r����mo��A���o���L�:u������{�����v�i���� ���i��$��CM�T*8
�����UT�C��I'��=������G�g�����5�s�w�c�X�s���3l���^?r�����w�s�~��3{��5�8���s���v6,��G��Y�?W>P�a������ik�\`@e�):����?���o�=��{o����E�e�����G�T��7��K	�WUU��/�8GqD��r���+��3�<�.� ���_���/�e�]���>;��-�:��.������Z�|�c�W\���{.I2c��t�A�����c�9����O?�t�;��|�;��v��>���1�G>3��\.����O���7����$�&O��y���3��}8i^\t��[�����`@E�(
�����\p���_��A�����b�������������]����?d��������������1O<�DZ[[��������k���!C�:c����O~�#�<2--��L�9sf�;��><c����E�2k�����w������G>��������G�]}������7�Og��f��,�St����K�����UtV{{{�8��\~��I�X�����VWj�r��w���������u�Yikk�:��s�����[�=�����~������}�{��I����N8!,�:�h���{������o{����m�?�J�8mZ�������W��������D�PkS�������e�K*:�B]���}(������%�W/�b���Vy��7��r�G��s�����nEX/4v��|�C������n�fL�2%���s�����+�HSS�j��g�}��O:oz����s���V`
>����[p6f+Z:����a[��xTl�-���o~��]EVuuu��G?�w���a�2p�������?d���Y�`Az��L�:5����2g���J����n���������T�]w�5?����d���~��y����x��<8�F���������o��Q�F�[��V���/���o��?�E����.�l�M^���d��v��O��*wtt`5L�\p6v���k]}�9��K�`���I�r�������W����������2z���=:�vX�>��|��������<����4iRn���|��}�*���Cs�QG���������9���r�a���6��L���)
��(:���X�
���P�X�������S*��$�}�{�Z~�:uuu�����/��������,]�4������z(�F���������Y��/��|y��h}��$I���)����z��e��/O����g���*��GE`��/I{{{��T*�?��?_�^g�qF�N��k��&.�g>��|���������������?��Y��<�O��3������S���-�NlL*�k���]��
�W���k�~��<��S��T����������?�����8�G�@O)wt�q��$���~45�F����a�2������y-K:���J�O)6���Ov�Tt
`cR�X,H��J�l��������&���I���������{f��Q�3gNZZZr���g��
�F8��������S5dHF~��)�T�_�Q����u����O*6���*:���X�����A�V{��!CR.��$s��}�=��v����<��&���8mZ������_��
�j��'Td��a��^/[�l��>�����3_v�������-z����4�,�4eJ�I�D]X
���	������>IR.��`���^����f��I�;��c��������K�TJ�0���)h�������Y6D���&I&O��9�]�#y���yq�I�[0�s�Xl��P�X���{����gg��e<xp�k��{���7�I�\�m�����gg���^�~���/�l��$I�T�V[m�{��wZ|03��/)�{}V�����^�>�5{����O�b���`�Ud�;����G����K��u�]9��C�]s�������O�T��+����/?���RS��#=�����?�R����_Hx��^�'�������r9�#G�n���T*e����T]�{3xY���\��'��-4�K4l��4���"��d��)���~�$���_R�u�d�=���>�$�����~����~w�������v�m���K�t������J�L�4)�o�}_6b���%I���'2�C*6����s�����������7��M]X�\sM���/�T*u����FW1V�\�<���V_%Immm���/�zv��r[[����$I�����/��t����������&ox�����f��v����s�������>8�����$�R)�R)�r���U���rjkk���~7&L���������RnlL���g�{�>����*��=5EX�����z���8�����.9���r�}�u{oU	����.�(x`oD�k�:5I�p��)UU��e�A�+��`���-�Z�'O�=����{,��_2g������=:tP��WtDz�3'��%?�q�l���$i�<�w����},����%E'����#O�,�^�/
�V�y�����;�>�b��,���zuF���r���:cS4���yQ�)V��.���S�_���MO���I�{�����^�Q5lX���{e�MY[s������������Z?r�^���Z���I�A�����N��h]Y�U�Y2h�b������i��$I���'a}��,���/6}O��g�I���&UUi�4��8��UXu
�695E�Y1wn�~���X���g=�\�d�>��z��^���jZ�������$�e��;�ZX�X�����f_vY��t�Q}:oc������+:��
����5X����S�$���?2p��z}^��A������������6{&�^l�k�,{`�)�k
��1MMi���$���d���+8I�����~U�����IRUt���?�)ikK�v��v����Jm+�j����(���4M��$4yrJ�R�iX���s�XlX������{���G������WI����{e�J�����;iYRt����\k����(����=�Tf��5I[[����`=:-��9E�X���N�`lB����-�[l�{��+3=4�c�����n���u���
�W��Y��AE��N
�6!���%I���f��?_p�����s���d���L������r����S�$�&O.8M��������P�`l"Z{,+f�N��.�Xt�~�meVmC�9���`SW^�"����9��C����SU_����J���\.:E����������^��@���<��$��}6�a��>�����Sr�g��E'��N�UU�6e���>-��<8CO<������wV`�UC��nE���VSt�MU��Y~��I�q�=��-����U��)�������������d���e��Ium�)��)�(H�-�$�r�^�����S�q6J�+���%�XwUE�T5M��$4yr�I6^m+������Xi�6-I���[U�U;�����):@�)��f���O�f���!�,��$I������^2����k���bs<�x�Z�Pl`�(�x���_����V��8aBj���Of���\�<uo�)�e����C��4M��$��7d����{���2���{o�^���s�����c��2l�d����X/�8uj�d����!�_l�
���s�iR��^�f6>UE�$m�>���#)��p�!E��X�+����l�`�@���I�{����6+6Lk[Y�U[_l�����0���n��3�LH$,a�l���(����-U�[7l�����[��?z���[���*Z����h]�	�("*�E�a	[�����l������,��3����q]s���s������\��S�������=����'�V6���~5I�������~er���N������bs��,`�����������Y��i�7��<�P�)�*%��E��#X��0x�����r9s�����j9���y�s:c"�#�#�>/>1ij)6�AOU�L�,`Z���$I��?>]~y�i�1�%I����LZ:
�0a���E��W&I���NR����JIs[�Q&E0-Tzz�$���kpkVK{R����Xs���c��/�����;t�}�����9���Z���cx(�R���u�����������_�Rx�+������8�����i�����6��+��
�EH��*���r���a��?����47g�.h��c��o�/�J�C�Qt��i.:0��l���u�%I����}t�g����ZZ�~�xVj�ON����d(���b�e�4X����������i�}���'�T*�!�kkkg��Zl���\t`����I�t.Y2c���d����t�`�S�LZekV��g����`�*������S��o~s��v[C�T��>I���]�{�I��hRYW�k'l���E��(���r�5Y���<%�Z?<�GQ�;w]r���ze]������,��*==I������W��Y��xFJ�R]���[[�?6y�����	k�LwR�)�7X0��^ye�d���g�y��f��j������Ul��\t�1F*�����I������L�`���t���R�3T������4|pZ=��82�W[[`�(�E��dh��l���T>��?H�tuw�T*���@%���d������;jkKg�9�/X0�~����W�2�3;���}��_I~��
3Ams�N@=)��)RI�~�$�z�sR���V��������t��6���M�\�P��179��b3P_
�`�l����[�RWW��wRji):�
���'��<������S.:����$I�i����WI2�������L
�`��n-��:��������Z`��E���H__Fy�a�WGFR���$Igw�N�V6$���E�-�jk�,@�����Yq�q����������)O���K�)��k
�1f-
�hX�z�.���W�R������������-����e,��,<���L
���z{z�$���?d�����,C}�������B�@���E�
���k�$]���I�`�v�I�Z�M7ed�����O���\t�n-�j�(64�,f����$I��%)���c�j5�Z��������#�?��l����� w��$���N�\����[6n��#I��R[`0�)�`�T���������a�r�<���]��������������S@�(�`��w������i����g>��Y����#�H�}�������i�������T.n>4�,vK���$Igww����L��������q����Y��<���?*��*����1e#`VR��ngd���]}��k
��jkK����Y���L/#�J6~�K���nwV��=����=�$�7����R�cnzyT������5���-S3f+X����<��������)��I��~y��k���u�������0�(�`\z���$I��������r���'%����
���7I�RSS��9&��S�FUnJ��gS:fX��H__�n�!I��%����#�r����\�,z������Z�;��W��L}�_���@�8 -�^�{�jks{��vc
�����$IgwwJ�R������u���5������������[�@e|�?	�~��li[�9'�(�h����5n�,�`� C?��G��
v�o�O�
�^�j�e|Z.KNH���?u�fX3���}�V~U.�����}��R+���\�2��r�N����9��'��Z`7�`���$I�����>���m�b�O'���)�y{���)���V���Z��������}�����������������s���g���imm����=�i9��C�������Z�2iiI�3����[�Z;� ��(����;��|��_�n��������}����s�E����|z{{�������{������/�H\`�z{z�$Oz���;�;���EPX��w�����_M���Ks���f��5;�w�M7��s���_��|�3�Ikkk]��t��������O�$k�O�o����R[�gUNJ��?Os��i~���>�`mU�A�,�q����u���]�^{m�������o��=��3�rH��_����/�����������7����fJ�R]r��n�����_�b����_�����a�[�M[�`�A���3
�f����m�����$]]]�����=����K_��Q�W�/��?���}�����V�\��������>�m�����|���[���I�J`z^�>�7��$9��_Oy�=r������<��{�����>�i���z��c���g���u��K
�f��K���K.I������}���^8������><����C9$�^{m-Z4j��������w��]������]^��We�����E����j5�G�����$�^Q����,�����t�)������k^��T��$�����x���k�������Q�>���<�������������y��������Nh>L'�==I����m��jkkG�v
�f����=Y�|y���������	����~5�7o��|����������R�����}��}�s��V�3UekV�`
n-�ji/"�����4��7���}�c����_�%s����}����9���.�����r�!Y�bE�����
7���O>y�Y`"�m��'������l���9��H*�^����_����P{�iUmm�l�h����lpp0\pA����$��{n^��N����7��������~����J�<����g>��m�.��rXL����lXYJr|��->��~��_u�m�x�����C�Pn���$��{��O|���o��e��|�!�d�����g<��
�~��_N*LD��������u~k�,h��R9��?"���;��^�������;X3�����|���?�����j{n���Q�Ox��u���}4Zu$��}~��7���k���������E��FFFr�d`` Ir�i������&}�w�1������G����{���?�\0V���Q�����dIaYf3X3�'>���p�
I����|���N�T����V��|������������m�###Y�v��s�X
�m�PI�����.4�l���-L'+V������m��x�;r�QG�����7�z�����R�����l��i�wN��U��z��q������2��H6>8�������e���9��i�������`�`�0������$�QG�w���u���eU������QX���'s�E��.��ZM����uw��DK�Ch�����T�PX3�g?��\q�I�R��O��imm��������'rw[[������Ie`�6������=��v�yd$����>�v�q��9���z��7p;�k�x������u��k^���v�iu����>�y```�wl��e�w0��������{;����������?�������njp�W6�~vF���7�!6lH����~��G>R�s������?�;���F=?���z��_�s�=w\g�����s�9u���
l�������_%I��'I�����TM���o|#�^z�������s�=�>��eU����:_�VV���>�d�}���]����?j����^X�F��L�����m�_�������2��S+W����~8CCC����r,XP�l���Z�5x��\�<ijJ�i�5>�j.:��a��m������T*���{���1�n���w�q���<��Q��{��������/N{{���0&C�w��l��wU��2����Hu�9��4-J�����	��}#��I����O����
����1;���F=�z���:�m���>������]W��:���I��o�\�����]����s&>�iCcv�1����%���I����;>�`���1�����������wD�����&��prw���2��C����I�����|�\�>.JSs���ut���&�iD�������J���W��U����n{�w�}�����������{���O����m�~����/�.�U��\q�����E/Wf�n���v������3�bE6��kIss�|��)��S���j
�f�3�8c�g��G�[����g>���<w��g�*���g?;������X�b�������=�i�H�xl-�j���=���$I�I')��n�E`zy��^����m�W_}u�������V�����F�{��^�r�?~�2���e�X�[�����{���������>��o��o��x�����5���k�h�������>����z���y�������Y�0��������������2�����n�#%9,����U��l�3z��$I�,�H�v���_�Bz��$��+r�)����D^���T*%IV�\��������>5���������^S�`*�~E��S5���?;V�����[����R{{:N9eRw�S������^������<�9���O��s�=y��_�=��3�rH6l��{��7��������/�[���"bL������!���7n����&�W^���yi}������<�#�}$��o�����<'���I�Lr�������n�=���[�n��
6���o�����??����R*��*&����������������_����/������g5.LP��L_g�yfn�����u�Kgg��=�)O�����|�K_J[[�&�z[�Z;7�Z����'I�����A� �E�K�,I�Z��=���o>��O���r������n��
����8 O{��r����!1��0���e�}��6p�m~���������7n4�,����#g�uV�:�����T����'(6��U�$��������4f���&I:N9%������FR�������\���S$I)I��C�������N���n���(
��V�����IZ���PM5�=����o��i^��a��,����������a���.ySr�������eY��'����#��O���� ��+�a����v�����$�<�T�W�
���`��X�����i@3B�X����.]�$�R�;�\tf��>������?�����k�w�������
u�_����)��G��?����L�������`_�Z:�y����
�\�-7���s^�����������������O�!i�SL�y����;�����$Y�����3���)�OzR���F�6���8.ii+,�
�_���oN��{�+��hQ��`�*��o�o��R��Zh��\}u22���?^�L�6����#)����#�==I�������E�~��_|#�]7�s�6����������l�����g{6}�[I�.XP8X3���&W��������:8��/yIF6nl\�GkjJ��%S7�.X3He}m�������vv)�������n����)���=_�����c�����}���Y��)��A�j�~G%g���,�����$�:��������J��P?�����Ql���l-����.8	0�`� ���uw/���%�k�M�f����dC���N��
+kk�
���jn�=�6�5���zk�}}iZ�0m���y��E@����?���-(����o��?����������J�)�	O@��]m��O��253��&��>�s�.�4I��`A����9�c�;;������9��G@
���?��d��e���j*==I����tuw����E��~_���Ql�]���=�@Jmm�8����3�,���$I�n^�U���$I��'���^p`�S�� �}����`���$I:��N��Eh��J���$�<8�sG�kk�9ij��5�@�����Z�6&�v�Y�$�R�LX��������7�#���:8��_����h�<0�'�4�s��G0�
Vj������k����x�{�o�)#�7�<~_yeR*5.���zh�mmS6��`3�`_m��+���b��JoOO��k���w\�a�\t�F�Z���Ql���\ye������$�����`���X#[��r�uI`3[s���o���_O�����m���}�wo����HF6n�O���X�.���4-\��c�i���)���o&7~��I��?����9k?�������g=+�RiJfA�p}k���'��TL�����N�|���$��%/I����)�c���2��h���X@�
Tj�a�H����f������]}�d�>����*8��V.:0�
�����bsLT�
7��eK���/�GYt�iO�p�
�:��1Q���$IWwwJ�R�i����S�w]�v����������k��G��MI�:���h�w��$������3�,�e��/�<��0��[�P���E/J���'�t)��X0��m�C���C�n�����������r�5I��c�IJ�:$��%K�r�aS6`&S���`_mm�J^��b��W�UW%�jZ�������	*�Z�/��(6�DT��2I���]p&C�2�[�Z�cVOO��S���f��Jm�nXC�Ve��eI��3�(8
��\t���#��w'[6M�������9�;�����g���{��O�1
�o{����`�����`@A~��������Q?���������_�q����2��Q����c����S;��9��������$I������7S�T�VnkK��O�<Cd�����O��4�t�V��l-����s��������\t���jkKG�9�k��;3��)���������4�
2���u�`Uzz�$���r�4�n���P��%�\�TG
�kmm�C�T�O�
��l�����lW���>I�����Y�L
������d�/�N�t-��������/&�8�y���t3�,f��Gj�_��[TL�9���:�;���M��7'I������R�d;�z�!�x��>��I��@_m}����)6�dT��*�V�z��Y���v�\t(������bsLV��'I���]pX�Z3����3Nc�\tX_�~��&C[j�Q�5p������_4N#}}��lY����3�|>L�,
��.��_$#��eh�d����Yq�q���>�&��IOJ������P�@�y�V~���,8l������mrwT��&#7��������O�q(57g���}���D)��P}�u�A�_\Rl������$����,�.����B��0�
n-�j�(6�dTzz�$]��'��A���X�6�����$�
�`L`P��Jmm�,6�DU��:I����E����Bs��=,�.�����-S;wd���v����C��SO�����
5���$Igwwa`�Q�@�d��I����/z���<��oep�����r9s_���S����$�@�������L�����s���Uzz�${��������9�����#M{�Y�|�n`�$���{������,cQI����$s^���tP����*�����Z:��1V[�-���5)uv�������,�$[�Z�IV��'I�y��)������0��?HV�0�s��W[[�Q�5p�]Ys�����5&�N����I����)�
L�,��H�������@q�,���]�G��?f����B���`72������^�4�L���%���j����W&I�z�[�r�A
L�}-����>u����`72����'�����e���;����������EG�����R�>�[�Z:v���$���$I:N>Y�0.��_��]*�����c���������Ms�vG�jr�����������������7mJ��'������[��`��`;V�$������vn���ozS6~��S�egJ��i����L3
��c����c�d��S;�\N��g�}_�V����M���pBJSl;��w^�mmE��X�1�W[;5y�����{[�-����)uv�q�]�Rkk��&�\t��������bs��JOO����P~Lk
��c��X���c�
���N09�E�j��3*����:%�vid$���J�t)��9X��r�����N��uo����������P��J���`R�E����-�*W2�
S7p�����RKK�1&���c5������,)75h��g��Ms���������m���*�����E��4X��1����%���qs6~���
�I�S����k� �Y�\t���Z�����9���$IWwwc�R
��ic�R[]�����S@C4���������`����[����'��]��#�1)��7+_������H��+)��y�i
�0�)�&��o&��p�����3vmk�e���Nt��t�rJ���k���J0i��j��g%=e���[����_��p���?M��}�gJ�j:`M:;�m�i��\���=�q��r
��I����OL�����������������s�?�[J�Rc�[Q�5CU���}�����[�r��l��!mmm�?~�8���x��ioo���M�6�����o��<��#�������s�)�d��Eu���e�R[[;�w����$���V~0�(��A��_��.�,����s��Wf��5;�������y����3�8cRsW�X��������������|_*�r�g���.����>�Y���jkK����n-��\������)��!���7��K.�n�����.�e�]�����������;w�s�����U�zU*���T��,]�4K�,��^�}�C)�J������+Y�|���l���e��j�n�6���$������|���T������'I�����������?��v���������g�}����`����l��q��/~���������8s����o|�9���2222����s�Ae��U����S�Z�P�V��8[�l�G?��	�*�-����:�a7��$�4d�����j��q�i9���,^��<��`�@{��g�?����/�i���=��c�w������k����7�\s���?�����W�2���7�4c���y��^5����O~r>������{��;��#�|�;��o{���}�c9�������d2�Lv���V~UnJz����C���,M�����+���6w�������S*�7�C�r���uu���P�V���C0y'�pB��]�w���9������������y��_�O����_y���
�v�����W���m�'�xb������;�1{��j������fv�a������\\��e�r���n{��o~�c�9��<���o��xu2gA���F������E/J�����;�,$3�dz|��
������r�w��.�e�U�455����dN8��Q�/���]�]�lY����m{nmm������_%I�T��?��q���-_�<������Y��`_mm��o+K�&I��Pz
��k�x�^����q�ijj��^8��~��]����>����m�/{��r��G��L{{{�����z7��-�o�R[�[����$�T�@���@�N;��Q�k��M�RIgg��������.�`L�^����MozSz{{�$7�xcx��,Z�h������H7mI������)IkZ��3�7����������$I��%�c�k��?�c�m��q�Xw�qG����m�]]]9��S�4��{��%I��j���������&�`z���wN�r�ju�g
\�����E�y�z��i�����)�b����y���{�p�/��Q�'�tR�������g<c���t�k��C#Ok���pl��c��J���?vb��E�H�\s��������u��o���Q�Ox��5���}�LWY�4C��N����J�9b�!s�����I>0�����;:2�J�,���}n�����������;F=t�A�������`����d��'I�u�}a�����P��}�{����G�{�+_��3�V��|���k�0�y����:0��l���o�P��$IKG��� �E�����k_��Q��9���t�I;=�y��Q�]]]����������eK����u���Z�j�eZw�u��f�W��k32\J���$iU��,�k�_��_d�������7/���'vy��X�������������7O�����d.���I��n����N�6���V����������?����[:�z=L
�f����m�����Q�>��O���������Q�������������q��w^����?~s���:j���d�����������Y���D���q��/�0/}�K�t���}�������o��e�w�Sm=����Co���/Ny��������<gN������r]���D�,��/9o~��G�{�+_��/�x�w��3g�s��2�������x��_�s�=w\g�����s�9��
����������_M��/f�3��8��`0)��%.������H�Z���%/yI.����J�1��������q�x�������������g�}��>�L�`�������T.]�$�\���<0���@������s������w�z�����|%MMM����%S+W�����������u�Q*���u0}7��$���.0�\�E��~�������N��w��rJ.���������#�<r�����;�����QG�;0;l�?��[������3R�k����8*��^��T��hQZ?�a�`6S�5����������l��y���<�)��������	�����[o�u\�o������{�^�����OMIN���[.�J��s���J�)�	�����;�������_�~����>:?��2o��	�{�q��z���344������t�u���>��{������d��?���<on��
��^��C�>����f�����90�)�������<�����U���;��C���(.���GuT;��,_�<I�������>��~�.�����'?����R��������L#C�������g$�?��^�6���.��<��������r���|0g�uVV�\�������9���2��������~vL�����e�����O8��,Z��.���e����w����kS��L��'
�X3��u���g=+��/��n������~�C9�ns^��W�T*m{��W���n�m�g���s���zw��-0�Tjk�)�r��I��SOM����T@�4����iS����f��e�����������>����=������y����%I��W�"W\qE�������j5o~��s��wn{w������~u]s�5�qc2<��y�/*����m|��d^Z:FR��I��%K2�z
�f���>;7�x��woy�[�f��\q�����������w���������R�$In����~�����>�%TN����6�x�;��o{���/�8---��g�����������yun9��I���sKkWf����$���n�,`�(��!�.]��w�}�{'tWOO����9������~6��~��j��W��U����p��|��Y�jUV�\����{���s�=wB���W�V����}��5{�����$�o��I���NJ���7|05`1a/{��R�Vs����o����Wg����=����5��G�*"Pw���L��5�_�6������r����o�������	*7�!�����J����V��Lo��w^~�������OKK���~��Y�ti����^yL3���$I��'�<gNJ�����6�mnS����Sj����0�4���V���>��C��/})�����k��6w�yg6m�����|��y�3��8��|��T�.M�t.Y���@���vN}`�S�E���;7������Q�ZM��
��j�,`"`Ls���_����_\����/�r���_����U{��C�����#��O�4��c_�}ok��y�e��F�.7'{�������`�{��eI)im���g������{l�]sF��kq�9�����O�46�yszo�;9&�X�������#�R��L\���3��$I�������,�i������9I������Qs�f����]�$�C��ZM��7gd�����\���{�8I��Y�+N@��|"����~[J���
�sF2���}n��h$X
������'%]j�����ny�s��<�>�UM��������r@�)�h��Jm=�U��k������x�e�����@���T}�����>�`��#)��y���(�,�������ZY�4I�v�qi�?��P����L��-��M;�S���5u�7��o�R����������$]K���~��J0+T�'�;/��yW;���W��+�zTZ�7l{��������,`VX���W��l���:4\���q�K����o���9&]g�Y���,`V����������Y�������={�����o�N���d�Nw���L��Jmm����JOO��s�����`����Z:��}up0�k�M���`����Z;��}�M7�������J���N]0�Y�����K�{~6���>��u����/�$�}���od�������W�N�t�qFJe����m�%7|~<'%�E���v�����;�~�_8��?X�ncKom-���?����?�y����K�������zL���e����r���~_�7/���6��L�,`�1P��-����|�����4��N���Y�����p�M���7����s�{+==I����&�`����X-;�7�qc���$I�g48��\t`�Ywo����ju�{F6mJ��~�
������J���y0k��?v�o`��dd$-���{pv
��q�����j�IN��������^��}]g�9��(�,`�6������t�{���j5�|�k�������Sjm����p?���;�;��������
�nB0n���z���?��-��������::����O��m���tFv_���K����>�vnO���I��SN�@�3�,`\���p���
�*[���,��LL/�Eg��dx`l{W�J��v����)��I���3��:�ju[Vgw���0k(����_I������g\�7
�f��������t�x���`vP�3��jkSKR���W�*�����9�9s��e���oxCJ������A�P�����c���}#[��������C�-K��0�	����S.:��/�j�������,���4-\����n|0f=X0C
���]`�.]�$�\�$�R��� 
�`���������l-����nl ����0�m�?���I���l��=��:08��7�KJ�Y��?M������lY��s��q��
t�U�}7�jWS�Ck�85
����+�e����k9���u���(��
����NK�{������L��w��<3]�~�������=�}s����;.�Ri\w�D)��
Tj��������=C7~2������=^p����)f�����������/���'�r:O;m��@)��
Tjkk����,]�$i?��4��;5�������j5���������eZ�zL{z��$��e�m�|�����~��s���
�i@����&���s��q���g�f��;����3�}'��`�.l^S[;�'�����[n�%���K��yi>��1����!�?��4�_���[��t=�����5X�������Yo����/y_6-�4/�8���qL9{��`�)vw�}���c���##�\uU��k�����iL��@���v�|��[n���u)�����>���`�j.:��`������������u���d����e��w���o~3I�q��)���-�B
��F����e������-����Q��g��]��}�K���^�m`0#�o�C�U����<<�����R�RiL�7��f���4-\��}���y��7�;`�R���0P��-��/�����vIz����dI���q��$��LD`�r����kW*K�&I:�,iX`�`0#����s����jz�`uuw76�]
���X�5p��~������~�I�<Fs��]~�����&���]u`K�|(���C���i���gY~�_�p����I���ON��}����S��������>�m[R^��'���2����r���3�a��(�`Jm�����'��_��/���X���{]����	�].�d�OL�������J���<�9��(�`J
n-�:�����U������$9�m��y���S�\tf����O��v���UW%I���D�W0K(�`��������K�$�K�Ly��E`������-����H}�kbp�-��i*f�{��$�����$�����,`���QF��s����{��a3Z*d��>��MM�<����v/
������� I����3�����8p�[��io���q�ii�{���vO
���������$'���<���L9�w�E���^*K�f�i�$Ikg�a�I�������2�4'I��Qp `Fj.:�S����He}������o}b�Z�N��v��,�if���9?��������<����Z:4��`L3]�p2?)���mdm���i�{�,:�-�����
��������
[�����j����EG�r�����n��$i��Rp��Q�0�T�.�P�I�����L�,�i�Z����g[Vkg��&���3Q������9�������Wg�eA�����WLX
p�?7������j/<���LX
����%����G�����~��i=��t���y��w-�T�����(���o����wD��4�! Q{�%D����c��Q�vE%1�h�w
��W"
� 
�Uzo���a���v��^�9�~�)���|g�����`kf��U�/�)k����W����V%3�
loV��^�g�����r��P�Vk�`UMs3[��t7�.���1�����5��}WO������JU*tk���,�gk���_�;��X�]�b7�}`�f�z�5��@�����a�6����������������6���w�=���-�����%�?�����#����[Df�H��s���ofFDDVN��+�-H������cmV��������n~^���@IV��1f�?;
+.�j��ccQ���S��� ���Z��%��#��Y�O�����h����j�5�$���x��X��&""r������yN����q�������	��j+�
���""���E�=������6e��a�6�FDD�TMs3T��t7��e����������3#///��������]�Fnnn��c��hQ����X��zD��^��B:4��������7x����O�>q�5�D����pwl�V|�AdDA�O�W�`l`Q.�W���}��c�=��y��-����+�z��x��g���B��k���G�;�/�UFf96�ED�e�,���,���� z��/��B�xVVV4k�,j��S�L���'��;wny����[o�~����[fY��g1y�>����g���9�i$�28p`�����??����F���#����^x!���?����#"b��q�I'��q��V�Z[�o6����E~�	qH������2��Y�Fd7�!j7���H7X�������nH�������s�Xfff�p�	��K����c���1s�����;b��[�e�������3#"��;�m��[��t7����[o��K�&�8 ������o��I���Ic�
����o�I��5kb�����S5�
���E���!C������\w��G������K�����,=�>�F����+"?�ZD����t7�����>��s�&��w�9z������}��������C��.��)����c^����$,\kv�/"��|��*�����,J���_N�=�����Hi����T6,�/_��U���(��E����/���\q�6����j���-�X��������]����q����E��:ujDD�������c�}���)���G^v���h��WQ���r��Y�J�v���dG��h�����&L��T�o��T���o��Z����Y1lX���{�i���[�`�������\�2�O��4��i�R�Qt�����e�SV�������f�Y�E���7/
u�J��a�����I�&I��9s*�7J/��X5zt�����2�����e��%�U�V����R�Q�Z�M�Ys����s��j��I��}n:�|��X� �B�Z3iR,�qP�����2`Q*E��rssK�G�*U6�gY��_���{�m��k��������:E��;QU�^A��&��TV�Z�T����z���+'�+W�,WO?7��D�5+n�����i�h��*Q�N�m#�R���M����J�����7�'�v�����(X�J�����U�V�z��+Wnr�������O,��I�&���_�����E�
�Z�bEFFFF�{,_�|�{�E��
�a������2�������'�]�Y�&���S�=f���T���X�J�*U�Y�fIc��O/�E��k���}�X�Z�������j��	6��}�E�u��!�����R^��?���Su�J��}����-�Nwl{�9�����[�[o�������Q��7�x#����gT�^��{L������I�&�����)���)�(��]�F���c��y��w���a��g��%�}������;n����3f$��|z����3�c��)����������>}�$�
0 
7���������'�5j�I'��9Z�b�(�+��"�W����{�����[6:��Yq�9�$�]|��Q�~���#�u�(,,,Lwl�n���������.�����_��7������x�����/����'�5n�8�����]���l9��E�����K�M�6���+���TL�4)�?��D=t��h��U����{�~�~���`���=l?|�������c�����L9W({3����W\}�Q���K��{��'��7�Z�j��)Sb��EI��T�O?�tZ��""j���w\Z{(�V�Z�n����6�
��=l?|����������������c��eZ�Y�}�3����<�L�|��I������w��_|Q,��^�z��+�D�n��`���D����O<�D<�����C����V�Z\x��1~���������d����z��^�z��I�b��1k��������k������u����t�	l`Q�Z�j�Z�Jw�V,3�
��"�-J[�,�(XlQ���`�Ee�� u
4�k��&��M������{�~�~���`���=l�2
��?��n��XlQ���`�E	�`���%�-J[�,�(XlQ���`�E	�`���%�-J[�,�(XlQ���`�E	�`���%�-J[Tv��V���Sc���1s��X�hQT�\9����[��}��'rss��f�]�6F��������GVVV������S��m��*��Y�f����M��+WF��5�M�6����G���+�,`�%�.\C���^{-�y���7o�F�V�T)�>�����x���'��-��o�9����X�`���m�6�������Oddd�����{/�����
���999��w����k�E�e>�>d���m��~������#//��k�<����?�5k���7v��8���b��))�?��������Z�j���������+b���)��V�Z<��C��W�R�l_`��s��1j��b�YYY���;�;�k���i�����������K����Q�z������c����y��%�W�^=v�y�X�reL�:5��Y�t�~�����N����|�E]w�uW�XFFF���N��A��>}z�>�����g��N8����^�J��X�k��SO=5�>�����{��Q#1/???����b���I{���+�}�������k�c��1v���X��uc��Aq�)�D�J�""b��q�w�M7���]tQ�y��)����OG�����z��7�tS�n�:1���o��������/c5j��/��2Z�hQ��Ya-Z���^�n��iT�\9���c���1c��D}��F���SZ++E�;w�����_���8��S�J�*�����^xa<8i��w���={n���w^��S�N|����}�
�������NK����1~����
�����m����Sc��~��_�����b�/^�rH|��g��3�<3z��T�f��/�����`{1t��8���R����{�n0 &N�}��-1�*""+++���E�����������_^^^\��Ic��v�F��""N=��8������k���%���$�_�n�:
������Z�j�C=999���{,������?�Rt��G'8�"+++����4����Wd[I���1#Q�h�"�>������?)���g����orM��+��2rss7��}����w�D���C�)�?`�����w��wO����+V���U�V�9/��BR}��g'[m�.��x`6,""��Y���J�r�)�?s������u������NJ���}��#�<���-�������i��I���C�U�Vi��-�&M���?>Q���X�Y�:u��-^����^~������Ky�������x���6�U��n��E�j�R:�[�nQ�j�X�bEDDL�81����h��u��V���+'��Z���v�--����h���dn�>��Y�f�W�^��1{�����u����c��)����[R=z����-z_��]S>';;;�t���Y��I�f6|����y�����S�gL�0!�n��U��h��}R=i��X�vmJg][����l�`mf�������:����8qbR��i�R�o��A���&�����2e�f9������?X��+�����~�X�>}*��9s�$�;��S��h���&�\g����:�I�&)�l������j��q�y�%�����K�
?k��eIu�j�J�G�5E���X�re������T�)�9s��*��I�*�l������c��1���n��,]�+�TJw���m�E��vLw������� N?���9sfb�V�Zq��wn����H����z�*U�lr������T�)���_1`��
��M�y�	���W���YRu��������t��]�k�aq���(��/�<^-�}�}�E��M7�y�V�J�srrJ�G������+W�xNY�J��ny_Y�Efnn����s�EddFf�������v�y�kf����NV���;��;�H���_���{���[�K@^^^��X�z�&���X^^���s���C�F�_�"�m[��a�����'��i���l����
����������>}���7��Y��^�zR�j��R��r��M����U�V�*�*�s���/�O<�Tk&M��|����RX����	�� /��R�u�YQ�����~������###c��]4Dj��������
SU�R%���"???i]���+���h��a4l��B���266s����t7�=x��w��O��k�&�=��x��'"++k��_4�i�������������4h��\g��5+�s�z
���`���#��c��U�V%��v����#''g����m��z����Z?g����srrb��w�,g���]�R�`+ �r�U_~�ey���l�����{����JT�Vm��Q4Dj���������	&$����Kdgg�t����S>gCg	��	���`������C��&�v�u�x����V�Z[��F�E�F�����c��Q)������:ltn��>�����Y�vm|���)��VN�Na�`[����E��M�C9$����k��e������A���t��G�<���|���o��RZ���o&����/7y��>���X�|yT�V��s>���X�bE�n��M�i�&�����QPP������%###233#�6��_v��I��`��?�|p��931��I�x����I�&i���c�M
�2dH���-�K��������K��*U���:j���6m{��w|���l��x�������.������8���J\��+,,�U�V���Kc���������6)+++�U�5j��j��EVVV�[�F��(F.)�Lw������'ON�5h� �|��h��e;�8���c��vJ�S�N�!C������Q���^�zE�Z�6��o��I��7��V����	&�SO=��333�O�>%��-[�bEL�<9�N����~l���c��%1k�����ob���������������I7���-]�4�8������c�k��7�x#v�u�
=k��������g����\S�r�������.���?~�F�<�������&����0`@�������f��%�o��&.���� ��-Y�$�<����SO=5��o_�Y��+V����c��5�n�\�.]��M�� I�,�);�
l+�=��9rd�������7o^���[���S�NQ�N��l/""���w�uW"�k�����{�4hP�z�������{��1h��������w�y��M�������o�9N=�����������o�1Z�n���w��K.�/��21V�z����k��X�f���6��Y�zuL�:5�5k�+WNw;��@�$+E��
+6�����L{������G��5��*U�g�y&���X�`AD�vu�Yg��~���e�]b���1e��X�fM��.]��m����Y��rJ><��������>�=�\4m�44h��M�y��%�����!C�D��-��H�^���������T�R��Y3�W��*U�_���Laaa������+c����b�����]�6f����5Kc��VC�$k;�����;���w\L�6-1�l��3f��r�!��3�D�*UJu�]w����1h���XaaaL�>=�O�^l~��Uc��!��_��T�lKV�ZU,\�F���I�W�V�R�J���u�������1cF���%�_�|y�Y�&*U���.���<����A�2��o�����c���W^u�������[�����x��7�v���>'333����x��w�{��������vZ�7.N:��R��-Y�tiR]�R%�W�6)'''�7o����u�x��4ulU$�PN��n`[Q�?t[�hQ��j��7�xc0 F��������GVVV������c��c�=*���={F��=c�����G����c��UQ�F�h��u����Q�f�
9kkW4�f�����mVvvv��Y3-Z�[�xq��_?}M[��ec�U�rY U��s�*U����?����~�N;�'�t�f?gkUXXyyyIc��WOS7�h��5k����J�����$�PV��n���*U���N*N��F����~�`PN���l��3|I�q�����`C���K�,�IP:�('X@���)Lwlk`�S(��������222���*X@��/+`PF����@9	�J�P�$(X��,�[S�N������>}�����Y�&��o������NwKT����������w�1*W����|���xO����G�M������a��m������(���K�A�����/������������@e������?�&L���]v�%�=��4wDE6lX���+,X��V�	�'O�O?�4f��yyyQ�N�h��]t��5rss����e���������:����V����kG��
�s����E��?���F�q�UW����������K��#�����4w�����WJKl%����^{m����k�R�Ji���0i��8��cb����n�����b���1b�����O��O?�o��6
��O�!C�D�>}*���C��u�]�����^�z���'�����_�~��1bD:4�~��5jTltn����������;/���S�sRQPP��w��>�(i���a������^��~{��5+&M�w�yg\v�e�+�F��w�222����qY U�(�a��E��=�5�\���O_C��[o�5/^��5�SN9%�Q�������=��3�=��h��e���$�w�m�t��A�]vY����1f���������^�:����=��&�-[�,����x�����g��8���G��z�����.�~�M�W^ye����!C��G���T�u�]���J�r��q��G�~�""��[n���??�W�^-��X�n(+X��={v�}�����K.��l���%K��/�����m#F�����4vP����?���D������YYY��Y��U�VL�2%���s���Go��V���~�����
��U�V4j�(j������)S�D���p���1�>��x������O.�����M�W_}u��u�y����_K�,�y����w�W]uU��
P"X�Sf�"�����+""�J�*��O��6D�5jT���%�3�<s�
�*,,L�6lX�����E�I��|0�-m�����r��������_���1}��������/�����?��5K�Y�bE�t�I���w�}��������*-Z_�u�1"&O��g��n�!�V���_PPg�yf|���{��s�����e�""�Z�j���f��q���&����z��r�	��BX��,H�U�V�}������_G�������o�I�w�m�4uPz��u�8������{|����t���w�}+������
7��4v�M7�=���7N�eff�	'�}�Q�h�"1>s�����;J<'333N?��7n\|�������.��o_l^�
������?�8����_�fM���,�,���7�x#""�W����+����sN���9s��'�,���"�2�i��3���y��g���n�H�-J�k����FJ��_��7�|�>�h\|����k������sn���X�ti�>����+����&M������46h���?�F��i�&����x��GR"�s�=c��!Ic���~L�4)��2{������������h��Y��[�S�NIa^��sO��HIaa�;`'���GM��S�N���3��P�V�Z�TgH��p@��]{��QPPP,d���%^+>�����{�^�ti<������M�����w���&KED���k��g����w�p�������s��(�^E�p�	��#F�(WP@��`�Z`�x�Rv� ���k��O>�q�����f����i����G��U�\{/Z�(��'N��F^^^��];6l���O4o���E�X�hQ|�����?��y���� j�����K���^��a�r�1q��1bD|������
6�.]�����Z��ds�����~;Qu�Q��]q�#G��o��6f�������.�D��=K|-�Z�*>����0aB,]�4�������������e���W_}_�u��??V�\�j�����G���M�6e�{kTXA���V�������	b����|���Q�F��W/��c��}��#3s��5�4iR�1"f��M�4��;V��5???>����4iR��3'V�^
4��-[F�n��r��r�:����O>�$�����;wnT�^=�8����>����O>�$�N�?��C����n���sL�k'N�c����s������n����q�����n����m�����{���Y�b���Q�n��c�=b�}�����r�_�G�������9sb��U��a�h��i����Q�J�
=��� >���3fL��??�U�;��cp���Q�
=+�>����;wn��y���G�)����o><Q:4.����n1�w����O���O/�>�����������������]�����;.n���D���������
�`�`��@�`la��
��={&�k��&���k���;��#n����0�u*W�'�pB�v�m��I������/��'��7�x#����@��w�9.�����o[b�G�F�2`��0`�F�������(((���z*����9rd���o�����;N;��8����N�:����7�x#��������6x������rK����,�������&=��_%��k)???����������o�-��j������.�������M�o���q�������K�,)��A�q�M7E��}S���o��'�x"^{������b������Q�������.J�g��W�x����������F_��[�xq����1e�����7�W^ye�k7f�����e��������!C�O�>Ic3g��'�|2^~������c�����N�:q��g���^�7N�����<0�
�����E�1m����h��yL�:5"~z�_y����'�lp�^{�7�pC}��e:w���q�u����Cc���S�j����~�^{�&������������n��^{-��Y��f��A������ux�uw��q�M7���>?��c�����k�X��-��o�=z����������{��q���F���K��7�|�^zi���k�F4l�0.������K";;{��qC��/�:��x��S�k���q�-���!C����������8��#������w�=�}|��8�����k@AAA�s�=q��7���3�������;,n�����������I������{���
6,�/_��U���"��g����K���E��w��]����K�C��m-I���f������^zI����w�S��0(*3�
�S0B��=������""V�^O>�d�o�>^}���������c��q�������7~��w���_�;w�I�&��q���_:t�SO=5>�����_ED����^zi���(�9�����?|��W&L�c�=6����R�]Z���zR}���k������G_|���""V�X��;,V�\��<yrt��)n���
�_ED��;7�9�����KR����^��m�F�����O>�d�UD��?��\sM���1r��������y������_�[o�5���9���0�C9$���?��vs���/�Y�fq�����a�6~�p�����;Ju}�V80:����_ED�3&�9��8���K��u���G��m�?���F��"~z��-v�IDAT<�����]�x��Ju��n������[����_����i�����{�m��V,�jS^z���e�]���
�������a�����w^����=������{�K/���us���~����\���x����U�Vq�
7l4�*"b��U1t�����C\}��e>o��%q�a�����
�_E��������/~��b�����G'�]�vMym����E��:///��_A���f�J����W�=���?�?�-[�����WDkI���b���O��F��y��U�9I��^�,�H@���'�~�ab�^�z���{�������I��,Y������w�-q�U�V�Q�F�m�6�t�;v��M��3~�����{��3���l�}���o��b�����k��A������s��y��#3��_���c�����F���n�E����A�����o�������d������k��V�Z�y����8�����7�L�5n�8:w��������bg_|���S��A�������w�9��g��y��������={��{��k�J�*��M����St��9Z�lY�g:k�����GL�0a����S'�x�����N���/��?�x������x��g�;��>��V�.���W,�)'''v�e��{���K�.��u����x��8��cR�>ly�����_���\�r�m�6:v�����}����~J{���G�>}���k���%�W�^��5�I�&I�����9���
*��������+�H<����h��M���>��I�����1cF~��I!NM�4�N�:E�6m�}��3x��8����}T�Z5v�u����K�j����w�����_�:�0�'�|2�>��b!o��U��v�-��{������?z��]����z�����#�(��sss�]�v|
�����7�}��-�yk���c�9&�~���X��
�c�����{F�j����X�"~��_��i�J}����5�}���Z_t~I��UXX|�A�X�6mJ��[o�C�I���{oT�Z�B�+�S�N���z�l����`�# �~��x���""�c���������s���?�������s�������k'��Z�*N=��X�hQ��W�\9N:��x���c��i�d������c��1j���>}z��7/����h��qb��?����o7���o�o��f�v�mI�g�qF��
��k����5u�����W���\�r\z����W_��9sb��11r���<yr,^�8�x��8��s�z��%>�����q�-�DD�/~��x��7b��1n��9rd��=;�}��h��]��?���v����I��9sb����z��v+�~?�p���Kq�)�����c��Y1r������b���q��&�����c���q��g����#777��������'O�O?�4&O�_�up�Ik/���X�fM�}eee��G��w_|����l���8qb|��g1r������b��E����&��X�"N=���n��o��������k��SN���c���q�%�$����x��Gb�v(����Q�FI��3�8#���n�m����?|��x��1h��7n\,_�<&M���y�1"����X�ti:4�t��XSPP��~z,[����'�/^]tQD�T���#���_�u�5*���~�a���~I�O=�T��_{����C%�J�*��__}�U��7/q��9sfL�4)�;�����~���G}���Y�`A�u���;�<�����'���~3g����'�!���������c��9���\pA|���1s������b����`��b����~;.������O������a������c���1b�����oc���q�-�D�5s_x�����[7���������m$��7oO?�t��??����y��;7>������[DD������#�T�S�A3f���O?=)��^�z���;���&LH�?����������?��{���Tg�|���@��N;-�����={v�5*���������?Q�f���e��E�~���H�k���1}����
�rnJ��'N,w_�6lXL�2%Qgdd�G������������O;��8���*������I�g�}���H"�2�Nw?w��M�����:*��*UJ��z��q���F��=c����9s�D�OUW_}u�}�����#��3�<36l�������~���;=��5jTDD����1~��h��}�5�BZ���?Jv�y�R��z���p��D��q�x����9�S�z�8��C��C��n��X��������O�������tFFF���#������C|���1k��x�������+��*��_~�T�m��\�M�:5"~
Y���K��_�^�����c���1d����(,,���{��	�z����+�D�����m��m������s��0aBD��|��������hO�:u���'G���7�{�5���N�^�zE�^���W^�����G�k��Gy�&����/�}��x���#���U��}����K��b�����wR��W\�z�&�OUnnn����>H��S�N��G��i��Y�7��P����8�������e�w�yq���GD����<�H\p��[�ufu�����?v�}�bs�v������{'��/���8���7���G%����_?����]v�%�������g�z��QPPk���.� �����Y�tiDD������;�D�F���i��eJ{�����#;;;�x�����]��*U�$�n-Z��~z"�*333����o~��
�_�n����_s�1��G��;wnDD��o���:k��5"��K.I
j�c�=b��aQ�n��y��[�x������O�'�x")���]x��IzM�6����o�:��~��{��}��I
����K��c�M
������.222b���q�9���r��q��gG�V��G��������;wn4h����2�����pX�R�����I��z�w��PPPW^ye��G�����\}����j�z�b��A���
�L��P����Uf� b�w�'�|�X���Z�n?�p���!Cb���]��n��*L�N�:��ODf���xx��S^_o��F|�����r����*�n����C������s<�X���4h��_��^}����HU���v���{���{��W������~�������
�_�S�j�R?/-[�,1�j}�����#�D�Z�c���6%###~���`����X@�E]�x�?��\w�u)���4l������eff��w����Kb,��m[���{��W�dee���>-Z�H���=;�������k���^x����_������/����z+�G��J�*��O?]���r�e�m0�jC��������
7�������o�>�3#///����
��1cF:4Q����s�=W,�j}���1d��h��U���&N�/��r���>��&�c�������'�sk��q�=����?���Z_�����OL�k�����~�T�l-�?���3&��	���U����q�m���#ufff�p�
)����O����g�~�;��h���`L��b��R�~����Gi	���Laaa,_�O����c����D�5J�w����A��W�\O<�D����u����K�����*t������'����K9��,����M��s�I'%���y��2c���z�w,�~q����8�q����~�7o�R��/�����/�������n��q��G&�T_�
6�G}4��K/�4���?�x��?�I�W�v�x��'";;��:O�����`�/��"V�\����o�}��^�z�8/77��k����&L����z����wt��5���������s�=�����{o2�ks�Z�j\y��)����O
�i��Y��z�;���b���N�{~}��DYD�o~��h��u��W�\9�r?���$}g8��S�>7&;;;�4���;��U�T)0�1�{�N�7����P4�*77��{T�Re�{���������N��������������o�5~�AE�>}*��M�W�^���$���3*�,*�������+bb���nc��v����V-�mlP�J����ONy�Yg����N�6lX����S��-��O>���p���5kb��a�:;;;.����v^�Z����Oin��u�Y�f1}����<!�/N��������{F�6mR��������~��O8�����*q]����E���w�ED$�����e���Y�f���s�A�%�;�����������>""V�^'�tR<��S��'<�@4o��bO�����k���q�b�}�IcG�s��g�<�W�^q��&p>���X�|yT+r���W��3�8�T=��W/:u�#F�����rRu�)�����r��GG��5S�;f��������'��Rh��;���g��_�������'�������N;-��O8���V�Z,_��T}�����K�S	\��C��v�)f���g��o��&��m[��C9$�����9:tH�����U�V%��7��r��IuE��}��w��_�*��]����C�x��)�q�u�����#��`������}��Z�j���K�,����������^��c�rY U��n��n�=���u��<�G�I��!F�2{����?���vZ�����;D�*U"##���'�x"�n��(�!�}�Y��{��w4j�h����c���L���a����E��*��+��*U��k�N�:�<�h�J����v��%)�[�hQ<��q��gG��c�w�j��m�5x�M7%��7o^�����?���D��7��/~��X�tib��.�_��W)��N+V��'�|2�;���w�}�q��Q�F����,���w�yIkK��m��^�6�j��Ia_���1j��b��Vu����}5k�,q��������7�K�.�>�"����~~""&L�Pl�g�}�����]���*U����W����G'�J�*%]KJ���={�L[&Y��<��6El���-!777�^�T�W�����5o��8��#���;��C<������6��/��[n�%Q����V�Z�����Z�j�vaa�f��~���*;�
�2�V��������N�za[��w��T��5k5k�LM�6-
7��;o�����_<������_�-ZT�p�
�<yrR]����(R�j��%no��TCt6�A�)��Z�=Q���</��/���w�Y,�$U�-JynVVV<����C��?~D$�����q�w���-i��5q�w�
7���U�y��6YYY��]�R��}����w�M�S�L�8 iN�0��^�����%K�D�Z�69�z��Q�~�r�UV-[�Lyn�����N*��,H���]s��I�;��s��B����������������I��v��ENNN���k����GI���OOi]i^��6El�����z��I��U�J�G��^t��X�tiy����7�$�j�����z���������o�Y�&""��c�������SY���@����`�V&###2��}�W�^����[7�UPP������'G�=b��������E%)�R� �����n��K�hUY�?�W������y���Ac��-�>�}
���N1d��8��c���U�O=��V�Z(j���q�1��;��S�}6�{wK�U�Vdg���j��������U�����U�f�
?7U�9{s=?�+�s)������k���
[�paR]����k���1��&m��GE��V�X��@�
Y�|�&�L��U���c���>�,1V�j�x���c���Jy�;��#�Gfff<8*U�T���j�P�����`
��~�,�H@�
AJE�"!i��-+ ���GuT�����[��m���&M�D�j��J�*I��7�x��}����K���Wl���}>�'�xb����M�F��=�}����N;E����J�*���������#�<R����DD4o�<Z�lY�}��/��X�U�
�G���^{E��M�f��Q�J����J�y��7b���[�������Em(��


J���Cp�z��x~������z���+���
)�z)�zJE�5��u����_?222^k���9s��;����f�J����f��8���b��a�����x����[�n)��r�����k�\���o��)��?�j��Y�@1��(\?�H@��X���k��l(8��{��o��&Q�������GQ��<�@�{*�5j$�
���5m�4�����������/&���Q#����8��S���6����.���'O���;���������/�;���\�oN�G���z(QW�T)n������K
�<y��no��\���U���%K��������J��Q�r���
�����S�N��s��vK��6��������}�l(D�$E������R�J4k�,�M���>}z���O��T�k��T=��g����������<?��R��z��X�re���������.����^�������y��E^^^�n��Y��H��XE~/
���G)	�H�y���z���333�f����<���I�����o��J���T�n��z��9[���E�-���3g������k�����SN9%���y
�Y�&N>���������C9$�=��2��9=���I���?���)��R��-a����f���T�R�k����To(0�~��I���;F��
�����~��Iu��-��C��3�W��*U�5k�DD���_�=���$u��I����RQ�3���$k��]R����c�}�Iy��	�������8��s�>�222�����^�z�����������
%�
���~���W����MK
oi��yd�AAAA�92Qw��!���������T=�U������>�l�����s�=���'������O>I��W�^�t�I)�-�k���s�ki����{��'i�o~���6pl��-333�?����n�������_�u���;6�n��e�9E�&M�T���c[��i��}����sc��Y�Z?z��
�(b�w����D���_G^^^��3fLR��y�
�m{��C�����>Jy�?�S�NM��*UJz]���K.�x i��;��>}�������5����
�^V��w�Te������c����n��)������.]��3��X�vm�n��m��|��7�
"��L�R,\?��;v��U���+""��/���15j�����
�N;��b*m��n������Z�������-Y�$F�U�3_y��4hP��V�Z<��S��m�>|x<�����{���N�w�y'�������
D�:uRZWPPP����{���b�=�Hi��+�������S�N�����3�~��D��;�D��]���v�g��I�;��W]uU����K�����^z)�;�����?>&O�\�=�����{�#F�������������Ji}aaa6,il�}���6�+�sL�r�-��������������7�H�{����WO���������#i��o�����)��������o�Y�uo��F80Q����q����;EC;w�\�~R�������2K����f��x��'S���C%�x`�9EC����R��_��W�s#~
Z��0�TT�T)>��D�v��R������{���%K��o�Mc7k��ai^����b��U�>��~�>}�$�{�]w%�����h��U����?����R�����y{��aj���~8���=�\,[�,Qw�����)"��#�H�k��){���.]�$�����;1~��
?��c�M�����(((Hi�]w�U���S�3��Ly��o�3f�H�;��c�i���Z�.u��5���������b!b��$��w\J��_}���W^W^yeJ�7&;;;9��R�i��}�>u��)6';;�����#322�[�n�zL)�@	��
\���t���������;�$�*U��)��Rl^�z���>���X�vm���=��Tu��M��L�R��_|qR}������cK������O����4uR�5j����W_��E�J\3k��0`@��*((��N;-����;����O�>��F����OFNNNb�������������>�l�����K7g[i1r��x���J��j�����k��~���lpn�N��g���z�������|�nG*U���uaaa�w�yv��G�N;���G��
*q��~���^���o��X�?�{���P������~��%��s�9���&333�:1`��bA�E����1|��D]�F�8���J<����+�s���7�xc�Mo������?L��:u�
��#`�W���@*`l~���8���702i��8��3���:���]�v��YYY��_�"i��o�}�=L�4)�;��R��4o�<�W����~��X�pa��>�����{�^�zuq�)�`-X� F���y[�#�8"���������n*V��]������+�����s��1��RPVQ�_}�s��U����{�����S�|���:???N=���?~���\��""�����b�����~�}���n--~�����q�6zAAA�q�I�{
6�SO=u�k��������_�o������kK�Y���3���/��#G��f[q���;���?�������/Ny������w�<����������'�]~������}�?���z+�9�����O
��Hm���c�9&QD�^�b���]SXX��sN�3&1V�Z�8���7K���+��"�{�{����r�F���5�X���_�����9�?�x\x��Icg�}v�y��e�z�������%K��G��n������L����O@�5o�<""^y���o������K���|������]�t�9s�$�w�a����7�o���+��2.����=""�����~{t��9�O���m��������>8Q/Z�(��w����[��^���z+�����}���[�n������K�.q�����_]l������7��s�=7�7oC�M����;�tP�~��WJB��*����{�����i��%�/]�4x���s�=af���k��><����D���O>�d��Qc�����?�QG��g��g�}v��mn��~zR8��/����/c���I�V�Z�>�l���^���oFD����]����f���p�����k����L
w�������{������&�������?"�[�nq�
7$�]s�5��>���O>���T~~~L�0!�~x�l�2n���X�|y9���V�Z��3�D�J�c/��b���nq�������7�n�����������7��/�8f����s����rH�.,,�K.�$��k�����������������+?��8��Cc��EQ�j�8���+����+)\r��i���{����b?�O>�$z��>�`��m���7�l=n	?��C����}��?~�sW�Z��s���W]uU���W^^xa|��������:tht��5�N��o��q\z���<�������:+)L�]�v��w�x���7�����5���.-^x���zS!�B ;�
���y����'���o��F��=zD�z��y���j���2eJ�\�2iM�����G�:u�lt���>;����D�Paaa�~��1h��h��u��];���S�L������+��2f��'NL�1\r�%���/&����������������n���#i�Y�f��������-����}n��������a�����;FNNN��??�N��b��;��3F.�w�}7;��4wU~�vXu�Q��+�$�~��x���c��w�
��E�b��)�����s���F���c��%��`��8��S�^�7�|st��i�k222�������+����q��w�����<�
��]�8����_��Wb��W^�W^y%�6m;��c,[�,�N�+V�H�9����3�������h����U+����8��3c�����?�!.����y���j��1c��b�~?�*�r�)%���?�9����
J��5*N9������f��E�z�"��`�~�!����u��=~��8���F�f���.�,.����q��a��Q�r�X�xq��3g��a%y��g��CI
;vl�;v�����������*i<;���Y��N;���>�z����WG�Oa�}���������e��R��F_����o������~����_O9p���1p��
�7e��h���&�_q���G�K/�����{b�����y��U�VL�2%�a�*U���O?�X�!|�A�]�6i�����#�8b��6���a���z������7q{�}��6m����gA 3�
��eff�3�<���bl�������������_��Q#�}��8��C6�o�J���^���['����c��1i�����?��Oq�����1x�����#*U�T�����������Z��9s���1cb�����w�mW�W'�xb��_?Q?��#i��b=��c��K�b��}�]�1"&N��~u��'��!CR�������3g&���>:.������_?{������_����_|�E�goN�
�c�9����3��O?����'�1���3^x��

��q�1p�����z�^�:&L��F��h�����S���;���z�XxNAAAL�:5F��F����'o0��F�%�l�N>�����6���?��1c��O?��'n0�*+++7n��3j��o��V�u�Y%�S�~�:th�x���l����j��U���8������_��
&��\�2�����`VVV\y����Th/?���|��I������w��_|Q,��^�z��+�D�n��`�[�u�������
���^V�,�(�R$`+P�V�x��w���nJ
BZ_NNN�t�I1~��
�lH�f�b�������>rss7:o�}���_=n���2�����.�	&�����8����q��Q�j�R���}�;vl<�����{ormVVVt��5�������K����"777�;��D��s���V��];�����_������v�-��x��'"'''������x��u�����L��=z��W_��W�^'�|r�`�t����^x!
�5���-Z�]w�o���v�t�e������� �u��c�x������O
5K��g�S�N����n�AOE��S'~��_��??��ct���T�mk:u������~8��w���������+�A��v[��1#�=����]�v<���1r������c��w�:u�Dvvv4l�0:��4hPL�<9���`���=*:+��`�I�&�UW]�� ����8�����/��o����������'�x"�}��M���U�^xa�?>z������������
6�SN9%��?�`�,�(��p�O������b��wO������v�����]�6��������[Gvvv��d�4l�����g����k����z���������cc���Q�f��i���g���
�Y�lY><&M��/�*U�D��Mc�}��f����m>�g���?�8f����������S�N�n�::t��]���=;v�y�X�bEDD�q�q�%������j������c��	�p���������>���R������kc������_����#+++5j:t����+��U�-Z��i�""�y��1u����'M��|�I��5+222b�w��;�����Y�f���#c��91�������5kF�&Mb�]w�]v���![�����'�|��}��7/��Y5j���
F�v��m���\�(�;w�Q�FE�O�qK�.M9<��F�_}�U��3'V�^
4��M�����U�V��g�M�4)F��f������]�v������[�-��V,]�4�6m�/������.����T�9����pa|S�nDD�[�&2����x���f�#N�{��aK)O��O��Lvvvt��=�w�^��V�^=�<��
�ss�a�����Ow[�;�����b�������=.����*X"777z���G����c�������/���]�V��U�V���&M�D�&M6���Z�j��������_~�e��s�=7{�UDD��C���~�%�������/~U�^���������QX���d���'�����5kFD������'�HsG[�{��'��Y���u���n }V�^����W\5j�H_C��J��X�k�m�,�J��_?����D=`������Ma)����7�xc��o~���l	���sO��5+""v�e���������XTX�����b�]w�����'����������c���g�c��)q�s�==z��U�V%�:���s�=7g��UZ�tiR�w��+WNcG���,`��4@*�����U�T)����6���k��#�<�<�H�o�>:���k���a�����,��c���/�_}�U��5j�������!�j��s��Iw���z)7��"\H�, ����r`�Z�������-[n���
Z/�*3�
?O������+�j�a��q|����+���t7�<s�11g��x�����>�/��2�L������+WF��U�n����E�8������et��9�m��?�����>��	���z�������0u��t�@��Y3N<��8����
��BXT��t7lC`P`��lHa�`[#H�,`S\H�,��2`P�������������Hol�`��@���P@�:XTX@�`��4��
�!��R��@9�RWX����R�.+##�}�M��N@��BXTX@�`P`��@�T�x�H���������r@�	�R����@9�R'�
 HY�,*�, u�����<�������������%���,`=��� U���I�6A6���n]���A���`e��`��_V��`)+�@�Nwl���#��o��Y�fEfff���.��g��U��&��Z�*>����0aB,]�4����������Gvv�.���-����*�����?~�\�2j�������;F�6m�����.]_|�EL�81-Z�W���U�F�:u�E���}��a��}NyL�>=>����={v,\�0j���5�n��E�F�*��������Ob�����?D~~~���nq�1�T�9�&�
  
�
={�L��\sM���?�����������+����b��V�������k��������.]�_}�{���d��bk4h7�tS���7�����x��'���^��>�,��]����5�.� .����S�NJ���������_/��r���mrn��-�����.� ��o��:uj�l�r�k�>��8���7���)S�E��?///����<xp�?~�s222�S�N����5�=��M>�u���H����n���#,X7�tS<������?&��k��`[��t7��F�Vb���q�	'��o���9+V����'�|���zT�R%""&O�Gy�C���;wn�s�91n��4h�&{y�������e������q�5���������o���>)���������������O�2%�����U�V\��)�WV#F��S�{�fU]/~��f�q�*�(��7�5��fY��Q��I��D;��������g��,�Yj����!%�
hw�� ���f�����{6�������^��������������z���iS�L��|�#1l����/-Z���~���j2$�������/�R�I�����<�QY�`s@��.��_u��)�;�����G���g]��?�)������X�hQ80�J�$�v�}����]�n������x���v8���k�9���{�a�}�����;.9��(+���7o^���?�O������{�����n��U�V���c��O<1z���;w���y���c�����*++������?>�8������������pG�~��8��3��Wx`���';�����j�PHX@��/��x���3gNDD\x��q�
7��G��|���1j�����;2�~����������k�����������k���/�8 s��3�s��\�?>sn���q���G�f��;Syyy�y��q�9�����k����V�\�=�X�x��1s����X�fM\t�E����u�����{/�����s��w^\w�u��w�m�[�re�������O����m�;��2��g�y&n����g�\sM<x�?����j�����O~2jjj2�N9��������vZV�j�������
7�.�����'�W������;����]s�5�h��(//��}�s���~5�w������&&N���zE�%����S������n����������]�v���8jjj�g?�YDD�i���'c�����e�x��'��SN����?<�z��8���b����`�������{n�����'f��]�t����Z������y����w^<�����������8����������e��e�/�������w����c�����o;���f}^UU��~zD�6����#�Y.6l�\pAV�j���q�
7����V�Z�g?��8���c�����oFD�]w������W�^9��p������_������|����{�z�E�%�X������'?��:�W[��7�ee�~t����Sg��V�����n�:��SOm��C9d����UUU��>m�����
u�e���Y�W\qE�{UVVF��]s��������z��?��?c��Q;-x����#�d��s����k��#G����`P������z��OE�����$I��o��u�:u���;.&O��9��K�����vz��a����,6m����J������g�uV<�����K/m�������f��t�||�����o��y|�;����c�9&>������>����b���Q^^��{�7o�]w]��hl� ���y������c��I1y���2eJ�\�2�y�.]b��9�2��s��-�Z�\rI�w�}�������K/�����z��1n�������6��J=���K�F4���Sl�?��8���r������
`}���)���e�8������GDD���[
v9����y������c������N�:e���?���{|��Z�ti�?��C�F��m������3�U�V�+���w�N�2dH�n��~@%�UO'N��o�=&M����/�8EQYYY�`���O���m��]�q}�Q�����V�X��=��/�Gy$&L���M���_�b��X�f�N�]�dI���Fyyyl��1""�������kc�����k���B�0a��K�9�������:�>}zN������$j�^v��v`���@}	`���/��>�h��(��C��z�=ZEU���-�����RO�cuE���y������f���^�:F�?�������y��-_�����;w��.�,������;��3�������O�~����8N<���w�}�wCL�>=���k��k��6�5�-[��u�rH^�4�
@��Z�l�V�*��=��Nc6u;vl�}����:��g�]�5����<xp���m��^��i�$�������VU��BW>�n��%Kb�����k������Y?��b������g��:ujL�:5n���H�$z��g�uV><�:�������K�|�w�}7��Z�n]���bK+� X
��U����O���7�?�����oTWW��J2O�~�t��Q��������G�q���7h`���O|b��U���c����G���>-[�����;���2�<�������GUUU��w���~8n���x��W��&M�x��W��W_��|�;1d��������w��������|�M�6�t]�f�
�7@Ql	`�y���a��������#����DDTWW�h���9sf����:7b����2{��7n\��U�Vq��w��^��s�����z��$I\x��q����������>����	&��%K������}�?>~����)��R��r��y���/��1d�������k^��r�(�z���[�G(����/��W�^��~�4����~8������/�0�{�-[��}{��=z�����*�4�������3����cc��	��V�\���c�����e��W����gw��1N?������� e�����iS<���Y�F�Q�a�]�_�����v���������o��FAfH�$�<�������O�S�?>+N�h��m�a�p�!�d��5��{4ui��zvX{���>���f��5k]tQ	'v.�����{����t��+b���E���SN��~��Y�&L�P��ee�_m�������_x�����c��=�$)�4iX{����?�x�����}�M�J�F�[�.��~������k�1RDD���/�x��%u^��E���5k�����G}t�x�����SO�cJ�=� ��Z�bE<���Y�F����7n�7�|3^z������3g���+W��&Pp@��o���/��=������Gq�m�Wm�����}��7�����^�\s�5Y�_�����w�����-�D�<`��~��_��5k2�����}��
^����v�m�6;�����_�t�Iq����>���{l\s�51w��B�4��N:)�~��uq�u���������Cs
e������?�yl��!���4��o�=�\�>}�������:~���b���9�6|���5f��g�uV��??�5��_���|��9��dl	`�y�(�4����?�x���QQ���|��:�o��)�M���M�������|&��{��w����E������u��Y�
>�.���x���2�w�uW�Y�&n������K����+�W��U\���`����8��#c���;����^�o~��q��W��>����G>}���v��e]�i��x���b�����s�e�7o�<.���:����C���3�M���Q����?��?�[�nQUU�u��'��u���<y��8����w����?���q��G����>|xv�a���p��x�������G}4/^�\r�N�Y49X��f���1a���s#F�(��6l����+&N�O?�tt������q�1z����	{�����g�O>�d��<<�@t��5��o�X�|yTWW��u�2�\t�Eq��������-����+���������c�o�>Z�h�W�����X�j�6��~��q��nw����:.�������Sc���u^[]]|p���?<}��8�����w����w�y'n�������}��q�D�-b���d��zG�`OVV�h\��w_�q�����c�i�Z�{l\�����O��9sb��U�n��X�`A<���1r��h��M�=���Z6,V�^��h=�P������?��&M�3fd��.������~����������^����/��k�m��{����������;\�?��?��k��$�Z�����_��}�n���%K���_�I�&������_%I�;wn����4M7����t��$M�x�����1������;�N����J�t�Mq�YgE�.]�E���Y�������O�[o�5�����s������1j��<~����g�?~|�p�
����v�QG�/~����/���9��=��O��8���b���������o|��������������7����j�92N>�����CTUU�<cDD�n�b�����c����w�3�����>�����c��Yq�M7�k?�&A�C��r���m
e��q1`���q�.]b��9��}^x��8���2����1��h��]Q���iS|������7�sUUU1k��8�����E�b�����g��YYq��_=�:����a��x��7��z��QQQ��5aW�v��������O�w�y'*++�S�N��o�8���
�Guuu��1#������n�[�.Z�l���_s�1��G�]��Kk������/���o���K���&Z�l�����?<�<��h��E��((��o��O��g�{{lt}��R��"��x��7Gt����K=
���7����>:s\�������������Z��UDDYYY��'?�^x!�/_��:������_�rA����Ct��� k����b��Y��B;��C��C)�����y�8p`��(�4���$���&����8V�Z�<�H��#F4��m����.�,��3�<�h�P [X�y��C�������Wg����8���u��N;-�x����?�%�X�Akq���g><***u���;g/^��Q�v
X{����?~|��K/����h��Y�����}�����7IR�Ah��������}�����>���X�`A��~����3�',
@k7��i<��Y�F�Q�Y&L��u��s���@���x4POX�����Guuu����2.���F�c��
q���g�;���}�$�@`����6lX�����>�w����5kV���|�#�>y��J����.*I��_�����k����c�f�1bD^s�y����/���1c���Q����s�9��O��f��� ��)�8qb���ls~��iY�k�����{��5:u�=z�(�|���+W��p�q��g����I���+���={����g�yfu�Q��^{e]�f��x������n����g}��]�3fL^sPbIR�	h��`���1w���^�p��4hP��]r�%q�}�x�l����������0��O�6-�M�_������":w�m������x��wb��9�~��m�k��U<�����[���@�J�t�,� ���z������c��#Fe�
6Duu�N�;������h��(���<��ZfD���'�>���������m��1~��x���b���;����*���W^ye2$�qh������n<��V��3��{l�j����>����M�o'�pB�p�	�n���>}zTWW����c����~��h��u�m�6;�����WTVV|JD����*++�g����g�R�@c��J��CY���E]�)Kk��M��M��9WV�N ?��*H]|���%��p����$I��2��.M7���F�A
$I�����:�j��MP+V��:n������(,(�V�Ze�X�"����416l�&���M�M�*R,
@
��������y�D��&g��u1w����iS�y, ��:d
��&��������*�5k�����[�re��=;Z�n-[�����(+��v-i����c��5�j��X�f�61�-ZD�f�J4!��������$�N�:�[o������_K�.��K��p:��k��Y������li*$X�������y��q�A�M���k���K�.��^{�zvXP��f���z���j�*�t���7������$)�4i�vW��7�n���{��+V���+W��u�J=����G��-�e����E�(///�H��F���"J�$������*:t�i���M�"����."I�(++�����D*�@`A#J�$���K=@�	`;��@��J=��`PX@�jX�,�������	`�K���H�����-�� X@�R,
@�� ��N��G�%�@��r���_���s��	`���J�����-�� X@�R,
@�� ��N���GCx4�#,���4���$���&M���V"�@���m	`�y�r'�@`9K�(, w�,��d�x��&D��D����r���_�����-�D�<`���
,� ��N��r�
`PX@�jXu��#GX@�%*74���4��*�@���	`PX@���,� ��nK+������6�y��/IJ=�+�h GX@��t�����G�J�� ��N��r�%��`�, w[X!�@�����,��PIR�	h�������W,`k
���;,
@�� ��nK+� X@���B�<`��
`@���K�RO@&��,M��o����;,�.i����r'�@`���J�����-,��PIR�	h�������W,� ��,�v���\	`�����z�, wX��;,
@�]m� ��[�$��&L�]�n~� X@�R,`G<���;,�.i����r'�@`��
`@��������s��	`��`�, wi��U�<`9K���h WX@��(, wX@j
�+, w*7�PIR�	h�*J=���K����c����z��h��Et��-������+�xB�FDD"�@��0o���<yrL�4)&O�S�L��+Wf>���K��3����������
��g?�Y�1���M�6-F�O<�Dl��i�����c��!q�M7�?����.`K+���V=M�81n����4iR��?�������?�'F�6l��57n��{,�|��3fL|��_l�	((,`G<��V=���������z�]��1c������|���S�N1�������9�a������i��������I�(�j��e�Z���cd<�������������^z)�����s�����o�=z���97e��9rd�����sW_}u�x��q����k>vX@]�R@S#��@�Z��>}�D��}������}�Fuuu0���e�~��E[��k���7f��
c���������;��x��g�c�X�������
6�5�\����HUn��V=
6,GqD���e}V]]]���SO=/��R��]�vq���n��UYY?��O�G��t����?~|<���1h��F��K�RO@V��K�Z�n��G�����$?��O�������o��vxO���+���:4i�y�s+N4�{��O?�t���.�,�{��SO=���+�l4�-�� X���q�b������?<�t����|pz�����+W��/�X�(",
@�zy��W��O:��z���_����-�v���\U�z���w���s������e����]���>���
Zo���Y�=z������������
`l����������+������M����l�2�����w^\|����^{����3��;w�\������`W[�I���@�VV�(�W_}u��UD��U�������}�sq��������\�hQ��>��z�t���p=�,�PQ�(�����#G��[o�u���Z�*��E���������Z�hQ,^��^���5� {�Q�t��y���TUU��A������c�=6�w����O���{�h���������/��'����7q�m�E�v������v����UUUU��o�����z
u�w�����;��Y�`����W������_�k�n���5k-[���]�����c��	q���y�2����w�u�Y��g����v�������z���^{e�����~JlK+��CY��p�9��:�Wu9���c��q��}���4M������}UUUY������������`��
`;��@�*J=���{����[��K/��{��'c��e�����yO��-c��5���k��k����m�+�+��">��O���Y�f����[����,������/�k��6/^�6m���{.�?��:�o��e,Z�(s�z��z��������Ct��� k���$)�4ie���*++����g��1c�v�d����g���7o����� XD�����/^��k?������z�^{���#�8�^�Pbi��U�<`��5�:^�~�v�}����������w���-�D�<`,�:�o���{����u��K/�k��'�p=vq[X!�@��	&dw��y�����?Z�h�9�9sf��;7�}���o��f��U�V����
@I�X�x4�+�=��/��g��:w�i�m�����<xp������9�����<������qRv	�,���l�����/})��1�]�v��}������������wx��E���;���:4!IR�	�]�6�%���J�$���q�vx�UW]����y�%K��9��������=z��2$N<������K����t�_������[����c����s��rJ�q�9��.��r#�@*J=@S4q���������i�����]�=�\�kt��)z��Q��~����w�g�uV|���~������uo��v<���1f��X�`A�g��{n|���i�[o�5N=����iSDD<���1x�������w�����N�W_}u�����s���q�-�4�����(�>|x��;w��-\�0
T�g�\rI�w�}��������������6""Z�n;v�6m�����c���1��:�=��S���E�{�|�����|'����e��7.����:u��;�����_���6��r�-q��'���`��%��`�����+b��;����,F����7�Y�f�Z��k���������7n���?~������������_�r��`�%�X����P���������s��9]��UW]3f���o�����ZW_}uL�2%�eeu��TVVC���S��_4u�,��h����R���3��{������g?���g#"b���1}���;wn,^�8V�^�����m�h��}���+�v�Z�Y�=��x��'b��%1a����?��W��-ZD�n��_�~��}���@�d���

'��j��]�|��q��'7������s�=�Q��D����������MH��r#�@���	`PX@���,� ��nK+�������A�YZ�J��@�&������6�J�]m�F�<`������	`PX@�jX�, w[XI��x�2,����:x4�+, gi�n~�r@���	`PX@��(��R�~O?�tL�0!�,Ym���>}����Cc���*�h�P���y�������q�q��n��7�|3>���������g;v����'q��geV G�,�C�X?�����[n���6m��\��k-Z��zj,\�0�-_p���c��1��8��s�7��M:�X#;��>4DY����~��Y]x����y��^;r��X�`ADd����am��!F���-+��@����x4�����/_3f�������k������/"I�H�4����������z*|�����o&���;�����Z�����@��GE1}��72_TI��I'���kz����iS���z(�=�������'�_�~1u��H�4~����w���b�
��P������c�������;F�6m�{�O<��W={���_EDTVV�M7��9�?~��9�������Z�dIDl�Z�o�~���Z�*�L���/�O~��u^w���GUUU��o�[�r&�@%��f����-Zl����'��
"���v��g�y]EEEt��5s�`��M
�Km�P�VEEE�}MM�v������y��u�����v�m��u����+��h�-�$IJ<MYQXm�����4M������u�?�|Dl�2;���v���!����L	4�P�rU�V���3��-[3f������K/��)9����k.]�4��u�����4���r@�����w���e�V?�����G?�Ql��)�-_h��v�v�[�re��7/��AT����I��:�> WE	`�m�6i�F��q�]w��7��/������~������3A����G������_����Z�zh1�vF�(J+"�k_�ZDD$Ii��������v���UW]6l�4M#I���W�����x����}��GJ�6�y(Z���N�+��2���H�4�����'����gv����c#I�H�$���W�����
`m��@C-����0����GEEE��+7�i�
��{,������O<s�����Ygsd �y�(�7�tS\~������.f��555��S�4hP|�C������g����s�9���;���_��C�X�:u��/��A���G?*�4@�	`Pe�h:R,
@��P�����`�KUn�����V��v�����,M��1cF���[�b�������E��/����J��C��~��������<�L�������H�n~����@���Z�xq|�S����{.""��/�H�$�4U~�R����Z�lY�z��1c��L��6b������H�(���F������Wm������1��������k{�jX[�d����Z�lY<�����U�$��o|#����+��k�bl	4��V��v����^x����qc$II�������
7�P����$�@�c���~;""�4����9rd1�JE�<%��n����H�$=���{����
���4"6�E�������3�+**��P
[X!�����%���o���H�4�~��bl�@*�@%�u�QGE�=""b��%1e��bl4����<����""F��y?j��bm4��V��v�����;����g>i���O?#G�,�V@c�����������s��\�i�������1n��bn	4,�PQ���$����+_��W�O�S�v�i��m����W���~QUUU�5����"M�P�F��4TQX��/��S����k#����l��x����V��XPJ["!�����\5�����%>������#B��<,
�h�����q��g��+"bs�*����$
�.
�W�XW^ye�X�"�-��4M��3��s�9'�>��h��]4o��X��P[�����(Jk�����?�1�$�4Mc�}�����7�����M�<�c��'FDD���$I�u�]�W�;H���X��(��f����>q�y�c��m	`%X��(�V�ZE��/��]�������Vh�����>��d��[��[�P��<%���o�(//�4Mc��9�a��bl4��6��$��&�(�N�:��A�""b��U��SOc��	`uIK=MMQX�F����������kc��U��
hlX��h�O<1~��DD���3c��!�p��bm4�4��*�@��������������[��	�����Q�F�����Hk����cK7$� �Z�k����I�D���l�����������Y�f����FUUU��M�$f��]�q�\l	`�P�rT���9s2��$I2��t���u�b���^W�J�6�y(Z����U��R_~PR�H(Z����+v����:���&�h�9s�ki����CY���4��*�@���	`PX@���,�
�J����C��$)�4aX@�	`[KK=MME�������n�$q���em`��t���y(Z�������_Ri�
`@�`P E`�+��Q��POXHQX��X�Wm�*M�������69*Z�������Y�&/^/��r�����b��)�$It��=����8����0)���XI�r@�-���K��w��G��?�������7��M|������g��^�=�\q����V�� e�`G>����������������g�+V�(�X�y��X}����#GFD���s���F�'�=S���>������ZE����?������"M����{����v�����k��~���1cF����p��X�re�l�2��k���������]���D�i��;�!����QSS����3�8��c��y�b���1i���<yrL�2%V�\���K�.1g��F����:���>�lL�0!jjj�{m�6m�S��T\u�Uq����k����/.����y�����q�|?%"�@�4�VD�~����������d��'�����&M�����d��{�����SO�I�&�|����?�����{��o}�[q��WG�7���,�C�	`�Z�*�~��5%����_�G}�d��e�����_UUUE���}���z���5kV�[�.���u���k���������X#�m�J�����*�r�$X��/��3gf����g���-[��
u��!��\rI4(�����5�|VSS�<�H\��1w����;��#�<�����P������<xp���m���{��*��r@>�D��[n�
6D����!�R��"Z�j}����}����}������0`@�f���_�5*
��B��{�����b��!q�g��/�����n��.�(��w�z���G�8������&F�<���M�6�-��7�|s$Ii��^{���zj�f6lX<8�8��(++������$3UVV�O<C�����m��o��8���b����|��x��G����l�F�	K���X�V�~<@.��?~|��������+���>�h�����/�$I����t������^�u�V�������^��Z�:u�K.�$��������~Z��	`P E`���?�<���_�i��u�o�����)����z���J8
���X���bo��i�~ED&���i���+�}��h��m�G���������[�I��m�����(j+���X����W�q�1y�����K�#"b��yY����+�$�����$X���X����=I�DUUU�n�:�t��{�������Q�O�S��a���u6n����?b����$I�k�.:v��Z�*���
�
`�y��X4�+V���c���}���^����v|�K_��+Wf�/++�c�9&
_���K�.y��.D�<��zJ����f�Z�*s��}�:th��y��7��_EDl��)�M���v[t��=.�������kfJ'M�`[Kw~	l���P/��R�3&����_��7/�~6l����+&N�O?�tt�����/Z�(/^\�{f��U�v{X��h��Eq����3����_�������C���N:)z���������X�lY���k���O�=�����n���^{-�
/��b�h��`?�w��G�.�z�a��Ak��{��G?��x���3�Z�j���/���<�5z��S�N���{����������~�������q�e��o����S�N�Q�F�������@#�:��$���&����x6m��������^��+//��z(�w���:����z��m��#�<������q�1o����`�U+����@�*��������t|��.����+��"���9N�$����6lXQ�-++����'��/����#"b�����_�:���/d�+��">��O���Y�f����[����-�����T�$�
6|���u�]w�}w���o�=.���F��m��q�e���1c2��y����:t�:t(�ZlG�n~-BW�=KY�7H�������~�����~7���Q��+_�J��q�i�e��1�Q� ?���@�WE1oh�*y���U����?����.��UW]�G�n�Y:w��u�x��F��<`P E`}����=k�������/�o��FDl�au��=�^�w{<�@|��_�:w�e����������Y�������d�6�y��X[{�����_�z<���1{���5kV��g?������[y��G���.�t��4���q�=�DR��������o���@��,J��`�QV����������w���=�4�_��q����z�&������.�(6n��97d�����ee���|��	Y��;w.�$4��3�h�
`�������3��D�~��_�z�]��/���w^�[�.sn��1v��h��Y����aC���Y�N;��M@>,����""���oDDD����lk��)1l�������;���������N���~7f���u�#�H���A�t��yj�O<1��w����={v���+%����$��5n��^��o��g�+W���;��c������-[l�;��3^x��z�3f��5jT��s�9'���S��hXHE���A��-���������W���2q���������i�����]�=�\�kt��)z��Q�y�������c����s-Z��k��6�L�R��N?���~6i�����+�g��q�����g�GuT���^Y��Y�&�������b���Y��k�.��S��(��6��~�S�	`���e�/Z����D><������.\�
���K.�$������3c���?~����W�E]���r����i�b��i���=***�s����M�����w�y'���������V�Z���?��uk�l�Pm�"IJ;M^�`m��)���d����J8
��a�������u'�pB<��C�WM��$XO<�D,_�<s|��n�=���_m�������k��������UUU������+c��!���@�%�������X�g��+��2�$�t���'�\�����S�=j�\����^����N�N8!""��[��O�����?~�\�2��_�[���m��a��z�����F�
���(���]2��q��x����W��U���?���WG���$I|�C���;�zD"���2z��={�,�(4�4��*�@������k������w�y'��_�	_ED����m��V��z��@���3gN$Ii��V$I�Y���<����8��8%��|Z"������*Z�V��Zc�]����?���o���
����M�"����:��z���$����h��ut��%z��g�}vs�1E���R���9s��4PJX����MD�FDD"�@����l	`�y�rS��<	`9IkXIR�A�]�>�$��F�)Zk��	Q^^����?��A�����5***b������R���w�i�F����o�0`@��8p`���+�4�M�6�=��S�I����w�U��?��U�&"*&"QD�Q�� Ql1�
��_4���Fcl�XB�_5�h["�nl��J�.XC�.������
C�a����g����s�~�{�uO��^��"�2�$k��5���;�$�$I��SO-S�~��EDD�$�����G�@i������M��@	e���{���_~i�����.S���i����3���>*s�@)��$�(�L�&L���n��q����e���]�h��qn�����
���2	��1cFD�Mjl��u���y��s���M+��@��EXIR��P�e��d���u�������u-ZT.5�R�lBZ�
P�d���Q�����s����y�r����+��@)���d����;FDD���������K�To��%1y��H
|E��J �2�$�}����+V���#�To���b��H ��kW�z�V(���l��J*���;F���#I�H�4����2����k#)���q����o}�<�J�0+�p@e�q���GZ��z��������V���/o��VD�}����P
�D��2������v���$I�i��rK���/,XP��,��O?=n���\�Z�j���_�U���`%I��@��YV�6m��K/�4MsV�����.q�9�����c��9����3'���sN�m�6x��H�4Wc�����n�e�2��,`S��n���f�������������r!X,��o�=n�����H�$���K�,��.���+Z��o������l(	X�QA�<���q���F���$I$��4M#M�X�fM,Z�(��Y���y\pA�w�}Y�
lNa6�,�*���5k����x������ �j�W����9��9rd�t�MQ�F��[6G�%�(�����GGyd��?���#G�K/��}�Y��7/.\
4�v�!������������w���~��%EXPF�U���8�����0+I�Jn����������@	�J$�lB����,�t`PF���I��`PF����l�oJ�fEm4����?�c�����z+�������+V��N�$�j����6�(�(������%�\w�yg,]�4""R2�z
sC�$��F��2
��={v���#>���H����k��t6�Y��r@`PF�`�^�:N<��x���#bm�U����e��u�]��W_�����c��W/���'N��+W�����m��b�]v��U�RX����
������/G�$�$I����������i���W^���\
4(��~�a|��W1b��8��cs�3f�i��/��B���Y���,`}ie7@U�Y�����X����q�5jT~��[\W�n����g<������OF���c�������4n������$-L��@e�5s��x���"I�H�$.���h��M��u�Q���OG�:u"M������7���c`�����2	�z���#""-|`�v�i���n����o}+.�����X�fM\v�e��%P*E9!IR�}���%�I��3r�-[���-[nv��e�6���g�I�D����3���9s��O�`PN2	��7o^DD$I-Z������k���.]��z�[��]w�5""�4�1c��O�@�`%�(�L�j�����S��F�4l�0�������Xs�w�]O�8���U��(�L�7n��^�`�F�4k�,w����n�����7z
T0X�Q&X��������3f�������;w��K/m�������>������A�r�(�4]�We�I���V_~�e��9s�9p@D�
�z��wc��q��w�����U�"-|�m���;��(�(��w�1��s��x��1����o$II�D��q�������7�7t�����+#)L}�Q�Fz��Y�
lNQVa��|=PR5�*��g�����""����w�p�	��o��ms�1����G�$���G��w�����{��+���_����?�>��$�SN9%7n�U������d���o�����"M�:th���������[o�5^|��X�`A$IK�.�G}4����Wi�F�-�w��]V-��N�EfX�rH\p��l�������Ob���+6g�]v�#F�QG������V4N�4v�y�x����e��Y���,�(�����n�i�s���o���^{m<��C1}��b��n�:���^xa4i�$�V�-H�t��,`=E_PR�`��;��
�A����3g��4Mc��v�6m�Tv{@��n`PFy���6m���|T�eTP�
UDQV�Tn@���@		�JF�$���;��A�b���YmT���De�Y����]tQ�i�&�>��:th�X�"����"�2�,���U�b���q��'�N;�g�yf����Yo��4]�W�������4+M�H
Vi��������kr�!���{�u�]S�L��������GfX'N�+��2v�}���k�0�O>�$~��_����=z��{��7�,Y�U;@Y`�����,�m��q�W�'�|/��r���?�F��J�4��Y�F���N;�?����^��-`k	����%�Y���t���_��/����q�QGEA������Y���h��2dHq������W\�~�iE�l�,�I�`�S�N���7�|���6mZ�|����>�DZ�`[7k��)����6��s����k�y����W_Ud�����	��U�X�j��y�������~;�~��8����y��
�z����g?�Y�l�2N>���j���@UZ��:v��
��S���O>}���:u�����4�4Mc��e1t��J��Q�y �(���*R�F�8������G|������%�t���T��(`=�(��
�ZW�F�b��v��v�-���S��E	7IR�}P�����7a��2dH�w�}1}���n("�_�P^`��;7|��<xp�����>����]�����&`['�rRiX�V��'�x"����+W�J�$�4�4Mc��w��O?=���_���+�e BeV�Xc������?������/#"�_�^��W/����F��������C*�:9!P�����������{o|���Q<��(�*"��C�����I'��o�}E��DaFH���2�Z�xq6,�/��b�i����4Mc��w�~��E�~�b�]w��%���C��2�j��E,]�4"�X�UQ�U��
���N�����!��U@y)
�J����*/��%K�DR��*
�J�$�8�����|�����u�f�=P�`PN2���HX��������i���[��rK +��-��@Ie���;��'�����8 �m��&��2�,��/��Z�jeU�hi�,�� ������)����,�^���$��F��#�����,��,�d`PN`%#�_��,�t`PF���I���H`PF���)�����LQV�TnTy5+����i�������o��Y�""�E�����F���#)��11w��x��W���>���G����]�v��k�h��i��@�H`��VvT5��`��i1v��x���c�����o���s��m�6&M�T)��\�2n��������M����w�9�;��8��s�V�Z[��;��W\qE<����f��
��Q�F}��q�5�D���z*�,���Rz��W����}����1}���ng�>���8�����������S���^>�`<��c��u�R�u�-���^�V������W���?����c��Aq��g�z��,`S|=PB��@U����'y���
��5kVv�a�_m��v��o|#��k��[�n�����vX��3�T{
4(�;��
��Z�l����l����U�V�9����zk�� O�����(#X�h�����b����g���u���?���1g��x���c���1g��4hP� �O>�$�8���3f�����������{�7.�O�o��FL�>=����D�n������b���[�	�4EXPF��R�
�{��q�E���Cc��I��OTjO#G����~:7�U�V�1"�=���W�^�~�����������G�Z�r��x��x��J��E]�W����9��1bDt�����o~��1r��8���s�V�Z]tQ�?��0+I�Jn���R�.\S�N�)S���+*��;��c��>�����/�7�xc|�{���m�Vvk��_�����K.�C=t���u�,v���/��>O?�t�3&7n��i�u�]Q�v����]�v�}����i�����G�3�<����#�X!�2�����>~���G���v����q�h��m���n���/ot��q�b���1z��x��w+���j��]t��!

*5;l���^�;67�_�~\t�E[\w��G���s�1c���	6��o�[������q�7��y��q�Ygm��-�lB���T��8���k��~�E��=���s�����j��H���M��?��vXv�a��[�X�lYE�\�<��c��}���
lq]�
���N*v��G��������#��;��3J�����~��X�bE���`PN2����[�[�n����nv���Av�9�D�5"M�X�`A��_����*����*6���W���������'����Q�F����s�=��3��m[�}v�u������/\�0^|���	@��l�oJ*�����;�?��X�re�^�5����N:i�@���y���������Lz���4�w�}���.]��x}��]���y��M��y����z����~=�XQ&�,�(��I�&�Yg�I��^]tQ��1#^}����?�I	f'�xbD�
zz����j���<yr,Y�$7�_�~���.%^��m��W�^n�x������7:w��	��:t(U���_�y�(�(��+��"V�Xi�F�$���
7�;��C�k}����]�����g��g�U�G}Tl��M�R�X��5�k���@*
�J����*/��+V��?I�D�$����4����������G�z�r�	&�G����Y���w�y�R�h���fk��^%��<T�����jfQ��W^�%K�D����E]T�z��e�����""b��ie��:Y�hQ�q���K]c�5��,��J�Oi��5+f��]�5�~�i��
@~[5kV,��{lC����[�m���j������%{���*� �,�S�P�d�5q���u���c��v+s�����,XP�z���!Ru�����v�m�����WI�)�;��#����r�@��f����^{��y�*���j����iA��n��:E�30brD�]���()���*2	��={vDD$I-[�,��k��)��U��e���k��]�u��)6^�ti&{�t(k��2~U�}�J���������$]�WO��v�j*)(�-ZDA�z��
�g����Z�����"��uC�V�XQ.5�����n��i���.���[l�5���/_�����_�d�V�U�}�\%I��0�����m�~D�,�a�Z����*���L��7oi���i��\o���1e��H��X}��~�����-[V�K�.�l�u���U��J�Oi�u�Yq�I'�j���~�|��@~J���[`#2	��c�=r�s���?�0��o���F�k�����$I��(s����!R�/.u���l.k��Y[�WI�)����F`CEX�?�@~(���7����a�")<4v��w����7�������-[�,S��f����S�����i�6[���*�>P.`��L�


�����4M#M�����������Z�\sM�7.""�$��O?�<[���s�b��?���5�_��}��5e��R����M��B@^�$+"��+����kG�$�b�����w����%^�z�����K��+�����Y����������*�m����v����/���'�x����c��%�q����M�6��~`����K���	6[��,���YV��m���/�4M#I��={vr�!q������#c����0[�zu��3'^{�������]�vq��7F�����rK4h� ����$I�c�����3���_y��b��;�B����S���gc{�_����0T��Y������O?�!C�D�$�z��x����(6/M������"�<K�4�?��8����l�J���O������3�<��rJ��>��3���s�&�v��=����/����?�8&O�m����>�&M�O>�$7n��At���D=�V)<���JA��}����_���/(�ii�F�$�W��u��X�u�����7��u�U���[l<t��X�h��-\�0�Z��q����u���^�z�w��w��������;j��]���U��`[#��<�yVAAA\u�U1z�����W��8PV�U$M�8���b���1p������:v�p@n�h���������o�����tPt��a�k~���~��1{�����5kV�q����-w^)��O2�*��K�>|x�?>~������_����i��Q�F�h��A���n��G����k��7����{.�t�RQ-���@����Q�������.6���~�G����_|1n���b�����-�s��G�A���;7~�����+7:�����(�������o;�<��-�e" /���
��o������?���.7���J,]�t�����N���e���g��h�V�ZE������{G�^�b����r��8��#�w��]��'?�z��ED������;��K/��Xh�QG=z�(�^7�tSt��-��YO<�D���+~���G���s���\pA�����{5j��o�����H@^������SO���'oq���3�g��}���q�=��sgC���>8&N�kC��;�����Kc��w�4M����o,[����v�����C9$����8p`���Q�b����V�ZE��-c�����_l���o��:h�> ��,��$��i��E���q�q��;�����t�����6��S�N������;�X��.����Q�F80V�^��?}���>}��k��7�|s�w�y���*��6�(��]AV�~��X�reV����m����c��n�V�Zmr^�V���o��_=��i�U{]p���o��G����� ������~@�*J��WjfU�{��^���q�)�D�~����j�
7i����H���[�k���/�8.���7n\���;1k����h��yt��):w���������S<���1g��x�������o,^�8��������]�F�f����Z��@U%��|�YVD��_~w�qG�q����{�����N�V�Ze�-�(((�8�B��5k�|��@I�~�N
@^)��M�4�?�0.���h��my�������e�*b{`[% /e�����_�~��$�4Mc��������i��;��S��'?��^z)�6�m�,���Y������1cF<8�8��H
��M�4,Xw�}wt��=��kW_}uL�81���m�,���YVDD�z����O��#G������������GZx�l�0��'�UW]{��Gt��-������E��l�F$��V����L�X�j��u\r�%�����c�����v�a�aX/��r���?��v�)N?��x��gr�J����,��RaX���7���v[L�>=~��8����f����i� �%K��<�{��]v�%~��_��	*�e�*��{l�d?��*%�H�Z�������~8�������[c���������aX��M�n�!��g��l�B��"E" �Tj��v�a���/~c��������_�[��4M#I�H�$�4���4�-����&k]�������w1y�������N�:��P	��K5+�����������g2$^}���n��`���	�Z�fM<���1d��x��'b������b���5
� 	�`[Q���|W�Xo��v2$|���5kVDD���4M#M��[�n������l�J�@^����3g�}��C����?"��^�|��k�������76lX�UU��$���~ �UX������G�!C����>�W��d�U��m�_�~��_�h��]E�T3Eg�"�O2�z���b��!1t��X�paDD���������>N<�����t��=���m�,���Y�o~������b��IQ<��(�*"���������'������`[$ /e�u�5�����
�J�4����E������O�6m�d��Z��JfX�J�45j�������q��W����.M����W2
�*((�^�zE��������:u�d�@qEX����n���8��Sc��v�j��+�J����
��@��,��.��4@�`�,��RP�
d%���`��,��$��`����]0z��
�z��%�W^6���t�_Xl+��nJ��X��w�d��`I���U��8��lj?�
�R@�Q����%<V�y����R?�y���<W�5��_UB�&Xy�fi��7�)�yYI`�%X@�% /Tv���W`�W���+ �����,�Fx�PU�����$I*��U��X��#���_�9s�D�&Mb����>}�D�:u*�5��)�
Xlc<��w�`M�6-F��y����u�M����O�{��^�������e������{���W�zJ`����n������#"�Q�Fq��'or��Y��[�n1s��������Y��1}��8��c����>}�d�2P]	��+Y~���raV��rJ��Wo�s/����1cFD�Z7k��U1`���7o^V-�M�$X�%������G}������&�N�<9x��H�$�4��u����_O?�t�{��q�������������h��`���Y���r�UI�D�.]69�����5k������q�����?����k��1n��H�4���������h�n��`[��@Q�E��'��[�l�5���'�|2"��_�������""j���\sMn<}��������a�z*
�J����b2	��3gND�
�j���&�-Z�(�x��H
�}������#�8"����������-Pm`%���x���2	�Z�dI��~����7v��X�jU����z����y5k���w�=7�1cF9u
TgEg�B@^�$�f�����K�nr�K/���n��a��������a�������!�M��W2	�j��QD�����?�|���{����H�$�t�����i��Q����4]�W@^�$k�=��]��7/>���
���93��I������o����ss�
6,�F��M@^�$�s��QPP�����[7�s�m���5k"-<`��G�M�[�paL�6-Wo�]v��k��)
��m�'UE&XM�4��?<�4�4M���s\}��1{���?~�v�mq�
7����c�����&������Z_����h�n��
�*�2	���8p`DD$Ii��UW];��S4m�4�=��X�jU�iI��/����z��'s��7��LaV"�m�'�.��=z����\�UDD���W���:(~��o���a�"I�H�$�v��U�@5�`�,���YVD������e�]5k���A�Bi�F��=����5jl���O>�'O����w��e�@u$ ���z�k��&�<��x������?��K�F�V��g��q��oq����c�}����=��,�������W2���h��U�y��[����n+�n�mFQy����LQV�TnPQd?PE��/XyIP}`%���x���jVv��:uj�~�����/��9s�I�&�����g����_e�TU��JfX���z�~����W\{���&�6,�����-���4M#I�x������s80��������4]�W@^�,���k�w�}�$I�����
�7n\�v�i�b����H�$�u��^�:�����]�v\q�Y�T3�,��T�U�#F����lv�y��+V��_�iZ�Ut��k��>� �����(���I���Sc�����QG���c���W^y%��_X�m����g���K����g�}v.k���q�M7e�2P`�O��N�#UE&X~���6((�N�:mr�<i�FAAA<���q���G�:u�u��q�-�D��}#M�H�4y��X�rem��,���I��I�"""I��e�]�N�:��;b����^�zE�6�s�����-Z���^�6TO�X�,�1}��L�,X��n���&���93>�������~�������F���s�>��|�
R@�J&XK�.�]��Sg��^}����He�G������������[��mB��$X�%�����.w�`��M�{��s��Z�*r���u����,YR��mB* /e���I��X{xl��I�;D���#GFDD�$q���n����s�u��)�N�jmg��\�`u��!w�d��x��W6�������	")�e����o���Y�r�E[�U�UxN	���I���������[]u�U����k"""-<`��W�M��1cF��=;7�m����]�����&���d2	��[�n�p�	�p���>z��C��G}4N:��:th$II��!�m���d��^{���}��Y�
T7��R��
��7���C���+"M�x�������/6'M�H�$.�����z��Gs�m����-[f�2PM%���x���
�*��]���_��;<��i����Xt��?�i���s�u�.]�=�X$II�D�n��j�n
�+�,���YVD�������������"�a5h� ~��������������_}�Un}�>}�l�FRXy�f����3>����0aB|����t��h��Ux��Q�N�-�_�jU�{����w���,���u~����yV����+��k�R�;��s2��&`%I��@1��@f`��I+�(!X@�% /	���D�O>�]���l��1b��x���b��	1o������"M����������v��.M����W*$��/�����:����X�hQ���4�$Ib���]{��'���C#"b�]v��'f�/P=���RA��3&:u���zk,\���J���.�4M#M��2eJ<��su
T;�<�@��4��7��^�z���S��O�$�5kV�0����?:w��6������3JIR�}PLfX�-�c�=6�,Yi��A�=�X,X� f��k�����O��9rdV-��,�5[�}Z��`�t�M1c��\���g�/��rs�1Q�^�R�:��#r��&M�3f�k�@5' �d�����%~u����-��[�]���F��������G��K����Y&�fx���2	�z��7c��Y������T�N�:���;��'N,S=`Qx�)`��L�����n��I|��e���q���W_}U�z�6�(���I��Y�"""I�h��m���[�n�z����R�����$��F(�fEW�^���Q�F�����/s��7.������>��c����Sc����I�h��}t���XxP�`��L��7ok=q���e��b���<yrn��Y�2�,/�>�h\s�5���on�����>���o2�{�]w-���,�����s�&����{��?��V����[�5j��@�	�`[�VvP2Ym��u�z���1k��2�{��Wb�����7���2�+��/��N;-N8��M�_ED,Z�(n������C�=�;�z�k����|	��+�`u��5���I�������L�n����u����C�e�WVk������|�5j�n���:u�F�{o������|'^}���lu������[������L���� �����v�m�vX><""n������_4m�����x��x��Gs��?���lu��t�M��c������,~��_G�V�"bmH�c�=��w^L�2%""�,Y}�������������c����^7l����_��7o�<�:��R������W�^%���I�R���V���J&X�]vY><�$���g���O=�T4n���5�~��8���"""M��U�V80��Kf�������������>.���b�


��N�o}�[q�!���I�""b���1h����������]�n��+������SO��5K��E���#���� SEX����
w��5����EZx����^����;����X�h�&��^�:����rJ{���p��H�4�$�s�9'v�u��Z.�o�1.\�z���
�j��u��o+v��C��;7�K���?�W_}���TN3����K�$���d�q�=�D���s���O�?��O�i����>�D����{�����{G�������v<��C�z��H
�u��=n���,���5k������b�����\����G������/\�0z��Lz,�{����x�����;VN3�Xy)��z����O?��w�4M#I�H�4V�\|�An^��1~��?~|,^�8�U4�����Gy$

2mw����g���w�}����{����G?*6~��G����[�fM�{����
0�r����`S���|�y���;��=�\\����I���$I�����6�Q�Fq����O<
6���-z�����{����wKz��Yl<j��X�xq��VZ�=�\L�:57�U�V��?��~ S��J�Xk����y��O�c�9&�4ii�n��[�nq�q��7��I�b���%����o�]l��K��m��U�������+b�����Y�
<���O�>��Y�J�2��k���$�(}�����v�m���������ED���3c���1���W�^4k�,v�i��Y�B�*�	&w���T�;t��&M*V��(��Je����#��7`��2�\�zu�������gG�$��i�h��e4h��Lu�L
���G�X+���3f���cs��;�������-ZD�-�h��-]�4�L�R�^�6mJUc��}�Q���=�P,Y�$7n��Eu�Q[]�����s�9'.\X�~AAA���>��g���/~m����=`�`�_
�(����	'��{��TU��3'�u���U+�7o^��[�.6�5kV��VZ�.6>��S�f���B���O6���X�fM���;q��7�{�g�yf,]�t�������I��m�b�>�h3����;8��e����C�T�E���W/�R��_��fkV��>�,^~��b�����V��?�����+���#�e���Z��Y1{��R����O����,���IV��M#""I�h��u[T�������[��m��fkV�{�����s����>�lU�N�:E�>}�K�.��C�h��Y��];������^�1"��������rk�{��8��c��_� �,������������,���IV�V�r��/�b�
�l��b���k��F�:u���.]Z��J+M����{��0`@��t��9���;w���-Z��-Z�G������3��G}4���q���+��������J%M�����"���d
�(����GAAA�i�'O�+Vd�M��[�n���|����o�f�^x���<yrn\�v���~P�:;v�d����4i��������n��w�qGL�6��{@���K5�(��U����{<����t��x�����N�b�
����/[���5�.]���Y<xp�q�>}�i����[PP�����������G��~C����;�\�8������N*��O?�4�?��r��<U����+�`ED�������GD���^Gyd��W/��2�~X��%K"M�R�[�x�fkfi��E������T��M�4�3�8#
��7r��r�j��y4o��\jP�`�_
�*|��G����H�4>���8���c��YYm��f���Z�re�?��i���+2�i�����Z�h���w*l���=z��G�?���(�?t@�2�����������K"I�=ztt��!���������6�m�]���.��M�2�T5����}�2�UR�.6>��S�f���DD�6m��g��]���
���2K@:���s�M�6���g��y���k��k��&4hm����
F�Z�J\7I�x����hy���o�'O����p@��O�0a�za���1z��b�~��V���Z�����++��Q��JfX�F��d�CcE�i�/*.X� �{��bs�$M�R�/o�:u�#F��c�������h�_|�&M��k��:t(�7j���������������f��Ql���;Vxlc����`�ny
�����0I�b���O�>���>�l�`��9rd��a��o�}���)i���!C��0`@��n��/�\l��M�J��m�,���iV�����l]�t�f�������c��Q%Z{�]ww�q���&�=:&N����];~��T���Z�jU<���=zTxlc
�U������ �e��f��L^�W����-*((��w�UWm1�������^z)7n��A���7�7�~��1�;��C�������w�����WQ!`l������PfX����c�����_|�����69��i������s�=7�5k��}�$)�5jT�{]�dI6�����J�O�S<����Z3h�����+��;��cc���/S/�EEXIR�}P��Rj��Y��W�*v��K/���:+�O����f��x��G�K�.1i����V�Z�\P!�6,.\����N��w�2�|����G���S�������7�����o0o��%��OD�n���.�t�_�l��i4�L}@I���R��n�*8p`�3&�|����?��O����5��m�5��'�������n��������WH��.6>��S�f���W��;��;���]vY��Y3��i�5���k��_~�&M��+Wn��A���OD�v���(XyE�V(((��C������?����z�������5M�6�a��E��]+��)S��/�P���2�k��U1q��-�;������~@�I��`��H+�(���n���[�n<���1l������&���_?�:��?~|t�����2dH���N0�������{����g���w^t��9j�����u�����{�O<�����+*�,��T����N<��8����O?��_=�M�+V�����^{�]�v��u������U[���/��/��L56���<0""V�X&L��'����c����r��h��a4i�$�����~���k�.�>�D�x�,����������r�W�f�h��Q4j�(��m�;w������e��{�{�Q�mT���k�������oe�W��$R@�IfXW^ye���


b�}����Gq���G��
3���
�B@^)��M�4��kk��W�^o��v�s�9��{�#�<R��`��L��
�J�$�Z�������[4� ����4�9s������4hP��brg�`���Y~��""b��Yq�%���I�"M�(((����G�.]b������G�:ub��1}��x��������3fDDDAAA��g?��}���E�b��y�����s�=o��v����/�8��k���w�����Xlc���Y�k�`u��-�������S�F��q�i��u�];���f��Y�&�
]tQ|�����?�9j������{����'?�I|����$I�Y�&.��bX�Z��RAV����Gyd|���q�w��!C�~QPP}���7�x#��w�H�4n�������������c���o|��{���������a���(�1��w�`]v�e1m��H�$�8�����~V�;��c:4���i���W^�'O.6�a��q���F����?��<�L�|��+
���W2	�Z�xq<87���K���{�'�tRDD�Z�*����
�t��)?��H����+[�P��)J`��L�^z��X�lY$Im����w��L�?����3�<��9=z����4M��/�(�~@5# �d������[�hQ�z��7����V�|��F��k�.w=o��2�	T}i�����W2	�Z�hQ�����*s���/^��9�5�]�Z���{��,�5ie7%�IV�f�"b��'N�81���_�zo��F��i����d���u�����PM��K�`���n�$I�Z�*�������h��x��"I�H�$W{}��M����E����F���+�`z����A���H�4����x������Yg�_|�E��������y����]�k�n������$��>(&��:u�D�~�"M�H�$-Z�~x�w�}%���_�	'���$�����n�����s��Y����������+�J`��L�""~����N;�k�}��W����{�������Q�F���3c��e�f��X�`A|����������_�������4MsAZW^ye�n�z���y���9sf��Z�����X@U$ ����p��
������={���s#I�H�4���������(��h�������7:������i��Yt���\?P5�i��B@^)������/��bt��i�@���""7�V�Zq�5��_���M�3x���8qbL�81�{��((��cU�,�1ie7%�yR�^{�c���[n�%��c����b��P�d�fi�F������O���z+.�������m���E��|�
���jV�&5j����>;�>��x������_�7�x#�M��������G�F�b�v�:��������W4m��"����~���P!X�:��������m�mQQV�TnP�<��w��@f
�) yEP�	��+���+M����W`�V* /�����)S��^��5�Q�FQ�~�r�Tc�������LfX���k$+((�]v�%���oF��]��SO��M���>@5�J�GYo��i��V�^'N�a������;��s���?�d�Q���(+������@��<�H�$�J2gS�"��k-_�<�������c���������9$*O��
���/whl���1q��H�$��_Tl��u���^��q��S�N,X� �O�|�A,[�,"��u�q�E�F�b��E1o��x���b��9�9i���)S������^{-Z�l�������J! �d�u�=����+���EL�81""7n^xa�v�i��M���[�zu�1"n���>|xDD����1l��8���s��}�����[��{���`M�:5.���x����X@U" /dY���O����o�$It��->������K7~Q�F�8�������w<��Q�v��1cF���+������u��1����x����v�����C��������T@^�,������z(�4�o|�1|��h��i�j�|��q�]wE���x��8��Sb�������;���?F���$I�Y�&y����(@UU���>����������H�$n����S��V���~|pDDL�81����
���'?��v�-75j�V�T3E) IR�}PL&X����I�&EDD�F��g��e�w��'��~��
�/((�c�9&�4�4M��O>)�~@5!�m�G���{���<<���*�h$U!�A��D	jb@
�btP#q$���5�:#�(����&c��t.��$�L�1�Q�����f�K��^�
�E4\l�j�V�p
(�@U����Y�U��g�o��d���^��q]�z��W"""I�2dH$����G���m�1���������9#��)]�Z�zu�����v�#M���wTWWWx�~��}�'�i����KX}�����UK�.���!�����o^WWW��������.	`dJ��
Tx�n��x��'�i�x����C��9k��)�����>���T ��$�5j��H�$�$�4M���������������


��N=��]���k�EDD�$1t����������OtIk��A�PU�$��k��y�����+i�_��W1a��BH+"��_��.�}��'�?������@������sP�KXw�qG$-��iO<�D}��q�w��+v{]sss��3'.����O��?��-["M�H�$�;����g?��5�/�^x�p�Q�Fu�?
��`�C�� �zw��'�|r|���������Z�fML�:5�N���c�=6���UUU�a��X�re�����i����B�*M�8��������wy�����{����sNW�����
@�tY+"��k��^�z���_�����UD��e�����.:�����$I
�6,����)���r�!��o~3"">��������_iy&)���.
`EDL�2%F�W\qE��������Z��ii�F�>}�����n�!���v{�k������?�'��)]���8�����_��������x�������}477�tn������N�.� .������_w��P*��I��j5r��9rdDD466��������-[�D�~��C�P8�;G��5�@�tkkG555q�G���@O��J���@��r���2E��4���@�`���J�2E���V`dJ�������hhh��_~9��Y����-[���G�$��Ot��@�`dR��|����w��?��>���i$D:(m
`@����E���o�_�����{���������*j������9$� dJ��&O�w�}wD�N���V����=��aX�0�������x��yq��wF�$�$ITUU�
7�����c���EQ��<6o�+W��9s��u�](�3l��x������9�o��U#y����
@�tY��[n���4M�W�^����������GUUU;�_UU|p�y�����|'�.]W_}uDD,X� N?��x����j\ �ZX�@�tI���1�x��H�$�$��������:��=������n�3fD���~��7n\������<j	`�@�tI�����c�����<<v�W��^_������/������o��Sfz,�L�����K��������=��-���7�7��i�{���y��}���� [�$���{�EDD�$q��������{^�)hu����G>����


�4)�k��$)��]��OtIk��m��555�<�o���_W\�j����G?Zx�p��}��Q�2�KX���+���a�.�9���
��.]��=������[���=H���	`���� ��$�u���FDD����{����c�9������kw�����o�I�Chp@'M
��@&uI����+�^�rel��a�s�D��~��X�r�n����~6l���a��v��@>�<s�`dJ���|pa��/�t��^<X�m��������m�������I��@5jT�
�OK�l��VD������7���N��|����O|���={v�x�����({���={v\{��1b��x��w#M�H�$N?��8��C�jl G���?�@��������/�/~����������[o���Cd?���c������f���ZL�<�����UDDeee�z��]52�WX���G�����x���1b��6lX���FCC�N��v�i1c����H�$�$�4M��O�4*++��?�i|�S������i��`dJ������^xa��}�k_���>:����x��W��k�`}�3��;��#>���t��@^	`�C�� ��,�U�3�8#^z��x��7�������C�i|p�92�8��r����2)�VGuTu�Q����V"��)������, ���V��w�`�'�@O��{�, ���
�@�`�%��IX@~	`d��_-�D S���j	`�-X@~�����sPD�?,z���@	`���-,�L��K��WY'���@&	`���J�2E����"��Wk+I�;Ez�{��x��7��������GSSS���?�9��9rdTWW�{�n�v��x��g��7���������#�8"F�uuu���L��"-��1X�h��Yq��7�K/����kkkc��	��o~3����t���G��y����{��'&L�P�u���j�t�M1{��hnn���^�z���c���o���?~���R�iKD S*�=��j��-q�%���q�v�����aC���?�a����O>��v���q�I'�C=���UD��������O<1~��u���hX�T���8�����_����{�-:��W�8���b�����_���V�^��{n<����9j��>}zL�<9�m�Vt|���q��'�����o��-��������c��	`dR�r�?������,:v�W��7��
��"Y>�`L�<9�-[7n���������S �+��3����;�������\sM����G�����1bD��/�W_}u��7�p�����SN9%>��O�4��%��`d�V���]���w���r�-q�������q����>��8��Sc��%�|���>}zL�6��g=����l�)S��������??f��UUUE��t�I��c����������m�)S�E��K�����r������b��������S�N����rH���?/:���?��]�e3v�Gy$
��������v�_��������;���
��|���3gN��
�$���`����9�����c����"���qg�yf�v�i������������C���_��_��?��v�0`@L�8��}�����2E�


�z���������Gw���/��h=k��N���l��%}���c�]vY��m{�#�<MMM�6��
`���~�@�	`�����u�z��1�t���1c���������6[wi;��>��2dH��:thu�Q�����c��y�>#`d�V	^y������#;|��A�b����uSSS��?��&�>��DD�5����S	`�C�� ��J�`�����a�J����m��
���~��w��'�|2^z��X�til��}���?z�������/6m���-+:6x����h{����y��|�������w���\t���6F�]tQ����yp�����Y���ZXIR�9(RQ��k���t�_��������!�R�^�jU���;����N����
6���>��C�������{�����hI3u�g�@��.���
6�<�������iw�rx��wc���q��W�������������']��Z�*V�^]�5�-��{�a�?z'��)X�6�T]]]�}��iw��P]]c���s�=7�Gydt�A�e��X�jU<�����_�2~���D��p_D�q�QWW�^{m������U���3b��i����
`���{>�@��6o�\����*y�8�h�i��}�������[�5*���vz���2jkk������_�K<�����/})V�XQ8�����s�=7N8����c_?�����@&U�{��Euuu������=�l�������.�e�jWN=���;wn�����i7�pC�������������`Q[[[���ys�{l����=���G��~{\z���c���o�����}�C�����66n�XX��9t�g0q������K�f��Eq��v������"��AmCM7n�4M#)��!�������<����X�zuDD477���?����������j������iO��30`@0�S� GZX%<�@��(�����������[�BP�b���u�M1z���c.���mg^�|yI���g@���Cwt=����Oz��E��-[V�m�?��c�y��0x�������w{��>���u^>r*M?�+��)X%hk�?~I�/X���������h�u�����������$�>�h�����k�y��X�dIa]YY��
��������[����?��s��3��x��g��:S*��IX%8������?�������{�h}�gDmmm���/�~�������w{�������������X�ti���d��x��7
��}�����KJ!�@O�����*���#�����^�xq��;�C��u�]E�����9�^�7o^����E��<����_]]g�}v������C�j{�9��UUU��B���%�U�����0aB��i��E�����x��x���
��}������b��466��W^Yt���D~���^w��������X�zu���Z�*f����>�e�����M�:5jkk�y���������W�X_��W��M�4)�����O�$E���;���'M�+W���?���5k��.����wE��M���k����rJa�v������c����<���).���X�vm��i������:</����K�2E�D���q�������b���E�����5kV�92�,YR8>h������:}����q�����q���{�-����~���������D����-z��/�q��u�~��~{TT���>?�p�}����K/����/��g��g�.���W�v�m���>h	`�@��.����S�FCCCQ��'?�I���?�!C�D�~������u��]��O������������l��f��Y�fED���������_�~�u�����P���i�����/:|�SO=5n����:uj����s��O�A����c�����;��t�m����rJi�8�X�0�_}�uX{���"�������K�����o��/��5uuu1s��5jTw������c��TTT��W_�����������������WL�:5�o�^8�r��]��z��w�qGL�<�����J�2������������e��93����jjjb���1��=zt������4���/����;t���&M������Zr���UW]/��B�;6**v�����8�����_��{	`�C�� �z�{���E]]tQ,Z�(�{��X�bE455�A�{l�5*���K��������~5����FD���kc���t��X�zu466F�^����Q__���'���/y��>|x��=;��YO?�t,^�8���&�8��5jT���w����J|��!��I�<��8��#�=FDD���������zj�����>.���n�'tH��{vPQ��L�FDD"��)X@~��B S������I�=t��[�@&	`�%�@O�������5�@�`��$���`������, �ZX�@�`���
,�L��O����Y'��R��YX@>��J���e������O S��|J�?���, �v`%X�"������, ��2K��t��"��_��{�^���8, ���O��2E�',����i�V"��)X@>��
,�L��I�h��?�2, �R����/I�=t+_}d��Oi���* �"���@f	`��C+��, �v`�@�`�$�@O����, ��T ����K�rO��W'��S����@�`�$��YX@>��J�2E��Xd��O��$)�����_`����\J���IR�A�|��uX@>	`d��OX�%���@f	`���J��O�IDAT2G����#��[��{���)M?�+��9X@.�X�%���@f	`�$��YX@>��,�����%�@�`��$�����#�, �Z X�#��R*�@O������I ���|��,, �ZX�@�`����|J��&Iy�����{�, ��2K��T���Y'���@f	`�$��YX@>	`d��J��4���$I�<t���@�`���
,���r)��'��@�	`�$��YX@>	`d��O�,2G��$)��!��S�FDD"�@����'��SkD s��|����@�	`��
`d��OX�%��Sk����-I�=m`����`d��O-���, ����|��qX@.�X�%���@f	`����|J��&Iy�`'��=@^���������������)����sL�92����}��[�����_��_��C�_�>jkk���.�?�����?�g�XK+���}4k���������^������1a����7����]:�[o�3g��9s���O?�6m�������K.�$&M�GuTI��������^��s~�����s�����!-���i�����(���-[��%�\����m�*"b��
���8�
O>�d��r�)�����\sM��3���UD����w�yg|���;��#RO;�7X�%�������_�b�{��E�{���vX><���W�������s��g�}�����uk<��s�|���:;��8���c��aQUUU�~SSSL�2%���ot�\PN�=��?��w���~��������+��o�A�E���|0&O���-����7�������_�)���;�������3fL�|��QYYYxo��M���
7�K�.-�1cF{��{��2eJ�}��>���%�J&��YX%Z�vm|�;�):v�-����^[t���"��������SO�%K�DD����c���1m��N�m��Qq�M7��1c"��C{}���K.�$�������_��_
��x����/9>���t�a���Yg��O�=GE����v�m�~������O��S����C9$~�������k��������b������O��g����������f�������u���<�is@Y��;�<
�K����q�=����������g���vZa�~������:m����;vl��
4(��/������>�Yc@y	`d�V	b��������G�����_~y�z��Y�8���1��l��2M��%�����\I�=t�V	~��_���������S��;wn466v�l{���E����L�@'k	`�@�`���W^)Z�9���4(�ZX755����;i���b���u]]]�&���
`���� �z�{��������
+��a����%K��;���;c����SO��>����g����x��X�zu$Iuuu1p�����og�	���,���iS,[�������K����.���������9sf�����c���������+���������O|�1f����7�C���y�|�(���5k�D����QYY(i�C9�h�j��N�mo}����
6����q�y����o��S�*"���9^}�����;��#������i��}�:��y�$)���w��_����8��#)������v��N


1}���c7�pCx��]r�m��������3�<�>�h8�S�_�jU�^���k-Z��3�1X�%��AmcU���%���O�v��.�V��/}�K�}�����O>9���o������������#G��a����>���������^{-}�����~���~���^{-�?���7o�NA�}1c���6mZ��@��J��;���� ��:h���E������8�����6m������-[b��q���o����7~��_D�^�:���#��_�#F����|�#���|$�:���������.�Y�f������n��}�{��o�v�@�2����/�����MMM%��e��v��j���q�%�DCCC�X�^���{��#�<�������_����x���_�B��3f��+:|O(U*�@�����]�����E���7����M�����M�81f��YX'I?����������VTT������o�����>����?&O��)��8qb\|��%]�h�����;��@�	`uP�X���#M�HJ�u����v��J�]w]����?��}�{��K/��[��������b����c�=�X�������4��o	���=*�=������(v�u��X�jUI{�X��h�]���~�����~���M7����-�ou��g�.\�������,����Oz��E��-[V�m�?��c�y�=���;����+:6i���6mZ�������W�^��3��`d�V	�����_��,hw������_��-:v�e������.���TVV��n�Z�9�!ZX�@�`�`���E����_��;���%K
����6lX'M��x .���H[�2"��?�����@����[����?\�9�!Z������w�yE���(0���{�h}�gDmmm����Gy$���/�������������(���O?�t�z���e��A����'�U��#GF}}}a�x���;wn������������;s��y���E]MMM�cg�qF��93*++����m���_��;��3�4
PNX%����	&�6mZ����O<�D<��S�u��}c����>�/���~l���p��SN��z(���;�~���w��-*:�U0��?=��$���`�h���Q[[[X��7/n������b����W�Rtl��IQ__��}�$)�o����������q�9��������<�H����'?�I����-������M7�Tt��.�O<�����`dV�r���������>���������.�-[7�pC4(""�������I�&��e�
�4(����N���w����>;��][8VSS�\sM���%�w�Yg�����{.&N�'�pB�?>�9��8�����(:o�����O�w�O>�d�{uuu1}������`d��^�:uj444�����~����O��2dH���/�z��X�n]�u}������/:��N�g����r���c�����/y��K[�k�������j����M���;�����������X�dIl��u�����?�pq�{5tX�s0�=H�L��q������^����X8�}��X�x�.������3g��Q��k�n�m��x����x��?�����{����,���(��������/3g������������8qb��??F��m�u����1y��1bDTVV������8��s����g�}V�
��#�@O�����]��w]tQ\t�E�h��x���b�����tP{��1j�����.y�����=ztI���O����O:""���b����[o���+c����u����?�����}����O~2����e6`� ��I�<��8��#�=F�����N8!N8��r�;)��\��wvRQ���@f	`�$��YX@>	`d��O-�D��$-��1X@>��B s� g��:, ��4���@�`�$��YX@>	`d��OX�%��SK+��'I�=t��oX�#��S��{vC���5��$���`�$��YX@>	`d��OX�%��SK+��I�=t��J��4��o��w(_d��OX�%��R*��YX@>	`d��OX�%��SK+��'I�=t��J��4��o��w(_d��OX�%��R*��YX@>	`d��OX�%���=Hk��N�'�����%��$I����������%���=X@.�X�%���@f	`�$��YX@�	`d��OiZ�	����`?!��SK+I�2@[X@>��B����'��R*��YX@>	`d��OX�%���@�`��������?�X@>�@�$)� �%��SK+���|��uX@>	`d��K�@f	`�&��9X@>�i�'`7��|j
`%Iy�`'X@>��,�����%�X�D���8, ��2K��T ���|��, �����X@>�����s@7�`!���@f	`���J���|��uX@>��@�G��T ���|��, �����X@>�����s@w�`?!���@f	`���J���|��qX@>��B s��\J�2K�7,����)M�=�!��Sk+I�;t#�G�X@>	`d��O-�D s��|j	`�@�`�&��9X@>���2G���5�@�`���J����N��|��,, �ZX�@�`���
,z _d��o
 �#��S��{vC���5��$���`�$��Y��=@^���������������)����sL�92����6W����K/�+���V�����|�#q�	'��#"������]�<�L�������555q�G��Q�������"�@O��{��}4k���������^������1a����7�����6���[�?�A����]�X�b��|�����'��W^���{}�W_}5n����={v477��~�^�b���q��7��������`dVE��_m��%.���7n�n�W6l����1l��x��'�e���~;>��O��)Sv���X�|y\}�����|������� N:��x���v�����}{<��Cq��'��~������%��`��� ���Bsss|��_�{����x�^��������G�~���[�zu�{������v�l�V��3�8#^~����}�����;.�=�����.z��_�3�8#��YS���O��'O�m��8p`�x��1p������m�+��2~���t�'X�#��n���x����]q��l��X�xq������{������7=���97n���������e�M�0!�|������:����.��Y���z��??��Y��O/
a���q�e�u�>


q�5�=zt�����r��x��b����/��/���~������*�����@�i�'`7�J�v����w�St��[n����'1h�������7n\444���C��/_��O���{��x��G
����x��Gc��Iq�������_��_�?��?Eeee���?������k��)�}��������G}4F�Qt�I'��=�X�;�pl��m1e����}P��5��$���`����n�������~zL�:u��r�!�����������X�vm��v��7�����8���w{�g?���f����x�Gy$
�����������j��WUU��w�uuu�cO>�d��3g����&��YX%hnn�{���������H�����g���vZa�~������:u��^{-�������&�L�����������)�b���^�6��W�W����k'Nlw�TX�@�_�uX%hhh���W��~x�=�C�^~��E�Y�fu�d>�`�z�����o�=^��o��������7��-[��G-:v�e�uh���=��#�����k�dX�%�U�_���E�1c�D������S��;wn466v�lg�}v��m;����w{n��?�����!C:t��C��QGUX�_�>�����9`ot��_d�V	^y������#;|��A�b����uSSS��?�S�J�4~�����l�F�*Z��������e����^m��N���@�`�`��E�a���t}�������.]7n,�kjj��C���C��<��nll���~{��f�3����G�(?���iS,[�������K����.���v�O�s������������J[XIR�A��V�Y��O�EDeee0��=9�����U�:e���|��-y���������v"��Y��=��b��
E�<0�����iw���v�������������`��U�z����Y�hQ����-���X��W������M���+�u��{����{��jj���.y�>}����������^]���1#�M��){e�s�z,9��r��}U'F���=HRQ�	�}X�y���uUUU�{p�E�M�6��L��s�}�WW}=Im������r��_H*+�r���+�=
t������-��>����.Z755����-[��sou�l����q����WW}=���}��#�>�����������K�c��M�����s�����V�����`���q���t��E���/���'��AmCM7n�4M#I���������5[��tDGg����U�V�����30`@0�S��VE��_������n�Z���+V�;+��v������GGg��{u�g�?�:�O�>q���[�lYI{�=��c����"">�����~����h{��fk{��|��C�mcM���/������2dH�����nll��K�v���K��������<x�.���g�?�J0|���uCCC��}��wb��%�ueee6�S�J�$�?������g�)Z���$�.����`W�j����=�������[o���~���#M����v��c���8���������{���z��9�������s��)Z����=w���QSS����o��o�t��2d���d��x��7
��}�����;4cW��eK�z��Ee��?m�=m�>��*���#���>��Y�/��s��g���k�������?��N���.�o���������?��#[����������UWW��g�����
������6m�g��������sNTUU�������o�/����9���o��#:tnE��+1a���c��M�4M����'����z�����o�?�Sg;������O.�7l���v�����������>��Sb��a�^s��������X�zu���Z�*f����>@� �U��S�Fmmma=o�����[w{��+�+_�J��I�&E}��g������?�?$�
"�r�8�Y��pT�@���ZkU,v�p����T�u�*U+.((�,e# ��$�������
$�����y>�3����<�w�5������g���k���oL�o���4h�j������{�����>:��w�d=g��8���b�����_RR��w^��3'9��s�8����z���J$�L7�����[��k�M�����O�S�l�2""����_�~q�����)S��Z�l#G���
�������z����k���v�����o���k����v[�������kGD�������G���+����s�:��x��7�zFD�G}]�t�����X��]�����=��#96l�����+��>H�����G}���	���O��U�V�������n��qq���'�W_}5��n��5�3��`���=l:|��M�������6l���1u��d��K���+-'k����q����z�xNNN�i�&4h'N�����<^�V�x��w��X���5s���o��b������f�m"�H��	R��""��v����O�Y�fk=c�;��#����r�-[��-��2�O�3f�(��]w������>��7r���e�]��7�|;��s;��������6������{�t�~���L7�1����_|1N=��������0aB|�������4io��fZ�W�c�-��D��S��,Y#G��Q�F�����S0�B�W={��;��3rrrR��O���
+~�����s��+��	�ZG5k��g�}6^z������j���S'.���5jTt���Zzk��M|��gq���G��-W;�e��q�w��!C�U�V�t��W^C����>:��W};eggG���c��a����n��6��n`cw��'��'�����!C���i����$6l;��Sp�Q�f�
��H$���������g\u�U1l��1bD��5+""�7o�:u�=��c��U��S�x���c�����G��	b���Q�N��v�m����M���9��AV%�n��b����t�dgg��{�{��w����i�8�����`��������Z	��Z	��Z	��Z	��Z	��Z�f� }��5����.�6N������{�t�~���`���=l���D"�M����tl^`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�`P�r3�P��-[_�u|���1w��X�xq��[7�6m;v�:Dv�|<��,X�i���g�}C���>�,�����i�&M�\���w���w�O?�t�5��q��q�Yg�W\�Z����d%�D���
��w�uW2$�O����K�����z���������_?������g�Y������t�!��������w���47�|s��O*7����o�}��[7������������.���>;JJJ���������eg�����[7�-T������S���z�x��gb�����7�����c��11w�������~�����D".���?~|u��&J�A�z��k��q��W��/��&M����?�n�Bn���H$��m��1t�����G������_�~\v�e�����`�w�Qm=�i�J���DD�������8v�q���N��8p`t��-Y�i�&&M�T�����07n�����^x!N:���������W�^�z�-�����WI�l^��>6?�n�mt���\���f���)�W5j���������OL�g����������L7�*,,��?�8�M��f�����h��yt��!��c����J{��s���M�6�Z�j���u��������k�N�|XX���������o���?���W9�y��q����W_���[��
4H��,Y�v?+���������V';�
��n���q��'�����W~1k������b�v��?�|�{���Q�V�d=��7n\Z}}��g)����5k�Lk-��,��Y�fE�.]��_,���[o{��gt��)5j���?�]�v��>�h������/~����>}����D"w�qG��y����u�X�!eeeq�����a��c��5�>}���3b���1t�����/c�����G����[XX=z��9s����n�!j���������rK$�U�/**�.� �{����{�]t��^*��J�.X��F�n��u�6mb��I����o�?����g?�Y���/�7o��5eeeq����������o��_�xV�~����N�������;���rJ���.Q�n��?~|����3���i���:u�o��Vl���FXXPA��UXX�Z���s�FD��[n�|�M4n�x�kKKK�����GDD��uc�����a�5����/�7��M|��'i���E���o����#???�5���L7��'�x"~q����~����z�J��-�����u�����
��o�=j�����M�4�+��"�?�|�WT:X�o��f�����8��S+���C�����~���k]��K/E�����k��%K��q��9s��k��v���m��eee��DT�D"�q��a��~����N�:��I�d=z��5��������N����'�_q�1h���3gN�����Y����q�9�DnnnDD,^�8z����vZ���V�GX��L7���3g���s���Q�"++k��\q�����;����d��v��o�;��C��f���������������c��9s�DD���?����n�a������L7����R�i���7n\JhU~~~�������V��~����?�2v�����i���Y6{�����?���,++[������X�lY�>����}��i�y�!�������.]�?��z�	��n67�k�N�;t���_�k�Z�j�r����K��9��
�{�1�������
��+� �@T��M����D"=��*9k���)u�v�*�~����M[�� ;�
���E�Q�V�d=y��X�ti��U\\�R��V,��F�)uii�z������Q#8��d]XXC�����4i�RO�>�B��M��R7k�l�{X�GqDJ�����J�i��mJ����Wh�{���Ro�������L8����a������^�7�x���9��CR��}�FAAAZk����x������X�
4�k��&Y���E�=�_�~�g��aq�)����=zDv����g��=z�����5�;k��8��b�����F��1�S��`U��D"�M�����?�%K��1bD\u�U�z�-����zj�{�l�2:t���������c��7�|39����|��7��8 ���S��W_}���n������_DD��^���{n<��c)c���K�t�Mq��G��QPP/��B��/���������O�u������m��<y�z�q�Yg���?���,X�|8��c�����M�h��Q������������rs��2^�xqt��5�Z���5k���nu��������q�V��/��x��"++k��@��3�l�4h���N���������������o��!C���#b�����j�����S�N������_���cEEE1r��2dH�;���YYYq�W��O?-�
�J#2,777����;vl\p���y���i��m\p����o��I��:�Q�F���/F����{��Q�F�5��]�v�q���g���w�yyy�^�UV"�Hd�	��%�9rd�92f���������h��A�k�.:t�-[�\�3�,Y_|�E|��w1o��(,,��u�F�F�b��w��;Fnnn%]��@���tl^`P�`P�`P�`P�`P�`P�`P�`P�r3�d������>H��Z�����v�����:uj����K4l�0����l}��q���g�
�$����q�q��57��{���V��n2�U�V)�����m�]������q�����O�+����,6[���)�v�m;��s�������>k�]�}@9��V��V��V��n`sR�`A,|��(+,\�����/j��_5wU�`T��7�s��{��7��zXT��o�u;,r��������V�-U;X�d��?F�7�DDD�����f�2�Qfdg���E�DDD�.�l��W��M��Q�[�w�Y�����#"�v���#�r3�@uK����c�����S�/]�:�z����6;�}4��fF��s�����iF��P�2.�HD���Q�pa��UR?^{mDD4���hp�U~��r���Z��	��j�H$���,�D�[H�����������V����g�����^�g���K4������T�<�P��DEAAADIII�[X�����S�N��W/���999�n	�L9�Gv��U~^v������
���:T�����>}z,]�4������4.\.���z����[n)�r��FED�<
N=5��P��3�l�
c��)����^AAAL�<��o�*�H$�x�������!��P`A%[~�H$2�
@�(..�I�&Eqqq�[6Q�~�!��������v�t;T��L7��D"��O/~U�F��_�~��[7j��YYY�`��D�����%K��� 
S�n�l���9sf�n�:�]���Q�"""o�m#�f�wCu�����(�.]�2V�^��j���^�5jD��5�Q�FQRRS�N�������/��K�F�52�%�)*^���C�;��dg�����5j�~l�����M�6�����,X����M���|X�
XP�V��_���+`�������O�T�X���L7��D"%%%)cu���P7��~��1��d�t��H$�~`T�xq,������j?���o"""O�fCT��U�i��Q#�T���^�H$`�&j�i���~�2�@VV���c���Z	��J�H$������.;;��XYY�*���WYqq,��?""�v�)�rr�������kW��d�,��
����i�<�92���2����L7dV��AQ�sg�WTX��+�����)��,��%JKc��GDD-XT��L7���~��d��j;�t��([�0�����;V��l�`�b���������kx`d��d�l6?�`1��[""���{F^���vnV^^4���j;`���4iR�k�.Y�u�Y����g��4,]�4:v��G�������?.���wEeX�`A���7�z��5jT��;7JJJ��?��cq��gWkOYYY���t�\�����>n���d=`�����kv�cc�,��)((�m��&f�����Z{���
�K>�<
�{/"77�~�����M�[�*#6 �����W�n�m\p����0p��8��c����n`�0~��������������h��Q��������G��5�{�E����#c��11g��(**��
F���c�����m���ET�z�����^����#"��+��#�8"���2�l�N:)�

�����e�����_������g��7��������Q�F;�2�7.�w��/�t+VRR���!C��g�}�}�Y|��w�H$�s{��8���+��W_}5n������/V�x��u��������.�6mZ������j���{1l��(++[��6m��E]^xa4j��B�����,:w��|�I�x�.]b���i�q�%��]w���M�q���}��W]uU��
����=�s�d���:u����f�|�.�X/�n��%����.�����5����;b����u����G�;�2\{��)�W���[\p���]����K������h`�����4hP�1"JJJ������8�������^��E������?�|���Kq�A�u������'�&LH����'G�^����k<��cq�G��6�����������/�<z����~{\t�EQ�n��h6k�#GFD�<��=����i�0���A6�`0s��x����W\��>�7v.��^{-Y�o�>�5k��`Wk��#�$C�ZYYY�r�))��999��u�h��AL�81���1�<��x��wc���[�����j��4h-Z��
����c����H$�����q��G��O?��z�z\���<yr������.������w,\�0f����w_\+��K"�H`�>�������6]��n��������Q�V�8���3��b��aQRR���<��
*�*�H$�80��@�h��m������g���Znnn���W��}��)~u�E��)Sb��	���_���s��W^���['���'�\���}��7����9rd��??��C��������3���o���k'������g�_~���]��\p��h�����S��z�U�~�8�����_���(..^�=`s�l��(�??";;����t;�I�VTT?�p���/
6�\CT�o��6��y��3�	@�eee���o��~z�{�����GAAA�����v��9s���oN���[����-[&�������E|��'��m�����w�}�Z�����3�8#�������O��K/�:����Y����k��O?���'��.]����*~�+y�����������u�F��=�{���??���Y�����[�=`sV<rdDD�m�]d����n`�&2��_���g'�_��W���4����~���i�����s���o��6�z������c�������?i����(((H�tP\s�5����V[�#�<�2v�=���9sV�f�v����*�|����w�m�x���R�
���Kk����93~���'��n�)Z�n���-���{��y=�����'l�J������K��,����z*�s�F��[�n���TTT�Rgeee���9����a��UzFYYY������~����rHt��9Y�/����;��C��W+:��cS��""�z��
�����^���������+~�����^+��/~��y��!������`�	��*���H�l��<xp|��71w���_�~�j�*�v�
4X������|�M�;6���%%%��a�h��y������M�J���1�����Oc��1{��(++��
���n;v������c���!C�����#'''�7o���O���N�pk7k��x�����QG����������w�}��M�����v�m�[�nk��������>���GGAAA4j�(v�q�����z��h��9rd�3&���K�,�
D��Mc�=��v�a���%�J����(F��G���1/^����&M��������Kdgo�������!C���i�""b����=����^����1t��7n\��5+����Y�f��]�8��"??�R�Yn��91x���>}z����Q�n�8��#��uPZZ��I�&��3���4v�y�����Z��;6F�?��c,X� 7n-[��<07n�����3'>����6mZD���c�]w�}��7rrr�{��1|��5jT��5+����y����U�8���V�Z�zVYYY|��g1b���3gN��S'��r�8����E��zV&}��'���?&�m��&�v������;/>���d������_\�-F���c��Q�z��)�������x���#""777���T���q�7�|s�~��g�/�K����������2�	l�`T��F�n���u�]�_},]�4��������R� �����_��q��w�V[m��y_~�e<��s���o��#����6����_������������n�!n�����0`��-�����������/>���(--]�����{�~��q�9�D�F������~�����C�]��;��S�~��q�1�Th������r�+�k��{���4x����������+��v��q�����7�5k�Ly��� z��=�P,\����f��������w^�}~��������[o�C��e���vn�-���/��.�,����'����J�>��������j��-X� v�}��8qbr��[n�^�z�u��L�4)��k���W��}�������N���������7�x#>���(..^���5�s�9'����h��e����<u��%������m��<yrDD�i�&&M�?���z�����r]�����o���>z���4iR�t�M�������sW9�v��q�	'��7������Vw=�~�i�z����[o���KS��s�=��u�����/��;wn�z����SO�?����c���
�Z�hQ�u�]���+����������s�x����s�
�������W^o���*�#�7oW]uU\q������k\��_�g�uV<���i�UPP��~{<��c1}��U��Y�fq�q�M7�.������?�x�s�9�z�{@YYY<���q�m����_n]VVV���?�;��3��6do��FJ}�a�����|���/�:u�TZQ��h���c���q���&�+��":u������c�=�~������_]�DII}�e$�����Z��������6�6�����������9�����s���o��=�\y��k�������.�,�>&L��_~y<�����k��v�m����0f��8�������^��D"_|�E|���p�������>�g����O�5�=zt{��q��7��������������]�tY��/^���/��w�Y��������O<8����;?~|y����Z�����??�������{������^��~�!�������o��������{��y��6lX2d���q�w�5�\����?���0�C=4���?��kU�����S�Nk�[��y������G}4�}����6}���k��f����#�{��q����>�v�NDD������n����5�+,,���z*^x������^���q���?�!��me>|x}���
qZ��_=�;���5k������������.� x����M��O<�D\p�ky�5kV���3^�����_��a]}��q��'��������W_����?q�5���7��N�-\�0N8��x���V;'�HD�����?�W^y%?��u:kC1|���z���O{m��-�m���`����5j�Z?7*j��i)u�&M*������1cFDD�k��B�Y����x`����1l���={v4m������4��Kb���f������k�>�]�&O@�����I'��~��I�h��u������(�����7�|3�u����W\�\�z��e����A�X�lY����1u���9�F����;��#�y���y��0`@�p�	1��r�5k�,��r������s���I����l������~U�^�h��u��U+&O�?��c�����/���;�	'��N����~���a���:�H$��SOM	�j��e�l�2
c���QZZ�r���_}���Y�f��S�L������h��]4i�$���&LH9��{�����+N?��5���{�V�Z��U��W�^dee��9sb���)��i��E��]c�����N;�v�F����>tP,�_������8���b���[���z(^z��d��[�SO=U����TRRR. )///Z�j����5j��y�b�������X�`At��=�}����?l�|�����g������m�F�:ub����^�?�p$�x�����wiii�w�y�����cM�4����*���b��)8%%%q��������+����<���)�lyyy��m�h��AL�>���T��:uj�r�))AN[m�U�h�"


�������7.����������kG�6m�^�z1w���0aB���o��1s����������s�=��sN���:u�D��m#///�L�s�����A��)��?���*�T�o����/�����Y3��m�k�.w����-��?��C<Z����t�����{�gB���c����e������c�����
����e|��7��M�u���=ztJ��C�
����C2k�~���H$���>J�a�*������=�X�~����v��������s�dVYYY|��Gq���W�YP�D,��/""j�mY5jd��z�����;6�2��'����'GD�{�w�uWt��%�h��x��g��k�I�C�i���G���
�q����8����{����K�h��u�9s���_|1n���d�?��������^[���C�F�W]uUr�W��U�y�����c����&M�'�xbJ�U~~~��7��s�=�\ ��E���O?��^z)�y���_�J
'N������gq�M7E�n�"7����D"|�A\|��1f��������q���&�U�Y�f�����w�y�����'�H����#���?��G��3'�����������#�<�]vY\}��1e���Y�f���3.���h��Er���c��.�A�%�����8�����Z�����GqD{��q���6�l���)s


�_�~q��7���~?��v�i��_�1Dg������{������X�lY���#������_�\���O>�dl��k��t�h�"%���'��'�|2Y�y���|
��w��K�8������������������q�-��g�}?���q�1v���[��z_S�,X� .�����)��w��q��gG����s>���������O?M����7>��8��S����7��~U�F����K��.(��3~�����O���7L��g����~���Z�3w���}���[F������N�z��%�L�81%���\}��1k������.� ~������-Y�$%�1"������/�8%���c��+��28���{q�����#�D������ ""^{�����;R�V6e������rF�6m�O�>q���F����@"��O>�$���������������0u��8��3R���4i��v[�z��)��O?�4z�������3��{������>���nK
�~��q�5������|���8�y�����~.���>{���?��:_k&-Y��\�Z�V�*��������}�h�����
?}^q�i�_�xq\p�����O���������V�g""�*��J���F��?FV~~l3f�*������WGuT����������\pAt��-<���5kVD�P��?�1x����}��G��g���7_cM�4��.�(N9��8���b��a��_�5jT�0���C=4"�\ �6�l�|,]��vZ��7/Y�l�2�z��rA���[7;��8�����[o-��:�C,�>��x��G"'''��������k4(:u���6mZ���q�q�U�������J���o�^�-����;��+�,�x�&M���%K��c�=?��r�)1z���[�n������s�rk��o���c������GG�O��o���p�=��3��m��Yc������O?=N<��8����7��������[o�Gy�����3������^W��w^����)�
��SNI	����k���[����Y�f���b(N�O�G��]��O�����o�Yk(Z��5�����c�9&.���x��G""b������O��_\���@,�k��Q4(v�e�rs��������SNI�]_~��q��G�6��O>���{'��M�&��U�v�m����n���i��eee�l������c��i]��`��v�)���������k��^5s������g�}6~��_�{�V�Z)�������3�HSegg�?���8��sW�����g����{����k��������%�:��U^kD�W\�-J����k807n�2/+++8��4hP�q�������U�K.�$%��U�V�����}l����>� �>�����+��2�=��h��eZgN�0!����o��q����{<???�9���n���k�������������Y�f����={v2P.����}_Y�V[m�R/��T����W�^)cGq�j��U�����W�4i��sO���*;��cJ���l(

���Z?���+�Ldg�"��r�x�����_�h����'�x"e�����v��;�\�0�F����>�����������~]��������&����5�_��q����S����k���o�����V��Y������2����7�3��r���[o��{�r�)��ZQ���S~�������U�_-W�v�
?/���[k���j��O>�d4h� 9�<�kM�����'�H	&y��W��]v�e����)����nJ�����y���_�(;;;x���v�m�c�<o�����Z.'''�z��h��mrl�����3��v��7�����k��6�jE+������x��w������Q#^x��
�T����j��W���C�?���o�����_��C�)�%%%q����r���S��W_M�yyy���/��ZQvvv<��c��v���"����c��7�H9���^Z��Xvvv����L��*,,�|�Bg����]e���:w�'�tR�^�ti���{:gC�b�Y�O�1YYY��N�:k�s}�y��1d��d���7�|s�����R��������c��b��FDD���p'@u���������[���?<>��d�d��x��g+�����>��g�d��'�T��+���{S��={�~�.n���5�-w��'��_|�E��2u���z�-�\�������o\���-[��i��MZ7�sLJx��_~Y�F��q��q��G&�t������SO=����W^#F����g�y&���&k��a<������[I�gV^^^J0��_~K�,�`G�o����O<q��j��Y��_�w����GG�����)������=]s�5)���/����SN9e�a^U�v����W����������n�z��z+:���b��wO��{~�z��dYD�����o��Z�����n�!�~*��G�D"��{������:�����O�����){�I�Z����)���RW��SuX9��f����V�Zk�s]}�����?�1e�w��]���&%%%q�y�%���>8�>��J�mM�4iyyy�z����+4(""jw���N���i$>�&$�HD��0�mlr�j�����L��J5j��SO=5��g�uV�����z���q�EUjO������GD�-�t��8p`�����K.����k��A~��i�m��q�n�:�L�U"�`����n�����n��;��CZsw�e�������/~�����Y���u�F��mc��	�����k�.���i����f���u�!��^{m���;""������O��������G�6m�Tn�����l�����ob����`G���3�L{��'��\rI2g����x���S�N������)��~��
���I��s�=c��!�SPN�z��Q��*��G���Ok��#b������SOM+4pE?�����c�����gG��MS�|��G)����������/�N�:�x��
���>� �N'p��;,��z�����#"b�������F�������C�&M��uN�N�R��5����(�^1�)]���)ue��M�0!N8��X�lYr�S�Nq�-����M7��F������~����+]u��������X�pa$�
�;0��������r�!QXK'O����Z��Wm��%60�����!8��~���Z)eC��n�E�������k��z��5�9sf���1x������b��Y�p��r++,,�%K�D�Z���1]C�M	��}���E��~�r{��Gdgg�=�y��������*C�Jaw������i�]9he�=�����X.L{�������_��>�(F�3f����{Ve���i`ED\��1p��d����~?����� _|q�p�	i��I�����_�0`@�1"�L��x��H$k\;{��j��j��~�&�k�����;���1l��8���R��X��^{U����['����v��>��S��*CE����gE�G���+�l:4�snnn���j���:u��?�����Iqqq><Y��Q#<����gggG�n���'�L�
<8���<���7O�����:��Y3�^�=:]���k���f��Gyd�{�[l���J�����������oO����c���[��*�v��1o����)Xw��%Q�v�j;�MC��1��C#�����B�=���z���\ 3`d�.��R���[�����'��&O�������gG��=��'�����u�q���U�5~���z]�V*b������Bh��A]UemaFk�n@TD��X���</�/�n�!����ra%��?~�ssrr��g��N�:��9s""5Xe��v����{���NK�.����;n���(((X�=*��mhrrrb�w���]v�%�1q��rX�G�N�+�������X�pa4h�`�����M�6]���U�v������s��'���s��M��-[�f�J��l�M��B����N����?��W�������W�=:v����<Dqm*r�Y)��:>��B��_���*+_��{VDAAAy������&�4h���O�5TZZ��w^,]�4""v�u��������u���% "b�m�E$���C�W0a}d��F�K.�������������E�nc���R����I�&^��q�dVYY�j�W��]�v����~�z\����Y9e}�h��f��U�E�B�.�+Z�����f���q����_�^�T��z������c�=6e�N�:����op����,Y��w��������nuh��A��V�������
[�V�,X������W������U���h������Ui���zt�j���K��%�l�5+��:������VUXX��@�UY�x��LWQQQ{��1t���X�����7���;����w���#;;;���5j�X������`YYYU`
���d��X����3�D�
�[;���������S'�mP�VAJG����E��)))���:�\����o]�t�����V[mu���Z�j�N���'�~��
�UQ)��Wl�VpY����t�I���Z�j��u�:��[ou���Z�jEvvvr�O<O>��z��r0JDD�6m�]�v��ou���K��_5k�,�v�;v�V�ZE����V�Z��������oG�>}���*QY��+[U(��*++[����Y�����Y9�-//��{����WO�����������l�����i�������Z�ti��5+��b����6mZJ�.A�K�.��O>9�����W^y%8����Y�dI\w�u����/�}�������?����_�@16\�}6~���H���4�Bb������s�����*' �
+�f�`�UG=��C����&�-��"��8��#�����>Z���E�z�R�U��l�Z�j�R��1#C�T�~������W/|�����GJ������{�u������/,7>j����������[��������_��W��Q�F�q�q�%��5(h���U�^�������k����������]���-Z�X������n����s�=�k��w�9�^9�q]��W�V����U�����kV������U+Z�n�'ON�M�2�BXS�LI�w�q�
�PVVg�yf��?�I�����3�<�~x��*..�%K�$�x x��
������7o^���U�={v���$���[W�|6L{,�����ss��u�U�y�fK@���=��k�����9;;;���_n�s�=�R�����������W������f���s7m��M������4REV�~�����GZk��\�ti�z���
������zh{���|FUz��"�H$�n�!~�������^��a���t���Q�F�k����R�*0�i��)��{���7_�>75M�6M���k�zh��Q�n��Q�F,]�4""�O�^�=�e��4j�(�^�~J����+�I�w�1%k��Q���{��~�����KW"��.� ��*+++y��8����gC���b��l����*""���/�w�����i� r�;I����o���B�'O�����M����J�SVV��y����S��W#G��PO�j���O��Z-�n(v�m��z�����j<8�s�&M���ON{������R���;�E]_|qr��s�������[o���T�����������^[]���PZZc���]+�����:�n��]�9����	&$�q��	�Z�����q����:��#""���i���V[m������WzO[n�e���EIIIDD�3&JJJ"///�=�_�rm����75�:u����'�O>�$�:������1#&M���k��:tH��+��"}�������/�>�������3&�^�{�e3gF���YYQ��C"�v�L�Pi`d��_s������5��>H���g�rs�����-K����O��o��6�M��������:�H��v�=����kGaaaDD|�����?D�-��cc��y��z�����������m�f����y���������-\�0�
�Ng����q�=�$�:u����?����?�0�y�����5r��������v_�e���Y�f�(�d����r��>� ������������s�=�����[���{������������Dt��-�~�����k���s��g�����_=.������5*��_�=�������C��������������Nk}"������������&�{��q���'�w�}7�D�`�Uy���S�n��E��u�:���s���M���[�7��MZ�W�n����;�Tx��o�}��I����[�u�]��N��!�{��W��`�S��W�������MN���P��.]�=�\�������]�t)7g�����������������V�<�*5j��C9$Y/[����o�:w���y�����w�e�����}X�{����gU��3f��g��r������{���b���K>6h������*|NU[���_�~�0�M�O<����_~9-Z����s�r�OGqDJ��o�X�t��7���g�}RB����5jT��s�����=�P�����������~�[�3���O{�;��S�NM�[n�e������&i�����M�&�	&�[�G}4�>����Z��O����w�X�^��W�^i�_����8��C+��C�)�4j�������r�W�����8`��	�
C����w�-��T>X���{GAA�Z����?���d]�V����G�yM�4I	K<xp,[�l��>��T�7N�'N�X���_~yJ}�w��_]�=6f�~xJ=h��uR�Z�h��y���1�����6mZ�p�
>���,N?������c��~z�}����^�z��s�E^^^r�w���s���6o�����-ZW^yeU����y����k�WTT�]w]��������{��gt��-YO�:5���?�_���5j��~��d�H$��/����#�<2��z�d=|�����{�����?��}�Vj/+:���"+++Y?���)�B�SZZ={�L;���+��MMvvv��tD�
7�P.�se���^|�����^�zq��'����~����7��M�r�-�7��*--��?�8Y������Y�v@e�l�`lf����z�F��g�yf��Yg�
6,77'''~������]w���q���q�W���6m�D��u��{�����K{�!��;wN����q�G��5w��>|x��mh�8�����I��`7�k���O�\RR�z�Z���1�w��VP��z�����m��v��������{�m����KKK���N�9s�T��������g�(++[�����8��b��	U�ZF�����o��f�������~���������i����57�tSdg����;��#n���������������:>�����l,.����b�-��G}���/c��i��x��������G]��999q�����]}��q����������F������4%��2�����{�d]VV'�xb|����]�H$�����#F$����]tQ�������kR�G|��q����v��i����]~����i�5���3��%�\�2v�9��}���]ox����X�pa�>���3�
���X5`� X��M���x��7c����>� %�c������#��g��5kVr|�-��[n�e������W�����R����={v�u�]��^{��)S"+++��o�v����q�!�$����������~{���k������YU8�SO=�7N���O�}��'����3fL���/�w�y'.���h��M����i����b�-���N�o��f�C�6T+��=�P�u�Y1y�������x��Gc��vK�����Ni������7�����������z���r��~��8������i���s�I���v�g��3���q�1���Q�R��K/�;v�w�y'"*��m�6l����y���������R�]"">������s���K)���{�j�p@�|��)c�]w]������s���}���4F�}����?<��kw�yg,^�x=�r���A�x���F���~����;�w�uWL�2e���N�/��R�q���e�����c����=�����C=4Y'����+�c��q�-��+�����������?<;���?~��];�8���������O	��<yr����������{�����k�x���S�����h��e��Xf��Q�3|u���F�Z�����5���i����kS�z���\rIL�>=9VVV���j����1i���x��-��+�\����n�u�Y)a�;��c�r�)��{����U�6l�����x���R�5���H,]%��w����MPn����y��1x��x��wb��a��k�h��I�i�&���b����d���5�����SOE�F�V��9��>�`2P(�H�]w���sOl�����a��3gNL�81JKK��z����M��c��}
W\qE���/���������U�0`@t��5e�u����+�����������}�������;�y�����[F^^^��3'&M��b�����~�0�7o^0 ~���g�������<�:��x��7�cO<�D<����6�D�f�b���1q��())I�9���b����n�a�g��;7N;���{���n�=��s�k����_��Wt��1�����'������o�.�Z�v�q��������{r��7��7�|3Z�j[n�e,Z�(&M�����9tP��W��_����h��5h� n���8��3��� ~�����W_�l�M��];�N�Z.�/��P�=z�u�?��1k�����{�c��
�=zDvvv�n�:�4i?���1#����u��9�x��8��s�F��M����*�����r�-�y�����,�Y�f�28lm^|��8��CSB���������W9?'''��9rd�xnn���f������z*N<��(..����"�;����o~����Z�j��<��s���.��~2���i����'������&N�m��]��k��&>���x����c>�`���7��i
4��'&�#,W�V�x��R�V���>�e�����3&�8��5�[�.]����+�������N����{�;���n6M�D"��zj~�A�ZZ�����W/j�iS}�T��L7������_|1<�����9s��/��Q�F���W�^���Kq����q�5j�k���o�}�xYYY�;6����K	����{���5t��%����F�5*�v�=>����i���=6k��1bD|���1a��M*�*"���N��M�&�'�|2��T���~:��g�r�&L�!C����cS��N=��x�������s�����>Y}��q�W�u]��M���������*��g����/�>�*�s�=��{�r�S�N��>�,F�����[�x���*5hC��_�*���YYYQ\\�G��a���6��o��i���w�����r�9eee1i��6lX6,������z���5xgcv����G}�� �3f��#���>��c��2�*'''Z�l��36l���n�u�Yk��i�������I'��-Jy�A�k]_G}t���?�7o�2�d��5j�*��������W<�������`�w�SO=5e���4&L�_~�e���&M���o�p@5v�aZ��q�K.�$��l�J��.
^x!Jg���?�gGDD����l11���;��A����������������8���c��Q��Y���[������o�f��������F�������J�T�e�]�G�����/q��G��-�v����C����_���>������������<�@\y�������f��q��&��_~�\����a��1h�����������w�9�y��x��g#///���������_�n��e<���i���k�����������SO-��	yyy��k��=��-Z�X���m���������&�t�UW��V����������Gy$%�,g�yfL�4)n���U=��Q�F��_�2�x������S�N:oc���{��Q���'��}��7rrr�8????>�����;c���q�����
���?��y\~����.�D�F�"777�7o|p�s�=1~�������sS����������^{���j���||���q�-�Tz���5k���>/���_Wu���K.�$F�]�v���6d�<�H�����G�=2�
��k���Qs����W_U��m��&�z��_=@��J$�L7�0r���e�]��7�|;���:��l������R���~����]�=�4
80�u��������������e���O?����:����������:�u��^7�-�?�0��,�Z�jE�V�b�}����[��U��3g���~3g��9s�Dnnn4j�(��~�����&�3s���f�m���0""�������+2�U�***�O?�4F��������h��e����im��-[��y|��W1g������-ZD�N��c���n�R�m�6&O�m���I�&�<>n��<xpL�6-���b�-��=��c�>�W6m������c��Y1g����������V[m;��Sl������,X� ��O���g���K�^�z��y��q��}��k\�,{��W6,"~
�+((H;<o]
><F��f�����h��Y�j�*<���]�v���97n\2$�M�%%%��a��i������{lcQPP�Z��DD�M7����*����q�%1�����W�w���v6����_�l`rss�s����s�J��n��q��GV��Um�-����?>�mT�-��".������ODD�{��q�e�mR�5k��n�����v�����~��~����V2n��������J��j��b�����36f
4��?<�=��=;����d��n�Uy�UDD�N��S�NU~?��������N�_5i�$.���w��Z2xpDD��w�w����t�Oz��������)S����>���6<>�`,]�4Yp��2���8����d}�5�D�z�2��&���0���*""j��g�`�!6M�6����.Y�p�
)!/��D"Q��#F��[n�%e��s����`������i�""b�m�������`�U4lXDii��l�[o��v6��n��]vY<��#1z��?~|���7.���L�P%�~��x�����+���;�q��/���~%�>���m����M������}���������^��,<�T���S�g/������������U��l�`��F�1j��L�P-�-[O>�d<�����C�8����c����y������s���_o��F�92em�z���G�P��Y����Y�fe�
�j��_������j��_F����2n��Qi6h� ^~��h��]wl(���Q���F�6�~~N�F������\�M�, #�6m���Q\\�������q����N;�T����1cb���F����/��-Zd�%`��E%�`v�;�4��;������j	�2�{��1k�����|��G��W_���c��9�d���]�v4n�8��m]�t�c�9&��k�L�
DDb��(;6"��������Q����_�l����t��5`P��v��j����4iR�[ ���'�tR�t�I�n��������j=��9�T�y@��,���u�E�xhf{���5�T=X@�eeQ8`@DD�4m��]�g��c��w��U~�?��A��.�f�6���-�2%EE������Cd��d�%6BU�l2J��������~������X��V2vlDD��o��N�
I"������V<fLD�`���V2vlDD���c�;6(�L7��F���X���g�6f����.\��O���<X�
��oVVF�`#"HK���FDD�[DN���m��Zn��3���b���f����&EDD~�����ee�6�`#�t���q���n#""�;v�t��&�������@��_FDD�V[E��/�XY�jE�_�*c��i�����#"�v�.����l3+I$~�oVVf�`������+�_V��w�l#P	`�F ���SF��� 6p��t�������1���B"�
���������������f�2�
�?X��+><""jv���>�*+�
����t�1(=:�qD���[�g�GDD�,6� 
�z(�M��������Gf�|�5H$~�oVVf�`�!�"�HD���[>�h�����{�n�0r�4��s�*���(6,�M�Yu�D�="�V�L��a��tl,�3�l�
^y%""�u��+�UId�66��n����_�x�Z�Z��Q����<��	�`������9����{��8���3�P%�
c���F������i�$�uT���1I$~�oVf�`#"������#QR�-[����R-g��f���_�Z��M�,6:�FDD���Z?�Yf���ee�6��n*j��Q�k��6�XlT�
c��!Q[�%++�����tl��D��R,�1���\:yr������U��f�j;��K$2�X��?�<�����6mZdgg���n��u�
�q]QQQ|��G1z��(((�F���;��;w���u{�_�hQ�92��s���%K�D�
�i����{�;��N����� ����;vl��??����v����Q�h��mt��!��b��>g}L�2%�3g��y��E�
�E�q�D�-*�����<xpL�4)f��������;G���+�X_����N>9#g���5���2r6�~`d����[�n���������>JKK������?����r�j���^zi�x��Q�f���


�w����C�����m��Y�z��q�y������~�>�l���[1t��X�l�j��h�".��������Q�Fi���_|�{��7�x#JJJ�8�]�vq��G��_:tH�O�4)��k��5��sN�s�9��s�����m��>^RR>�`���7F���9YYY���{�����8��c�x
�]��q�
7$�D��]c���q����SO=?��C���;
�`�S���Qc����^{U��Y�jE�^���<�"����%$M�������:�:����M�n�RJ���C)�-EAT�}~#�eTgdE�t��Q�QveS@�(��l(��e�B��m���@4���M�����u�z�����?�[�����O466�]�zWn���5�ijj�W�������
7��!C�$I��q��-�z����}(>�`�����5���^���:������|����w���\q��<yr��������~��������9s��[��VF��.�������������3g�Z���������G���:*?��O������f�������y��g�72T\���I��>���:�����,zE�\�_�����1#���O�l����4iR��{��Jj�`m��r����u+�7n\������<��#Y�jU�{��~{N=��|�������3u��<���I�R�����>�F���E���Ot�u��g�}���'���<---��7d��l���6lXJ�R-Z���z�[y��y�r������sv�e��~�����r�j���
����.


inn��/���s��\.����s�5�����Ksss���
���o�#Fd��e�={vV�\����S����nK]]]��=��39����~M����:c���������@��R��I�
N@�^��P5CO)��������;���r��w���s�/_����	���O����=���7r��g��y����6����N�'?�����V8!?���~��9��s�H-Z�(������o��������_��_r��g����N]]]�:��|�����c��=��#��G>�?��]��8��{��k�5Y]]�����y�;���S�f��������g�������s�����GM�455��N�_���5����������v��c��9�����������{��o~��\v�e�:o���]�a7�xc����t�w��g���_����?W/{���^U~u�������a����j������~�s�=7/��B�������>��\r�%k��Jg�yf�������|�#����/�{����onn��w�����:V�H���'I�`�@V?u��w���.�����<���E�Y�g�y&G}t�������;wn�8�����?�UW]�����B	a�x����_�jN?��W�?j�����W������?IR.�s�q�e��Y:th~������~��;��S~���f�}���Y��$�?�|��������\m�7���y���3a����6lXN<��s�19��c����&I2c��\��9��#V���~������]��N:)�����9S�N���S�o��o�;wn�����2m��$y�{���k�{=�r����}��V~u�y���s�]m���a���8o{��2e��<��cI�K/�4��G��7��Gs_x�������?�i�������!C��������I����cS3fL�q������=���+�����_��??S�LyU���!C��n�e�]vI]]]������L�2%.�dT0�;����_��.� UU����B��}�k�-�zY}}}�=��n�~����q���o���W���.?���2b���{/u����>�m��O|���
��'�x���������v�?����s���j�����[o�_��W���\t�E�4��3�Xm��W�3g&I�&M*8	0�(���Zt��|��y�����uuu�����p��<���y����p��|�k_�V���c���SN)"��Q.'��~���r����kW*�r������q��e�}��vo��	=�uu�QGu+gze����|��s�Gt��O��������������eC\|��]���������=~v�=���G�������j��=[__�s�9����?hQ������v��
����L�<9���o&O��9s�d��)�e��������k][[�n�!�rH�}


���>����;o~������$���kr�-��1�g+[�o����O���):�������q�{�w��w��w���~��������|n����n����O$I�~�����o�}��y��e���b�-^�o��q���]vY��{�^���-Z�����#��f�m�Ng~�����+�$+V��}�������y��������[`H�:kV}�+)��V|v�-�$I+�����/�(�DV?u�QG�����;�����n���3��T��=��n�O���*��{������>;\pA������w��ga�y������F���^���Q�Fu`-[��G�,Y�$����r�wd���y����l��455���.\m���SS]]�U�V%I�������%g�qF&N�������q�)w�i*=*�z����w[��5�G������<�d��gg�5��a������~j�v(:�j=��������


9��3_����:+_�������$�>}zf���]v����T5u�'o*:������k����5�����g��������1��w^���o�u=���,Y����n�mN9�����w��K.�$�\rI���7f��i9��C��~�e��7_���c��Y��g�uV�:��
:��_������~���iZ�|yo�1I2�s�K����0x�]2�u���\��r��T*6�,��UW]�m}���f��a����a�����7?����]y��
�V�TJj���J��[���
yvM.\��S�����s�V���o~3�?�|�yE������{��7^xaJ�R&M��#�8"'�xbv�m�
��Z-Z��g.]��G�������5^}�����a����R�:UE``������?��?��7�����k���L@�{�{�����m��6'�tR���/���.��W^�n�!7�tS��|�=�QWW����*?��O��^{�vO�\��3������}��s��Gf��������%Kz������������l�����I�a�~��+��wD����\.�����v�����x`����3S.�������:��zk�z��a���Kr�����j��������iV�T������?>?�pn����z�����;�p��W�������?�!�]w]>��u���������vZ����o��'N���x��������*2k���&I���]�kT.:�,z����JSSS����!������&LH}}}����y��g������g?����w����?�G������=w�]w�����SO=5�r9��_s��7���/�w���o���y�{���<C�]�y�3z��n����*��M��l�Zy$��|rEg�l�u���M�	��`�c�<�H����n��gl�����y��G`A?��?�����Q�r�������z�W2�J����.�e�]r������o�����,\�0I2����G?��?��^��������z����z>��[nI��q�{�{�~`��aG�RUU����(�;��bc0�(�������m��6���[o�u��W�	��^�z����.���=zn��e���{�$���/�����>�u��;�XmV�+>1/�����2eJ�����uL
�������$�O8![|�����`�c+V���nhhX�3^��+�\_����������g��l���}aT[[[�����������E�$���m�p����{��3MMM=����[g��w��>�$y�������6Gq�:�`ST.��
����
N)��B=�������u>c��!k=s}}����y���+g��n����3gN������%K2r���>3o��>�5�����6�l��6�|�n��?��:��3��~�k}�i�����#��6=��gg�s��4hP���ME�����������m=h��u>c���������	�}p@������s�9k��`��y��Y�dI�g�{�������r���/��������{��������[���W_����g;����������#����>��3���������{����jU��������'I����T
R�G�������������m��hmm]��@�N:�����?�Z_z��ijj�����	&t�_�|y~��_�_��_����'Iv�e���5�5g<�����r������~w�>��L�<9�F������#��O�y����o���~}}}N8����=f��L�4)3g�L�<��c�����| ;����~�9����������~����Mo���K�$w�uWv�}�����KN<����������/��{��5�\�+��",�?������o,����{�{Rni��������������R��
����C�v[��������z����'>�������������w��W�������������7������0?��3q��l��Y�dI�������N��_���w�y=�5��\z�����K�$[m�UF�����466f��9Y�b����������[����O?='�tR���{��������s���v�m���N;��+��"�sL/^�$Y�xq�?�����=zt������,[�,.��z�q��������_���3��c+>`�Q�E�������q��x�3�U�5f���3�W�����y�[��������'�x"O<������}������������}�����s����!C���_�z>������|�y�����|%���A���)Sr�=������=������f���k}�T*e�m�]��l���3�$�~��}�[+6�4dH���<�7^�x(��D=�����s������[��@�0r���������|������KW�o��v�g?�����t��������u�]�;��#/���Z�o���9��c��O:&L���/�0'�xb~�����c}��,[�,-�����;�����5�\��/�8w�qG��������:���o�8���x���8qb�g�{�mmi�5+IR����9��@�J�\.�_{������)S�t�'L��'�|���>����~����


Y�b�:����������SO=�����Z�u��Ce��w�Z?����m������+W����v���}jj��1����������Y��x��4(����������;���9s���G�SO=��K����-C��[l�=��#���k�������?���y��g�h��477g���=ztv�i����.ihh(:&@���0����9{����#���/�T*	6z3~���k���&G]Pt*eCz||�*=6a��2$���I����<��S�0aB�������_544d�m����@������)S��������[�^U__��S����2sf��n�=�_@���E'`��*:G�T��{�������{���w��m��O��/`
�4��$��,���G�m}�M7���W�=���z%����
��`@����@QSt�w��9��s�����/��o~3C�]�s��/�/��n��>��>�@�:Z[����)�����R��=���lzF�d�=�����s�=�$IV�X��������������?�#���]����/���k�f�8s���4�xcq��2x���������R�1@`m�J���[�r�-9��C�������#�8�k��/9��M�!������v[.���n�.����@�����]�W5�lSH�����!C
�
�kS����y��inn~���3gv[������o^��������������������/}��������-����������O�466�����s�9����������m9���z5�����J���l7}z�i�J*��N�@��;����SO���^x!o~��W��?����?��d��������3gN����N;-��sN&N��r��'�x"---���a��$���+�L�{�;�TP��4
�X/[n�en���}���9sf�����<��C�}f�����W_�-���R1xIGkk�MM}?g��4���I��
�XX��	&������_�o|�y��gW�o��q9���r���f��AN	@����7��"X/��������\tX���O>��3��
�]c��A9���r�g��{����33��$��1c��^{e���NUUUo�`=,���+Z~���l~��������^QUU���'g���EG��n�5I2��K3��S�~`��R�J���_��J��`��E��u45��OJ�4L��Rmm�� �*:�w���+ioO�6��v�����R�(`�F���[�$
S��T�H��r�hj���}�W.�]�:::^u�_t��k�>=K����W�����nK��zh�f�kQ������U�V�Z�������U�����}�����TZ�������R?uj����r��Z*���C��R�����n��������Sl����n�����|�	�Ky�����d��?��#*6{���g�v�Ul�X���l���������f��`�,_���z���%������RniI��>�?��������{�/]K��`��a�E��
��njjJ[[[Ai6��+���������J_���'I����+6y�D�������\.��g����+J�~V�X��s�v�W]]��������2sf��n������R�0j�����6,��/�������<������S[[�*m�@?����U�V���1��/OKK����1"��/;��z�k�,`#T.���F�����*mmmimm������%K�d��%������1c��Z���'I�����$P��������:�n�mjj������g��q)�JEG�k��/f���I��
����oG��4�@���������/�����8����:#F���1c�_�Q)����SNI��Y�����$��~�T^���_)��>2x���?>���Y�ti�.]����������QMMM��������^��7��e�]V���C)d.@���DzJ������=:�G�N�\N�\NGGG���)�J���Rx�&a��W&I�sLF�rJ������+7�����0�(��
*�J]�TT^��#���&I2�#���/8l�����h������R5|x=��8��K�R�)@j����}�����o���\��-3f$I�qDJ�Ul.��,
��_���}�������B�l����0�(��M��]�d�)��v�m*6�f��{�{*6x5XT\��9i����&c���T
Zt$zA�Tt�����i���$��}�U~� XT\���$��2��$@j�@�V.\���������
��N��\�H��k�� 
�6a���<��>i����.
�!��_��@�`l���x�����:�w���������2��3��r��T*6�,�MX�}�%I����l�=�6UE�8-3f$�,��X�����K��
T.:�,�M�,�
�6Q+�>��>����=�,:X��k�ThX�����K��q�T�����������3���O��������$uoxC�f��*�t-��D@?����N���2����
�l�`����2I����!P��U���n��+6��[�Tt
Xk�5+m�<���A����L���EG�uR.���������W^�$�?�0�W�&�����������~7������{�I�{�;+6zU��4
�^R.���?�s��z���K�g�;�Q��EP������,�����o;���������;�b��7�_~Q*2�,��4�|s�������>Tp��W��������M+8	L�R�	(`$)�Z����>�,Xg��0������r}�Ki{�����X�"��j�����O��l�`�N���Yp����n8���j|+6���K�R�)@|��;-�K�d��{f���_���A�2��c+6`S��wZf�L�}�;2��3N�T�Tt����R��I��I��
�H�\tX@�R^�2�>�D��J���=�h���)54�v����D��4
��~�e��$I��{�T�[�6F>�����
�O�Tp���/]K�Bc0������3��|r�����j��$I�^{U|6��x�E_�j�g�..@MM��L)n>�~JE`�P�t�������O�ls���~��g�;65[nY���z*��F�����6����N���G�R�Tt$62UE�����u�d�1�(�z�\������):�v�r9��tRo��"�V-X�$~�1���G�s�s�d�e�Ut��]wM����	`��0�(��~���;�$u{�����+2s��_�RUUEf��Q��\�KX����I�
N���0P�\�~�����*8	�����������m��$��(8
�����@R^�*Y��b�����$��]vI�����N���R��
�������<��7�c�����?������RUt(������_�
������\��*�_zQ*4HM�`�h�93I���g�?X�����T��Ul�5X�C-/`
�o�T�Yl�~�Tt����@�����������c����/��0�(��h�93I2���OU}}�i``S�=�2cF��n��
������@�z�u��$��I�
N_M�`]��??Mw��������?&I����b3��?=+���������#�L�=�2{��I�����,����,���������CM��q�	0����@��e�UW%I���2�w�+8
I�r�h���b��W&I�������_M��V.\���?_�y�����;�$��>�bsX�r��Z*6�,�K�����]wM��������;���W|.�;`�^V\sM�mm)
����+6�4hPF�}v���JE`�P��zi���$����Qg�Up` �*:Oy��4�v[��~�����,�Y���X�4U����
o(:+�;��R�98`���n�%IR�!)���h|5`�[q�
Y������V���s�&I��L��L���K�R�)@`p/^tQZ�������3�mo��\`�S�0��������${�����]�����N��P*:�,�l���g��IUUF|����/:��r��4UE`�����$������������3�$u{�UhzW��d����E'��g�������`k�93I2x�������6��?E�Xw���N�@�`k�1#IR��^���w5-����%��
�f���C���^t

X���5�O>Y������=�h�d��I�@�io��n�������,�
P�����'���
�P=fLj��-l>�o�KX�u�����`��{og�UUU�F����RUU6��'S*�*>����r��bs@_Q���_qE�d�1�d�_���4l,^.��\l�+
�6��+�L�{���
@��}{2�{I��bs,}��Z;���W`�r[[���}>�m��������f�������{3~�,�]t���||�	�o(�6*�7��g�<2�����l�:5�#FTl}�eY����&[�Vl���`��R�lT���G-�Jmm6���+7�>������^��{6j
���F�\N�-�$I����4L���3K��)
��s6v_�<���S$+t^���6v
���F��9Y��3Imm�NMUCC����U�I��b3����%����xY��d���S��M��h���$��}�U~������O��/:I��A�a�/)���������f���,`��x��I��C-4�@�����_UU�%�d��'{Yp�"`}b�UWe��~��������$
S�Tl&��hZ�\���qQ�9��;�[���pi�Y�M�,�����<���d����]5th����������<���S��V����(�z�����,�����_�ZR*Ul��HU}}���������{&}��,U5�����lz`������$�v�1��zj�i���������6{�UE6>-3g&I�&M*8	@����y�Rl��(�z]�KX�����$�S{s�uP}�9�RSt`��z��I���&�`��mr�W�Um���R�|��T��t�����M��)���Go)����&�z�b3������m��d��Tm�Yj����8@�5%3~��,/:I���H����%��.&C��dP}1���6B--y��������j��$I��I)�J�����On�����r��~��Slz`�Fh���f�W����C��\����-^�����,�4z�d�m�N�iR���W^�$��d��'W|~i���<��s�����y�n������M�,��������k�$#?���x`��������:���l:������nK����3&C����8��U�5��l:j����;���_�Z���}>�����$��>:���>���'�'�nL�����w�����s�t)��
��9i�����~���l��}=Y�\q���)n6�X��:ZZ�r��I�1]���#�|f��qi�6���@_[�B�����Q�H�������&�u���0*��Oeg��R�}���{SnkK��1��S�J�T*:w}?����ST^UM���I���$�w`@k���$I�A)��u������AIUu�Y*i��(�`���X�KXC:��$0��7w^���d�C��2�����i���$I�,X'mM��A���z_M��R�y����r�=���jU:/N��>u{�U���1ho���)6��`��h}��,����=��oM��������'/>]��-�;��`�FG�����O�~�2�����������
�����%��	+�*����f}C���H��o��tP�i``X2����T��W��cwM����\�o)�`��r��I��=�,8	���2y�OE��{�K;��'&'}��,��C����
�+�`u�Ln�VR^Ut���bb�	���,6	�^|1+��K��}���0��5����-�$��b�����d���NlL`�Ihy��$I����z����0��5w^�k���^l��h#��N����$���'`c���y��/6�@USt6��>�y�����+>{�K3��G�g��ik��Rl��J����N���fh8��B��;Z�'�}!i\X�����b�t
���r���\�$����3��*��z���~�������+y�OE�H6_t��I�6kV��x"�A�2���)UC�	`����d�3E����3:��M&_L�Ru��n���`
0�?�x������;7mmm�l�����;��H]]]a��,Y�{��'s����%K����#Fd�m�����3v�������k�I��O���
����H�b����$�7v�d���S��`
W^ye���/�/��j�:thN>��|�������+�����u���o��[oM�\^��7��
���>�SN9%55�gEk���,��������|�k�QGUl&��b���WU����NS9��]�Rt
��&�~���5��O�����k��b��|�[�����\~��9��C�4��E�r�I'�7��M���w�}��G?��~�����~����u}�X�g����=�X��Jv������kk���*����=������q������������?>#F���9s�t����,X�#�8"7�|s���>��l��~����_������b�l���)�J�7o^���n��{���2eJn���l��v}�X��9s:��jj2����R�b����7���Wl�������
����R���}�+_yU���>���{��7n\�������*��vZ�~��$ISSS�=��<���1bD����g>����w������7��
����5+_�����������s���|$7�xc�g^[��7'I���_�|����8u�J�IV�����;��`0@(���-Z�/}�K������{>��Ow�WUU�w��]�w�}s�A��'�L�Y2���}-��w^���?~.���n�>��������j����.������N;�s��\���n�)w�uW���^�����nJ�4L�Vp�b����?&M/�����,��w���,
X����d���]�C9$g�}��o��������L��/8��_�'?���5��r]{��Y�jU�z�-��W����|����l~���f��Y]����XPa���4��wI��7���4�x���gVn��-+3��6��m��JV?���������}�_H�TZ�s�vX>���~��I�������E>����Z�Gy���-oyK���_�������]��V�5{��^�Y��=/~��Y���}>k��eY����6,C&O��y���Ou^��N���ws6�.9�cI���f�@���>}z,X���8qb=��=�O��O]XIr��W�j��/��m����������w[/Y��7"������2���+:����R����L�5i]�<�p�re�=�P����&SO��L�;X��u�]�m��7�9�R�G����o�����[�������^�6b��n����?����G���L0����/I�����p�a}>�4hPF��?����������*?�a���:)���f���m}����q��e�����O>�$ikk��?���'�J��������{����w�}w�������`�k���$���O����D�i*��G;���O�k+3�nX�S�wk���5kV������N�����]X/��[XGyd����$���;s�]we���_�s�g���~���u]]]N8��^�]�KXu{�Yp`�(��?\�,|��$����u~�bN�nR;��8@e(��g������Ow�����������#�lp���92���g���~���1�����j�%[�f���G�����{\pA���k�`�Z�xqV>�L�d����(�I����S���[)��M��~f���)��]����u.��z��������+�^��O:=�P~�����=��s�������=�~x&L��R��y������}~��_��������~z�f������$5���z��b�F�������A-4J��z������Y�bE�u}}}J��:������37TUUU.���p�9����`���Z�*W_}u����5>w�������a���y������3�g�����Z��?IR�����Z�w^��Mv;��,�CV?�������u>c��!k=�7�J���?�s�>��|�����^���x`N?��L�2���$������w�y}r6����
�+��>�je���I��
+W`F���v^��Uf@oS������t[4h��<xp�uss�eZ�����{�����K{t��w��;��3;��s����g�����L�������K.I�����W\}�d�{T|6l*��3���E��
��`�(��g������������k=sC=���9����������N;��SO=5S�N�6�l����<��s������������{�$��_s������e���w�j.X_�O?=�����u{�]�|��-_�y�U�mo�R+��IJxN��d���N�JS���:�����e��hnn^�����%�~x���}�C�����4����'f���9���r����K_�R�d���9�������%���K����'>���w��J7{�l%\���%+n�!I��?�s�F��x������;�X����ho��n���-���N
���W�U555�\.��5����k=sC\x��y�����S�N�w���TUU���R��.� O?�t~��%�,�:��������Wr�3&c�������4�zk�MM��z�l����N��m���A����o��ZD!F��������?�:�1o��n��*�Z�jU���ou�w������}�K_�������3�<�+�`}����$��#�T~�����,�����t7d���?>O=�T����~:[n�e��x�����w�y�^�v���g���]���Gg�������n�m&M�����/IR.�s�w������||��i������,�2�}0����\�ysgt^`�
����w��[��?���'���Y�f����0g��n����n��E������+I����+���mmy|�]���g*>�TW���S+>6U�}!Y�|���oV�����~h����
7����>}z>�������{.O���pQ[[�]w��Wr���v[�����|jkk��W�Z�A��x4M��Y~U]���7���R)�}�������LXG+��|1y�����������x\R����!#�����
���#�<2^xa����oN�\N�Tz�go���n�)S�d�����k��Q���>��:�1o��n�-��b�2��h|�{c�|����
N���M�]�)z��O���SPX�����Gg���I�'�x"��zk�L����~�{���>���{-�v�m�m���O����;�����/_�{������>�������$
o~s�I��iZ�y�|�d�'��k����IV?TUU��O>9_��W���w�y9��CS*�����~���~��]�a����c���\;��c��f���;���W���\r�%=z�k_�ZZ[[������o��z-��E��r��I��i�
N�@��2�}G����$�g����['��[l�
�����>;�^ziV�X�$����r�������j���7/�����;��S3z����ye��-���C=t��������_�r��;��N����t�Ik�s�5���.�v�}�{_���(N��#-���rcc��j����\���vK��q}>���c�%�~��}c���@�P��O�=:���g���|���9�����~:�����q/}���#W_}uN=��<���]{����O?��s�u�Y��w��_|1IR.���~0��rK�8�����n����=;���7��o;]�������}����{��y�S��������<6NK����2�r�b�����d�c�N�CV?v��gg������k��]r�%��w��	&d���3gN�,Y���!C����EF����6�l�\q�9�������u�?�A~��d��1�f�mR*���������{�UUU��O~�	&�z>zO�-�$Ij��*U#F�����#3�c��9l��Vt^_wp2��B�k������/����?�c~���u�_�jU�x���>3j��\~��9���,�!���o�9�����SOu{o����?���r�-�����y����g������$������C�
�����:�����)����������4�y�{r�d��������~�����?�1c��y��:(<�@�����;��N�����u�v�m�}�C���>�Q�F�y>6��e�����I��{�Ql����k��^��S��A
���R�5@s�19��c2{����O��y������#Gf�]v������u>�\.�w�a�����N�i�����>��sO�}��,Y�$�r9#F���[n�}��'���_�9T^��&Ij��K�}���"�}{���o�/�����7g������^���u�{]^����U�����:�����H��s�������~r��+3k��Ruef�o�L<�2��u�x����O��)���-~��:f�d��}3��d�i�N�������x��H��c������w^�?%y�A�f6
����hjJ�$�r�g���d��{V|��le[���%��������	l�`@?��G��(.@MM��sq�7A��,��j������l�`@?�>wnW�U��b���|J�2{]�jOf�!iY^t�
������O�����<,���f@��$�C+��.I2d���������f����oE��]#�N�7+:@�Q����k�M�=�����K�����:�C�YzCum2���S�-X��t45�����(����e����%~��,��,X�U������O�3�Tlf��%����l�m��G����8Y����=?����k�����p�������z>�b)���X~��Yq�u������T*����ir�����F�,�c�.�z����p��l��f�8qbjj6��V����$#N9%#�?�bsK�g���������������5����5�_���5�]���7O�����k�h|����z]UU����r9]tQ����������?r���|��9�������gY8�i���$���ON���h��7u^��l����f`������;��NjkkS[[�����G]����;.g�}v�{�������/��_�}��',�Pz���3�j��T
�!��Wt�^��R���bs�i�X���/�J��M��w�q�{���o���/O�\N�TJ�T�z�T*�\.��G�����JD��k���$I���)����w(��?�):��X�jU�����"��W�����_�b��r�����.oz���p���z�����H�\��������$'�pBE>z�����,��Oy��>���dI������|�����}>&�K;�
�(��.�z�������$)�J�6m��^y��Y�`AW�)����|�;���N��s�=�6mZV�X�$���K`�C������7�b�Juuv�Q}:c���O���2hhe����X�?�x���C�f���_���/�<IR.������?��?����d������?�3�8#I2}��,Z�(�F�������������$���?�j��>����C��S[g�M�}:ga����a����tT�d����k2�����/u�J�l��6k�W.�s�-��T*%I�?��2�U�N:���y��)��I����/��M�����%��_�KU'�O�J��r�����eY��x�=�N�Xeg@tVccc������q��>���'�,�z�����}�G�������SO%I�x��^L�����d��!Im�?����r�'�3I�og��}l����b@`�\�����U���o���]����s�A�q��1c�
��.�����VMK:�[-�I���tF������UR3�"�`�1���
�$)��Y�p���z��I�R��I�&e���=:�������.Y�L�����:�
��f������zP�k����z��3�d���1bD�=+W��
7��R��$9��C�z�����^744�bZ��[�D2����B�N��G���um�2x���v��t��I��$�R)���~�SN9���+��2K�,��w�����������7�k���[�zf�J���Go-f��G��yM�i���3n�/2x�o���@E
�������a���O�\.�3��L>������O���;7����S*�R.�3t��L�6m����5+���]�v���?���������d��7��r�#+��*�s�Y���r{���6�/{q�������?=;�v�)UC����@e
��$���>�s�9'�R)�����I�2e�������C�.]�r��R��N8!C�����rK��������n��������NS;K�6T�=���������>n������d�R|��>����?���>�R�����\��I�U|�$���������.���$I�T��I��Z�0�j��V���y+��.I�0mZF�}v��.jk3d��*?�U�k��A���2m����=���*�,�*�������~���7n��<������;���6mZ�g�k]X�z���^�$~�	i���z�*:@o?~|����\x���g�}2|�����f��	���?�3f�-oy�Z���������r��r��w��J�wV�w^kz������r��I��G������������y��9��3���O~����G?���4iRoE�u���4�tS:�/_����G&iH�m7e�#/n�����J��M����c7�,`���`m��w���=����+/|�S���}�����,���io��+������r��R�0-���$���vK�[�q_G{C��~�=S_�l��Vo�Y6���6�`����,ybz��]nm��9'�������z�Qk����IV&�����7y��F_�5o������Y�ti:::2i���1��X�F���%�����'�~����z���j��,�n�+�jkk�e�]�_��W�>}z�-[����n�)S�N}�s�]w]-Z�$3fL����V$/�qj~�[^hR7�w�n����=�p��k�<�5�o�[2��'�#U���_��������$�r����Ri����1#�����$��s�=�#���3+n�!M����^���I�d�e_���{u��?�0+�{.�|��{G�
PM��>��|����*�����R���2�W��'>���KsssZ[[����<��G�43�q�hm��w�+��������Iu���/���'z}fi���O����T�FQ���/~1���7����j�-���)S2~��|�+_y�36�l����o�W\�$���k`=�6kV����:4#?�����t$��rr�^��3�MK��a�~.@%��x ��w^J�R����._��W��855��W�������]�zW��������v�mY�jU����4?0��>�@��n�������$)��#��s3lLq���_�u������#I2h��\��9������8����+��c�e��w����������$�����^���R�*"@�6��
���1�_}J�RJ�R�8���.�J��'f��a]�Y�f�FL`#���I��{��$)��V�UU]T*��k@`�~��ikkK�\N�������g�;�����?������=�H��W����,�W�Xs��M��J�l��v�������#�^/[�l��6n+-��g�M��}�$I��`U
������P.\��z��1�r���+�^W�&�5�>�@��v��S=lX���������H���`C444t�nll��3��Tk��Q�r�����G�Q�y�Ww�;�BB�@P��
(
��*(��,<�(�<��.�����:���
**��QA@�Bv�u'���#IK @�����y����Uu��������9U�.�g�e����,|�����w�]I��-��<�������x�^]�5r��$�nR=��3]^o���y��gRE�d��Q]^�y���<w���f�������:��XA�U\�.�3fL���Y�r���g�m�]��~���$YT�����w���]������$I��[��oP+�C�d���w������P����k�����k��I�&%I.������?^��,X�s�=7EQ$I��r�>���=�������>I2���2�}��8Q����hH����Pu��:��CR�e�����^�n�a��9����c��,�$��G��1�2����^H������.U�I���>�^��=���F����A��(�ttt�C�P������~���9������0��W�����9��cz*2��f��wI��{_ZZ*N�HG�����js�����U#F������s�1)�"s��������??GqD��n�$IY�)�"�>�l����<�������s���g��9)�2I����K.�$���U�,��f��Gy�+_I�pa�fv���$��>5��f��E�E�u9@���XI��O}*O=�T���o�(��e����;w�}�R��e���:�5�������s������Z���1�[�����������W����E�
���XU�EV�|�k_�Fm�O<1s��M���*I���<o��%��_���??���r�!��68����3<ij��w�����f����^�
���7S..�*`,S�`%�QG�q�������O����7/��EXK
��ojj�����N;-�G��,;�v���>I����{�;����Y��+p�����"f<���������*�J���G���/��g��[n�%��~{&L���S�f�����F����Gg�]w�{���#GVz�9����g����D��O&�#U��N�j���%�
�<0x`�Q�2����5����f��7'I��W���������1i����Q�f{W�`�T�X��[8yr��|��O�R���#G�e����H���-�H>|~�#�
j�:�3��v[M�����5N<1EC��\��X�Qt=����t��O?����o��9r��jkk��I�:��_�.e�*����I�!G������,��k����X����
7����Xccc.���{��+����������I�p[�pa���Zk}��$I��[vk1UO+;}�������t��,S�e.\���?>_����VY���joIV�-��8���|�_@�����(:��e���:+����`����@%:��K���'IZ����4+fIVQ��������,S�eg	�e�]������9sf����Z��O�2�#F�q�����b�`�����MVQ��g>����w�`�v�m;vl�y����@M�>�P��e�-R��&�rqVzWlV@�`%�>���[n�%k��f�������=�yO����V�j���O��l�e�IV���^���
h�:@w�n����?�9{��w}��E�^x!�}�{s�Wd����:"�����K����9sj>{�����w`�c��,��UwXI�������������o�=EQd������s���c��:"�����V^���+���=��t��(��
��V]`%���C��?�)Gyd����E�������SO=�o~��UG���e�9�c�d�W��������l�a�n�e��v���������-�J����\v�ey�[��s�=7EQ�,��u�Yy���s�%��O�>U���>�`��B���3��S���Ru��cIV�)�A���P�>��\p�ihh�,��������{f���U������$v�M��
*`���zZmn�p�	���~�~��u�`�z���i����3�T�:3gI�^{U���);}E�9�9MU��}��7��rK��w�L�<9I����=�yO�������S���'3��+k:��3'I2P��+}(��_�UV������]w��|�y��GSE^x�����.9��c��@7[����y�%������i~�[+��������n�vXI2z���}���o��r�w�(���=;���wRE��;e�v/_{m���;d���������-5�W/�<�_4T����Z`%���Cs��7��#���W^�Y|U^PO^����$�>��4�]q�G����#���.��R.y��
jnn���_��}�s������S3����$�8��0�0������t��G����:���g�}v6�p�|���N{{{wE���O�G���'�lf��I{{Z��:��G�l.]Sv,�P�P�z}�%�\�-��p�	9���2��nY���������_U2{���V2��S��>Xu��`u���Z��u����$�>�����j6�a���m����,)�j�6=G5���CI�������P�iX��e�	�i��@�+�2��{��e�-+N��nIV���VS�z��Y�r������o��	2m����93eY�g?�Yv�a��#�VN����S�����SuVuK
��jc�s��k���9��3���8�g�^���,SE�����k=��\u�UI���_?O>�d��X]�>�P����oOC�~�aUWv,�P�P���]�������������_NY�+t��'���,S�e�~���t�M=�`����e�-+NBo��/
Xu�.
������������>����(2b���*��n������v�_}����`u���������z`Y���U�g��~����s��(��e����=���?��w�=���OCCC��x��A����?eY��n�Az��k{���|��)��k6s�-�$Q���Y��`�����s�9'�&M�,�:�����|'

+���=��#_���$O=�T&M��Q�Fuk^���p�Q�{�m���������wYR�U����K��������W���[�?���^k���Jccc���h���
����>}z��qG�d��G&M�{���v��y��j6�^lIVQmzN�.�����3y��$IQ9��3��^KKK�[o�L�81I���Ov9#��d�M7%i3&���'U��e*;o(��[
U�����wn6,;��C��:th����3����d���$���'��W.�,`��^]�5y��$IQ�`�
�e��}�vn���v�����,3����$����4����E�
��WS������s����[��>}z����C�eM�W+�2S�:+m���lfGkk>�l��}��]j6VX��S@���X#G�L�����/�������2q����#FtyM�e�w��y����d���wOC�~����Q..�*��@���X���n����>���'w�b��;��3������o�y����YW^�$���.���5�[���A\�y�2��E�E�1�A��k���iiiI[[[���?�yN:���^��.��9rd6�l�.gx���=���:I2��S3p��+N�������^}+�_�~�u�]S�e���Yg���S���Z���os�5��(�E�8�{�,6��;����i:4v���8��);o���z��4U�����/���c���K/�����/�]w]���k����?��$IY����ON9��J�J���o�|�)��;�f3>�L�d���hn��\�-�r�gQmzP�/�;vl>��\}��)�"�����[���O�!���.�������/�w���\}��iooO�E�����nX�_Te���g���W2{�����������^_��$?��O��O����OQy���s�����N��o�$)�2EQ����t�����3w���|W�e�����:����P�C%I��zj����5��4jT��[�y�����RT�TX�������r�!���[:��,X��~����,3~����w���(:���>�_��ih��X���i]������J����z+�����Y/T�d�5��E��,��UXI���k���n��g��s�9'��MK������+�2eYf���9��S�����[��@}Z���)��K��o��������������T��$�������)�J[�r�)����\z������;�����������c�f�����G���W�����J��l�Y��������?k�g���m�T�eu�wP2��U����U�����q����;.I���/f����1cF����#Fd��Qij���,����=I���'a�R.��V�����j�h�Zk����ZkUX��>�P��e�-+N����:��P����=I���'aUTT�XS���u�������
,��=�X��e�-k7�U_��S���/K�3��IDAT�z���2m����93�z��3d���c�P��e�.��}����n\c�4��N���
+���k�����-?�����_�2w�uWf����������n�������.S�,9rd��k�����w����S�0hP���k�E�|��)��v3�=�����*�����s��'f���I��\��;otS�������$IKKK^x��2��������I�A�u.���4���<��
zNC���I'��C9$/���
_-q�	'�o��)�2������+z**�*�`
�k���@���O��.
���������OY��eWk��f9���|���)�Z�a��e�W�,���~�cy�Y���i}���(2����:5�Tu��z���r���w_���7��{n�9��45-�y��sN��o�������e�[o�5���ill����*��;7S����O�V��&NL��}���4bD����Y�
��xXI���K_�R:::�$��������w�y���q�;�g������t�M�%'�����L���*�=p�}*��Q��)@����9s����c�������>���WI��Fe��Ay����$&LP��je�5�$ItPZ���fs
������<X.E��~����o�=mmmI��(�o��o]^s��Q�X�&M��z�[,�2%s��#I��y���T��Q��>X�c���>�l�E�Wn�aF���5���=k��.������.��H�;�����[Yu�MU��)S�tn�9�[�\�pa�vCC�����=;sn�)��5�=��?N�����`������=g��nY���Z����5`y�x�I����]i�AP�|�Z���(*�u�W`�92IR�e�y��.�7y��<��3)��5jT���1��N��l�u����~�yOZ����sa�R��)@����1c�tn��5+����v��^�7��M�E�Z


y�������������cI��~��4�]q"X�U���Pu���j�����k�(�U���Vz���s�MQ)�"[n�e��]Q�M-x���mm)��K�
6�:���r��,�1��+I9���e��,s�����nX�uN<��<��c)��<����3&���	�$��l����?��W���]�����_��A�RE:::��}(W]u�r_?}��v�a����X�z���^;�sLOE�ej{��$I���V�H����=��`�1"����S�e�����ss���f��v�~���w�}I��\�
�g�}6��{o.���{���`�
r�W�,��e����\r�%inn��g�j�0!I�<fL�I�g5U�;|�S��SO=�o|�)�"eY������w���yeY����z���(:�;��s������� I����e�M+N=�����k_�Z~���_�~����\��jI���I:����/�]vY>���T�X��e��GI�4�SqX�-~�<EQm�gMU�NGuT�����:+?��O3o��$Y��jI����MMM9���s�i�e����e`�P�e�����m�<93f$

i~��k>x���P���+IF���/�8g�yfn����~���0aB�N��3f���1bDF��]w�5{��GF�YulVeY����/so���}F�NC����^��:���+�Zb��a9��s��V�^b��OVZ~�$�>���@R��>X�czu�m�����������g?��v���@�js��#I�w����
7�>@CC
��\`ie�����������5�\��(��O���'?�:���;�L���e�4Rq�_
U�����$IY�Y��3x���������$I��c+NT�\�Y��������^{�$IQ6lX�i����MK���I�~
�`�V��)@������[�s���^�0	�����N�4o�q��\��4�*��:����t���c3t����1#'N�/����^��X���G������/�X��I�~c��~6�J)�E��,�1
U�����|��������_a��,�������/����������1�?��j�C�+�����]��/9W^yef���s�9'{��gv�a��c����=m����
�z��{���nH���
��;}�Y��g�Z����\X����u�]7W]uU8����;7{��W�;��}��UG������3���k:s��~6�����3���:��^_����Og��7��~����y��s�q����F9��l���=zt�>}�������~�����OI��a�R46����M6��/|�������:��^_�����(��Z��(R�e&N��s�9g��-�".��������g����<���ikk��a�����f�wL��}�������w�}?~|&O��d���Yo��2f��l���ihh�:&�N����S�$o��4��_q"��z���@7��XK�e�Y��������\s�5����������80���'���|%#F��q���'��9����.�,3f�x���]w�5�{l>���. ���&LH���`�W��e���
���4T�;�e���z�������9��_��*If���.� �m�Yn����������g��1c����.z���$�5kV����\z���	����X�c�T�����qtX�5U���<���#�����r�!���k�:������_?C���O>��3gv~��K/e�����7��v��G�-X� ���r�UW���!C�d����������/g����;wn���W�#�$IZ`����P�z}�%�\Ru�s�9����������/}�KYg�u�,*����k���|&O?�t�d�����G>�����2dH�����>�T�USSS�;��y��y�;����������<��c����s��W.��jj�0!I����'���������z5u��|��X���g��SO=u�c


9������g��v�SO=�$y��g��o;��~z�����~����������N���?d���Z��


�t�M��������t�O��#�������e�����VYV��_C�^���^����_�:N��}��y���;�w�e��r�)�{���������^��w���L�:���M�2%'�tR���!Cr����n���6��s��c��,�81I��XME�	�~5U��|��H��n��������Z�<��K/���s�=_������#�\r�R�����v��x=���{v�y��~��I��_~9W^ye�?��n���o|#S�L����7�����m�:�V�c�%I�O�����r��,�1�lV��e���O�[����u�]y���:�7�h��7n�����>�Y��$�\sM�`���.U:6j��w�q��>�Z�g��| �����,��O�4�S�����|�s��Y�����j��)��M����������-��{������-���9s�d��������u�M����������[��m���y�xAf-
�u�J��
��1uX���X���ikkKQikk{�s���*Ix����w�q���v�u���n���z*I��������]�zW�d{u9��j�7��;�$�;,�O>�fs���4o�i����U�k�5���I��$O>�d�ijk��	K�o��f+t�f�m�Y��d��*����������z�$I{{{n�������O������g�M�>}���kf�m���{��C9$������:�{�I���`������
Ux=�,}��~����
����y����O/u�-oy�
����}��.�J��3g�����oll�l�'�x";��s>����+��c�=��s�f���y���s�UW����d������?�i�d��E��9����&I��[q��CY.�(*�u����g�=���7��$y����w�#GqD6�|�<8E��;�������}?i�]v������)SRv�-M�����#G������R��'O��lO<��R�
����g�w���3�����>GqD~��|�[���LP���sO������K���W`�P��)@���X�w\�:��L�>=I��#���_��2�]R����}���E��v�z�k���K�����e_od��o����1c�R�EQd�}��,����;�����.>|x�N��[o�5���/2o�����:������9���%W������^Z�k��n�=e�w$I������5�gz�*[�5x��\}���w�}3g���6��]-�}�[����o��+�F�~��p��������w�m��v���~��_�f��?<��vZ���<�����O>�������x���%��^��O?�[��W�s���t��)_�B�ZY��������l����G�`@�Ye��d��qy�����>���o���Vu�7�������Wx�������u��6�W���z��O�S�
���7�p��t�M�r�-3i��$Ikkk�=����?��l�S�2��c���c��hj�����n>�j�����U�+I������+���/�����/�=�Xf�������,��~��)�E�����?��6����]��o���W������
�\Y���9�����WK�1"������O|���O��������_����0������ci\s��w�5)�j��e��������|.����:��U�k�A�e��q7n�R�O?����#�<2���[��u��.�?��^c��yo���Z�:k��F:������C��?����93���v�=����}o���p�	���?�B�<���9���<��*�2���o��xcm�-~���g���;�X���"4`@��5X��W�L��;7eY�(�����9s�p����$;��C����\����7�o�}���?u���{��k���9rd��`����g3���j:��v�e��G�t&�)��@�������.�1"EQt��d���Yk���{���{n���*�ZV��7�x���d�M�*��<yr�s�zi�0!I����g��n������N�T�]�V�=��
��Ob<������F��0I����_�_�L�8����O?�BXO?��R��n�i�d{�[��������u<x�
�����O��-�X}�-.�j�b��y�[*N@]Z��fX�c��Ul�A�������t�WV�?~��������[oe566f��7^�Xkk�
�1���������\�^Zy$I��M��������tM�/��G�x�;���������^x!O=�T�~�>}��f�uS�d�m�]j��_\��'O���������	��K��E��Sq�]Qu�c
�VA����R�7�xc��|��
7���������v[����o�����o�����l�I�3�zi]\������z��U��;��#Ft�?�����[�����GK������-{��W������������r]���g�����7n\w����O������$-�nZq��r���X�����|��X�������M���t�M����;�
��|�#��m�����?�������u�g����{����9���P�Zy$I���zi8��4����P�`��N9��|��9��zk�:���=������G���O��1b��)�b���r��f��W���}�v�_z��������\x�����+�:����Mg�+�M��$i3��$����..`@�i�:�6b��|�_�����c�������O���N�:���$����o~��|�����O?�y�:���������l���^N9���~�����>�����9��S��������O?�3�<3�����Z���h��s��@�j�1#/w\�'O���O=�$iV�@O*��O�*��SN�]w�����w��.�����?�l�!C���'���3���_�~���+3t�����/})��w_g��,���}/^xaF�����g���y��'^s���n���=�
��5�g?��W^Yi�~�~w���X�����\u�U9���r���wooo_f�T�><W_}u�����s��W���������t/�2O<�����o������<��|������$r����|~�kd�n��|.��r�gQT���U\��}s�e���������<���<o��9��#���|%#G��I������'?����������;�y^Q�~��s�i�e�}��I6zF���Y�5������
=�|�S��Q��Kt�A9��������/�K�{�����e���3fL����}����e��;�{��W��k�<��s����3q����??��
��k���c����������i�:5E�����wVzVQu�_
�z����my���Vu�eZw�us��W�4��[�$�w�)Ess�a��,y�p�z�,��:����{�I��k6��k�I��7�f3����@�S��PY�yf��2���+����BQu�_
���u��{��)�����&5��w�m�o��k:j�,�N�����M��	&d��i�9sf:::���{f����:u�,�����`�����y�%I�����5�������MQu�cuW�5y��\p���/�Gy�5���OZf�%�\�g�y&I��:����������yw��I�W��}6�(�O>��3`��zL]`�s�9���������e�������>��=;_��WSE����.�(�e�$I�7�$�������r��i����g��f����.
������8�^{m��|M�UQ�,�z�O}�S�����Y�f���=���/r�I'�dl�H���I�A��g�Yq�;��;��.j�:@w�������k��,�*�2�l�MN9��|�{�{���$�����w�������=�:����e��*Nt��G�`@���Xw�qG~���(�E�#F�����}���3�<3�|��X�W�p�I��,s��w����'�PGZ`5+��^o9��tQ�/������dQi��A�r���f���^�����wwn�����G������S������$-�nZqX����������oOQ)�"��vZ6���C���^�
����#�tGL�\��	I�>l��*Nt���:��^]�u�w���=eY���!G}t��9rd���������u��$I�f�U��e��������>IRE6�h�:��k2�s���_��z���	�$-
���U���Tu���6mZ��k��-k���vn����[���-�2%3~��t��[��s���$I��15�
t��\�Y(�����������/w���'O��1bD��	@��r�����V��e��*�t���P�zu��k��$)�2'NLGGGVz�g�y&/��B��:��������?�)I2����T��_�o{����5��Q�.��z��;�����;��3;���J�w�UWun766�=�yO��P�>m�<�E����8lX���^�\�Y�����Pu���x��3z����*~���^��f����|�;)�"EQ�]�zW
�]Q�Aso�%I�w�m�_]W��)@����$9��#R�e���o~�������
�����#�8"�=�\�r���N8����C��|s�����V��+E��~5U��>������.�K/���,s��Gg�����g?����7���G�q��;��#E�����o��;�������-mO>Y�������[%�������)`@���X�����LGGG���s�����/�G?��l��vI��,SE����L�6-�?�xn����|��)�2��;�����/~���2,�\�pa&������?W��1�v����@�(����`%�>����}�{9���,*��8qb�:����+�2��z�k�-)����O.���l��6�	P'�}������0xp%�yd
�d6�b��+I�=�����o����I�&u�Z���j��EQ�(��e���Z+W]uUv��?�t���i����/�����23~��$���.��c����=���������n
��d��w��	r�E��.���?�d���W*�2��
�g>��|�������:��f]~y^���j:��N;e��>U��=b������
��d��!9��S�����������~���0aB�N��3f���1bDF��]w�5�o�}����?�����I�~;����������9C�9&ECC������:���m~jhh�6�l�m����(5����I����d�~�S��e���
���x�@j]\�����'�}�����F@�i�6-_x!I���f������P�`����N�4��-i<��4�PYu�
�������7�8	��5U��n���n]���)C���!C2j��45���D�j��k�-*N�;��?���P�z}���q�R��]����l��V;vl>��Of��@g���W���*���kz}�e��w[[[s�����{�������w�=?����t�,�>M;��L=�����5��>eJX]�3�jR'X�,�*��u�{�W���s_yNY�������[��k���q���X�e��g����?_����F�e�-j>�j-lK~}r2����@��:{��2;�I�/���W��d��b?��O��SOu�0 �x�;2f��:4---�5kV���<����?��dQ�UQ9���3z����=;��M��>�|0,�,��5kV>�������&�lR�oz�O<����O����_���=��g�
���_���jx����U�����T��W]`��5+�rH�z���e����m9���s���o���{��	���~7?������_�����O~��:����S���/��g�����$��3r�I'����}��>���{��I�~�o���lSqVe��s��d�oU�z�>���T��W�/�joo������n�-I���~4�\rI������1c���/��>�������1cF>�����k���{��$>|x���/e���������3g�,�\�������������z����k����'`u�����������U���wr���&I��������U~�Jc����W^�$Y�pa>��Od���K����[��?�a��LQI��������z5����$�w���$����tEGGG�=������:k���c�=����?7�pC�L��K.�$'�x�R�t�A�|������(���-`��������k>�}��,x���(�o�k>`U������?g�����v��K���������$���o^S��$������,�<��S]�����s��f�e����ehy�;�8dHe�VE�����J�E���_���m��I��,����}��l�������M��L�����������������;�������:��^]�������.��`��e��Jk��F����s�<�9���$�������w+N=�,�N����]1h��$IY�y����*�Z�<��k�~��vn����K���Svtd��~�$��>���zu������=g���v��W���_���_i���I��(2|��.�z������^H����?n\�q�����k�:@W����MSSS���S�e>���e��w��!CVx���??=�P�b����w�}����o��=z����D����|��i�:������I��ZZj>������Xc���������RE�z���7.���/��F-�:���wr��'�(��e��(���|���|����[m�U����?�Yf\|q�x`����������XIr�y���oL[[[�������l������>��;,�z����O��\��/�w��].���<��)�Ew�����G�m���5�<���?~|��H����N=����k}��$��~0��������C��\�X�/��x�����?���'S�e��Hkkk.���\t�Eijj�Fm�!C����9�g����?��^z)I�*�*�2�m�]��?�s���;���k����=���&�z���N�>��9��������:��^_��$GqD���s���f���)�E����������&�W��+���=��#W]uU��9�����n�%IF�����O�^�,�����7�8
���(�J�C=4c���g>��\{�����H����%^�_�e���z����~����'?��3>���up�S'MJ���ICC�7���8�Zx��b`�U7XI����%���/�����g?�Y�����{���<y�R����'�m�Y��~����~�{�����PQj�Om?�$i~�����o�iX��U����^N=���������1#���2dHPa:X=�.)��l����j��:���,�z����>���ZYR�����'`U�Pu�>)���4U�yS�;/S�=7������)S�(���`�j`�y��}����mZo�4o�I���j��:�1XP�<�\��B�������I�>5�����ihi��<z��+�����
7�����+��_3e����1#���+�NQ��?��C)�v��sO��e�-�w�m*N�����|�������y�����{n��e��w�����XP�����I�~�zW�I`��(��;wn8���t�M�eWK
���\�2�%��La����sO�����W����`UWXGqDn���$�,�jhh���#��/t�7r��E�������������#Fd���
=�����{�M��{��*N����k��6����:K��
���>;�zh��������s���g��vK�������7���.�(<�@��Hccc.����������W�`A��M���O>���3S�����7��|������|z}��g��$)�2�����7������M�{�[������9��cr���?��?2y��������/~��>�����h�5+Ol�E>�Le�n�m�>}*���Pu���1cF���?�(�E��N:i���^��N�UW]��(�p��y��y���{ 1���?������������9��j�#�UT�XS������NY�I��(��O~r���g�}r������/����s�i����/��������L��w�$�.�0��?��DP�^]���s�un�1"m���?��7�����l.����e�_����5kV�-YXu�d�_���M�'��?��?��!C2���{|��+���W`M�6-IRE�]w�e���O�,\�0��`��mo�z���g�}6.�]w������{CP�����L���j:s�QG�a�����UU�.�z��}�.�����3u��E�I�&��:k��v�}��$���?��X5����$I�
7L���=>�q���q��=>`����&zu��!C:�_~��e�3l��L�:5I��O���������f��bBVEm&$I�����w�m*N�}���rj�:@W�=:IR�e^z��e���f�un�u�]o�^kkk{����w^��������X��Ki�:5)�4o�I�q`����6�|����^z)��M{�9�n�m�E%Y��sO�����z�^zi�����\�����[��P��	�$}6� 
^�������zu�����
6��s��{�y�9|p��(�ttt��#����3_s������|��)����y��{ 5Uj]\��<fL�I`�����d�=���������7�l��"��(����%c������?�A.���z���e�]2k���e��(����f�������6�`�l�i�Iz@YuX>MU���>8?���R�e�����{��inn^��.� �z���`��$��I������K�����,�80g�}v�~5���#I��1c*N����t�{��}�C��?����>��__s��[n����:����EW�����\���%�W���W_��7������h�0!I���c���UVS�����1W_}�����>����)�������ikk���,�477��������l��F=��:�����k6�lm����N�4+����������=����2g�����y��S�eF�����.����:"�j�\� Ol�E<�d�g7��f����\��V�U'���Z`-1`������U�X��N�����(����\�o�V�y�k��XTo���'I���K6���j����������i�}�%I�n�]�I�ZS�@%�������V����U���Tu��������[o�=���'�|23f�����3p��:4�G����o������d�M���Z)��3���$}����0@��]�/��|�;���w������������-���K.�$I����''�tR>���fX]�=�h��sS������8u��:����t�I�&���`>�������NY��)�Z�o�%��}��9��C��| �?�|�V+���/I���H��Xq�����&N���w�=O>�d���,�zu	��,)�*�2�_}v�y��|���`�
j�r����<�����5�f3��$}���f3Vo��,�:z}Vkkk��s�<��I�Y|5x��t�A7n\��b�><��9s2u��<��C���[��_�2�f�����'���{�����oiii����������_������g���*����8��<��c)�"I�����O>9_��3`����?|�������f�mr�G��������=��{n:::R�e�����3��7���Z���j�6-���$��7������f�
J�k�l�j��:��^]��p��|���OQ)�2MMM���+r��.���g�����>��G:K�������3�Hccc��j�����mmi�z��}�����^]�u�m�e��i)�"EQ�����
�_�����~��9��s�$��O�-����=�	���������.K��v3o�1I2��#k6�T��W��W`=��I��,�����|�3]Z���N�y���r�C�O<��,�f^8��,��?k?�O�9����V[�����^J�E�
7�0�F���z�F��Fm��<EQd��)��Mu���Y~5��_M��O�f��a�4��V��PE������tn�������a���>@Oj}��$I�Zke��|��4=���]�����s{��I����/����zR���I���6�8	�ZYuX>��k��wNKKK�����>��{�K�=��cy����$---�y���#&��j{��$
���C�.�8p`?����3�8�K��~��I��(r���g���]Z`y���$iV�@7(�����XI��o~3�F�JY�������o}k��������.�,EQd�u��7���nN
���`�l�y�I������|z}��#r���g�u�IY�����8 �>��r]��#�d�������$�:������>������:����'�L��l�Y�iz^S�����nK�|����)����'����m~���f�����q���[d����������)S����{n����w�}I��,���������)S:�}3���K��6`����#IY�q��4��f�qz\�/�7n\����/�"eY&I�������eYr���&N��C=t�gE���Dj`U�1gN�;��,�8�v3g�J��l�y�fT��`-Q�eg�+��|�jEQ����;X}����f��~W��~;�T�\��Ga�%��kIi���W)��e��w&I}�#v�15�[���~�~w��T��`}�+_�:PG��uW�d�Ae�{T�VNQT���,��:f�����-I�o�+NP�����w�=I{{��_?}�[��8�����rR������J���q�������,��\��?�YR�=6�u��$I��c{l�DQuxc
��U���^����O������"v������`���_���5-[m����|��j=:-c����1e�`�(���c��t���s.���}/I2��S2��C{n5�Xi�o�!���O�`A��jZg�>�����(�No���@����W���*}�d�3�H������qMUz�y�K�d�������AE���{����e�	`�(�VJ��9i����$�v�!Ecc���-�X)���/��H�������V�^D�R���/I�~�~w�I�m`+e�=�$I�n�}�I�Ne�`�4U�~/_w]��{o���{��I�~�~w����(��:�����}�M����55��v���`�E�	��)��:3���;)�4����}o�����i4�GgP`@),��K.I�����g��>Tq"�����rR�=�������~�r�������i������<�:m����I�����
mYT��
R���_�E~0 
��83�����BQ�P\pX��eAY,S�
���6I�&����@�����;��s�����g�GC������z��3�=���<�
����}��y�_��Wg��=;���^�	�!�������9s�6����+l6G��7&I����L�P�yU�Gg���V|l�>_�5{���J���J[�}��4��d�W����/80��������+�{���E�n0�4�yg������S~/�*:@w�J%�T�;���%I���_�I�A��n��j��]�r9���9�����.����w�K�4(�zA�\t��~S�U*�����n�!�?�|f�����>:c��-:����n����+rv���'I���oE�����`M�2%O<�D���$���{s����������w�3�f����������o�>���[����+:�j��y��+:��^��-�Y}�1����������K.��W_�U�V%�(�jii���^�k��6c���G>��w�q�c�=
N
@�����$�oxC��O���RF~�#)y�t���=��r����.��W_�9s����nJ�\N�\N�<��s����r�Ee��v��Y�r�1�d�����/[s�
I������:����l�r��{���)r�1�����m.\�/���q���S.������3�����s�a���?�q���
J
@_�n��4��I�a\p<�U��M�4)g�qF~���q���'?���Gw����-7�xc�=��l��69��r�-��>�����r9C����l�u�q`��):@O�s�=���{��.�/~��\z����o~�u���\.�T*e��U���Kr�%�d����q��c�=6S�N-:>/��|y�������V��GI�a�R�Y�KD�zuuu9��#s��Gf������~�9s��������\.g��������/}�K�g�}r��7������$��}���N��y�:W��U��r[m�UN>���|������K.�$?����d���J����$�������VX}@��7�i�����2�-o���C�O��C��Y@�[��r���k�?���w�y9��������]J���}�+I����D����(8
@�U*�6nP`��??s�����_�'�|2%���,������p�W��������X���f������@�1`��/_�+��"s����w��$)����W�r9I���{���������G�]w����z*---3fLv�i��������/:0������[���3�|����v����^��,�y�k��u��/�K/�4��������������v�{��9���2}��"#w�5�\�/~�����{_��������s��gg�������566f�]w���>����Y�r�%�
�bMw��$��[�������K55�}�z�\�oXw�}w��������y�����TzU~�5VC���G�Y�fe���E��$k���	'���/�|���^�:^xa~���������K	_�Yg��W�W@���fM���OI���}oj'M*8T*:l\�-�Z�xq.�����3'���O�����J�Rf���Y�f��#����C���������}(�^{m������n��2j��<���Y�re���.]�w�������>��v�$�]w����/d6P9���}����I��_[�_`566�������^��s��\.w�^�J/��j�w�q��c�=6���������_�����>��O����|&N����$��k��g?��,Z�(I�OGuTx���5�W3�����NH{{{�d��aY�fM�f*���;�$
{�Up6����@_PUt�����3k��l��6�={vn�������F��O}�S���;�����3����W�=�\���/w����~5����;������*���3o��L�2���SO=���?���v��W��x I2i��|����@e(�zJM�^�v�m���'I������������Y�f�=�yOjkk��X_����j������O?}��O�4)����s�!�t^��7���|�37n\E�������_�j���/�}���+�`�k�������*;����$�{�Y�9l�R���q}�����J�T�R~����%�g��G>���?��t��������]��s�9)��'>���������[�$�V���W^�O}�S��^{{{N8�����$I�����}�{�,�-d���'mm�V]��=���`@��X/W]]��3g�MozS��|�+_�����?���o��y��t������o�<�[��p�	�XIr�5��J�\�;��3I2r��\x���	tx���=ikK�;d���\�Y����T
^�l���s��~U�����o�17�xc��+�����e�����R���g=��.��s�f��56lX��{��{,����;�_��W3q����^��|yV����$y�w��a\p"���o
�^^U.��]�9*}�k��������w�n?;q��L�2%O<�D����%=�Pf����	����?����$�>���O}�S��A�]we��g���T�Ym�?�rcc���k�tP����~Q�U.��um�x�����w�e�Mz~�]v�,�Z^�
��������nJ�������/.�<���/� �7���3��v����F�/���Xt�^����E�u�����n������[���<��39��S;���vZ���7Vd�'k���$���>���^�yUc�d�T|���}�,L�/��5kV�z��e�R.�������L�0a���4iR���%Kz$�+�x��Y�bE�d��i9���*2��r���GI��<���i���=}�k�Y�zu����CS*�6��a��m���p��W��k������M}}}����%K�d�������*���l��O��fMR]����/:��&~�z��>��eU�S*�����3��s�=�O������?>3g�����[��V�=��B3@�����$��~����
N�`S.:tSU�^K[[[�zUsss�}�f| ~��!]�MMM[���>���f��%I�	&�_��_{�|��:�v���$}W�/��4iRN9�����EG����]�---�|���k7z��������G��o|�;vl����ZX��������,Y�$\pA.��������={v>���f���EG�����w�777o�MMM=ss�Z�*���';��~x�>��9{K�x����?�I�,X� �{��*�A�e}���'���|�z�r9��������i����?<�g��{�������o�5������1�r9�R�_��f����������9�-J�:4����{���0a��L�0���R��;��A�\t��~����\.���5�]w]�����;6G}t�;�����o-8��?~|J�R���O���f��%�z���}������{�����Rxu���f��)[|.TB��5-�>��s��K�O$I�(���>_�����,s���o~�����va%eX�=�\.���\x���e�]2{��s�1�T��444d������;�-Z�h���E�u����N[�k�����\Ir�����SO��s.���\z����Q�Fe��[�^n�!�������U#G��������e��>��`y��9��#�l��\~������r���&Ig��b�|0��vZ�8��z��9�������7uuu���;��S���z(3f����?��_�������,��;���J��Oty�]��������N:)'�tRz��\r�%������~:I�2�u���7��M~���d������?���;.{��W��B����n����;������Y����3�<�'�x�s_[[�]v���#@��t�I��w��s�i�w��^Y���M�����.������}�k���r�����k�ISSS��eX��/�w���|�;�����3{��{���8qb���F�����y�������R.���������]�3g������8���S���������9sr�e�u�;���z�������-�/�t��I��}�)8	�/������a���;,�W���W^�9s���[o�RU~�UV�����g����:+tP�?����}�K}}}���_�w�}3~��,[�,I��c�e����9s�k>�������#���L���!�����v�m]��{��6��.X}_U�z�������},s���c�=�s�9';��Cg�U�TJ�TJ�\N[[[n���|����^��|����~������TUUe���]��{�������x�����[;�#F��QGU���'���K��w&Q���
����<yr���/��G��~��|����Q���a%I�\���+���?p@�O��/��Y�hQ���$��~z������[r�y�m����������\;���2~����Y_��?s�����P��<���5�1"Cv���8��6��U�3j�Pi���O��g�|����5�\��.�,�_}��[�Y��t�a-X� _��r��g���
7�PX������3���g��y��3���E�r�Yge���I�������?�I'����k���9��Sz=7l���o���f���X���k�$
{��Ruu���e|�zuuu9���r�QGe��%����s�e�����K��2�r��r���o����N?����7/�]w]��o���������'g��Qy����b��.�544��+�����{70l��3���'���Y��8�W�@�Uz�[�H����&L���O>9'�|rx��|�����_�R��R��r�\t�$IUUU~��������O~����mmmy���^��q�������~���[1�55�~{���3�!C2��[R5bD�f��M��);�-7(�����r�����k�I��7_sU__�+��"����/})��w���7l����5+g�}v&L���!��Z�|2��c��Z��o&IF~��i�k�^�	@�5�
�~��\z���������O'I��r�-�Z��#���G���;�����������Gg��w�~������M>�\.W �K�9���s�9���+������5mK�����'������E�s�=�+��"�^zi����$/?�J��J��}}}}�8����=���5u��L�:���s������KS2$C���^�9�]�J����+�`�������[��n�������9s��_�:����%WIG�U�R��{����g�C�PF�UHf�-Mw��$:sf����N�`3�
�������3'?��O�|��$/�\����\.���}�=����=;��M+,3�����J�4��W�I������@�6 
��z��\v�e�3gNy��$]K�J�Rg�UCCC����g���9���;K�`0i���$
�(F�-�jll�UW]�9s�d����W��/�Z�mo{[f�����:*#F�($3�m���������Qp�"�#�>��`�t�M���K�_��_Y�fM��J�^^zU.�3y��{���={v��~��2@_�t��I��vH����`0�X�����9s���(O=�T���W�R���j��a�������=;3g�,26l���n��s�I���b3�=�t��a��*6(H���=}�k����=�����K��_+�Jy����Y�f���`�
VX^���rJ����Wf
;��^����������~y�U���
o�q��Y�fe��)E������W55�8gNJuu�U=jT���Y���b�����`%�W�r9�r9���?����5+p@�������/I2�=����|��4@��{f���XIr�Ae��Y9��#3t����0����<��o����*:g���$���Ut��`}��_�q��m����(R�s�f�)������3���{e��`}�s�+:�\�m�%I�w�=�����
*�2��#R�������R�`�|r^C���'IF������t�i���*:�e������}�)8

�`#Z��O��)54��o���8�R*�6NlD���'If�H����400��T�������*r�?�I��a�}*r>@O*��N���~������uO=U�9
���(��_[��?e�SO�T_��3gVdF�����wV�l��(6N���oL�=��l��_�������h���$���*8	@P.:t�,��rkko�%�,�Oj�����xq�W�����<����S=vl����T|@Q*�6N=����,��:�Wg�93���^�	l>X��r{{��}v��j���jk+>�4lX�|�S����E'��Q�@�Yu��iy��T�����z���#}�,�A����g?�����+r�����$c���_�`i�������������3���*:��`"Mw��$��1#�N=�"3���kj&L������`i~�k���g�?Xp`��*:����{�$�{�Qp*�Tt�8X�D��5Y��CI`�R�0H4��I{{j&NL���E�����@�(�$���;IR?cF�I����������$K�8#�����j[�"I����@�J����)�(H{cc���g�����:w�����<�WR�P���^��}6�S�d��W�T*U|f�V[������
R.:t�,�W(��e����u����Y��_%I��yfv�����X�������/~�Wf�l�]F���+�DJE��S��
Mw��$i�{��������R)�������*7���\t�X��|��I��G����t�i����%�r9M���$��c�����)^�,��Y�xq��}6��N�n�`@R��2Mw��$��7�����4�i���@�(�x��{�I����G�I���t��K.��9s�r�b3�>�`��a������+6N�/�77��O:��WW~X���P�9��,�_X����}���L����?���j����y����`�����J����2���
N���*:�k)��d���$�����R���q5E������'�����?������+S��6i�w�?��������i��������TUU�����E'��Q������J�L���3d�]{����!���=~.�O����>-���I��'����cN�\���qUE���{�I��N���
����b�w��$i�s���� W.:t�,`�5)�`����^��������X�3fTt�=���kP���e�����i_������S���T~��,����(���I����5��cS��P�����E'��Q�X�w$I�����m.���4����@��/�j�{�����Tt�8X0@�[Z����'Q�@����?�1���T����S���`��t��I����N�T*8
����0�����,���7im���u�<�$��>��1:���`@/)���/��L�=�d��v�a�:(N�\t�X�K^����{��TO��I?�qR*U|f�6�d�.�T|l
X��u�����_*:����$��O�����,`p���}�"
���>�`�u������JC�d��>U�9��)�`�[}��I{{J���z����)UUe�?�Cj&L��`�+�G�^�w$I��s�������P��;�L�4��W�I`pP�����/��E��R)�{�Qt`0�5�yg�d�����#N���E��Q������~��
N�GM�`C�_|q^�����X��I�X�R*�6N}R���y���Ny��������� �,����2��kS������s+:�v��S7mZEg��r���`�'����$���<#?��b�=J����)/��'i_��r3��I�w$�����Vl��U*:l�,6��o~3KN?�Wf
���M�6���,��(�`�����$I�>��v����)��g\/m��@�(������i���$��^���w/8�U��������reJC��~�]����JE'��S�@�5���$i�k��jj
N�W
�����X��[p^M�\t�����������>�xE�n�;7I2T�` -���wO��*:�a��+z>[�Tt�8X����&ikK�����6�"3�����;�"g��,��q��$���~6�?��b����E���*:=�����[nI��9��4�`�X���i[�,��C���E��@���kP�0@4���$����TWWl
Q.��������~7K�9'Y�����W�N��9�����,�
i[�*K�����bE�
����#���y�M����)�����^�W�H��;��W_��*��F�[m�������-�t��rV^zi�=�tE�,���$���N��7�����X�������3��+�j&M���~�Wf�
��A�q��$��7�1�{�]�9����:��T
R��jJ����)�����>I2��3��N0�T�7���4�sO��a�=
N=�\.:t�,`PY���i[�,����]w-:���T���'I2��oNU}}�i�BJE��S�*���}����o-8	��USt��o�=k����3V��%I�����s���@�(����+�������ze^��{����,�OX~��i���N����|gEg���s������`�`��u����^]�����y���$[}�+���Tl�S�l���.����+���M������Y0��E'��Q�l����K�T
�R}}�����3���S�����X�F5�}w����\�a\p�;J����U���=�\Z<IR����`�P�lP���$��:5�c����B�A�w��$i�1��$$
��
j���$I�{��$������<ky$-��WtF�w$I`��`@?��/�����rSS���J��}����\���=
��Z��_�����1cR7mZEg�x��R5|xEg0�(��~h���&I��rJ��s���R���q
���i_�:kn�!I2��#
N�U���0���b�X���V�J��*v��_�*��kS�����7Vl����o%w����
��-=��,;��^�5���M�T��Y�����IR�J&����q
������^�S5jTF}�c�2���_�X?��d�����Yum2dX�)`�`@i}���>�DRU��K��j���
��N���r�}J��d����E'��r���;�y��d��"���)���x�mI����%�c��H�� ����StS)�Qt�:X�C�n�5I�����h�?����::��(�i��%U>��k�Q3�!����$���'����u��O���b�@OP���Q.�������|y���vm���OI��o{[��n�Mk��bs@OQ�����?�3�?������6-5[o]��������*�`�P�����7�I�To�Mj������w��=.P1��$7]�4�Pt��[�d�Z�Pl�)
�4���#I���|'#�8��4@_������):E����[�z�,��^��L�4��W�i��b���u�����Ul��2f�d�VE�����A�����r9�S��f�m���������.6&UE���t�I����.8	���{�����0�(�`PP���VXP���0x=s��Y����+���-K�����c�Q��J�h�������{uf��_�!����3�KM~���yu�I�Z�b�ZX��`�C�>�h����<��Siii��1c��N;e�}�M}}����5�����>�g�}6�V�����3n������y�������^��m����$���|$��8�Wf���
�2�Wf]=6/Y�T�)^]�:�0��0�(��G����|��_������_>|xf�����>;����h��<W]uU����;��v[���6x��Q�r�1����N��i�*��|��W������-_^�Y��k���HJ��?���>��3�b�[���tH���b��R��d���S����X�vmN8��\~���o����������4W]uU8���dy����;������\�2]tQ.���|��_�)���R�����-���K��s����#>�A�W0H�6w��'$��Pl�x
������|�C���^��zuuu��n��5*�?�xV�\����K���xGn������>=����u��W���y��^����g��5Y�`AZZZ:�����SO=5�?�x.����l��<�$i��4��w��U54d��'V|�7�{��vH�9��AV�/��/U~��O~2����3q��$%Y�^{m>���f��EI����u�Qy��2j����{���Y�f��C��3R[[������\}��9����p�����������;���+��t-�<�$���g����h���Xk����
UE`��{��|��_�r��_�j���ow�_%IUUU����g��y�2eJ����z*��~E����~�������������������*Ir�1���Cf����k��������W$�y�`�M�Vp` jm�Xk`Ij���}��_��U�:�p@N?��
�?i��|����!��y���F>���d��q=����.�]w]���wu��1c���k������f��$��+r��W���x���L��5Y�xq��n�������1��;Ic}��?u�5C���
���������?�r��s�I�T��s|p����z��I�U�V��+���>���UWW�I�W�M�81�f�������k�_�,�#Z,H�T����cNl�GoK����S���N�
���y��e��������>x`��=��:����k����-����w)�Z�hQ�i��ky��$I��i'6W���u�����.6���L���@_�����/�e����T*u��C=��~���Y�fM�
�c�6��1c��W�\YP��Z���$u����\-k:���&��]�Y^KU�xu��w_�������g'N��)S�t�[ZZ��C�P���x��.�q���x��GI�������nh�9�������~��~�]v���w�e�<��]��1cFOD�l��zk��tP}Fg��i'��a���eM�)�Z�|�:dX�9�CV����E�u�����n������[�kK��������\{�;�YP����pCV��GI��k3����$I��jxM�>�\������$��vh�	^��>h��e)��\kkk3a��M:c��I]�K�,��l��K_�RV�^��?~|���w���r���?���{��^�]jhH��i�>��gx����T��O^��L&�(:�k�c�$I���$:thJ��&�1l������������?�����:+C���+g�,Y��K�n�3,����S�-Z�Q~US�	_�r���N`K4��w�^������B���w'��^l��JV�������M>���a�g��%K����p���:���1#������s���o��s���3�����$��}��;����@��������E'�j���[jUl��LV����e_WW��g2�����i�2m��k�����|���k#F�����TWW�z��`
}��
N�[������b��G���R�����w����l�k����������c�9&�����V]]��/�<S�N��,��4�X����^VnO���N���t��#�a����J�#�����R��
>�����y��hjj����v��'�������J�\|��y�{�S�y��7���}�{_E���h[�<k�������Wp���&?��d�������| ����S��`�A�,�jllL�\N�T��k������t�g����n�k��o����?�b3'L��	&T�|hy��<�����^����U��$u������Z{[���d�����7,����_��%��,:=MV4~���J����$Ikkk�,Y������g,^������������k_�Z�k_��r��'��|���������/{e�����^�@q�u�����}�m�����*:EW5uI���S��`�A


�n���p���k�-���E�u����N=�oC.����q�]��t�I9��s+>*���)/��'I�	�����������!v��;��a���46.��b���02y�{��E'`0P��G���N]
�z����1���?���u^%��3'�����\���>�o|���a�����+S��v�O��RUU����Z�:�7�3���f�"(���v�m�\����y��e��Y�z��g��O<������.����;]}�����>�r��y������_�R�T��Nk����_�2y������W$IFw��+z���km}�9�(
���w���9���:�7�pC��r�
�~���v���93�����I��_�:G}t���:���]���~��T��`*`��>����_����W�\����U���>j�}������l��$�c�=��s�f������~��.�#�8�"o���y��iii��6s��\u�U�����L�rKK�>�@�d��>�R]]��n���M��k��Z�;VXV
��������=;�����y��s����R����n����z����#F������|��sO�����������{���������	m*���������
��+������tM��)iY]t���_���6����;������|'�Ww|��[n�y�����~��/^������r���N����7:��,|��7�����>�`?���Z����n���_���>|�Fg��h�??IR7}��+��O�%7_Pt�
2��PX}����s��g��3���v�gd��E9���2q��$I{{{~������N��E�:��8qbN9�����3�����s�=�ym��a9���r�=�l�y�rHO�`�[_�5d�N@�zi�:f�d��b��������Zt
(��>���O��y�r�u�u^������}�{�<yrF���<+V���\CCC�����=�G���??O?�t�kk����G�Y������� ����:Xt���������B�/SUt6���*?�����������<��c����W�W�����~�����~��*�E����c��/6���~���>W\qE�������n�o��a9����C����|�[`����X�U������}Gyd�<��,X� w�yg/^�����=:;��s��o���o�����r��=��7�~�)m�?��e��$C�O/8
�E��X�C��t���:uj�N�Zt�Uk��O��L�����N��5�JZ����5����6��J���V����O����6����$��q�^�	�k{��������+:���):�r
��M�����|����6sf!sxuy����T�T���@�*����S/�G?~�eMw��$5{v��|r��-���n��^��kki�X���������
��M�t��I���xG�w���4i}V��bs�KU������1����$i�{���P��X�
��MPSt�i�������L���m�-:����%y�WI����t���k]C�9��E�I�n�=I���>)�J�<�9��_�N�aC���O`��t��Y�����V�Y���$i�{����%/<�����L���,��0:����S��,�r��i���^�9��zu�`���c�a�������`@?��|y����$��s�M����3���>
{�Y�9EX�6��uI�E'�����R?��=A�s��������>=[}�E�������o�b���/:��S��\�-�$I�x`�A6�����UE��j�������v)6�+5�N����[N�s�Xo��@������Zt�
{����G�``R�=����u�<��s����?$Q�l������'���N��_�X��&u����J
����`�R�[����G����.XPX���SS;iRa�����7$w^Vt�
;����+:�Il��'��,�*54���RMM�~���>�?�Vv�[�����b��R��d�AE���)��-��pa��n����C����6u���&���b�@�T���X��'�����X�U�PlXOl!X@_��bVM}�9`���@�X�\N��o��B�I�Z�t�Z7����,�B
����O����b�j�N`�R�������~D2|�b����1��.:tP�[�������J�HZ�:���69���F�>������{��d����&5�{]�q���6w�������Nl����$��n�Ruu�i���6u��
����Nl�����N�
��{j���,(�����]�R�T��}�c��/6�u
����^x!OqDZ�|����%Q�E����Gn.:�_���@���~k�o���s���$i�{��#�����c����
}����L~k�)�oS�@���`A�d�;���g�UX��q�2d�����`��B�:yF��w��>X�[��>�$i�s��g������������r{�9�y�c�Yl`�(���jY� IR��'���nm����S$s/L�=Zt���y}�	�M��~��������:��$�{��T����S����$C��a�6�����lX�K���Y��SI��v(8
���������MJ�b��~�d���`�/�>�xR.�j��T�_t���������3���c�mH>y��)��R�@���`A��v�R�W����Hn�^�)���)��7X�K��>�$��:��$&M+;�['������d����
�S`�/�,X�$��a���0��6u�c�M��Ul��L��}��4�|s���z}v�]w%I��N���^��j����)�`�=���e�9���V����c��/6@����t�I����S��V�>�n���o�^�����g(�`�����I��}������` z~Q����E'��nh�	�����?�76�u��$I�N;�����{�^�U�:��k�)�����?����&�r���M���E�`�j~�c���d�g���^���nh�)�7Xl��?�9IR��N)�J�`�jz�k��d��b��s`�Y�������;�����k.6G����G��������b�X=j��������bs������f�TJ�����$Xl��/`�)��Q�%y���S����%��Rl�����q�f�g)��g��/O�����rZ��O��y�b�0K�X'�MR7��,�'%;�TU���G@?��k_��3�(:F�R]]j�L):@�)����N��cqV/�X���a������Y��_�����R�-��c�s�#7�"=):��P9�J�i]�0I2��������xZ;������*.���'����@�)��'���Y�xq��v��b�P����a��i�f����������J��S2$�&`@jm�Xk����,�~���'�$��m�R��*a}VMC�9`��):���pa��v��b�T�����������;���bs�@���h}��$I��������&sf��%u
E'��M@?��pa��v��b�T���:���d�6�f��I������,�~���'�$��'��_�X�����K�f*O@?��pa��v��b�F���eM�):�|�c�Ql�w(���mmi}��$I�������K��LRn/:IW�#�N�X��fM���#I�����u�����L�Xt`�^�<p]���o���������g�vdU@@pE�\)�55�.����4�-M�4���Rj�--�D�5SKE�DEE�U�}�
��� ���Y��;��^��s9��s���<�<�~���OYv�X����W�-"Z�g7������P��2A,�������%?�Q���D���#'//�i���}S�v�������v@s��f�}��l��Y�O>9�)�6�lm�����x���~_���3{yDDv������4O
`l����#"��3�D�C�n2������-��l��8��>���=g;��P`3>+���W�����r6@:-���u�>yY�C��O����1P������\�"""Z����l�tJ$"*J7����"�v�n>�Un�hl6,Y��-[Fn�N�MH�
�����nY��\�3��X�xqDD���#rrr��
�N����eA��h���"Y�{�,g�[E��������������v�M�V�Y���'D�{+�YlT�f�k������)�P�X�>*"��6bCy�3I�z�lg��)�P�����S��t��_�D��lg�_9�v��XU������h��{�3�m_����m#����\h<��b�����G�,g�3���Ug7����_�>�y��(�P�X4K?�x��lg���N����D,�*��>�,�x����5��c����m�D��=��DN^�^�g7���r��HGDD^��Y��m��g"f���,>7�������, �X_���O"""�u��m�6��P�E��X�����������~-b��YM%ZD��������Uk�|2�]sM$**��JDDT��DDD�="'''��P��x�����s�E���lg��X@V����(}��l�������v
����_�}%���YM%Zw��yXvs��L, �*�����������3���W^^��_����*�m|������n.@���&�HD�����c#��,g������Z��n���f;���\�"�6V+i��g��`[W^��5_,h�Zd;����??""��v����,g@}M{*������z��W���S���""�e��Y���J$"^�MDEIv����h�5�9[��5�������ze9����"b�G��v&
�����W��8"'';yt���svb5��5�-���w�,g�p��I��W��E�����1��h���f����W�,g�p������sDn�����7���-h�?�����#"�e��Y�������z�o#:��n.�En��/���.��(/��������1Q��D"�,����ze9����<"�a����\�l'4O>�4����g�,g4�������,_����3�1S���w���=QY��<6,[y��Gn�VY�h����x�����o�������X��,=:J'O�vI�;����f`������Ft�����~-�13��ITTD�;�DDD��~7r
��ON^^t�����4W���`J������6��q������Y)�5+�����m��������vJ@���x��lg�]d;"��f���w#""� ���++����2�����K&�F���lg@�X���M����#���T�n�k~��]���\h�r���9��*�s�,gdS�V���@��4#��j��Y�������
`�--������E��Y�4���x�������[�n�k������(���a��(}���Db���{/9d�cj��V��`��9s"����5Zt����@�{���E���s����yS�H$1����|��l�� Z��G�S�M�]�jQ����%n|������l��=f6&|F,�����7�j�2Z��k��sr��^}�����-�����/�����a�VF�sr���lg�==G���, s��*�<�DDD�=�����cY���U7����h�}����6�#�}%�Y@f)�U�;6""�w\�3���|�����D�qvs2C,�	�%%�()i�8�-��)S"rs���G7x<��X-[g7 s���[���1o��H��g,f��F��]3���
`�+���X4z�������i�*:}����E���E�#��f6�'37�*���X4z��&ED����O;����DNnn���F���D������4
`��%**�t����(<������rF�t}������"
�e6v�V{���@�(�@�V6mZ$JK#�c�h9`@���)]��?F�[��L2g����_�8b����h���Q+�4)""
��7rrr��
���"�>��,�c�>��h���Q��V�~�e9���U_�1�����I�zEl�c���:�������U>�aC�c?�LDD*�E������c���O�n.M�XT+�H��SO���S��Dn�Xd\������d7��H,�U���Q6uj�F�s��J�-z��Jl���#���q>���@�)�@�������������f9�"�x0b}y��)[1����QU�����(��A�����'?�
K��g�D"*��c��%QYV��5�(�:5"":��
�>M���D����������Q�1b��
��Q ���v[����l�Qkm?<
��3�i���Z��u��"�����rr#�����a��p���DEE�������x���j�]��nNaa�u���[�e�M�������o��i������X<#s1�.��:���>_�\\�M
`d�����F^����7���V���M��3��|��]v�|\�=
`���?�y�}��������
K����+��f�������s�j���OfF���v&������v�8������GD��2�m�X�6����c�5�d;�Z��n��t���N����J��?�v���W�{d;��X�6i�o�����|�%�Y4//��t��N�"'77=kV
��k��n� kS?��6�t�h�=���C^��}N�v�y
`i�H$�r����ti$��O��%%����""��UWE�CI{���5_q�����:��X����g�����,�Hl�����k�h=|x���y(]����Cv���@,h������+#Q\���s����V���nDDNaat������i������/�����bT�D�]�p�W���KA�����J,h��>�t��A�v���L���������C��n���h|�}"b��lg�~�y=v�v��)�iV^TEEi[���$6,Y�k��m�/Z5fLDDt��w#�_��A�S���999���
$'�m���h��h�.��}��@s��Q��y1{��H��f;�������??�Y�
)/�������
Uh���4Z���G��4r;v��={�g���h��{��o999�Y��6G-{�n��i���[�U���l���4Z�����������f9��E�#���\��e_[��\L��P����(J�x#"77�}��N�f�xy�����\����3��)�@�T<aB�{����Y����z��h��[Z�����iOE��8�����O6�j�6�������?�S�����hv6�Y��:*��5���O>�A��~>���
���a��?��k����)�@��������u�b����	'�u���]���g�uM�c������G88��4�������v5������="":|�;�����r6��w�1���D"���\���������EYL��5}�QL�4),X�����S��m�����������H$�������~;�,Y��w����+�999Y�
��6�\���wDD�?��,g���x_������n����Pk�����/~��x���6�~��mc��Qq�5�D�.]2�WEEE�v�m����&.\��1�z���.�(.���h��e�r�������|'*��i�X���E��<���=�h�x5Q�.��4�Y�\�2b����>�g���N��,��~P��@�F���,F�>�`����]�������{<��#1l���m���q�q���)S��`�����K���k�;6z��������7��o�����������yoE�������I���E�2b�+��X�Xeee�r�)1v��������q��C�QTT�V�J��t��8��#c��q���|��r[�dI�1">���������i�����2������4���o�#F��W_}5�t��`���Dyy�y�������?D��wo��9�[G��!
�&�M�B�����Rk���u�V#��_�j��W��{n\}����;D��"Yc����.�(��������O>9�M�:th��F��R���� n���8����u��Q\\w�yg\y���BX~�a|�;��'�x�A��=�/��+WF^�n����"'�������dfM�F�3u�V�n|=����O�n.�)
`5R�~�i\w�u)}�_}���?N�����N8!��o�8���b��9�`�����[��k�M{n�>�l��_�J�[�l�<�L6,e\�6m���/�!C�������3^|��1bD�s�=k�����h��o���UEY�_��(_���2�}�lg��V#u�M7��5k��a�����_���={�����;F������[��.���;�5����:����x��W_4|����������e������W^y%�y��H$b��������h��'�X���o,~��2b�}��T���.���lg���H$�N�T�����G�X�ti���^�#Flu��a����_N�o�����������}��<xp���M�X�hQ�k���yk������>����}��O��w�=m���{��{��G�=m��4hP����b�k���#�sv�(*sZe$fn�����#'7��k�[1����}#F=������O�
�u�������i����C�����G��z����Zk���)��O>y���""��k'�tR�3&%�l�6o�=��G���E]N�l�q�Yf���Yh8
`5BO=�TJ��C�����=��CS��������h��M��v�a��x����R��'��+��"-y�Q�vm����c�N�DD���Gl�'�I�Bn����g;`k�j��~�����X��;��C���7������1}���w�}��W"��w�y���
:4�=u��H$5.���5/���Q�X�; ���Zb��X��!""�:!���YNhr�j�f����8p`��80Y����Qk����n��d�M�6���;�x~�>}�u���5���c����Z����x��������T���v�zg;�)R��)))�y������]�
4U���9��ymn������/�3s�L����E+b��EQY���Tj�������#:Dt��6F~{N�S�������i�h�-'Zd;�)R��Y�lY$�d�e����[�Z���g����%K��[�uz��U�5z���R+]��t���z<z�'���q�N�v��o}��������#��42
`52k��Mi�n�:rrrj�F�6m�]����S5NM4TnK�,��K��j��Y��;�����X��K����D"��'��N�����F^�g9���i�6
w�1�:�v��h�jd��*((�������YW�9��o�=���������~vu���?�N#s�������������U�����jdJKKS�����^�U��
A%%%���3�9������lB�������Q0xp�Z��@�V#SPP��.//��eee��YW�9��d��O�v
P/
`52m��Mi����z����j������y��'�tR����5+�?����jN�F�jA�u��E"������Q\\\�����j��h���u���uK�Z@���v����KJ�����X�dI��X�paJ;]�����`��Z��P��������q�S����W�5���m����WD�������?~���:']�����E��O�^��3f��v�����O&����1w����;wn�[�.�n��M���;-����N�M������3�$����j�q�5��h���3gN���e�8p`Z����������Sr���O�����+)���GNNNZr��������Y���	l{����Z��:
`5B�sL�x�����q�"�H��X���>��1bD�m�6��}��s�=���7k4����Ki{��i��.�����>�����4����!C��hln�Bx����K�d{���1~������{R��w\:S����)��~8��]��yk����~�As�
`5B���1j����k��6�D�����x�����v����'�������o��v�������:���n����d�����57`����ZU%�b��e��_�X�vm�����������p��8���b��9�����*~��_T''''����/�!�R�����q��G&�-[��q����a�6;~��	q���FEEE�o��q���}��8
m���1a��d�w����U�,f�u�f����?>�~���c���K�3�{h:������������{h����b���������c��5����r���t�W^ye\y����+��"���W]uU���QYYO<�D\x��1o����v�!.������#���;,�}���������?<n���8����u��Q\\w�uW\q�)���:���������cw�q�N�^�
�v@��@�aM��=4���t��@�3d��:��Ms����_�sLJ�w�;��c���?��;w�N8!��Uaaa<��C5��V�����/�.--��.�(�t�{��G4(�t�_|q���&����?���`y��X�Xnnn<���q�����o��!f��S�L��+W����s�x���c���
�[�����_����+����$�{���>}zJ�������;^|�����k��4n
`5r����5y���{���8�M�6q�y�������C�Hn}���I�&��7�;�������q�M7����w���
h�Zd;j��O�O<1f��'N��Fyyyt��1v�}�:th�z�D"Q��������.�K/�4�|���:uj,Y�$""�u�{��w2$rs�Z6Rk3`��0`@���Dnnn��������f;����v4/
`�Q
`�Q
`�Q
`�Q
`�Q-��Ps]�v�k��&�
l�������������{h:�����I$�l'@����h^� �� �� �� �� �� �� �� �� �� �� �� �Zd;���>�(&M�,�������S���nq��FAAAZb����������~�X�"����W�^�����N;��������m\����������9sb����f���������G���c�������G^^^��|���������y�b��%Q\\yyy��c����g���>����������K�����}�Q�X�"�Dt��)z��p@l��vi��~���8qbL�6->����������>��g�4hPZc����93�N�,�u��Eaaat��=v�e��k���U�V��Q\\'N�>� V�X:t�~���{��{��w����{�L�M3u^��\�U�-�>� �����-�u��E~~~t��!���_����r�e������FQQQ,X� V�Zeee��]����S4(��s����O�_U71s��x�����O>�5k�D��m�g���c���M���.\���Z��;7JJJ�}����.��Am��Mk,��L��������=|��h6����/~o���f�o��m�5*�������K�b,]�4����3fLov�>��W_}uw�qu�Q_�����`���#���q���W^���?��__��:�7������c��v�Q�e������/��rL�4)>�����4hP�=:�9��h��u���Gyyy<��3��SO���?�f��������w�}�����SO=5Z������k��
7�w�qG,_�|�cv�u�����c��Q���S�X4_k�����������;����8.???��o���������k���_�[n�%�~��(//����={����\rI8��q�����f��oK����O��3�N����,\�0&M�'N�I�&����c��5������L�M3u^��\JC�����>�`����1y��X�l�V����~���~7�8��Z�ey�����'��W^y%�M�eee��/,,�O<1�?���o��j�>�����G���{.����DII��v��!���o��^;��s��N�0!~�������7�~~~~�r�)����<���[�X4�����L������tz��wc�}�������{��7F�U�5�����I$�l'
���,F�>�`��w��5y��6lX���?>N:��}y��o;�����=]&S�!��_�-�z����z^��-��+��k��f�E����zh�����_�w�}q���i~M�3&~��&��S���o<���u:0�����q�W���_t�����������C�c�|=���q�Yg�'�|R�9��w����x��U���������/����;��s�=�Vs�����g|��_�������`K^y������c���[}HD:~<���i&����k@�eb��w��g�]����{�����{��G��t�A��+��:NNNN�{��q���F�V�j=�&���b���1q��Z��������..���Z?p.�H���_����j4�M�6q�}���'�X�<��L�����Y�L�J�
6�W���x��76y�.�������c3`TYY��rJ�;6�?///v�q����C��U���-]�4�<��7n\|�+_�Q����?q�QGm����;F�~�b��1����aC�����?��]�<�H�����L]���-h


�{����X�lY��7/�X����"�����?~�s�=u���K����{�k�.��[�����UQQQv�a1v��8�����wm��i��X��[�n��{������?�8-Z���o�x`���K�����8���3��_��&?�i��m���NQRRs��Iyb�3�<Gyd���QPPP������[o�K.�$�>���� v�a����K�����E�j�c��.\�vXL�>}���w���w�V�Z��+b��9�~��:�I�U�V���������=�y��7����H�L�M3y^��\B&��Um�����K�h��M�]�6���k��M���o�������������NqZ�l�������������(*++�c�D�q�1g��x����a[,~UPP�����1k��(//O�_^^?������(~����*�\����R�rrr�W�^��k��7o^��*���q�)���?'�pB�b�}���g��M&�5�[o�u�����=|���v��~��_m����s��y������c��)�|��x��Gc�wL�Y�n]�|��)�d��q�)��D���O<����|��x������(�����sN��G}4n���z��[����m\�M;��C�}����?�9f�����1s���4iRL�<9����~�i�y����W��������{��j������������g�}6>���X�tiL�6-^{���:uj,_�<�M���~���%�����i����/�Z�l'�pB<����p�����O��w����'��3f��3�<3e��e���#��u���(����7y��v�m��w_,_�<�N�|�A,^�8~���Dn���^{������������s�=���0���G����b�����G�����w���K�������s�x��5��������#�H9���S����c����x���:ujL�4)>���(..��_=~���F�����7���~��X�paDl|2{}�@}�m�6mkero���2u�Z�
��������#����e���K�j��������w���^{-�}��X�jUL�4)���o��]�|y�r�)QVVV�X�m�]|�[�����+�O�����Y�f��o��&M�Y�f��������&������]w]�������/~����+���W����g��I�������+W��������O���o�}�bV�y���6��'���3c��y���o���Kc��q1x����
6�g�s�����@���=~Df��d��PC������?�i�]�s=��@D$��Z�lY�]�v��H�w���oq��}��M����t�q�����9���K,\�p��������:tH,_��NcMd�:$��Z�m�:uj�������/_�2dH�^s���Ol��a�s�.]�X�`A��z��g���)q.���Z�QS�\rI�]�v����:�x�������999u�����L���S��{�����>�`��-Z$>�����y����=d��-��_j<����G���W>|xb��e5�[YY�X�bE�sJ�_|1�����M�t�M)G�>}j����l�������D�v��rH�G?�Q���N��3'���/�k?�E���f��L]�4�L�����_����3fLJ��H�~��[�7m��DEEE�����&�8���8�Z�j�{�k��IDDb����g�y�Fg��/_��w�}S����c��O?������M����{���\�2��/9e�����Z��dW���'�;k���C�VYY�1bD2�c�=61|���kv����x=��`��D��q�	�������nJ��
�������-�y���c����v�v����(:w����K�.��v�)��]��7n\|�k_�b�D"�rH���K��+�����*����m\��3f��A�R���K/����8W\qE�p�
��N;�}�QZcDD��?���v�-�t�R�y?��S���g�X�`A�s���c��1��d�=�����w��w����<�l�v�i����*_���~�����/&�=�P�t�Ii�1~����W���\���������u��i��n%%%���{&?[\x��q�����#�c���S�'��@M|��GQVV���[�����7~��:�G�(�{�L���+������}]}�������o��W���x����g������X�fM�������O?=�q����������>�V�>����e�]���8�w��w��g�]��;��#�;��d{��w�w�y'


�8g�����/})���#""///�M����[�r {2����Y�L�jw�yg�s�9��m��>}z�~��1a����{��7F�U������r�>�=���q�������g?��C_D��������Y�&z��-������rm��a�D������k��&��O�S4D-�L]���-h^v�}��g�}R�f����8����R��g�������9���j]�*b�b_��/\�0�M�V��g�y&��U��}��3��j���5~��X�jU�s��;vl���N:�A����?L�on��E�}�����UD��W_�,~���;�/��z���=5���8p�&?�I�L�M3y^��\R&��uU��MC�������k~��
+??����""v�a�8��3R��y��������S�W\qE���""��rJ��a��M>'��ej����6�:;�n.��.�,������w��u^�=|�\��F���W_��K�&�;��Sr�!5�;z������?���c���v���1"����l/^�8^�����L]���-h~�����^�lY�������O����w����KJ��y���Suo��gn�K����b����vEEE<���������;�LiW�w:���1e��d��������=N��������&����m��������Xdjo���2u�Z�\e�<O6b�����3=,���z+�n��m�|��5�Uu_�3	d��M&�5���;/������/~���k=���s
`�$=��S)�C=�F?��l��?>���7�v��x���R�;��������#G��=���5�[�������)--Miw����c4T�����SJ��/���������#6�ao@U.Ly���{��
J{�{��'�]����QEEE�=:6l��ny�1��kM��h,2�7��y��r-h�2q�'����gz�m���Q��C�F������3g��~X�Lh2u�&Sg���o�[<����E�����"7�~?�w>�M��o���>��k<w�v��}�&����1}��M����{QQQ�l���/z��Q�8C�MiW���9s�DNNN�s���vN&�CD��lM"��7�x#�o�}�I{��'��w�m���b[��o�����1c���g.\�������~��'�x��d�U�V1d�����`k���'<ED�1�A�T= V��#�E]��o���_���nDl��o��z���=�E&���:/��Q�F�|5jT��������z��!���'��1cR��_��[m��D�o��E��o���]��-Sgm2uv�3����9�~�i\p���%�\��wn������I�1cFJ{�����_u|��2��2���p-h^���?���l���n�����������S��8���������X�`AJ��;����U�����������5kV�_����h����k�����2eJ\p���^{E�N��u����o�8��C�����&?����������:t����k������vX���7Z�j]�v�=��3�=��x���"�H��/������u�]�l�x�������@c���ic��4W%%%q�-���5�Y���>^��d{����c�=�Ab���/����e�]�o@C��Y�L�J�/�0�.]����k��&-�����Zd;H�����7o^J_���k�F��3g��dL�����;wn���FAAA����L]���7�k@�r�}��y���l�����~�����I[��+W����&LH����nq���-F:�3&���w�=���������w��5


���4"6>I������[4/U����N�v������O��&����s���q���O��������k���-[�*FD��q���3�H)��l��X�lYL�6-���?�>����~{���nIeee�=:���#"������>;-k�@c���i&����k@s�p��8�����>H�r�!q�)��=��O?������w��7G������V�^�<�HJ�QGU��t����3�<k���C����O��>�l������z��>�R�&g��e)?�n��et���Vk���3��d��M�T����W�bt��=Z�h������?p���O7�]W����ol�����>H�����"V�X��M��c������������w�_���jg��	QQQ�l�[�.-Z���z<��c�j���{���K����N��Y��h����o~��7j��j��wo��;����S�T����5+������
�)S�lunIII\����o���>����Q�����<����k���7�|3���_��N������o�|
�g�a�U���{�L�M3y^��\���������S���],����?��ODIII��8 }��:��?~��7l��V��3f��O?�&MJ�������/�zf&�~��_���k��.]��1�S���K���k�Y���-��Y�L�J�5k������l�~��1r�����>�R�&��_ED�n���_��i���57�Wu�����Daaa�Y���8u�������v-hZn�����������GqD\����^{�)�q��R�js:t���w^\y����m�:�i�D"�:��X�zu��g�������y���on��=����L�q�$�����1�GuT���+���c��)��?�9�I�����Q�F�?�����Y�reJ��?���:+yh�W�^��o}+��{�h��M,X� �|��x����sJKK��SO�W_}5��g�t���UTTW]uU�}�W�n������������4��e����)Z�vmz��[��{����K���.��-[�)�?��������:n���q�u������������q�-���]u�U��u�-�)))�
6�������=[���6�:;�.�_~y��??"6������� �X49U?��z����j�Lg���h�o��5������[3�����t9�����.�s���h��}\v�eq��g�����9s&���������N������z�-��#h~V�Z��}���z+"":w��=�X|��)��r�)q�UW�9����_���>�h�����o{�8U����{��5*~���o�#�s�=7^|����7���_^^���7c��������R����/��w������n���W^Y�u���{�L�M�q�{��11f������T�{������$N?��:����}�kq�����a�j5o��Q1j���I*"�,Y��zjJ1�}��7~��T;os{��������L������/��=��������?�!������K�.�^gK���T��N����4����_�5Z�j��.))�Z���d~��Z��<��Cq�A��a�b��Y
c�������$���?�������A�����c����J�;��s��_��V������t�*///�z��M�}�m����?�9;���������fOm)���������#F���c#7����>���x���6;������7n\Dl|���w�Y�=xu��h,����k@s��'��\;��c�|��u~�DM<���q��G�^{��'On�8�QVV'�pB��??���]���_�yyy�����������-��Y�L������=ztr��#Gn��V]b|�{�4w
`��T�t\�����U�f&��U&�k�����7��M$�����������O>�G�Ny���/����o���\�2���2V�\��M����+��WVV7�xc}���=l�I���z�v�iQYY��;����7��M��������7<���b����vnnnn�q�)�f��&L�Q�-Z��������6��a�69�v��wV;�.-Z�^zi�}�Ygm�_}���X8������������c�y�
6����������������{&��Y�&.���8��3R����E]����,-Z�<�L\t�E��c���w�}7�O=�T:��:����o}�[����&�������lu����������%�:k���C�u�5���~�����?�!�1���T
`���m�6�]��W�t\u�L���L����M[aaa���+�>��������w�����;����+������+W�9FNNNt��!
g�uV��?��x ��)����K.��I����{q��G��u��}{��W�������.[bo@C�����������v�)F�����Cl��s�GD���k����nJ{���u:dV������(=z���n�)������y�-����MWnnnt��)���/����S�N�_���)?�����7�|s�c���G�=����[o�5����������SO����z�����;/y��d;'''����8��ck4s{��������L�������x���R>����?�����5F�{�P�X49U?��[�.�D��(..�v���U��5�D"���:l���]���s�=�������W��UZ�����o�w�})}w�qG��93�qj���(;��X�|y�o��w�g�y&:t�P�u�����{{>SXXyyy)}����/}�K5^c���)���'o2fs{��������Faaa�]ZZ���n��o��?�=�X�}�m��<�>��������4��e����9����K.�$������k��6V�X��X��w�'�x"���[�vm\u�Ui�SSW\qE���L�������3���������%����L�������Z�~}|�;��
6DD������K/M��_�>�R�&�K�.)O�����%K��j�����u�����},�U�O>�$��_�l���F�.]j�Fu2u6�����O�.]��k�M�3fL���r�)1l��d;�H������8�����c������'�z����������j����?���5h�����5��j�]wMio���������K�c�h�b�'7���zu~��%�}��G��'�����r���"S{�L���+�����K.��v�)�...�Gy$�q
����uJ��?\�����
7�7�pCJ�O������k�V��]S���,a��d��M&���<S�N���������h��E���"�� �X49������;����7�VkT��n�m2��������O�j��d�:D4�k@�t�	'�|)������s����FJ��W_M{�-Y�lY�92f�������[�7n��5Q����%K���4����O9����{J�}����_u���
_5FC����+W&���SOENN�V�1bD�s���d��o��I,��h,2�7��y��r-h�Z�h_���S��������s���vEEEL�<�Abm�������+R�.���M�WS��,a�g2y�&g����gz*++������	&��s��g�����o�=|H�MR�j��O���3fT�^�b�W�r���O��c���K�[�xq��T}ZMC���U�V���������c<����z��U����GQ^^^��U�����o����m8p`J����V��Xp5"�u��[��Pq����Xdro������]������F��}3�����?�?�����|�;q����yM�{J&��d�����>�M��{�����Sa-Zs��I�[�l����
��-[&�s���E��8�+������s:d�:Dl�""e��-�(..���>:�z��d_��m�_��W���^u^�G���G�d���,�|�����`k������Oj5��%)�/>���}U���q����Xdro���2u�Z@�L���d������|'�D����O����+rrr��n}������I�&U��W&��d�����=|��X4I�sLJ{��q)_ U��g�Mi�1"��m���v����a�R��{���H$1n����c�=�Fsk#�!b��4?k��������u��=�q�����1����,�?�������c�����G}tJ��{���������>:rs?�z���h�}{u�h�u�]7;��_�z�����'���R�v�e�����c��s�=W��~��_����{�M�0`�X���Xdro���2u�Z��e��M"��y��e$�g����i��6lH�}�����|?RU������Q\\\�����J�[�.��e�]�����L�������8��k}�������������(���������>|N,��<0�t��l��=;��_����sOJ�������������_|1������������_�����������SO=��P��]c���O{����)��_`��������ON�qK��-�����~��i�Quo��������>�(&L����QG���h:�u�C�M�{��Gk4w�����c���r�!�{�	'��������Q�Gy$�������1����#G���}��'e����M�l����4���f��L]�4W�D"�|�����:k3q��X�ti���E�8p`�����0aB�x��Q^^��1bD<��#��e�z���w������l�]�6z�����`k2u�&Sg���w���>�3r�����S�:LyK�y����)�E�����F�J����k������>^~��d�]�vq��'oq����m��I�_z��x�����H$��k�M�;��3��D����u�h�������$������c�9&�{�^x!�y����������2F�O<�D�/777x��M��R�~x���+��3gN�{��[�����,����'�:tH[^4��sNJ�W��U���mu�]w��/N���o�~�f�><�	��������o�1��[7�|sJ����7v���Xdjo���2u�Z�\�{��������U-����q�W��|����0=]&O��{l���$�8��x��'��� mqF�����������93f���������>'@&��d�����=|��S�4Y�_~y���'L�7�x��/\�0�:����/�0��rU��u���)}g�uV|���[�s����K/��lw��!~��mq�g���999)���3g��2q"2{-h>.���x��7j5g������=>���d_^^^\|���?s�����+c�������K/��'������������}��M���3f�s������>�l�����w���/�Z�j?��OR�.����>}����/�x ������G8��o~�����{&�|�A�s�9�>5r���q�e����w�y[,�������/S�.���x����c��
1z��(**J��i�&�?��j��������h,2�7��y���Q�F�|�������y�0aB�t�M�n��Z�{����{��^J�I'�}��������.�{��Z�Y�n]|���������_z��[�;f����}��}�:�����#�8"��Y���{���_��W�^<�>���q���>� .���-�@~�����o;����}��vZ80�y����Y�L��L]��g�{���X4Y]�t�+��2���+����;/��Xeee<���q���� e�v�K.�d�q.������G�]TTx`<��)_$-X� �=��M~H����$��n���y5��������g�}6��o������[n���~;***6�H$�����_��������q�R�����S�$����������w��q����#�<������q���i���rH�\�2�^�V�����}�������k��6���?���x����w�7n\���={�V��=:
�l�X�">������c����������W_��~z��s�9'v�e�z��4U���q����������8�����7�L�j�����[b����v��d�.����������'�����#���n���W���<yr�92�������r�-��s�Z��������+������U�����[�]��"2�7��y��r-hH
��_�bE\~����g�=zt<�����'�lv��5k��'����>:N>���BL�m�]�|����o��Fv�a��{�/~���4iR���lv��9s��[o���<d.b�wGuT���b��Eq�a����~��k��M\v�e1y��Z����������R����?��'�~�aJ�/�|pL�<9���m����^���l��=�L������m�{��QNbK�z�&���2�;��x��'S�����O�>��C�(**J��zDDaaa<��s1t���y�������������;F�~�b���1o����aC���w\<��c5����9s�_�~)}EEE5z�L��CDf����{�S�NM������={F��#???��Y���Oy���q���?�)rs7_�����/}�K��w��)�u�:t�������+c�����e#6�z�����#������o��;wn�}���V�4�C9$&L�P�����k�����g[7c��8���b���)�m������GIIImR�l�������GaaaZ��������?��&�=z��^�zEqqq|��G)?������s����[,r�E�-��C��<i2b������G�6mb���x��M��}��q��wn5F}�������c���v�>}R�����lM�{�uq�g��1c����i����5*����d�&��3M�Z�x4������N8a���]�F�.]�}��Q^^��/�y����~���c�x���c��!��p������cS�����W�^��c�(,,�5k���+V����zh<��QPPPm���1c���g��lo�~|����U����w�yq�w�����D����k��1w��X�lY���������=���'m��9������6�����������g������������������x�����SOM���aC��=;�L�������;��O?]�}��
���zj��*�\�2�L�EEE�D;������{F~0�����������(**�)S����c����-~��}�������{��b����X�"f���&M���z+f�����W_������_�q��m����/��B���'����1u�����6)~5r��x��g��F.�����o-[�L�_�xqL�<9f�����]w�5^{��`���~�����^�/��)����1c���<y�&�rss�g?�Y��m�������4��e����)Y�ti��1#&N�S�L��s�n�����o���V�_m��
b���1u��x��������l��V�Z����x���jT�j[����..�����D"����7�|s��W�[�������_�U�<k���C���@,�������_��<�H����[��M�8���b���q�!��:�W����>}z|�{����[oq�������?�>�`�j���q�*S�!��_���_��o��#GF����:>'''����b��Y���}o�?4hP�����.� yyy[�SXX�w\<�������W�������^�����W\�:u����w�9����x��g�c���K�m�������N�r�)�f��~���m�����N��������W�x����w��]�����Z�j'�pBL�:5����Z��V�@c���i&����k������G}4�>���u�]kT��}��q�i����?�>�l����F�n��������8��c�s��5�3`�����k��>��������U���q�-��/�|������������i����O�`�l�2y�&g�������$6�H
h�f��'N��Fyyyt��1v�}�:th���RRR���j��1#V�\�����g����c��i�Q_�����`�PYY~�a��5+����W�����h��]t��!���C��Q����������>�%K����k#777:t��:u�A����kT(�)�����'��i���O?�����~��c��!M�	:d������W_�?�0V�Zm��������!Cb�]wM[�i����)S���?�������K���':��jl���@c���i�����k��h���1}��(**�%K�Dqqq���G��s�����{�.��R�BY[STT|�A��;7V�Zeee��M����C���;�R�BYM����W_�y��Eiii�k�.v�y�8����}�
2u�&Sg������(�@F�f;���(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(������n{B{��IEND�B`�
v1-0004-Replace-uses-of-blkno-local-variable-in-lazy_scan.patchtext/x-patch; charset=US-ASCII; name=v1-0004-Replace-uses-of-blkno-local-variable-in-lazy_scan.patchDownload
From 67781cc2511bb7d62ccc9461f1787272820abcc4 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:07:50 -0400
Subject: [PATCH v1 4/9] Replace uses of blkno local variable in
 lazy_scan_heap()

Progress reporting and free space range vacuuming expects to be passed
rel_pages outside of the main loop in lazy_scan_heap(). We previously
solved this by setting blkno to rel_pages after vacuuming the last block
of the relation.

Change this to use rel_pages. With that, blkno is used only in the main
loop in lazy_scan_heap(), eliminating the requirement that it be set to
rel_pages after vacuuming the last block. This opens up code
simplification opportunities elsewhere in lazy_scan_heap() helpers.
---
 src/backend/access/heap/vacuumlazy.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index d80231fc727..1d922b5a831 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -1042,7 +1042,8 @@ lazy_scan_heap(LVRelState *vacrel)
 		ReleaseBuffer(vmbuffer);
 
 	/* report that everything is now scanned */
-	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
+	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED,
+								 rel_pages);
 
 	/* now we can compute the new value for pg_class.reltuples */
 	vacrel->new_live_tuples = vac_estimate_reltuples(vacrel->rel, rel_pages,
@@ -1068,11 +1069,13 @@ lazy_scan_heap(LVRelState *vacrel)
 	 * Vacuum the remainder of the Free Space Map.  We must do this whether or
 	 * not there were indexes, and whether or not we bypassed index vacuuming.
 	 */
-	if (blkno > next_fsm_block_to_vacuum)
-		FreeSpaceMapVacuumRange(vacrel->rel, next_fsm_block_to_vacuum, blkno);
+	if (rel_pages > next_fsm_block_to_vacuum)
+		FreeSpaceMapVacuumRange(vacrel->rel, next_fsm_block_to_vacuum,
+								rel_pages);
 
 	/* report all blocks vacuumed */
-	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_VACUUMED, blkno);
+	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_VACUUMED,
+								 rel_pages);
 
 	/* Do final index cleanup (call each index's amvacuumcleanup routine) */
 	if (vacrel->nindexes > 0 && vacrel->do_index_cleanup)
@@ -1114,7 +1117,6 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 			ReleaseBuffer(vacrel->next_unskippable_vmbuffer);
 			vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 		}
-		*blkno = vacrel->rel_pages;
 		return false;
 	}
 
-- 
2.34.1

v1-0003-Count-pages-set-all-visible-and-all-frozen-in-VM-.patchtext/x-patch; charset=US-ASCII; name=v1-0003-Count-pages-set-all-visible-and-all-frozen-in-VM-.patchDownload
From c317a272713bb833f7f2761a5be1924f8e1bdb4d Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Thu, 31 Oct 2024 18:19:18 -0400
Subject: [PATCH v1 3/9] Count pages set all-visible and all-frozen in VM
 during vacuum

Vacuum already counts and logs pages with newly frozen tuples. Count and
log pages set all-frozen in the VM too. This includes pages that are
empty before or after vacuuming.

While we are at it, count and log the number of pages vacuum set
all-visible. Pages that are all-visible but not all-frozen are debt for
future aggressive vacuums. The newly all-visible and all-frozen counts
give us visiblity into the rate at which this debt is being accrued and
paid down.

ci-os-only:
---
 src/backend/access/heap/vacuumlazy.c | 88 ++++++++++++++++++++++++----
 1 file changed, 76 insertions(+), 12 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index a74ba75dde1..d80231fc727 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -189,6 +189,8 @@ typedef struct LVRelState
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber tuple_freeze_pages; /* # pages with newly frozen tuples */
+	BlockNumber vm_page_freezes;	/* # pages newly set all-frozen in VM */
+	BlockNumber vm_page_visibles;	/* # pages newly set all-visible in the VM */
 	BlockNumber lpdead_item_pages;	/* # pages with LP_DEAD items */
 	BlockNumber missed_dead_pages;	/* # pages with missed dead tuples */
 	BlockNumber nonempty_pages; /* actually, last nonempty page + 1 */
@@ -702,6 +704,9 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 100.0 * vacrel->tuple_freeze_pages /
 							 orig_rel_pages,
 							 (long long) vacrel->tuples_frozen);
+			appendStringInfo(&buf, _("visibility map: %u pages set all-visible, %u pages set all-frozen.\n"),
+							 vacrel->vm_page_visibles,
+							 vacrel->vm_page_freezes);
 			if (vacrel->do_index_vacuuming)
 			{
 				if (vacrel->nindexes == 0 || vacrel->num_index_scans == 0)
@@ -1357,6 +1362,8 @@ lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
 		 */
 		if (!PageIsAllVisible(page))
 		{
+			uint8		old_vmbits;
+
 			START_CRIT_SECTION();
 
 			/* mark buffer dirty before writing a WAL record */
@@ -1376,10 +1383,22 @@ lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
 				log_newpage_buffer(buf, true);
 
 			PageSetAllVisible(page);
-			visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr,
-							  vmbuffer, InvalidTransactionId,
-							  VISIBILITYMAP_ALL_VISIBLE | VISIBILITYMAP_ALL_FROZEN);
+			old_vmbits = visibilitymap_set(vacrel->rel, blkno, buf,
+										   InvalidXLogRecPtr,
+										   vmbuffer, InvalidTransactionId,
+										   VISIBILITYMAP_ALL_VISIBLE |
+										   VISIBILITYMAP_ALL_FROZEN);
 			END_CRIT_SECTION();
+
+			/*
+			 * If the page wasn't already set all-visible and all-frozen in
+			 * the VM, count it as newly set for logging.
+			 */
+			if ((old_vmbits & VISIBILITYMAP_ALL_VISIBLE) == 0)
+				vacrel->vm_page_visibles++;
+
+			if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0)
+				vacrel->vm_page_freezes++;
 		}
 
 		freespace = PageGetHeapFreeSpace(page);
@@ -1533,6 +1552,7 @@ lazy_scan_prune(LVRelState *vacrel,
 	 */
 	if (!all_visible_according_to_vm && presult.all_visible)
 	{
+		uint8		old_vmbits;
 		uint8		flags = VISIBILITYMAP_ALL_VISIBLE;
 
 		if (presult.all_frozen)
@@ -1556,9 +1576,21 @@ lazy_scan_prune(LVRelState *vacrel,
 		 */
 		PageSetAllVisible(page);
 		MarkBufferDirty(buf);
-		visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr,
-						  vmbuffer, presult.vm_conflict_horizon,
-						  flags);
+		old_vmbits = visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr,
+									   vmbuffer,
+									   presult.vm_conflict_horizon,
+									   flags);
+
+		/*
+		 * If the page wasn't already set all-visible and all-frozen in the
+		 * VM, count it as newly set for logging.
+		 */
+		if ((old_vmbits & VISIBILITYMAP_ALL_VISIBLE) == 0)
+			vacrel->vm_page_visibles++;
+
+		if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0
+			&& presult.all_frozen)
+			vacrel->vm_page_freezes++;
 	}
 
 	/*
@@ -1608,6 +1640,8 @@ lazy_scan_prune(LVRelState *vacrel,
 	else if (all_visible_according_to_vm && presult.all_visible &&
 			 presult.all_frozen && !VM_ALL_FROZEN(vacrel->rel, blkno, &vmbuffer))
 	{
+		uint8		old_vmbits;
+
 		/*
 		 * Avoid relying on all_visible_according_to_vm as a proxy for the
 		 * page-level PD_ALL_VISIBLE bit being set, since it might have become
@@ -1627,10 +1661,26 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * was logged when the page's tuples were frozen.
 		 */
 		Assert(!TransactionIdIsValid(presult.vm_conflict_horizon));
-		visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr,
-						  vmbuffer, InvalidTransactionId,
-						  VISIBILITYMAP_ALL_VISIBLE |
-						  VISIBILITYMAP_ALL_FROZEN);
+		old_vmbits = visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr,
+									   vmbuffer, InvalidTransactionId,
+									   VISIBILITYMAP_ALL_VISIBLE |
+									   VISIBILITYMAP_ALL_FROZEN);
+
+		/*
+		 * The page was likely already set all-visible in the VM. However,
+		 * there is a small chance that it was modified sometime between
+		 * setting all_visible_according_to_vm and checking the visibility
+		 * during pruning. Check old_vmbits anyway to ensure the value of
+		 * vm_page_visibles is accurate.
+		 */
+		if ((old_vmbits & VISIBILITYMAP_ALL_VISIBLE) == 0)
+			vacrel->vm_page_visibles++;
+
+		/*
+		 * We already checked that the page was not set all-frozen in the VM
+		 * above, so we don't need to test old_vmbits.
+		 */
+		vacrel->vm_page_freezes++;
 	}
 }
 
@@ -2276,6 +2326,7 @@ lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer,
 	if (heap_page_is_all_visible(vacrel, buffer, &visibility_cutoff_xid,
 								 &all_frozen))
 	{
+		uint8		old_vmbits;
 		uint8		flags = VISIBILITYMAP_ALL_VISIBLE;
 
 		if (all_frozen)
@@ -2285,8 +2336,21 @@ lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer,
 		}
 
 		PageSetAllVisible(page);
-		visibilitymap_set(vacrel->rel, blkno, buffer, InvalidXLogRecPtr,
-						  vmbuffer, visibility_cutoff_xid, flags);
+		old_vmbits = visibilitymap_set(vacrel->rel, blkno, buffer,
+									   InvalidXLogRecPtr,
+									   vmbuffer, visibility_cutoff_xid,
+									   flags);
+
+		/*
+		 * If the page wasn't already set all-visible and all-frozen in the
+		 * VM, count it as newly set for logging.
+		 */
+		if ((old_vmbits & VISIBILITYMAP_ALL_VISIBLE) == 0)
+			vacrel->vm_page_visibles++;
+
+		if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0
+			&& all_frozen)
+			vacrel->vm_page_freezes++;
 	}
 
 	/* Revert to the previous phase information for error traceback */
-- 
2.34.1

v1-0001-Rename-LVRelState-frozen_pages.patchtext/x-patch; charset=US-ASCII; name=v1-0001-Rename-LVRelState-frozen_pages.patchDownload
From 69b517f34caf39ad814691d6412c68d54e852990 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 10:53:37 -0400
Subject: [PATCH v1 1/9] Rename LVRelState->frozen_pages

Rename frozen_pages to tuple_freeze_pages in LVRelState, the struct used
for tracking state during vacuuming of a heap relation. frozen_pages
sounds like it includes every all-frozen page. That is a misnomer. It
does not include pages with already frozen tuples. It also includes
pages that are not actually all-frozen.
---
 src/backend/access/heap/vacuumlazy.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 793bd33cb4d..a74ba75dde1 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -188,7 +188,7 @@ typedef struct LVRelState
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
-	BlockNumber frozen_pages;	/* # pages with newly frozen tuples */
+	BlockNumber tuple_freeze_pages; /* # pages with newly frozen tuples */
 	BlockNumber lpdead_item_pages;	/* # pages with LP_DEAD items */
 	BlockNumber missed_dead_pages;	/* # pages with missed dead tuples */
 	BlockNumber nonempty_pages; /* actually, last nonempty page + 1 */
@@ -407,7 +407,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
 	vacrel->removed_pages = 0;
-	vacrel->frozen_pages = 0;
+	vacrel->tuple_freeze_pages = 0;
 	vacrel->lpdead_item_pages = 0;
 	vacrel->missed_dead_pages = 0;
 	vacrel->nonempty_pages = 0;
@@ -663,7 +663,8 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -696,9 +697,10 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 								 vacrel->NewRelminMxid, diff);
 			}
 			appendStringInfo(&buf, _("frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n"),
-							 vacrel->frozen_pages,
+							 vacrel->tuple_freeze_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->frozen_pages / orig_rel_pages,
+							 100.0 * vacrel->tuple_freeze_pages /
+							 orig_rel_pages,
 							 (long long) vacrel->tuples_frozen);
 			if (vacrel->do_index_vacuuming)
 			{
@@ -1455,11 +1457,11 @@ lazy_scan_prune(LVRelState *vacrel,
 	if (presult.nfrozen > 0)
 	{
 		/*
-		 * We don't increment the frozen_pages instrumentation counter when
-		 * nfrozen == 0, since it only counts pages with newly frozen tuples
-		 * (don't confuse that with pages newly set all-frozen in VM).
+		 * We don't increment the tuple_freeze_pages instrumentation counter
+		 * when nfrozen == 0, since it only counts pages with newly frozen
+		 * tuples (don't confuse that with pages newly set all-frozen in VM).
 		 */
-		vacrel->frozen_pages++;
+		vacrel->tuple_freeze_pages++;
 	}
 
 	/*
-- 
2.34.1

v1-0002-Make-visibilitymap_set-return-previous-state-of-v.patchtext/x-patch; charset=US-ASCII; name=v1-0002-Make-visibilitymap_set-return-previous-state-of-v.patchDownload
From ee769e8bdba93532f7f9686c4f17fda0279bd8e5 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:02:56 -0400
Subject: [PATCH v1 2/9] Make visibilitymap_set() return previous state of
 vmbits

It can be useful to know the state of a relation's VM bits before
visibilitymap_set(). Because visibilitymap_set() examines the bits
anyway to determine whether or not to set them, returning them is cheap.
This commit does not use the new return value.
---
 src/backend/access/heap/visibilitymap.c | 9 ++++++---
 src/include/access/visibilitymap.h      | 8 +++++---
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/backend/access/heap/visibilitymap.c b/src/backend/access/heap/visibilitymap.c
index 8b24e7bc33c..ab616a937d3 100644
--- a/src/backend/access/heap/visibilitymap.c
+++ b/src/backend/access/heap/visibilitymap.c
@@ -238,9 +238,9 @@ visibilitymap_pin_ok(BlockNumber heapBlk, Buffer vmbuf)
  *
  * You must pass a buffer containing the correct map page to this function.
  * Call visibilitymap_pin first to pin the right one. This function doesn't do
- * any I/O.
+ * any I/O. Returns the visibility map status before setting the bits.
  */
-void
+uint8
 visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,
 				  XLogRecPtr recptr, Buffer vmBuf, TransactionId cutoff_xid,
 				  uint8 flags)
@@ -250,6 +250,7 @@ visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,
 	uint8		mapOffset = HEAPBLK_TO_OFFSET(heapBlk);
 	Page		page;
 	uint8	   *map;
+	uint8		status;
 
 #ifdef TRACE_VISIBILITYMAP
 	elog(DEBUG1, "vm_set %s %d", RelationGetRelationName(rel), heapBlk);
@@ -274,7 +275,8 @@ visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,
 	map = (uint8 *) PageGetContents(page);
 	LockBuffer(vmBuf, BUFFER_LOCK_EXCLUSIVE);
 
-	if (flags != (map[mapByte] >> mapOffset & VISIBILITYMAP_VALID_BITS))
+	status = ((map[mapByte] >> mapOffset) & VISIBILITYMAP_VALID_BITS);
+	if (flags != status)
 	{
 		START_CRIT_SECTION();
 
@@ -311,6 +313,7 @@ visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,
 	}
 
 	LockBuffer(vmBuf, BUFFER_LOCK_UNLOCK);
+	return status;
 }
 
 /*
diff --git a/src/include/access/visibilitymap.h b/src/include/access/visibilitymap.h
index 1a4d467e6f0..0cdfa817071 100644
--- a/src/include/access/visibilitymap.h
+++ b/src/include/access/visibilitymap.h
@@ -31,9 +31,11 @@ extern bool visibilitymap_clear(Relation rel, BlockNumber heapBlk,
 extern void visibilitymap_pin(Relation rel, BlockNumber heapBlk,
 							  Buffer *vmbuf);
 extern bool visibilitymap_pin_ok(BlockNumber heapBlk, Buffer vmbuf);
-extern void visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,
-							  XLogRecPtr recptr, Buffer vmBuf, TransactionId cutoff_xid,
-							  uint8 flags);
+extern uint8 visibilitymap_set(Relation rel, BlockNumber heapBlk,
+							   Buffer heapBuf,
+							   XLogRecPtr recptr, Buffer vmBuf,
+							   TransactionId cutoff_xid,
+							   uint8 flags);
 extern uint8 visibilitymap_get_status(Relation rel, BlockNumber heapBlk, Buffer *vmbuf);
 extern void visibilitymap_count(Relation rel, BlockNumber *all_visible, BlockNumber *all_frozen);
 extern BlockNumber visibilitymap_prepare_truncate(Relation rel,
-- 
2.34.1

v1-0005-Move-vacuum-VM-buffer-release.patchtext/x-patch; charset=US-ASCII; name=v1-0005-Move-vacuum-VM-buffer-release.patchDownload
From 67b5565ad57d3b196695f85811dde2044ba79f3e Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:14:24 -0400
Subject: [PATCH v1 5/9] Move vacuum VM buffer release

The VM buffer for the next unskippable block can be released after the
main loop in lazy_scan_heap(). Doing so de-clutters
heap_vac_scan_next_block() and opens up more refactoring options.
---
 src/backend/access/heap/vacuumlazy.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 1d922b5a831..4b1eadea1f2 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -1038,6 +1038,14 @@ lazy_scan_heap(LVRelState *vacrel)
 	}
 
 	vacrel->blkno = InvalidBlockNumber;
+
+	/* Release VM buffers */
+	if (BufferIsValid(vacrel->next_unskippable_vmbuffer))
+	{
+		ReleaseBuffer(vacrel->next_unskippable_vmbuffer);
+		vacrel->next_unskippable_vmbuffer = InvalidBuffer;
+	}
+
 	if (BufferIsValid(vmbuffer))
 		ReleaseBuffer(vmbuffer);
 
@@ -1111,14 +1119,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
-	{
-		if (BufferIsValid(vacrel->next_unskippable_vmbuffer))
-		{
-			ReleaseBuffer(vacrel->next_unskippable_vmbuffer);
-			vacrel->next_unskippable_vmbuffer = InvalidBuffer;
-		}
 		return false;
-	}
 
 	/*
 	 * We must be in one of the three following states:
-- 
2.34.1

v1-0006-Remove-superfluous-next_block-local-variable-in-v.patchtext/x-patch; charset=US-ASCII; name=v1-0006-Remove-superfluous-next_block-local-variable-in-v.patchDownload
From 8485dc400b3d4e9f895170af4f5fb1bb959b8495 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:36:58 -0400
Subject: [PATCH v1 6/9] Remove superfluous next_block local variable in vacuum
 code

Reduce the number of block related variables in lazy_scan_heap() and its
helpers by removing the next_block local variable from
heap_vac_scan_next_block().
---
 src/backend/access/heap/vacuumlazy.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 4b1eadea1f2..52c9d49f2b1 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -1112,19 +1112,17 @@ static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 						 bool *all_visible_according_to_vm)
 {
-	BlockNumber next_block;
-
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
-	next_block = vacrel->current_block + 1;
+	vacrel->current_block++;
 
 	/* Have we reached the end of the relation? */
-	if (next_block >= vacrel->rel_pages)
+	if (vacrel->current_block >= vacrel->rel_pages)
 		return false;
 
 	/*
 	 * We must be in one of the three following states:
 	 */
-	if (next_block > vacrel->next_unskippable_block ||
+	if (vacrel->current_block > vacrel->next_unskippable_block ||
 		vacrel->next_unskippable_block == InvalidBlockNumber)
 	{
 		/*
@@ -1151,23 +1149,24 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 * pages then skipping makes updating relfrozenxid unsafe, which is a
 		 * real downside.
 		 */
-		if (vacrel->next_unskippable_block - next_block >= SKIP_PAGES_THRESHOLD)
+		if (vacrel->next_unskippable_block - vacrel->current_block >=
+			SKIP_PAGES_THRESHOLD)
 		{
-			next_block = vacrel->next_unskippable_block;
+			vacrel->current_block = vacrel->next_unskippable_block;
 			if (skipsallvis)
 				vacrel->skippedallvis = true;
 		}
 	}
 
 	/* Now we must be in one of the two remaining states: */
-	if (next_block < vacrel->next_unskippable_block)
+	if (vacrel->current_block < vacrel->next_unskippable_block)
 	{
 		/*
 		 * 2. We are processing a range of blocks that we could have skipped
 		 * but chose not to.  We know that they are all-visible in the VM,
 		 * otherwise they would've been unskippable.
 		 */
-		*blkno = vacrel->current_block = next_block;
+		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = true;
 		return true;
 	}
@@ -1177,9 +1176,9 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 * 3. We reached the next unskippable block.  Process it.  On next
 		 * iteration, we will be back in state 1.
 		 */
-		Assert(next_block == vacrel->next_unskippable_block);
+		Assert(vacrel->current_block == vacrel->next_unskippable_block);
 
-		*blkno = vacrel->current_block = next_block;
+		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
 		return true;
 	}
-- 
2.34.1

#2Andres Freund
andres@anarazel.de
In reply to: Melanie Plageman (#1)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Hi,

On 2024-11-01 19:35:22 -0400, Melanie Plageman wrote:

It implements a new "semi-aggressive" vacuum. Semi-aggressive vacuums
eagerly scan some number of all-visible but not all-frozen pages in
hopes of freezing them. All-visible pages that are eagerly scanned and
set all-frozen in the visibility map are considered successful eager
scans and those not frozen are considered failed eager scans.

I think it's worth mentioning that this would be useful to eventually be able
to mark pages as all-visible during on-access-pruning, to allow for
index-only-scans (and also faster seqscans). Today that'd have the danger of
increasing the "anti-wraparound vacuum debt" unconscionably, but with this
patch that'd be addressed.

Because we want to amortize our eager scanning across a few vacuums,
we cap the maximum number of successful eager scans to a percentage of
the total number of all-visible but not all-frozen pages in the table
(currently 20%).

One thing worth mentioning around here seems that we currently can't
partially-aggressively freeze tuples that are "too young" and how that
interacts with everything else.

To demonstrate the results, I ran an append-only workload run for over
3 hours on master and with my patch applied. The patched version of
Postgres amortized the work of freezing the all-visible but not
all-frozen pages nicely. The first aggressive vacuum with the patch
was 44 seconds and on master it was 1201 seconds.

Oops.

patch
LOG: automatic aggressive vacuum of table "history": index scans: 0
vacuum duration: 44 seconds (msecs: 44661).
pages: 0 removed, 27425085 remain, 1104095 scanned (4.03% of
total), 709889 eagerly scanned
frozen: 316544 pages from table (1.15% of total) had 17409920
tuples frozen. 316544 pages set all-frozen in the VM
I/O timings: read: 1160.599 ms, write: 2461.205 ms. approx time
spent in vacuum delay: 16230 ms.
buffer usage: 1105630 hits, 1111898 reads, 646229 newly dirtied,
1750426 dirtied.
WAL usage: 1027099 records, 316566 full page images, 276209780 bytes.

master
LOG: automatic aggressive vacuum of table "history": index scans: 0
vacuum duration: 1201 seconds (msecs: 1201487).
pages: 0 removed, 27515348 remain, 15800948 scanned (57.43% of
total), 15098257 eagerly scanned
frozen: 15096384 pages from table (54.87% of total) had 830247896
tuples frozen. 15096384 pages set all-frozen in the VM
I/O timings: read: 246537.348 ms, write: 73000.498 ms. approx time
spent in vacuum delay: 349166 ms.
buffer usage: 15798343 hits, 15813524 reads, 15097063 newly
dirtied, 31274333 dirtied.
WAL usage: 30733564 records, 15097073 full page images, 11789257631 bytes.

This is because, with the patch, the freezing work is being off-loaded
to earlier vacuums.

In the attached chart.png, you can see the vm_page_freezes climbing
steadily with the patch, whereas on master, there are sudden spikes
aligned with the aggressive vacuums. You can also see that the number
of pages that are all-visible but not all-frozen grows steadily on
master until the aggressive vacuum. This is vacuum's "backlog" of
freezing work.

What's the reason for all-visible-but-not-all-frozen to increase to a higher
value initially than where it later settles?

In this benchmark, the TPS is rate-limited, but using pgbench
per-statement reports, I calculated that the P99 latency for this
benchmark is 16 ms on master and 1 ms with the patch. Vacuuming pages
sooner decreases vacuum reads and doing the freezing work spread over
more vacuums improves P99 transaction latency.

Nice!

Below is the comparative WAL volume, checkpointer and background
writer writes, reads and writes done by all other backend types, time
spent vacuuming in milliseconds, and p99 latency. Notice that overall
vacuum IO time is substantially lower with the patch.

version wal cptr_bgwriter_w other_rw vac_io_time p99_lat
patch 770 GB 5903264 235073744 513722 1
master 767 GB 5908523 216887764 1003654 16

Hm. It's not clear to me why other_rw is higher with the patch? After all,
given the workload, there's no chance of unnecessarily freezing tuples? Is
that just because at the end of the benchmark there's leftover work?

From 69b517f34caf39ad814691d6412c68d54e852990 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 10:53:37 -0400
Subject: [PATCH v1 1/9] Rename LVRelState->frozen_pages

Rename frozen_pages to tuple_freeze_pages in LVRelState, the struct used
for tracking state during vacuuming of a heap relation. frozen_pages
sounds like it includes every all-frozen page. That is a misnomer. It
does not include pages with already frozen tuples. It also includes
pages that are not actually all-frozen.

Hm. Is tuple_freeze_pages that much clearer, it could also just indicate pages
that already were frozen. How about "newly_frozen_pages"?

Subject: [PATCH v1 2/9] Make visibilitymap_set() return previous state of

LGTM.

From c317a272713bb833f7f2761a5be1924f8e1bdb4d Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Thu, 31 Oct 2024 18:19:18 -0400
Subject: [PATCH v1 3/9] Count pages set all-visible and all-frozen in VM
during vacuum

Vacuum already counts and logs pages with newly frozen tuples. Count and
log pages set all-frozen in the VM too. This includes pages that are
empty before or after vacuuming.

While we are at it, count and log the number of pages vacuum set
all-visible. Pages that are all-visible but not all-frozen are debt for
future aggressive vacuums. The newly all-visible and all-frozen counts
give us visiblity into the rate at which this debt is being accrued and
paid down.

Hm. Why is it interesting to log VM changes separately from the state changes
of underlying pages? Wouldn't it e.g. be more intersting to log the number of
empty pages that vacuum [re-]discovered? I've a bit hard time seeing how a
user could take advantage of this.

From 67781cc2511bb7d62ccc9461f1787272820abcc4 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:07:50 -0400
Subject: [PATCH v1 4/9] Replace uses of blkno local variable in
lazy_scan_heap()

Largely LGTM, but I'm not sure that it's worth having as a separate commit.

@@ -1114,7 +1117,6 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
ReleaseBuffer(vacrel->next_unskippable_vmbuffer);
vacrel->next_unskippable_vmbuffer = InvalidBuffer;
}
- *blkno = vacrel->rel_pages;
return false;
}

I'd seat *blkno to InvalidBlockNumber or such, that'd make misuse more
apparent than having it set to some random older block.

From 67b5565ad57d3b196695f85811dde2044ba79f3e Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:14:24 -0400
Subject: [PATCH v1 5/9] Move vacuum VM buffer release

The VM buffer for the next unskippable block can be released after the
main loop in lazy_scan_heap(). Doing so de-clutters
heap_vac_scan_next_block() and opens up more refactoring options.

That's vague...

From 8485dc400b3d4e9f895170af4f5fb1bb959b8495 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:36:58 -0400
Subject: [PATCH v1 6/9] Remove superfluous next_block local variable in vacuum
code

Reduce the number of block related variables in lazy_scan_heap() and its
helpers by removing the next_block local variable from
heap_vac_scan_next_block().

I don't mind this change, but I also don't get how it's related to anything
else here or why it's really better than the status quo.

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 4b1eadea1f2..52c9d49f2b1 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -1112,19 +1112,17 @@ static bool
heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
bool *all_visible_according_to_vm)
{
-	BlockNumber next_block;
-
/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
-	next_block = vacrel->current_block + 1;
+	vacrel->current_block++;

I realize this isn't introduced in this commit, but darn, that's ugly.

From 78ad9e022b95e024ff5bfa96af78e9e44730c970 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:42:10 -0400
Subject: [PATCH v1 7/9] Make heap_vac_scan_next_block() return BlockNumber

@@ -857,7 +857,8 @@ lazy_scan_heap(LVRelState *vacrel)
vacrel->next_unskippable_allvis = false;
vacrel->next_unskippable_vmbuffer = InvalidBuffer;

-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (BlockNumberIsValid(blkno = heap_vac_scan_next_block(vacrel,
+															   &all_visible_according_to_vm)))

Personally I'd write this as

while (true)
{
BlockNumber blkno;

blkno = heap_vac_scan_next_block(vacrel, ...);

if (!BlockNumberIsValid(blkno))
break;

Mostly because it's good to use more minimal scopes when possible,
particularly when previously the scope intentionally was larger. But also
partially because I don't love variable assignments inside a macro call,
inside a while().

From 818d1c3b068c6705611256cfc3eb1f10bdc0b684 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Fri, 1 Nov 2024 18:25:05 -0400
Subject: [PATCH v1 8/9] WIP: Add more general summary to vacuumlazy.c

Currently the summary at the top of vacuumlazy.c provides some specific
details related to the new dead TID storage in 17. I plan to add a
summary and maybe some sub-sections to contextualize it.

I like this idea. It's hard to understand vacuumlazy.c without already
understanding vacuumlazy.c, which isn't a good situation.

---
src/backend/access/heap/vacuumlazy.c | 11 +++++++++++
1 file changed, 11 insertions(+)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 7ce69953ba0..15a04c6b10b 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -3,6 +3,17 @@
* vacuumlazy.c
*	  Concurrent ("lazy") vacuuming.
*
+ * Heap relations are vacuumed in three main phases. In the first phase,
+ * vacuum scans relation pages, pruning and freezing tuples and saving dead
+ * tuples' TIDs in a TID store. If that TID store fills up or vacuum finishes
+ * scanning the relation, it progresses to the second phase: index vacuuming.
+ * After index vacuuming is complete, vacuum scans the blocks of the relation
+ * indicated by the TIDs in the TID store and reaps the dead tuples, freeing
+ * that space for future tuples. Finally, vacuum may truncate the relation if
+ * it has emptied pages at the end. XXX: this summary needs work.

Yea, at least we ought to mention that the phasing can be different when there
are no indexes and that the later phases can heuristically be omitted when
there aren't enough dead items.

From f21f0bab1dbe675be4b4dddcb2eea486d8a69d36 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 12:15:08 -0400
Subject: [PATCH v1 9/9] Eagerly scan all-visible pages to amortize aggressive
vacuum

Introduce semi-aggressive vacuums, which scan some of the all-visible
but not all-frozen pages in the relation to amortize the cost of an
aggressive vacuum.

I wonder if "aggressive" is really the right terminology going
forward... Somehow it doesn't seem particularly descriptive anymore if, in
many workloads, almost all vacuums are going to be aggressive-ish.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
considered successful eager scans and those not frozen are considered
failed eager scans.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. Because the goal is to
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager scanned
and frozen, the semi-aggressive vacuum is downgraded to an unaggressive
vacuum.
---
src/backend/access/heap/vacuumlazy.c | 327 +++++++++++++++++++++++----
src/backend/commands/vacuum.c | 20 +-
src/include/commands/vacuum.h | 27 ++-
src/tools/pgindent/typedefs.list | 1 +
4 files changed, 326 insertions(+), 49 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 15a04c6b10b..adabb5ff5f1 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -12,6 +12,40 @@
* that space for future tuples. Finally, vacuum may truncate the relation if
* it has emptied pages at the end. XXX: this summary needs work.
*
+ * Relation Scanning:
+ *
+ * Vacuum scans the heap relation, starting at the beginning and progressing
+ * to the end, skipping pages as permitted by their visibility status, vacuum
+ * options, and the aggressiveness level of the vacuum.
+ *
+ * When page skipping is enabled, unaggressive vacuums may skip scanning pages
+ * that are marked all-visible in the visibility map. We may choose not to
+ * skip pages if the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ *
+ * Semi-aggressive vacuums will scan skippable pages in an effort to freeze
+ * them and decrease the backlog of all-visible but not all-frozen pages that
+ * have to be processed to advance relfrozenxid and avoid transaction ID
+ * wraparound.
+ *
+ * We count it as a success when we are able to set an eagerly scanned page
+ * all-frozen in the VM and a failure when we are not able to set the page
+ * all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, we cap the number of successful eager scans to
+ * EAGER_SCAN_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, we use a localized failure cap instead of a global cap
+ * for the whole relation. The failure count is reset on each region of the
+ * table, comprised of RELSEG_SIZE blocks (or 1/4 of the table size for a
+ * small table). In each region, we tolerate MAX_SUCCESSIVE_EAGER_SCAN_FAILS
+ * before suspending eager scanning until the end of the region.

I'm a bit surprised to see such large regions. Why not something finer, in the
range of a few megabytes? The FSM steers new tuples quite aggressively to the
start of the table, which means that in many workloads there will be old and
new data interspersed at the start of the table. Using RELSEG_SIZE sized
regions for semi-aggressive vacuuming will mean that we'll often not do any
semi-aggressive processing beyond the start of the relation, as we'll reach
the failure rate quickly.

I also find it layering-wise a bit weird to use RELSEG_SIZE, that's really imo
is just an md.c concept.

+/*
+ * Semi-aggressive vacuums eagerly scan some all-visible but not all-frozen
+ * pages. Since our goal is to freeze these pages, an eager scan that fails to
+ * set the page all-frozen in the VM is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once we fail to freeze MAX_SUCCESSIVE_EAGER_SCAN_FAILS
+ * blocks, we suspend eager scanning until vacuum has progressed to another
+ * region of the table with potentially older data.
+ */
+#define MAX_SUCCESSIVE_EAGER_SCAN_FAILS 1024

Can this really be a constant, given that the semi-aggressive regions are
shrunk for small tables?

+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple semi-aggressive
+ * vacuums, we limit the number of successful eager scans (as well as the
+ * number of failures). The maximum number of successful eager scans is
+ * calculated as a ratio of the all-visible but not all-frozen pages at the
+ * beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
typedef struct LVRelState

There imo should be newlines between the define and LVRelState.

{
/* Target heap relation and its indexes */
@@ -153,8 +208,22 @@ typedef struct LVRelState
BufferAccessStrategy bstrategy;
ParallelVacuumState *pvs;

-	/* Aggressive VACUUM? (must set relfrozenxid >= FreezeLimit) */
-	bool		aggressive;
+	/*
+	 * Whether or not this is an aggressive, semi-aggressive, or unaggressive
+	 * VACUUM. A fully aggressive vacuum must set relfrozenxid >= FreezeLimit
+	 * and therefore must scan every unfrozen tuple. A semi-aggressive vacuum
+	 * will scan a certain number of all-visible pages until it is downgraded
+	 * to an unaggressive vacuum.
+	 */
+	VacAggressive aggressive;

Hm. A few comments:

- why is VacAggressive defined in vacuum.h? Isn't this fairly tightly coupled
to heapam?
- Kinda feels like the type should be named VacAggressivness or such?

+	/*
+	 * A semi-aggressive vacuum that has failed to freeze too many eagerly
+	 * scanned blocks in a row suspends eager scanning. unaggressive_to is the
+	 * block number of the first block eligible for resumed eager scanning.
+	 */
+	BlockNumber unaggressive_to;

What's it set to otherwise? What is it set to in aggressive vacuums?

@@ -227,6 +296,26 @@ typedef struct LVRelState
BlockNumber next_unskippable_block; /* next unskippable block */
bool		next_unskippable_allvis;	/* its visibility status */
Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/*
+	 * Count of skippable blocks eagerly scanned as part of a semi-aggressive
+	 * vacuum (for logging only).
+	 */
+	BlockNumber eager_scanned;

I'd add _pages or such.

+	/*
+	 * The number of eagerly scanned blocks a semi-aggressive vacuum failed to
+	 * freeze (due to age) in the current eager scan region. It is reset each
+	 * time we hit MAX_SUCCESSIVE_EAGER_SCAN_FAILS.
+	 */
+	BlockNumber eager_scanned_failed_frozen;
+
+	/*
+	 * The remaining number of blocks a semi-aggressive vacuum will consider
+	 * eager scanning. This is initialized to EAGER_SCAN_SUCCESS_RATE of the
+	 * total number of all-visible but not all-frozen pages.
+	 */
+	BlockNumber remaining_eager_scan_successes;

I think it might look better if you just bundled these into a struct like

struct
{
BlockNumber scanned;
BlockNumber failed_frozen;
BlockNumber remaining_successes;
} eager_pages;

@@ -471,24 +569,49 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
* Force aggressive mode, and disable skipping blocks using the
* visibility map (even those set all-frozen)
*/
- vacrel->aggressive = true;
+ vacrel->aggressive = VAC_AGGRESSIVE;
skipwithvm = false;
}

vacrel->skipwithvm = skipwithvm;
+	vacrel->eager_scanned = 0;
+	vacrel->eager_scanned_failed_frozen = 0;
+
+	/*
+	 * Even if we successfully freeze them, we want to cap the number of
+	 * eagerly scanned blocks so that we spread out the overhead across
+	 * multiple vacuums. remaining_eager_scan_successes is only used by
+	 * semi-aggressive vacuums.
+	 */

Somehow the "them" feels like a dangling pointer that's initialized too late ;)

+	visibilitymap_count(rel, &orig_rel_allvisible, &orig_rel_allfrozen);
+	vacrel->remaining_eager_scan_successes =
+		(BlockNumber) (EAGER_SCAN_SUCCESS_RATE * (orig_rel_allvisible - orig_rel_allfrozen));
if (verbose)
{
-		if (vacrel->aggressive)
-			ereport(INFO,
-					(errmsg("aggressively vacuuming \"%s.%s.%s\"",
-							vacrel->dbname, vacrel->relnamespace,
-							vacrel->relname)));
-		else
-			ereport(INFO,
-					(errmsg("vacuuming \"%s.%s.%s\"",
-							vacrel->dbname, vacrel->relnamespace,
-							vacrel->relname)));
+		switch (vacrel->aggressive)
+		{
+			case VAC_UNAGGRESSIVE:
+				ereport(INFO,
+						(errmsg("vacuuming \"%s.%s.%s\"",
+								vacrel->dbname, vacrel->relnamespace,
+								vacrel->relname)));
+				break;
+
+			case VAC_AGGRESSIVE:
+				ereport(INFO,
+						(errmsg("aggressively vacuuming \"%s.%s.%s\"",
+								vacrel->dbname, vacrel->relnamespace,
+								vacrel->relname)));
+				break;
+
+			case VAC_SEMIAGGRESSIVE:
+				ereport(INFO,
+						(errmsg("semiaggressively vacuuming \"%s.%s.%s\"",
+								vacrel->dbname, vacrel->relnamespace,
+								vacrel->relname)));
+				break;
+		}

Wonder if we should have a function that returns the aggressiveness of a
vacuum as an already translated string. There are other places where we emit
the aggressiveness as part of a message, and it's pretty silly to duplicate
most of the message.

@@ -545,11 +668,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
* Non-aggressive VACUUMs may advance them by any amount, or not at all.
*/
Assert(vacrel->NewRelfrozenXid == vacrel->cutoffs.OldestXmin ||
-		   TransactionIdPrecedesOrEquals(vacrel->aggressive ? vacrel->cutoffs.FreezeLimit :
+		   TransactionIdPrecedesOrEquals(vacrel->aggressive == VAC_AGGRESSIVE ?
+										 vacrel->cutoffs.FreezeLimit :
vacrel->cutoffs.relfrozenxid,
vacrel->NewRelfrozenXid));
Assert(vacrel->NewRelminMxid == vacrel->cutoffs.OldestMxact ||
-		   MultiXactIdPrecedesOrEquals(vacrel->aggressive ? vacrel->cutoffs.MultiXactCutoff :
+		   MultiXactIdPrecedesOrEquals(vacrel->aggressive == VAC_AGGRESSIVE ?
+									   vacrel->cutoffs.MultiXactCutoff :
vacrel->cutoffs.relminmxid,
vacrel->NewRelminMxid));
if (vacrel->skippedallvis)

These are starting to feel somewhat complicated. Wonder if it'd be easier to
read if they were written as normal ifs.

+/*
+ * Helper to decrement a block number to 0 without wrapping around.
+ */
+static void
+decrement_blkno(BlockNumber *block)
+{
+	if ((*block) > 0)
+		(*block)--;
+}

Huh.

@@ -956,11 +1094,23 @@ lazy_scan_heap(LVRelState *vacrel)
if (!got_cleanup_lock)
LockBuffer(buf, BUFFER_LOCK_SHARE);

+		page_freezes = vacrel->vm_page_freezes;
+
/* Check for new or empty pages before lazy_scan_[no]prune call */
if (lazy_scan_new_or_empty(vacrel, buf, blkno, page, !got_cleanup_lock,
vmbuffer))
{
/* Processed as new/empty page (lock and pin released) */
+
+			/* count an eagerly scanned page as a failure or a success */
+			if (was_eager_scanned)
+			{
+				if (vacrel->vm_page_freezes > page_freezes)
+					decrement_blkno(&vacrel->remaining_eager_scan_successes);
+				else
+					vacrel->eager_scanned_failed_frozen++;
+			}
+
continue;
}

Maybe I'm confused, but ISTM that remaining_eager_scan_successes shouldn't
actually be a BlockNumber, given it doesn't actually indicates a specific
block...

I don't understand why we would sometimes want to treat empty pages as a
failure? They can't fail to be frozen, no?

I'm not sure it makes sense to count them as progress towards the success
limit either - afaict we just rediscovered free space is the table. That's imo
separate from semi-aggressive freezing.

Storing page_freezes as a copy of vacrel->vm_page_freezes and then checking if
that increased feels like a somewhat ugly way of tracking if freezing
happend. There's no more direct way?

Why is decrement_blkno() needed? How can we ever get into negative territory?
Shouldn't eager scanning have been disabled when
remaining_eager_scan_successes reaches zero and thus prevent
remaining_eager_scan_successes from ever going below zero?

@@ -1144,7 +1310,65 @@ heap_vac_scan_next_block(LVRelState *vacrel,
*/
bool skipsallvis;

-		find_next_unskippable_block(vacrel, &skipsallvis);
+		/*
+		 * Figure out if we should disable eager scan going forward or
+		 * downgrade to an unaggressive vacuum altogether.
+		 */
+		if (vacrel->aggressive == VAC_SEMIAGGRESSIVE)
+		{
+			/*
+			 * If we hit our success limit, there is no need to eagerly scan
+			 * any additional pages. Downgrade the vacuum to unaggressive.
+			 */
+			if (vacrel->remaining_eager_scan_successes == 0)
+				vacrel->aggressive = VAC_UNAGGRESSIVE;
+
+			/*
+			 * If we hit the max number of failed eager scans for this region
+			 * of the table, figure out where the next eager scan region
+			 * should start. Eager scanning is effectively disabled until we
+			 * scan a block in that new region.
+			 */
+			else if (vacrel->eager_scanned_failed_frozen >=
+					 MAX_SUCCESSIVE_EAGER_SCAN_FAILS)
+			{
+				BlockNumber region_size,
+							offset;
+

Why are we doing this logic here, rather than after incrementing
eager_scanned_failed_frozen? Seems that'd limit the amount of times we need to
run through this logic substantially?

+				/*
+				 * On the assumption that different regions of the table are
+				 * likely to have similarly aged data, we will retry eager
+				 * scanning again later. For a small table, we'll retry eager
+				 * scanning every quarter of the table. For a larger table,
+				 * we'll consider eager scanning again after processing
+				 * another region's worth of data.
+				 *
+				 * We consider the region to start from the first failure, so
+				 * calculate the block to restart eager scanning from there.
+				 */
+				region_size = Min(RELSEG_SIZE, (vacrel->rel_pages / 4));
+
+				offset = vacrel->eager_scanned_failed_frozen % region_size;
+
+				Assert(vacrel->eager_scanned > 0);
+
+				vacrel->unaggressive_to = vacrel->current_block + (region_size - offset);
+				vacrel->eager_scanned_failed_frozen = 0;
+			}
+		}

I'd put the logic for this in a separate function, feels complicated and
independent enough for it to be worth not having it in heap_vac_scan_next_block().

@@ -1199,6 +1423,11 @@ heap_vac_scan_next_block(LVRelState *vacrel,
* The next unskippable block and its visibility information is updated in
* vacrel.
*
+ * consider_eager_scan indicates whether or not we should consider scanning
+ * all-visible but not all-frozen blocks. was_eager_scanned is set to true if
+ * we decided to eager scan a block. In this case, next_unskippable_block is
+ * set to that block number.
+ *
* Note: our opinion of which blocks can be skipped can go stale immediately.
* It's okay if caller "misses" a page whose all-visible or all-frozen marking
* was concurrently cleared, though.  All that matters is that caller scan all
@@ -1208,7 +1437,11 @@ heap_vac_scan_next_block(LVRelState *vacrel,
* to skip such a range is actually made, making everything safe.)
*/
static void
-find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
+find_next_unskippable_block(
+							LVRelState *vacrel,
+							bool consider_eager_scan,
+							bool *was_eager_scanned,
+							bool *skipsallvis)

I don't think we ever have function definitions without a parameter on the
line with the function name.

Hm - isn't consider_eager_scan potentially outdated after
find_next_unskippable_block() iterated over a bunch of blocks? If
consider_eager_scan is false, this could very well go into the next
"semi-aggressive region", where consider_eager_scan should have been
re-enabled, no?

Greetings,

Andres Freund

#3Melanie Plageman
melanieplageman@gmail.com
In reply to: Andres Freund (#2)
10 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Thu, Nov 7, 2024 at 10:42 AM Andres Freund <andres@anarazel.de> wrote:

Hi,

Thanks for the review!
Attached v2 should address your feedback and also fixes a few bugs with v1.

I've still yet to run very long-running benchmarks. I did start running more
varied benchmark scenarios -- but all still under two hours. So far, the
behavior is as expected.

On 2024-11-01 19:35:22 -0400, Melanie Plageman wrote:

Because we want to amortize our eager scanning across a few vacuums,
we cap the maximum number of successful eager scans to a percentage of
the total number of all-visible but not all-frozen pages in the table
(currently 20%).

One thing worth mentioning around here seems that we currently can't
partially-aggressively freeze tuples that are "too young" and how that
interacts with everything else.

I'm not sure I know what you mean. Are you talking about how we don't freeze
tuples that are visible to everyone but younger than the freeze limit?

In the attached chart.png, you can see the vm_page_freezes climbing
steadily with the patch, whereas on master, there are sudden spikes
aligned with the aggressive vacuums. You can also see that the number
of pages that are all-visible but not all-frozen grows steadily on
master until the aggressive vacuum. This is vacuum's "backlog" of
freezing work.

What's the reason for all-visible-but-not-all-frozen to increase to a higher
value initially than where it later settles?

My guess is that it has to do with shorter, more frequent vacuums at the
beginning of the benchmark when the relation is smaller (and we haven't
exceeded shared buffers or memory yet). They are setting pages all-visible, but
we haven't used up enough xids yet to qualify for an eager vacuum.

The peak of AVnAF pages aligns with the start of the first eager vacuum. We
don't do any eager scanning until we are sure there is some data requiring
freeze (see this criteria):

if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
vacrel->cutoffs.FreezeLimit))

Once we have used up enough xids to qualify for the first eager vacuum, the
number of AVnAF pages starts to go down.

It would follow from this theory that we would see a build-up like this after
each relfrozenxid advancement (so after the next aggressive vacuum).

But I think we don't see this because the vacuums are longer by the time
aggressive vacuums have started, so we end up using up enough XIDs between
vacuums to qualify for eager vacuums on vacuums after the aggressive vacuum.

That is just my theory though.

Below is the comparative WAL volume, checkpointer and background
writer writes, reads and writes done by all other backend types, time
spent vacuuming in milliseconds, and p99 latency. Notice that overall
vacuum IO time is substantially lower with the patch.

version wal cptr_bgwriter_w other_rw vac_io_time p99_lat
patch 770 GB 5903264 235073744 513722 1
master 767 GB 5908523 216887764 1003654 16

Hm. It's not clear to me why other_rw is higher with the patch? After all,
given the workload, there's no chance of unnecessarily freezing tuples? Is
that just because at the end of the benchmark there's leftover work?

So other_rw is mostly client backend and autovacuum reads and writes. It is
higher with the patch because there are actually more vacuum reads and writes
with the patch than on master. However the autovacuum worker read and write
time is much lower. Those blocks are more often in shared buffers, I would
guess.

From 67781cc2511bb7d62ccc9461f1787272820abcc4 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:07:50 -0400
Subject: [PATCH v1 4/9] Replace uses of blkno local variable in
lazy_scan_heap()

Largely LGTM, but I'm not sure that it's worth having as a separate commit.

I've squashed it into the commit that makes heap_vac_scan_next_block() return
the next block number.

From 67b5565ad57d3b196695f85811dde2044ba79f3e Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:14:24 -0400
Subject: [PATCH v1 5/9] Move vacuum VM buffer release

The VM buffer for the next unskippable block can be released after the
main loop in lazy_scan_heap(). Doing so de-clutters
heap_vac_scan_next_block() and opens up more refactoring options.

That's vague...

I've changed the commit message justification to the fact that all the other
vmbuffer releases in vacuum code are in the body of lazy_scan_heap() too (not
in helpers).

From 8485dc400b3d4e9f895170af4f5fb1bb959b8495 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:36:58 -0400
Subject: [PATCH v1 6/9] Remove superfluous next_block local variable in vacuum
code

Reduce the number of block related variables in lazy_scan_heap() and its
helpers by removing the next_block local variable from
heap_vac_scan_next_block().

I don't mind this change, but I also don't get how it's related to anything
else here or why it's really better than the status quo.

So because this feature adds more complexity to the already complex vacuum code
selecting what blocks to scan, I thought it was important to reduce the number
of variables.
I think the patches in this set that seek to streamline
heap_vac_scan_next_block() help overall clarity.

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 4b1eadea1f2..52c9d49f2b1 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -1112,19 +1112,17 @@ static bool
heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
bool *all_visible_according_to_vm)
{
-     BlockNumber next_block;
-
/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
-     next_block = vacrel->current_block + 1;
+     vacrel->current_block++;

I realize this isn't introduced in this commit, but darn, that's ugly.

I didn't like having special cases for block 0 in heap_vac_scan_next_block()
and personally prefer it this way. I thought it made it more error-prone and
harder to understand.

From 78ad9e022b95e024ff5bfa96af78e9e44730c970 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:42:10 -0400
Subject: [PATCH v1 7/9] Make heap_vac_scan_next_block() return BlockNumber

@@ -857,7 +857,8 @@ lazy_scan_heap(LVRelState *vacrel)
vacrel->next_unskippable_allvis = false;
vacrel->next_unskippable_vmbuffer = InvalidBuffer;

-     while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+     while (BlockNumberIsValid(blkno = heap_vac_scan_next_block(vacrel,
+                                                                                                                        &all_visible_according_to_vm)))

Personally I'd write this as

while (true)
{
BlockNumber blkno;

blkno = heap_vac_scan_next_block(vacrel, ...);

if (!BlockNumberIsValid(blkno))
break;

Mostly because it's good to use more minimal scopes when possible,
particularly when previously the scope intentionally was larger. But also
partially because I don't love variable assignments inside a macro call,
inside a while().

I changed it to be as you suggest. I will concede that variable assignments
inside a macro call inside a while() are a bit much.

From 818d1c3b068c6705611256cfc3eb1f10bdc0b684 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Fri, 1 Nov 2024 18:25:05 -0400
Subject: [PATCH v1 8/9] WIP: Add more general summary to vacuumlazy.c

Currently the summary at the top of vacuumlazy.c provides some specific
details related to the new dead TID storage in 17. I plan to add a
summary and maybe some sub-sections to contextualize it.

I like this idea. It's hard to understand vacuumlazy.c without already
understanding vacuumlazy.c, which isn't a good situation.

I've added a bit more to it in this version, but I likely could use some more
text on index vacuuming. I'm thinking I'll commit something minimal but correct
and let people elaborate more later.

---
src/backend/access/heap/vacuumlazy.c | 11 +++++++++++
1 file changed, 11 insertions(+)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 7ce69953ba0..15a04c6b10b 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -3,6 +3,17 @@
* vacuumlazy.c
*     Concurrent ("lazy") vacuuming.
*
+ * Heap relations are vacuumed in three main phases. In the first phase,
+ * vacuum scans relation pages, pruning and freezing tuples and saving dead
+ * tuples' TIDs in a TID store. If that TID store fills up or vacuum finishes
+ * scanning the relation, it progresses to the second phase: index vacuuming.
+ * After index vacuuming is complete, vacuum scans the blocks of the relation
+ * indicated by the TIDs in the TID store and reaps the dead tuples, freeing
+ * that space for future tuples. Finally, vacuum may truncate the relation if
+ * it has emptied pages at the end. XXX: this summary needs work.

Yea, at least we ought to mention that the phasing can be different when there
are no indexes and that the later phases can heuristically be omitted when
there aren't enough dead items.

I've done this.

From f21f0bab1dbe675be4b4dddcb2eea486d8a69d36 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 12:15:08 -0400
Subject: [PATCH v1 9/9] Eagerly scan all-visible pages to amortize aggressive
vacuum

Introduce semi-aggressive vacuums, which scan some of the all-visible
but not all-frozen pages in the relation to amortize the cost of an
aggressive vacuum.

I wonder if "aggressive" is really the right terminology going
forward... Somehow it doesn't seem particularly descriptive anymore if, in
many workloads, almost all vacuums are going to be aggressive-ish.

I've changed it to normal, eager, and aggressive

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 15a04c6b10b..adabb5ff5f1 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, we use a localized failure cap instead of a global cap
+ * for the whole relation. The failure count is reset on each region of the
+ * table, comprised of RELSEG_SIZE blocks (or 1/4 of the table size for a
+ * small table). In each region, we tolerate MAX_SUCCESSIVE_EAGER_SCAN_FAILS
+ * before suspending eager scanning until the end of the region.

I'm a bit surprised to see such large regions. Why not something finer, in the
range of a few megabytes? The FSM steers new tuples quite aggressively to the
start of the table, which means that in many workloads there will be old and
new data interspersed at the start of the table. Using RELSEG_SIZE sized
regions for semi-aggressive vacuuming will mean that we'll often not do any
semi-aggressive processing beyond the start of the relation, as we'll reach
the failure rate quickly.

I've changed the region size to 32 MB but I also decreased the allowed failures
to 128 blocks per region (to avoid eager scanning too many blocks if we are
failing to freeze them).

This doesn't completely address your concern about missing freezing
opportunities.

However, this version does randomize the eager scan start block selection in
the first region. The first eager scan block will be somewhere in the first
region to avoid re-scanning unfreezable blocks across multiple vacuums. I will
note that this problem is unlikely to persist across multiple vacuums. If the
page is being modified frequently, it won't be all-visible. You would have to
have this pattern for it to be an issue: modify the page, vacuum, vacuum,
modify, vacuum, vacuum (since the first vacuum after the modification will set
the page all-visible).

I also find it layering-wise a bit weird to use RELSEG_SIZE, that's really imo
is just an md.c concept.

Makes sense. New version has a dedicated macro.

+/*
+ * Semi-aggressive vacuums eagerly scan some all-visible but not all-frozen
+ * pages. Since our goal is to freeze these pages, an eager scan that fails to
+ * set the page all-frozen in the VM is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once we fail to freeze MAX_SUCCESSIVE_EAGER_SCAN_FAILS
+ * blocks, we suspend eager scanning until vacuum has progressed to another
+ * region of the table with potentially older data.
+ */
+#define MAX_SUCCESSIVE_EAGER_SCAN_FAILS 1024

Can this really be a constant, given that the semi-aggressive regions are
shrunk for small tables?

Good point. This version actually disables eager scans for relations smaller
than a single region.

{
/* Target heap relation and its indexes */
@@ -153,8 +208,22 @@ typedef struct LVRelState
+     /*
+      * Whether or not this is an aggressive, semi-aggressive, or unaggressive
+      * VACUUM. A fully aggressive vacuum must set relfrozenxid >= FreezeLimit
+      * and therefore must scan every unfrozen tuple. A semi-aggressive vacuum
+      * will scan a certain number of all-visible pages until it is downgraded
+      * to an unaggressive vacuum.
+      */
+     VacAggressive aggressive;

- why is VacAggressive defined in vacuum.h? Isn't this fairly tightly coupled
to heapam?

It was because I had vacuum_get_cutoffs() return the aggressiveness. I've
changed this so that the enum can be defined in vacuumlazy.c.

- Kinda feels like the type should be named VacAggressivness or such?

I changed it to VacEagerness.

+     /*
+      * A semi-aggressive vacuum that has failed to freeze too many eagerly
+      * scanned blocks in a row suspends eager scanning. unaggressive_to is the
+      * block number of the first block eligible for resumed eager scanning.
+      */
+     BlockNumber unaggressive_to;

What's it set to otherwise? What is it set to in aggressive vacuums?

The idea was to set it to 0 for aggressive vacuum and never advance it.

However, for eager vacuum, there was actually a problem with this version of
the patch set that meant that we weren't actually enabling and disabling eager
scanning per region. Instead we were waiting until we hit the fail limit and
then disabling eager scanning for region-size # of blocks. This was effectively
a cooling off period as opposed to a region-based approach.

I've changed this in the current version. Now, for eager vacuum, we save the
block number of the next eager scan region in next_eager_scan_region_start.
Then when we cross over into the next region, we advance it. Eager scanning is
enabled as long as eager_pages.remaining_fails is > 0. When we cross into a new
region, we reset it to re-enable eager scanning if it was disabled.

For normal and aggressive vacuum, I set next_eager_scan_region_start to
InvalidBlockNumber to ensure we never trigger region calculations. However, for
aggressive vacuums, I do keep track of all-visible pages scanned using the same
counter in LVRelState that counts eager pages scanned. I'm not sure if it is
confusing to use some of this accounting labeled as eager scan accounting for
aggressive vacuum. In fact, in the logs, I print out all-visible pages scanned
-- which will be > 0 for both aggressive vacuums and eager vacuums.

There are tradeoffs between using the eager scan counters for all vacuum types
and initializing them to different values based on the vacuum eagerness level
and guarding all reference to them by vacuum type (and not initializing them to
valid but special values).

Let me know what you think about using the counters for aggressive vacuum too.

On the topic of the region-based method vs the cool-off method, with the region
method, if all of the failures are concentrated at the end of the region, we
will start eager scanning again as soon as we start the next region. With the
cool-off method we would wait a consistent number of blocks. But I think the
region method is still better. The region cutoff may be arbitrary but it
produces a consistent amount of extra scanning. What do you think?

+     /*
+      * The number of eagerly scanned blocks a semi-aggressive vacuum failed to
+      * freeze (due to age) in the current eager scan region. It is reset each
+      * time we hit MAX_SUCCESSIVE_EAGER_SCAN_FAILS.
+      */
+     BlockNumber eager_scanned_failed_frozen;
+
+     /*
+      * The remaining number of blocks a semi-aggressive vacuum will consider
+      * eager scanning. This is initialized to EAGER_SCAN_SUCCESS_RATE of the
+      * total number of all-visible but not all-frozen pages.
+      */
+     BlockNumber remaining_eager_scan_successes;

I think it might look better if you just bundled these into a struct like

struct
{
BlockNumber scanned;
BlockNumber failed_frozen;
BlockNumber remaining_successes;
} eager_pages;

Done

+     visibilitymap_count(rel, &orig_rel_allvisible, &orig_rel_allfrozen);
+     vacrel->remaining_eager_scan_successes =
+             (BlockNumber) (EAGER_SCAN_SUCCESS_RATE * (orig_rel_allvisible - orig_rel_allfrozen));
if (verbose)
{
-             if (vacrel->aggressive)
-                     ereport(INFO,
-                                     (errmsg("aggressively vacuuming \"%s.%s.%s\"",
-                                                     vacrel->dbname, vacrel->relnamespace,
-                                                     vacrel->relname)));
-             else
-                     ereport(INFO,
-                                     (errmsg("vacuuming \"%s.%s.%s\"",
-                                                     vacrel->dbname, vacrel->relnamespace,
-                                                     vacrel->relname)));
+             switch (vacrel->aggressive)
+             {
+                     case VAC_UNAGGRESSIVE:
+                             ereport(INFO,
+                                             (errmsg("vacuuming \"%s.%s.%s\"",
+                                                             vacrel->dbname, vacrel->relnamespace,
+                                                             vacrel->relname)));
+                             break;
+
+                     case VAC_AGGRESSIVE:
+                             ereport(INFO,
+                                             (errmsg("aggressively vacuuming \"%s.%s.%s\"",
+                                                             vacrel->dbname, vacrel->relnamespace,
+                                                             vacrel->relname)));
+                             break;
+
+                     case VAC_SEMIAGGRESSIVE:
+                             ereport(INFO,
+                                             (errmsg("semiaggressively vacuuming \"%s.%s.%s\"",
+                                                             vacrel->dbname, vacrel->relnamespace,
+                                                             vacrel->relname)));
+                             break;
+             }

Wonder if we should have a function that returns the aggressiveness of a
vacuum as an already translated string. There are other places where we emit
the aggressiveness as part of a message, and it's pretty silly to duplicate
most of the message.

I've added a helper to return text with the vacuum eagerness level. I used
gettext_noop() to mark it for translation later because I think the autovacuum
logging uses _() and ereports are translated. But I'm not sure this is
completely right.

@@ -545,11 +668,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
* Non-aggressive VACUUMs may advance them by any amount, or not at all.
*/
Assert(vacrel->NewRelfrozenXid == vacrel->cutoffs.OldestXmin ||
-                TransactionIdPrecedesOrEquals(vacrel->aggressive ? vacrel->cutoffs.FreezeLimit :
+                TransactionIdPrecedesOrEquals(vacrel->aggressive == VAC_AGGRESSIVE ?
+                                                                              vacrel->cutoffs.FreezeLimit :
vacrel->cutoffs.relfrozenxid,
vacrel->NewRelfrozenXid));
Assert(vacrel->NewRelminMxid == vacrel->cutoffs.OldestMxact ||
-                MultiXactIdPrecedesOrEquals(vacrel->aggressive ? vacrel->cutoffs.MultiXactCutoff :
+                MultiXactIdPrecedesOrEquals(vacrel->aggressive == VAC_AGGRESSIVE ?
+                                                                        vacrel->cutoffs.MultiXactCutoff :
vacrel->cutoffs.relminmxid,
vacrel->NewRelminMxid));
if (vacrel->skippedallvis)

These are starting to feel somewhat complicated. Wonder if it'd be easier to
read if they were written as normal ifs.

Did this.

+/*
+ * Helper to decrement a block number to 0 without wrapping around.
+ */
+static void
+decrement_blkno(BlockNumber *block)
+{
+     if ((*block) > 0)
+             (*block)--;
+}

I've removed it.

@@ -956,11 +1094,23 @@ lazy_scan_heap(LVRelState *vacrel)
if (!got_cleanup_lock)
LockBuffer(buf, BUFFER_LOCK_SHARE);

+             page_freezes = vacrel->vm_page_freezes;
+
/* Check for new or empty pages before lazy_scan_[no]prune call */
if (lazy_scan_new_or_empty(vacrel, buf, blkno, page, !got_cleanup_lock,
vmbuffer))
{
/* Processed as new/empty page (lock and pin released) */
+
+                     /* count an eagerly scanned page as a failure or a success */
+                     if (was_eager_scanned)
+                     {
+                             if (vacrel->vm_page_freezes > page_freezes)
+                                     decrement_blkno(&vacrel->remaining_eager_scan_successes);
+                             else
+                                     vacrel->eager_scanned_failed_frozen++;
+                     }
+
continue;
}

Maybe I'm confused, but ISTM that remaining_eager_scan_successes shouldn't
actually be a BlockNumber, given it doesn't actually indicates a specific
block...

All of the other counters like this in LVRelState are BlockNumbers (see
lpdead_item_pages, missed_dead_pages, etc). I'm fine with not using a
BlockNumber for this, but I would want to have a justification for why it is
different than the other cumulative counters for numbers of blocks.

I don't understand why we would sometimes want to treat empty pages as a
failure? They can't fail to be frozen, no?

I'm not sure it makes sense to count them as progress towards the success
limit either - afaict we just rediscovered free space is the table. That's imo
separate from semi-aggressive freezing.

That's a great point. In fact, I don't think we could ever have exercised this
code anyway. Since we will always freeze it, there shouldn't be any all-visible
but not all-frozen empty pages. I've removed this code.

Storing page_freezes as a copy of vacrel->vm_page_freezes and then checking if
that increased feels like a somewhat ugly way of tracking if freezing
happend. There's no more direct way.

This version uses an output parameter to lazy_scan_prune().

Why is decrement_blkno() needed? How can we ever get into negative territory?
Shouldn't eager scanning have been disabled when
remaining_eager_scan_successes reaches zero and thus prevent
remaining_eager_scan_successes from ever going below zero?

Right I've removed this.

@@ -1144,7 +1310,65 @@ heap_vac_scan_next_block(LVRelState *vacrel,
*/
bool skipsallvis;

-             find_next_unskippable_block(vacrel, &skipsallvis);
+             /*
+              * Figure out if we should disable eager scan going forward or
+              * downgrade to an unaggressive vacuum altogether.
+              */
+             if (vacrel->aggressive == VAC_SEMIAGGRESSIVE)
+             {
+                     /*
+                      * If we hit our success limit, there is no need to eagerly scan
+                      * any additional pages. Downgrade the vacuum to unaggressive.
+                      */
+                     if (vacrel->remaining_eager_scan_successes == 0)
+                             vacrel->aggressive = VAC_UNAGGRESSIVE;
+
+                     /*
+                      * If we hit the max number of failed eager scans for this region
+                      * of the table, figure out where the next eager scan region
+                      * should start. Eager scanning is effectively disabled until we
+                      * scan a block in that new region.
+                      */
+                     else if (vacrel->eager_scanned_failed_frozen >=
+                                      MAX_SUCCESSIVE_EAGER_SCAN_FAILS)
+                     {
+                             BlockNumber region_size,
+                                                     offset;
+

Why are we doing this logic here, rather than after incrementing
eager_scanned_failed_frozen? Seems that'd limit the amount of times we need to
run through this logic substantially?

I've moved it there. Actually, all of the logic has been moved around to make
the region method work.

Hm - isn't consider_eager_scan potentially outdated after
find_next_unskippable_block() iterated over a bunch of blocks? If
consider_eager_scan is false, this could very well go into the next
"semi-aggressive region", where consider_eager_scan should have been
re-enabled, no?

Yep. Great catch. I believe I've fixed this by removing consider_eager_scan and
instead checking if we have remaining failures in this region and resetting
remaining failures whenever we enter a new region.

Also turns out was_eager_scanned had some issues that I believe I've now fixed
as well.

- Melanie

Attachments:

v2-0001-Rename-LVRelState-frozen_pages.patchtext/x-patch; charset=US-ASCII; name=v2-0001-Rename-LVRelState-frozen_pages.patchDownload
From 1995eff8c5e6d3f9d3e0dcb0482b5a652d8d3c75 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 10:53:37 -0400
Subject: [PATCH v2 01/10] Rename LVRelState->frozen_pages

Rename frozen_pages to new_frozen_tuple_pages in LVRelState, the struct
used for tracking state during vacuuming of a heap relation.
frozen_pages sounds like it includes every all-frozen page. That is a
misnomer. It does not include pages with already frozen tuples. It also
includes pages that are not actually all-frozen.

Author: Melanie Plageman
Reviewed-by: Andres Freund

Discussion: https://postgr.es.org/message-id/ctdjzroezaxmiyah3gwbwm67defsrwj2b5fpfs4ku6msfpxeia%40mwjyqlhwr2wu
---
 src/backend/access/heap/vacuumlazy.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 6a3588cf817..3077ee8ec32 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -188,7 +188,7 @@ typedef struct LVRelState
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
-	BlockNumber frozen_pages;	/* # pages with newly frozen tuples */
+	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 	BlockNumber lpdead_item_pages;	/* # pages with LP_DEAD items */
 	BlockNumber missed_dead_pages;	/* # pages with missed dead tuples */
 	BlockNumber nonempty_pages; /* actually, last nonempty page + 1 */
@@ -407,7 +407,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
 	vacrel->removed_pages = 0;
-	vacrel->frozen_pages = 0;
+	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
 	vacrel->missed_dead_pages = 0;
 	vacrel->nonempty_pages = 0;
@@ -696,9 +696,10 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 								 vacrel->NewRelminMxid, diff);
 			}
 			appendStringInfo(&buf, _("frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n"),
-							 vacrel->frozen_pages,
+							 vacrel->new_frozen_tuple_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->frozen_pages / orig_rel_pages,
+							 100.0 * vacrel->new_frozen_tuple_pages /
+							 orig_rel_pages,
 							 (long long) vacrel->tuples_frozen);
 			if (vacrel->do_index_vacuuming)
 			{
@@ -1453,11 +1454,12 @@ lazy_scan_prune(LVRelState *vacrel,
 	if (presult.nfrozen > 0)
 	{
 		/*
-		 * We don't increment the frozen_pages instrumentation counter when
-		 * nfrozen == 0, since it only counts pages with newly frozen tuples
-		 * (don't confuse that with pages newly set all-frozen in VM).
+		 * We don't increment the new_frozen_tuple_pages instrumentation
+		 * counter when nfrozen == 0, since it only counts pages with newly
+		 * frozen tuples (don't confuse that with pages newly set all-frozen
+		 * in VM).
 		 */
-		vacrel->frozen_pages++;
+		vacrel->new_frozen_tuple_pages++;
 	}
 
 	/*
-- 
2.34.1

v2-0005-Move-vacuum-VM-buffer-release.patchtext/x-patch; charset=US-ASCII; name=v2-0005-Move-vacuum-VM-buffer-release.patchDownload
From c57df90d531dabd2a1383f67e82fdd2feef7a862 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:14:24 -0400
Subject: [PATCH v2 05/10] Move vacuum VM buffer release

The VM buffer for the next unskippable block can be released after the
main loop in lazy_scan_heap(). Doing so de-clutters
heap_vac_scan_next_block() and is more consistent. All other VM buffer
releases happen in lazy_scan_heap().
---
 src/backend/access/heap/vacuumlazy.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index dac40f2f7fd..272ddee22c5 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -1054,6 +1054,14 @@ lazy_scan_heap(LVRelState *vacrel)
 	}
 
 	vacrel->blkno = InvalidBlockNumber;
+
+	/* Release VM buffers */
+	if (BufferIsValid(vacrel->next_unskippable_vmbuffer))
+	{
+		ReleaseBuffer(vacrel->next_unskippable_vmbuffer);
+		vacrel->next_unskippable_vmbuffer = InvalidBuffer;
+	}
+
 	if (BufferIsValid(vmbuffer))
 		ReleaseBuffer(vmbuffer);
 
@@ -1125,11 +1133,6 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
-		if (BufferIsValid(vacrel->next_unskippable_vmbuffer))
-		{
-			ReleaseBuffer(vacrel->next_unskippable_vmbuffer);
-			vacrel->next_unskippable_vmbuffer = InvalidBuffer;
-		}
 		*blkno = vacrel->rel_pages;
 		return false;
 	}
-- 
2.34.1

v2-0002-Make-visibilitymap_set-return-previous-state-of-v.patchtext/x-patch; charset=US-ASCII; name=v2-0002-Make-visibilitymap_set-return-previous-state-of-v.patchDownload
From b85054fdaad430e4581718f75ed591285eb22aa6 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Thu, 21 Nov 2024 18:36:05 -0500
Subject: [PATCH v2 02/10] Make visibilitymap_set() return previous state of
 vmbits

It can be useful to know the state of a relation page's VM bits before
visibilitymap_set(). visibilitymap_set() has the old value on hand, so
returning it is simple. This commit does not use visibilitymap_set()'s
new return value.

Author: Melanie Plageman
Reviewed-by: Masahiko Sawada, Andres Freund, Nitin Jadhav
Discussion: https://postgr.es/m/flat/CAAKRu_ZQe26xdvAqo4weHLR%3DivQ8J4xrSfDDD8uXnh-O-6P6Lg%40mail.gmail.com#6d8d2b4219394f774889509bf3bdc13d,
https://postgr.es/m/ctdjzroezaxmiyah3gwbwm67defsrwj2b5fpfs4ku6msfpxeia%40mwjyqlhwr2wu
---
 src/backend/access/heap/visibilitymap.c | 9 +++++++--
 src/include/access/visibilitymap.h      | 9 ++++++---
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/src/backend/access/heap/visibilitymap.c b/src/backend/access/heap/visibilitymap.c
index 8b24e7bc33c..5f71fafaa37 100644
--- a/src/backend/access/heap/visibilitymap.c
+++ b/src/backend/access/heap/visibilitymap.c
@@ -239,8 +239,10 @@ visibilitymap_pin_ok(BlockNumber heapBlk, Buffer vmbuf)
  * You must pass a buffer containing the correct map page to this function.
  * Call visibilitymap_pin first to pin the right one. This function doesn't do
  * any I/O.
+ *
+ * Returns the state of the page's VM bits before setting flags.
  */
-void
+uint8
 visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,
 				  XLogRecPtr recptr, Buffer vmBuf, TransactionId cutoff_xid,
 				  uint8 flags)
@@ -250,6 +252,7 @@ visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,
 	uint8		mapOffset = HEAPBLK_TO_OFFSET(heapBlk);
 	Page		page;
 	uint8	   *map;
+	uint8		status;
 
 #ifdef TRACE_VISIBILITYMAP
 	elog(DEBUG1, "vm_set %s %d", RelationGetRelationName(rel), heapBlk);
@@ -274,7 +277,8 @@ visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,
 	map = (uint8 *) PageGetContents(page);
 	LockBuffer(vmBuf, BUFFER_LOCK_EXCLUSIVE);
 
-	if (flags != (map[mapByte] >> mapOffset & VISIBILITYMAP_VALID_BITS))
+	status = ((map[mapByte] >> mapOffset) & VISIBILITYMAP_VALID_BITS);
+	if (flags != status)
 	{
 		START_CRIT_SECTION();
 
@@ -311,6 +315,7 @@ visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,
 	}
 
 	LockBuffer(vmBuf, BUFFER_LOCK_UNLOCK);
+	return status;
 }
 
 /*
diff --git a/src/include/access/visibilitymap.h b/src/include/access/visibilitymap.h
index 1a4d467e6f0..f7779a0fe19 100644
--- a/src/include/access/visibilitymap.h
+++ b/src/include/access/visibilitymap.h
@@ -31,9 +31,12 @@ extern bool visibilitymap_clear(Relation rel, BlockNumber heapBlk,
 extern void visibilitymap_pin(Relation rel, BlockNumber heapBlk,
 							  Buffer *vmbuf);
 extern bool visibilitymap_pin_ok(BlockNumber heapBlk, Buffer vmbuf);
-extern void visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf,
-							  XLogRecPtr recptr, Buffer vmBuf, TransactionId cutoff_xid,
-							  uint8 flags);
+extern uint8 visibilitymap_set(Relation rel,
+							   BlockNumber heapBlk, Buffer heapBuf,
+							   XLogRecPtr recptr,
+							   Buffer vmBuf,
+							   TransactionId cutoff_xid,
+							   uint8 flags);
 extern uint8 visibilitymap_get_status(Relation rel, BlockNumber heapBlk, Buffer *vmbuf);
 extern void visibilitymap_count(Relation rel, BlockNumber *all_visible, BlockNumber *all_frozen);
 extern BlockNumber visibilitymap_prepare_truncate(Relation rel,
-- 
2.34.1

v2-0004-Remove-leftover-mentions-of-XLOG_HEAP2_FREEZE_PAG.patchtext/x-patch; charset=US-ASCII; name=v2-0004-Remove-leftover-mentions-of-XLOG_HEAP2_FREEZE_PAG.patchDownload
From 2a998f8ffad95c5cf7057d8ad76eefd47e0d671f Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Wed, 11 Dec 2024 13:36:29 -0500
Subject: [PATCH v2 04/10] Remove leftover mentions of XLOG_HEAP2_FREEZE_PAGE
 records

f83d709760d merged the separate XLOG_HEAP2_FREEZE_PAGE records into a
new combined prune, freeze, and vacuum record with opcode
XLOG_HEAP2_PRUNE_VACUUM_SCAN. Remove the last few references to
XLOG_HEAP2_FREEZE_PAGE records which were accidentally left behind.
---
 src/backend/access/heap/pruneheap.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index 869d82ad667..11c9532719d 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -1906,7 +1906,7 @@ heap_log_freeze_eq(xlhp_freeze_plan *plan, HeapTupleFreeze *frz)
 }
 
 /*
- * Comparator used to deduplicate XLOG_HEAP2_FREEZE_PAGE freeze plans
+ * Comparator used to deduplicate the freeze plans used in WAL records.
  */
 static int
 heap_log_freeze_cmp(const void *arg1, const void *arg2)
@@ -1966,7 +1966,7 @@ heap_log_freeze_new_plan(xlhp_freeze_plan *plan, HeapTupleFreeze *frz)
 
 /*
  * Deduplicate tuple-based freeze plans so that each distinct set of
- * processing steps is only stored once in XLOG_HEAP2_FREEZE_PAGE records.
+ * processing steps is only stored once in the WAL record.
  * Called during original execution of freezing (for logged relations).
  *
  * Return value is number of plans set in *plans_out for caller.  Also writes
-- 
2.34.1

v2-0003-Count-pages-set-all-visible-and-all-frozen-in-VM-.patchtext/x-patch; charset=US-ASCII; name=v2-0003-Count-pages-set-all-visible-and-all-frozen-in-VM-.patchDownload
From 7e52c4c20a8b07ebf2bb40462e2780f25a060b38 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Thu, 31 Oct 2024 18:19:18 -0400
Subject: [PATCH v2 03/10] Count pages set all-visible and all-frozen in VM
 during vacuum

Vacuum already counts and logs pages with newly frozen tuples.
Now count and log the number of pages newly set all-visible and
all-frozen in the visibility map.

Pages that are all-visible but not all-frozen are debt for future
aggressive vacuums. The counts of newly all-visible and all-frozen pages
give us visibility into the rate at which this debt is being accrued and
paid down.

Author: Melanie Plageman
Reviewed-by: Masahiko Sawada, Alastair Turner, Nitin Jadhav, Andres Freund
Discussion: https://postgr.es/m/flat/CAAKRu_ZQe26xdvAqo4weHLR%3DivQ8J4xrSfDDD8uXnh-O-6P6Lg%40mail.gmail.com#6d8d2b4219394f774889509bf3bdc13d,
https://postgr.es/m/ctdjzroezaxmiyah3gwbwm67defsrwj2b5fpfs4ku6msfpxeia%40mwjyqlhwr2wu

ci-os-only:
---
 src/backend/access/heap/vacuumlazy.c | 125 ++++++++++++++++++++++++---
 1 file changed, 113 insertions(+), 12 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 3077ee8ec32..dac40f2f7fd 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -189,6 +189,21 @@ typedef struct LVRelState
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
+
+	/* # pages newly set all-visible in the VM */
+	BlockNumber vm_new_visible_pages;
+
+	/*
+	 * # pages newly set both all-visible and all-frozen in the VM. This is a
+	 * subset of vm_new_visible_pages. That is, vm_new_visible_frozen_pages
+	 * includes only pages previously neither all-visible nor all-frozen in
+	 * the VM but which this vacuum set all-visible and all-frozen.
+	 */
+	BlockNumber vm_new_visible_frozen_pages;
+
+	/* # all-visible pages newly set all-frozen in the VM */
+	BlockNumber vm_new_frozen_pages;
+
 	BlockNumber lpdead_item_pages;	/* # pages with LP_DEAD items */
 	BlockNumber missed_dead_pages;	/* # pages with missed dead tuples */
 	BlockNumber nonempty_pages; /* actually, last nonempty page + 1 */
@@ -428,6 +443,10 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->recently_dead_tuples = 0;
 	vacrel->missed_dead_tuples = 0;
 
+	vacrel->vm_new_visible_pages = 0;
+	vacrel->vm_new_visible_frozen_pages = 0;
+	vacrel->vm_new_frozen_pages = 0;
+
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
 	 * not just RECENTLY_DEAD, and which XIDs/MXIDs to freeze.  Then determine
@@ -701,6 +720,11 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 100.0 * vacrel->new_frozen_tuple_pages /
 							 orig_rel_pages,
 							 (long long) vacrel->tuples_frozen);
+
+			appendStringInfo(&buf, _("visibility map: %u pages newly set all-visible, of which %u set all-frozen. %u all-visible pages newly set all-frozen.\n"),
+							 vacrel->vm_new_visible_pages,
+							 vacrel->vm_new_visible_frozen_pages,
+							 vacrel->vm_new_frozen_pages);
 			if (vacrel->do_index_vacuuming)
 			{
 				if (vacrel->nindexes == 0 || vacrel->num_index_scans == 0)
@@ -1354,6 +1378,8 @@ lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
 		 */
 		if (!PageIsAllVisible(page))
 		{
+			uint8		old_vmbits;
+
 			START_CRIT_SECTION();
 
 			/* mark buffer dirty before writing a WAL record */
@@ -1373,10 +1399,25 @@ lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
 				log_newpage_buffer(buf, true);
 
 			PageSetAllVisible(page);
-			visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr,
-							  vmbuffer, InvalidTransactionId,
-							  VISIBILITYMAP_ALL_VISIBLE | VISIBILITYMAP_ALL_FROZEN);
+			old_vmbits = visibilitymap_set(vacrel->rel, blkno, buf,
+										   InvalidXLogRecPtr,
+										   vmbuffer, InvalidTransactionId,
+										   VISIBILITYMAP_ALL_VISIBLE |
+										   VISIBILITYMAP_ALL_FROZEN);
 			END_CRIT_SECTION();
+
+			/*
+			 * If the page wasn't already set all-visible and all-frozen in
+			 * the VM, count it as newly set for logging.
+			 */
+			if ((old_vmbits & VISIBILITYMAP_ALL_VISIBLE) == 0 &&
+				(old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0)
+			{
+				vacrel->vm_new_visible_pages++;
+				vacrel->vm_new_visible_frozen_pages++;
+			}
+			else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0)
+				vacrel->vm_new_frozen_pages++;
 		}
 
 		freespace = PageGetHeapFreeSpace(page);
@@ -1531,6 +1572,7 @@ lazy_scan_prune(LVRelState *vacrel,
 	 */
 	if (!all_visible_according_to_vm && presult.all_visible)
 	{
+		uint8		old_vmbits;
 		uint8		flags = VISIBILITYMAP_ALL_VISIBLE;
 
 		if (presult.all_frozen)
@@ -1554,9 +1596,25 @@ lazy_scan_prune(LVRelState *vacrel,
 		 */
 		PageSetAllVisible(page);
 		MarkBufferDirty(buf);
-		visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr,
-						  vmbuffer, presult.vm_conflict_horizon,
-						  flags);
+		old_vmbits = visibilitymap_set(vacrel->rel, blkno, buf,
+									   InvalidXLogRecPtr,
+									   vmbuffer, presult.vm_conflict_horizon,
+									   flags);
+
+		/*
+		 * If the page wasn't already set all-visible and all-frozen in the
+		 * VM, count it as newly set for logging.
+		 */
+		if ((old_vmbits & VISIBILITYMAP_ALL_VISIBLE) == 0 &&
+			(old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0)
+		{
+			vacrel->vm_new_visible_pages++;
+			if (presult.all_frozen)
+				vacrel->vm_new_visible_frozen_pages++;
+		}
+		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
+				 presult.all_frozen)
+			vacrel->vm_new_frozen_pages++;
 	}
 
 	/*
@@ -1606,6 +1664,8 @@ lazy_scan_prune(LVRelState *vacrel,
 	else if (all_visible_according_to_vm && presult.all_visible &&
 			 presult.all_frozen && !VM_ALL_FROZEN(vacrel->rel, blkno, &vmbuffer))
 	{
+		uint8		old_vmbits;
+
 		/*
 		 * Avoid relying on all_visible_according_to_vm as a proxy for the
 		 * page-level PD_ALL_VISIBLE bit being set, since it might have become
@@ -1625,10 +1685,33 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * was logged when the page's tuples were frozen.
 		 */
 		Assert(!TransactionIdIsValid(presult.vm_conflict_horizon));
-		visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr,
-						  vmbuffer, InvalidTransactionId,
-						  VISIBILITYMAP_ALL_VISIBLE |
-						  VISIBILITYMAP_ALL_FROZEN);
+		old_vmbits = visibilitymap_set(vacrel->rel, blkno, buf,
+									   InvalidXLogRecPtr,
+									   vmbuffer, InvalidTransactionId,
+									   VISIBILITYMAP_ALL_VISIBLE |
+									   VISIBILITYMAP_ALL_FROZEN);
+
+		/*
+		 * The page was likely already set all-visible in the VM. However,
+		 * there is a small chance that it was modified sometime between
+		 * setting all_visible_according_to_vm and checking the visibility
+		 * during pruning. Check the return value of old_vmbits anyway to
+		 * ensure the visibility map counters used for logging are accurate.
+		 */
+		if ((old_vmbits & VISIBILITYMAP_ALL_VISIBLE) == 0 &&
+			(old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0)
+		{
+			vacrel->vm_new_visible_pages++;
+			vacrel->vm_new_visible_frozen_pages++;
+		}
+
+		/*
+		 * We already checked that the page was not set all-frozen in the VM
+		 * above, so we don't need to test the value of old_vmbits.
+		 */
+		else
+			vacrel->vm_new_frozen_pages++;
+
 	}
 }
 
@@ -2274,6 +2357,7 @@ lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer,
 	if (heap_page_is_all_visible(vacrel, buffer, &visibility_cutoff_xid,
 								 &all_frozen))
 	{
+		uint8		old_vmbits;
 		uint8		flags = VISIBILITYMAP_ALL_VISIBLE;
 
 		if (all_frozen)
@@ -2283,8 +2367,25 @@ lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer,
 		}
 
 		PageSetAllVisible(page);
-		visibilitymap_set(vacrel->rel, blkno, buffer, InvalidXLogRecPtr,
-						  vmbuffer, visibility_cutoff_xid, flags);
+		old_vmbits = visibilitymap_set(vacrel->rel, blkno, buffer,
+									   InvalidXLogRecPtr,
+									   vmbuffer, visibility_cutoff_xid,
+									   flags);
+
+		/*
+		 * If the page wasn't already set all-visible and all-frozen in the
+		 * VM, count it as newly set for logging.
+		 */
+		if ((old_vmbits & VISIBILITYMAP_ALL_VISIBLE) == 0 &&
+			(old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0)
+		{
+			vacrel->vm_new_visible_pages++;
+			if (all_frozen)
+				vacrel->vm_new_visible_frozen_pages++;
+		}
+
+		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 && all_frozen)
+			vacrel->vm_new_frozen_pages++;
 	}
 
 	/* Revert to the previous phase information for error traceback */
-- 
2.34.1

v2-0006-Remove-superfluous-next_block-local-variable-in-v.patchtext/x-patch; charset=US-ASCII; name=v2-0006-Remove-superfluous-next_block-local-variable-in-v.patchDownload
From d0c8d809c668ffb577d7e62b340c62a6b822bb97 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:36:58 -0400
Subject: [PATCH v2 06/10] Remove superfluous next_block local variable in
 vacuum code

Reduce the number of block related variables in lazy_scan_heap() and its
helpers by removing the next_block local variable from
heap_vac_scan_next_block().
---
 src/backend/access/heap/vacuumlazy.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 272ddee22c5..0f03bbd951b 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -1125,13 +1125,11 @@ static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 						 bool *all_visible_according_to_vm)
 {
-	BlockNumber next_block;
-
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
-	next_block = vacrel->current_block + 1;
+	vacrel->current_block++;
 
 	/* Have we reached the end of the relation? */
-	if (next_block >= vacrel->rel_pages)
+	if (vacrel->current_block >= vacrel->rel_pages)
 	{
 		*blkno = vacrel->rel_pages;
 		return false;
@@ -1140,7 +1138,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 	/*
 	 * We must be in one of the three following states:
 	 */
-	if (next_block > vacrel->next_unskippable_block ||
+	if (vacrel->current_block > vacrel->next_unskippable_block ||
 		vacrel->next_unskippable_block == InvalidBlockNumber)
 	{
 		/*
@@ -1167,23 +1165,24 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 * pages then skipping makes updating relfrozenxid unsafe, which is a
 		 * real downside.
 		 */
-		if (vacrel->next_unskippable_block - next_block >= SKIP_PAGES_THRESHOLD)
+		if (vacrel->next_unskippable_block - vacrel->current_block >=
+			SKIP_PAGES_THRESHOLD)
 		{
-			next_block = vacrel->next_unskippable_block;
+			vacrel->current_block = vacrel->next_unskippable_block;
 			if (skipsallvis)
 				vacrel->skippedallvis = true;
 		}
 	}
 
 	/* Now we must be in one of the two remaining states: */
-	if (next_block < vacrel->next_unskippable_block)
+	if (vacrel->current_block < vacrel->next_unskippable_block)
 	{
 		/*
 		 * 2. We are processing a range of blocks that we could have skipped
 		 * but chose not to.  We know that they are all-visible in the VM,
 		 * otherwise they would've been unskippable.
 		 */
-		*blkno = vacrel->current_block = next_block;
+		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = true;
 		return true;
 	}
@@ -1193,9 +1192,9 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 * 3. We reached the next unskippable block.  Process it.  On next
 		 * iteration, we will be back in state 1.
 		 */
-		Assert(next_block == vacrel->next_unskippable_block);
+		Assert(vacrel->current_block == vacrel->next_unskippable_block);
 
-		*blkno = vacrel->current_block = next_block;
+		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
 		return true;
 	}
-- 
2.34.1

v2-0007-Make-heap_vac_scan_next_block-return-BlockNumber.patchtext/x-patch; charset=US-ASCII; name=v2-0007-Make-heap_vac_scan_next_block-return-BlockNumber.patchDownload
From 285becfb434d6e20fd72c02c781729c6fa5573c1 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:07:50 -0400
Subject: [PATCH v2 07/10] Make heap_vac_scan_next_block() return BlockNumber

Pass rel_pages instead of blkno to vacuum progress reporting and free
space map vacuuming outside of the main loop in lazy_scan_heap(). This
allows us to reduce the scope of blkno and refactor
heap_vac_scan_next_block() to return the next block number.

This makes the interface more straightforward as well as paving the way
for heap_vac_scan_next_block() to be used by the read stream API as a
callback to implement streaming vacuum.
---
 src/backend/access/heap/vacuumlazy.c | 48 +++++++++++++++-------------
 1 file changed, 26 insertions(+), 22 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 0f03bbd951b..0d3f6e67e45 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -242,8 +242,8 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
-static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+static BlockNumber heap_vac_scan_next_block(LVRelState *vacrel,
+											bool *all_visible_according_to_vm);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -849,7 +849,6 @@ static void
 lazy_scan_heap(LVRelState *vacrel)
 {
 	BlockNumber rel_pages = vacrel->rel_pages,
-				blkno,
 				next_fsm_block_to_vacuum = 0;
 	bool		all_visible_according_to_vm;
 
@@ -873,13 +872,20 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->next_unskippable_allvis = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (true)
 	{
 		Buffer		buf;
+		BlockNumber blkno;
 		Page		page;
 		bool		has_lpdead_items;
 		bool		got_cleanup_lock = false;
 
+		blkno = heap_vac_scan_next_block(vacrel,
+										 &all_visible_according_to_vm);
+
+		if (!BlockNumberIsValid(blkno))
+			break;
+
 		vacrel->scanned_pages++;
 
 		/* Report as block scanned, update error traceback information */
@@ -1066,7 +1072,8 @@ lazy_scan_heap(LVRelState *vacrel)
 		ReleaseBuffer(vmbuffer);
 
 	/* report that everything is now scanned */
-	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
+	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED,
+								 rel_pages);
 
 	/* now we can compute the new value for pg_class.reltuples */
 	vacrel->new_live_tuples = vac_estimate_reltuples(vacrel->rel, rel_pages,
@@ -1092,11 +1099,13 @@ lazy_scan_heap(LVRelState *vacrel)
 	 * Vacuum the remainder of the Free Space Map.  We must do this whether or
 	 * not there were indexes, and whether or not we bypassed index vacuuming.
 	 */
-	if (blkno > next_fsm_block_to_vacuum)
-		FreeSpaceMapVacuumRange(vacrel->rel, next_fsm_block_to_vacuum, blkno);
+	if (rel_pages > next_fsm_block_to_vacuum)
+		FreeSpaceMapVacuumRange(vacrel->rel, next_fsm_block_to_vacuum,
+								rel_pages);
 
 	/* report all blocks vacuumed */
-	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_VACUUMED, blkno);
+	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_VACUUMED,
+								 rel_pages);
 
 	/* Do final index cleanup (call each index's amvacuumcleanup routine) */
 	if (vacrel->nindexes > 0 && vacrel->do_index_cleanup)
@@ -1109,11 +1118,11 @@ lazy_scan_heap(LVRelState *vacrel)
  * lazy_scan_heap() calls here every time it needs to get the next block to
  * prune and vacuum.  The function uses the visibility map, vacuum options,
  * and various thresholds to skip blocks which do not need to be processed and
- * sets blkno to the next block to process.
+ * returns the next block to process.
  *
- * The block number and visibility status of the next block to process are set
- * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * The block number and visibility status of the next block to process are
+ * returned and set in *all_visible_according_to_vm.  The return value is
+ * InvalidBlockNumber if there are no further blocks to process.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1121,8 +1130,8 @@ lazy_scan_heap(LVRelState *vacrel)
  * relfrozenxid in that case.  vacrel also holds information about the next
  * unskippable block, as bookkeeping for this function.
  */
-static bool
-heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
+static BlockNumber
+heap_vac_scan_next_block(LVRelState *vacrel,
 						 bool *all_visible_according_to_vm)
 {
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
@@ -1130,10 +1139,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 	/* Have we reached the end of the relation? */
 	if (vacrel->current_block >= vacrel->rel_pages)
-	{
-		*blkno = vacrel->rel_pages;
-		return false;
-	}
+		return InvalidBlockNumber;
 
 	/*
 	 * We must be in one of the three following states:
@@ -1182,9 +1188,8 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 * but chose not to.  We know that they are all-visible in the VM,
 		 * otherwise they would've been unskippable.
 		 */
-		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = true;
-		return true;
+		return vacrel->current_block;
 	}
 	else
 	{
@@ -1194,9 +1199,8 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 */
 		Assert(vacrel->current_block == vacrel->next_unskippable_block);
 
-		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
-		return true;
+		return vacrel->current_block;
 	}
 }
 
-- 
2.34.1

v2-0009-Add-more-general-summary-to-vacuumlazy.c.patchtext/x-patch; charset=US-ASCII; name=v2-0009-Add-more-general-summary-to-vacuumlazy.c.patchDownload
From 852b876a35e07d3712baf11295e30ae68c835a61 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Wed, 11 Dec 2024 14:13:34 -0500
Subject: [PATCH v2 09/10] Add more general summary to vacuumlazy.c

Add more details to how vacuuming heap relations works to vacuumlazy.c
Previously the top of vacuumlazy.c only had details related to the dead
TID storage added in Postgres 17. This commit adds a more general
summary to help future developers understand the heap relation vacuuming
implementation at a high level.

It would be good to add another sentence or two on index vacuuming.
---
 src/backend/access/heap/vacuumlazy.c | 39 ++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 49c5c24f63b..4bfb5b3c5d2 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -3,6 +3,45 @@
  * vacuumlazy.c
  *	  Concurrent ("lazy") vacuuming.
  *
+ * Heap relations are vacuumed in three main phases. In the phase I,
+ * vacuum scans relation pages, pruning and freezing tuples and saving dead
+ * tuples' TIDs in a TID store. If that TID store fills up or vacuum finishes
+ * scanning the relation, it progresses to the phase II: index vacuuming.
+ *
+ * If there are no indexes or index scanning is disabled, phase II may be
+ * skipped. If phase I identified very few dead index entries, vacuum may skip
+ * phases II and III. Index vacuuming deletes the dead index entries from the
+ * TID store.
+ *
+ * After index vacuuming is complete, vacuum scans the blocks of the relation
+ * indicated by the TIDs in the TID store and reaps the dead tuples, freeing
+ * that space for future tuples. Finally, vacuum may truncate the relation if
+ * it has emptied pages at the end.
+ *
+ * After finishing all phases of work, vacuum updates relation statistics in
+ * pg_class and the cumulative statistics subsystem.
+ *
+ * Relation Scanning:
+ *
+ * Vacuum scans the heap relation, starting at the beginning and progressing
+ * to the end, skipping pages as permitted by their visibility status, vacuum
+ * options, and the eagerness level of the vacuum.
+ *
+ * When page skipping is enabled, non-aggressive vacuums may skip scanning
+ * pages that are marked all-visible in the visibility map. We may choose not
+ * to skip pages if the range of skippable pages is below
+ * SKIP_PAGES_THRESHOLD.
+ *
+ * Once vacuum has decided to scan a given block, it must read in the block
+ * and obtain a cleanup lock to prune tuples on the page. A non-aggressive
+ * vacuums may choose to skip pruning and freezing if it cannot acquire a
+ * cleanup lock on the buffer right away.
+ *
+ * After pruning and freezing, pages that are newly all-visible and all-frozen
+ * are marked as such in the visibility map.
+ *
+ * Dead TID Storage:
+ *
  * The major space usage for vacuuming is storage for the dead tuple IDs that
  * are to be removed from indexes.  We want to ensure we can vacuum even the
  * very largest relations with finite memory space usage.  To do that, we set
-- 
2.34.1

v2-0008-Refactor-vacuum-assert-into-multiple-if-statement.patchtext/x-patch; charset=US-ASCII; name=v2-0008-Refactor-vacuum-assert-into-multiple-if-statement.patchDownload
From 153261061f28f05696daf1ddc74898a8e395ed6e Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Fri, 13 Dec 2024 13:48:09 -0500
Subject: [PATCH v2 08/10] Refactor vacuum assert into multiple if statements

The assert in heap_vacuum_rel() before updating relfrozenxid and/or
relminmxid in pg_class was long and complicated. This commit refactors
it into several if statements for clarity.
---
 src/backend/access/heap/vacuumlazy.c | 45 +++++++++++++++++++++++-----
 1 file changed, 37 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 0d3f6e67e45..49c5c24f63b 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -550,14 +550,43 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * value >= FreezeLimit, and relminmxid to a value >= MultiXactCutoff.
 	 * Non-aggressive VACUUMs may advance them by any amount, or not at all.
 	 */
-	Assert(vacrel->NewRelfrozenXid == vacrel->cutoffs.OldestXmin ||
-		   TransactionIdPrecedesOrEquals(vacrel->aggressive ? vacrel->cutoffs.FreezeLimit :
-										 vacrel->cutoffs.relfrozenxid,
-										 vacrel->NewRelfrozenXid));
-	Assert(vacrel->NewRelminMxid == vacrel->cutoffs.OldestMxact ||
-		   MultiXactIdPrecedesOrEquals(vacrel->aggressive ? vacrel->cutoffs.MultiXactCutoff :
-									   vacrel->cutoffs.relminmxid,
-									   vacrel->NewRelminMxid));
+
+#ifdef USE_ASSERT_CHECKING
+	if (vacrel->NewRelfrozenXid == vacrel->cutoffs.OldestXmin)
+	{
+		/* No new relfrozenxid identified */
+	}
+	else if (vacrel->aggressive)
+	{
+		/*
+		 * Aggressive vacuum must have frozen all tuples older than the freeze
+		 * limit.
+		 */
+		Assert(TransactionIdPrecedesOrEquals(vacrel->cutoffs.FreezeLimit,
+											 vacrel->NewRelfrozenXid));
+	}
+	else
+		Assert(TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+											 vacrel->NewRelfrozenXid));
+
+	if (vacrel->NewRelminMxid == vacrel->cutoffs.OldestMxact)
+	{
+		/* No new relminmxid identified */
+	}
+	else if (vacrel->aggressive)
+	{
+		/*
+		 * Aggressive vacuum must have frozen all tuples older than the
+		 * multixact cutoff.
+		 */
+		Assert(MultiXactIdPrecedesOrEquals(vacrel->cutoffs.MultiXactCutoff,
+										   vacrel->NewRelminMxid));
+	}
+	else
+		Assert(MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+										   vacrel->NewRelminMxid));
+#endif
+
 	if (vacrel->skippedallvis)
 	{
 		/*
-- 
2.34.1

v2-0010-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchtext/x-patch; charset=US-ASCII; name=v2-0010-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchDownload
From e36b4fac345be44954410c4f0e61467dc0f49a72 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Thu, 12 Dec 2024 16:44:37 -0500
Subject: [PATCH v2 10/10] Eagerly scan all-visible pages to amortize
 aggressive vacuum

Introduce eager vacuums, which scan some of the all-visible but not
all-frozen pages in the relation to amortize the cost of an aggressive
vacuum.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
considered successful eager scans and those not frozen are considered
failed eager scans.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. To effectively amortize
aggressive vacuums, we cap the number of successes as well. Once we
reach the maximum number of blocks successfully eager scanned and
frozen, the eager vacuum is downgraded to a normal vacuum.

All-visible pages scanned by both eager and aggressive vacuums are
counted and logged.
---
 src/backend/access/heap/vacuumlazy.c | 426 +++++++++++++++++++++++----
 src/tools/pgindent/typedefs.list     |   1 +
 2 files changed, 373 insertions(+), 54 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 4bfb5b3c5d2..6806926c459 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -27,11 +27,37 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and the eagerness level of the vacuum.
  *
+ * There are three vacuum eagerness levels: normal vacuum, eager vacuum, and
+ * aggressive vacuum.
+ *
  * When page skipping is enabled, non-aggressive vacuums may skip scanning
- * pages that are marked all-visible in the visibility map. We may choose not
+ * pages that are marked all-visible in the visibility map. It may choose not
  * to skip pages if the range of skippable pages is below
  * SKIP_PAGES_THRESHOLD.
  *
+ * Eager vacuums will scan skippable pages in an effort to freeze them and
+ * decrease the backlog of all-visible but not all-frozen pages that have to
+ * be processed to advance relfrozenxid and avoid transaction ID wraparound.
+ *
+ * Eager vacuums counts it as a success when they are able to set an eagerly
+ * scanned page all-frozen in the VM and a failure when they are not able to
+ * set the page all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, eager vacuums cap the number of successful eager scans to
+ * EAGER_SCAN_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, eager vacuums use a localized failure cap
+ * instead of a global cap for the whole relation. The failure count is reset
+ * for each region of the table -- comprised of EAGER_SCAN_REGION_SIZE blocks.
+ * In each region, we tolerate EAGER_SCAN_MAX_FAILS_PER_REGION before
+ * suspending eager scanning until the end of the region.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and are thus not
+ * subject to failure or success caps when eagerly scanning all-visible pages.
+ *
  * Once vacuum has decided to scan a given block, it must read in the block
  * and obtain a cleanup lock to prune tuples on the page. A non-aggressive
  * vacuums may choose to skip pruning and freezing if it cannot acquire a
@@ -85,6 +111,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -170,6 +197,51 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * Eager vacuums scan some all-visible but not all-frozen pages. Since our
+ * goal is to freeze these pages, an eager scan that fails to set the page
+ * all-frozen in the VM is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once we fail to freeze EAGER_SCAN_MAX_FAILS_PER_REGION
+ * blocks in a region of size EAGER_SCAN_REGION_SIZE, we suspend eager
+ * scanning until vacuum has progressed to another region of the table with
+ * potentially older data.
+ */
+#define EAGER_SCAN_REGION_SIZE 4096
+#define EAGER_SCAN_MAX_FAILS_PER_REGION 128
+
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple eager vacuums,
+ * we limit the number of successful eager page scans. The maximum number of
+ * successful eager page scans is calculated as a ratio of the all-visible but
+ * not all-frozen pages at the beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
+
+/*
+ * The eagerness level of a vacuum determines how many all-visible but
+ * not all-frozen pages it eagerly scans.
+ *
+ * A normal vacuum (eagerness VAC_NORMAL) scans no all-visible pages (with the
+ * exception of those scanned due to SKIP_PAGES_THRESHOLD).
+ *
+ * An eager vacuum (eagerness VAC_EAGER) scans a number of pages up to a limit
+ * based on whether or not it is succeeding or failing. An eager vacuum is
+ * downgraded to a normal vacuum when it hits its success quota. An aggressive
+ * vacuum cannot be downgraded. No eagerness level is ever upgraded.
+ *
+ * An aggressive vacuum (eagerness EAGER_FULL) must scan all all-visible but
+ * not all-frozen pages.
+ */
+typedef enum VacEagerness
+{
+	VAC_NORMAL,
+	VAC_EAGER,
+	VAC_AGGRESSIVE,
+} VacEagerness;
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -181,8 +253,6 @@ typedef struct LVRelState
 	BufferAccessStrategy bstrategy;
 	ParallelVacuumState *pvs;
 
-	/* Aggressive VACUUM? (must set relfrozenxid >= FreezeLimit) */
-	bool		aggressive;
 	/* Use visibility map to skip? (disabled by DISABLE_PAGE_SKIPPING) */
 	bool		skipwithvm;
 	/* Consider index vacuuming bypass optimization? */
@@ -267,7 +337,48 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eager scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/*
+	 * Whether or not this is an normal, eager, or aggressive VACUUM. An
+	 * aggressive vacuum must set relfrozenxid >= FreezeLimit and therefore
+	 * must scan every unfrozen tuple. An eager vacuum will scan some number
+	 * number of all-visible pages until it is downgraded to a normal vacuum.
+	 */
+	VacEagerness eagerness;
+
+	/*
+	 * An eager vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a row suspends eager scanning. next_eager_scan_region_start
+	 * is the block number of the first block eligible for resumed eager
+	 * scanning. Normal and aggressive vacuums do not use this.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	struct
+	{
+		/*
+		 * The remaining number of blocks an eager vacuum will consider eager
+		 * scanning. This is initialized to EAGER_SCAN_SUCCESS_RATE of the
+		 * total number of all-visible but not all-frozen pages. Aggressive
+		 * vacuums also decrement this counter but it is initialized to #
+		 * blocks in the relation.
+		 */
+		BlockNumber remaining_successes;
+
+		/*
+		 * The number of eagerly scanned blocks an eager vacuum failed to
+		 * freeze (due to age) in the current eager scan region. Eager vacuums
+		 * reset it to EAGER_SCAN_MAX_FAILS_PER_REGION each time they enter a
+		 * new region of the relation. Aggressive vacuums also decrement this
+		 * coutner but it is initialized to # blocks in the relation.
+		 */
+		BlockNumber remaining_fails;
+
+		/* Count of all-visible blocks scanned (for logging only). */
+		BlockNumber scanned;
+	}			eager_pages;
 } LVRelState;
 
 /* Struct for saving and restoring vacuum error information. */
@@ -280,9 +391,14 @@ typedef struct LVSavedErrInfo
 
 
 /* non-export function prototypes */
+
 static void lazy_scan_heap(LVRelState *vacrel);
+static const char *vac_eagerness_description(VacEagerness eagerness);
+static void heap_vacuum_set_up_eagerness(LVRelState *vacrel,
+										 bool aggressive);
 static BlockNumber heap_vac_scan_next_block(LVRelState *vacrel,
-											bool *all_visible_according_to_vm);
+											bool *all_visible_according_to_vm,
+											bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -290,7 +406,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -332,6 +448,144 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+/*
+ * Helper to return a text description of the vacuum eagerness level for
+ * logging output. The string is not localized but is marked for
+ * translation later.
+ */
+static const char *
+vac_eagerness_description(VacEagerness eagerness)
+{
+	switch (eagerness)
+	{
+		case VAC_NORMAL:
+			return gettext_noop("vacuum");
+		case VAC_EAGER:
+			return gettext_noop("eager vacuum");
+		case VAC_AGGRESSIVE:
+			return gettext_noop("aggressive vacuum");
+		default:
+			elog(ERROR, "Unknown vacuum eagerness level: %d", eagerness);
+	}
+}
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scanning related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_set_up_eagerness(LVRelState *vacrel,
+							 bool aggressive)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	bool		oldest_unfrozen_requires_freeze = false;
+
+	vacrel->eager_pages.scanned = 0;
+
+	/* Normal and aggressive vacuums don't have eager scan regions */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs.
+	 */
+	if (aggressive)
+	{
+		vacrel->eagerness = VAC_AGGRESSIVE;
+
+		/*
+		 * An aggressive vacuum must scan every all-visible page to safely
+		 * advance the relfrozenxid and/or relminmxid. As such, there is no
+		 * cap to the number of allowed successes or failures.
+		 */
+		vacrel->eager_pages.remaining_fails = vacrel->rel_pages + 1;
+		vacrel->eager_pages.remaining_successes = vacrel->rel_pages + 1;
+		return;
+	}
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation. We are only guaranteed to
+	 * freeze a freezable page if some of the tuples require freezing. Tuples
+	 * require freezing if any of their xids precede the freeze limit or
+	 * multixact cutoff. So, if the oldest unfrozen xid
+	 * (relfrozenxid/relminmxid) does not precede the freeze cutoff, we won't
+	 * find tuples requiring freezing.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+									  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_requires_freeze = true;
+
+	if (MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+									vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_requires_freeze = true;
+
+	/*
+	 * If the relation is smaller than a single region, we won't bother eager
+	 * scanning it, as an aggressive vacuum shouldn't take very long anyway so
+	 * there is no point in amortization.
+	 *
+	 * Also, if the oldest unfrozen XID is not old enough to require freezing,
+	 * we won't bother eager scanning, as it will likely not succeed in
+	 * freezing pages.
+	 *
+	 * In both of these cases, we set up a non-eager vacuum. This will not
+	 * intentionally scan all-visible pages, so the success and failure limits
+	 * are initialized to 0.
+	 */
+	if (vacrel->rel_pages < EAGER_SCAN_REGION_SIZE ||
+		!oldest_unfrozen_requires_freeze)
+	{
+		vacrel->eagerness = VAC_NORMAL;
+
+		vacrel->eager_pages.remaining_fails = 0;
+		vacrel->eager_pages.remaining_successes = 0;
+		return;
+	}
+
+	/*
+	 * We are not required to do an aggressive vacuum and we have met the
+	 * criteria to do an eager vacuum.
+	 */
+	vacrel->eagerness = VAC_EAGER;
+
+	/*
+	 * Start at a random spot somewhere within the first eager scan region.
+	 * This avoids eager scanning and failing to freeze the exact same blocks
+	 * each vacuum of the relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed % EAGER_SCAN_REGION_SIZE;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager scan failures tolerated for this region.
+	 */
+	vacrel->eager_pages.remaining_fails = EAGER_SCAN_MAX_FAILS_PER_REGION *
+		(1 - vacrel->next_eager_scan_region_start / EAGER_SCAN_REGION_SIZE);
+
+	/*
+	 * Our success cap is EAGER_SCAN_SUCCESS_RATE of the number of all-visible
+	 * but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel,
+						&allvisible,
+						&allfrozen);
+
+	vacrel->eager_pages.remaining_successes =
+		(BlockNumber) (EAGER_SCAN_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -364,6 +618,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	BufferUsage startbufferusage = pgBufferUsage;
 	ErrorContextCallback errcallback;
 	char	  **indnames = NULL;
+	bool		aggressive = false;
 
 	verbose = (params->options & VACOPT_VERBOSE) != 0;
 	instrument = (verbose || (AmAutoVacuumWorkerProcess() &&
@@ -502,7 +757,8 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * want to teach lazy_scan_prune to recompute vistest from time to time,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
-	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
+	aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
+
 	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
@@ -516,25 +772,20 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 		 * Force aggressive mode, and disable skipping blocks using the
 		 * visibility map (even those set all-frozen)
 		 */
-		vacrel->aggressive = true;
+		aggressive = true;
 		skipwithvm = false;
 	}
 
 	vacrel->skipwithvm = skipwithvm;
 
+	heap_vacuum_set_up_eagerness(vacrel, aggressive);
+
 	if (verbose)
-	{
-		if (vacrel->aggressive)
-			ereport(INFO,
-					(errmsg("aggressively vacuuming \"%s.%s.%s\"",
-							vacrel->dbname, vacrel->relnamespace,
-							vacrel->relname)));
-		else
-			ereport(INFO,
-					(errmsg("vacuuming \"%s.%s.%s\"",
-							vacrel->dbname, vacrel->relnamespace,
-							vacrel->relname)));
-	}
+		ereport(INFO,
+				(errmsg("%s of \"%s.%s.%s\"",
+						vac_eagerness_description(vacrel->eagerness),
+						vacrel->dbname, vacrel->relnamespace,
+						vacrel->relname)));
 
 	/*
 	 * Allocate dead_items memory using dead_items_alloc.  This handles
@@ -595,7 +846,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	{
 		/* No new relfrozenxid identified */
 	}
-	else if (vacrel->aggressive)
+	else if (vacrel->eagerness == VAC_AGGRESSIVE)
 	{
 		/*
 		 * Aggressive vacuum must have frozen all tuples older than the freeze
@@ -612,7 +863,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	{
 		/* No new relminmxid identified */
 	}
-	else if (vacrel->aggressive)
+	else if (vacrel->eagerness == VAC_AGGRESSIVE)
 	{
 		/*
 		 * Aggressive vacuum must have frozen all tuples older than the
@@ -633,7 +884,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 		 * chose to skip an all-visible page range.  The state that tracks new
 		 * values will have missed unfrozen XIDs from the pages we skipped.
 		 */
-		Assert(!vacrel->aggressive);
+		Assert(vacrel->eagerness != VAC_AGGRESSIVE);
 		vacrel->NewRelfrozenXid = InvalidTransactionId;
 		vacrel->NewRelminMxid = InvalidMultiXactId;
 	}
@@ -718,7 +969,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 				 * VACUUM VERBOSE ereport
 				 */
 				Assert(!params->is_wraparound);
-				msgfmt = _("finished vacuuming \"%s.%s.%s\": index scans: %d\n");
+				msgfmt = _("finished %s of \"%s.%s.%s\": index scans: %d\n");
 			}
 			else if (params->is_wraparound)
 			{
@@ -728,29 +979,25 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 				 * implies aggressive.  Produce distinct output for the corner
 				 * case all the same, just in case.
 				 */
-				if (vacrel->aggressive)
-					msgfmt = _("automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n");
-				else
-					msgfmt = _("automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n");
+				msgfmt = _("automatic %s to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n");
 			}
 			else
-			{
-				if (vacrel->aggressive)
-					msgfmt = _("automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n");
-				else
-					msgfmt = _("automatic vacuum of table \"%s.%s.%s\": index scans: %d\n");
-			}
+				msgfmt = _("automatic %s of table \"%s.%s.%s\": index scans: %d\n");
+
 			appendStringInfo(&buf, msgfmt,
+							 vac_eagerness_description(vacrel->eagerness),
 							 vacrel->dbname,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u all-visible scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_pages.scanned);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -918,7 +1165,8 @@ lazy_scan_heap(LVRelState *vacrel)
 {
 	BlockNumber rel_pages = vacrel->rel_pages,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
 
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
@@ -938,6 +1186,7 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
 	while (true)
@@ -946,10 +1195,12 @@ lazy_scan_heap(LVRelState *vacrel)
 		BlockNumber blkno;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		blkno = heap_vac_scan_next_block(vacrel,
-										 &all_visible_according_to_vm);
+										 &all_visible_according_to_vm,
+										 &was_eager_scanned);
 
 		if (!BlockNumberIsValid(blkno))
 			break;
@@ -1057,7 +1308,7 @@ lazy_scan_heap(LVRelState *vacrel)
 			 * lazy_scan_noprune could not do all required processing.  Wait
 			 * for a cleanup lock, and call lazy_scan_prune in the usual way.
 			 */
-			Assert(vacrel->aggressive);
+			Assert(vacrel->eagerness == VAC_AGGRESSIVE);
 			LockBuffer(buf, BUFFER_LOCK_UNLOCK);
 			LockBufferForCleanup(buf);
 			got_cleanup_lock = true;
@@ -1079,7 +1330,38 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_pages.remaining_successes > 0);
+				vacrel->eager_pages.remaining_successes--;
+
+				if (vacrel->eager_pages.remaining_successes == 0)
+				{
+					Assert(vacrel->eagerness == VAC_EAGER);
+
+					/*
+					 * If we hit our success limit, there is no need to
+					 * eagerly scan any additional pages. Downgrade the vacuum
+					 * to a normal vacuum.
+					 */
+					vacrel->eagerness = VAC_NORMAL;
+					vacrel->eager_pages.remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_pages.remaining_fails > 0);
+				vacrel->eager_pages.remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1190,7 +1472,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are
  * returned and set in *all_visible_according_to_vm.  The return value is
- * InvalidBlockNumber if there are no further blocks to process.
+ * InvalidBlockNumber if there are no further blocks to process. If the block
+ * is being eagerly scanned, was_eager_scanned is set so that the caller can
+ * count whether or not we successfully freeze it.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1200,11 +1484,14 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static BlockNumber
 heap_vac_scan_next_block(LVRelState *vacrel,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	vacrel->current_block++;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (vacrel->current_block >= vacrel->rel_pages)
 		return InvalidBlockNumber;
@@ -1268,6 +1555,9 @@ heap_vac_scan_next_block(LVRelState *vacrel,
 		Assert(vacrel->current_block == vacrel->next_unskippable_block);
 
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
+		if (*was_eager_scanned)
+			vacrel->eager_pages.scanned++;
 		return vacrel->current_block;
 	}
 }
@@ -1291,11 +1581,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1303,6 +1594,18 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, eager vacuums reset the
+		 * failure counter, allowing them to resume eager scanning if it had
+		 * been disabled.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_pages.remaining_fails =
+				EAGER_SCAN_MAX_FAILS_PER_REGION;
+			vacrel->next_eager_scan_region_start += EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1335,24 +1638,31 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 		 * all-visible.  They may still skip all-frozen pages, which can't
 		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if (mapbits & VISIBILITYMAP_ALL_FROZEN)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip all-visible pages that are not also
+		 * all-frozen. Eager vacuums only skip such pages if they have hit the
+		 * failure limit for the current eager scan region.
+		 */
+		if (vacrel->eager_pages.remaining_fails > 0)
+		{
+			next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible block is safe to skip in a normal or eager vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1531,7 +1841,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1684,11 +1995,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1786,6 +2103,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		else
 			vacrel->vm_new_frozen_pages++;
 
+		*vm_page_frozen = true;
 	}
 }
 
@@ -1874,7 +2192,7 @@ lazy_scan_noprune(LVRelState *vacrel,
 									 &NoFreezePageRelminMxid))
 		{
 			/* Tuple with XID < FreezeLimit (or MXID < MultiXactCutoff) */
-			if (vacrel->aggressive)
+			if (vacrel->eagerness == VAC_AGGRESSIVE)
 			{
 				/*
 				 * Aggressive VACUUMs must always be able to advance rel's
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index ce33e55bf1d..728ceb6441c 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -3063,6 +3063,7 @@ UserOpts
 VacAttrStats
 VacAttrStatsP
 VacDeadItemsInfo
+VacEagerness
 VacErrPhase
 VacObjFilter
 VacOptValue
-- 
2.34.1

#4Robert Treat
rob@xzilla.net
In reply to: Melanie Plageman (#3)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Fri, Dec 13, 2024 at 5:53 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Thu, Nov 7, 2024 at 10:42 AM Andres Freund <andres@anarazel.de> wrote:

Hi,

Thanks for the review!
Attached v2 should address your feedback and also fixes a few bugs with v1.

I've still yet to run very long-running benchmarks. I did start running more
varied benchmark scenarios -- but all still under two hours. So far, the
behavior is as expected.

On 2024-11-01 19:35:22 -0400, Melanie Plageman wrote:

Because we want to amortize our eager scanning across a few vacuums,
we cap the maximum number of successful eager scans to a percentage of
the total number of all-visible but not all-frozen pages in the table
(currently 20%).

One thing worth mentioning around here seems that we currently can't
partially-aggressively freeze tuples that are "too young" and how that
interacts with everything else.

I'm not sure I know what you mean. Are you talking about how we don't freeze
tuples that are visible to everyone but younger than the freeze limit?

FWIW that was my interpretation of his statement, though I had a
clarifying question around this topic myself, which is, from a user
perspective when would we expect to see these eager vacuums? ISTM we
would be doing 'normal vacuums' prior to vacuum_freeze_min_age, and
'aggressive vacuums' after (autovacuum_freeze_max_age -
vacuum_freeze_min_age), so the expectation is that 'eager vacuums'
would fall into the ~50 million transaction window between those two
points (assuming defaults, which admittedly I don't use). Does that
sound right?

In the attached chart.png, you can see the vm_page_freezes climbing
steadily with the patch, whereas on master, there are sudden spikes
aligned with the aggressive vacuums. You can also see that the number
of pages that are all-visible but not all-frozen grows steadily on
master until the aggressive vacuum. This is vacuum's "backlog" of
freezing work.

What's the reason for all-visible-but-not-all-frozen to increase to a higher
value initially than where it later settles?

My guess is that it has to do with shorter, more frequent vacuums at the
beginning of the benchmark when the relation is smaller (and we haven't
exceeded shared buffers or memory yet). They are setting pages all-visible, but
we haven't used up enough xids yet to qualify for an eager vacuum.

The peak of AVnAF pages aligns with the start of the first eager vacuum. We
don't do any eager scanning until we are sure there is some data requiring
freeze (see this criteria):

if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
vacrel->cutoffs.FreezeLimit))

Once we have used up enough xids to qualify for the first eager vacuum, the
number of AVnAF pages starts to go down.

It would follow from this theory that we would see a build-up like this after
each relfrozenxid advancement (so after the next aggressive vacuum).

But I think we don't see this because the vacuums are longer by the time
aggressive vacuums have started, so we end up using up enough XIDs between
vacuums to qualify for eager vacuums on vacuums after the aggressive vacuum.

That is just my theory though.

I like your theory but it's a little too counterintuitive for me :-)

I would expect we'd see a change in the vacuum time & rate after the
first aggressive scan, which incidentally your graph does show for
master, but it looks a bit too smooth on your original patchset. I
guess there could be a sweet spot where the rate of changes fit
perfectly with regards to the line between lazy / eager vacuums, but
hard to imagine you were that lucky.

Below is the comparative WAL volume, checkpointer and background
writer writes, reads and writes done by all other backend types, time
spent vacuuming in milliseconds, and p99 latency. Notice that overall
vacuum IO time is substantially lower with the patch.

version wal cptr_bgwriter_w other_rw vac_io_time p99_lat
patch 770 GB 5903264 235073744 513722 1
master 767 GB 5908523 216887764 1003654 16

Hm. It's not clear to me why other_rw is higher with the patch? After all,
given the workload, there's no chance of unnecessarily freezing tuples? Is
that just because at the end of the benchmark there's leftover work?

So other_rw is mostly client backend and autovacuum reads and writes. It is
higher with the patch because there are actually more vacuum reads and writes
with the patch than on master. However the autovacuum worker read and write
time is much lower. Those blocks are more often in shared buffers, I would
guess.

<snip>

From e36b4fac345be44954410c4f0e61467dc0f49a72 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Thu, 12 Dec 2024 16:44:37 -0500
Subject: [PATCH v2 10/10] Eagerly scan all-visible pages to amortize
aggressive vacuum

@@ -27,11 +27,37 @@
* to the end, skipping pages as permitted by their visibility status, vacuum
* options, and the eagerness level of the vacuum.
*
+ * There are three vacuum eagerness levels: normal vacuum, eager vacuum, and
+ * aggressive vacuum.
+ *
* When page skipping is enabled, non-aggressive vacuums may skip scanning
- * pages that are marked all-visible in the visibility map. We may choose not
+ * pages that are marked all-visible in the visibility map. It may choose not
* to skip pages if the range of skippable pages is below
* SKIP_PAGES_THRESHOLD.
*

I find the above confusing since page skipping is the regular activity
but referred to in the negative, and because you use the term
"non-aggressive vacuums" which in prior releases only mapped to
"normal" vacuums, but now would map to both "normal" and "eager"
vacuums, and it isn't clear that is desired (in my head anyway). Does
the following still convey what you meant (and hopefully work better
with the paragraphs that follow)?

When page skipping is not disabled, a normal vacuum may skip scanning
pages that are marked all-visible in the visibility map if the range
of skippable pages is below SKIP_PAGES_THRESHOLD.

+ * Eager vacuums will scan skippable pages in an effort to freeze them and
+ * decrease the backlog of all-visible but not all-frozen pages that have to
+ * be processed to advance relfrozenxid and avoid transaction ID wraparound.
+ *

@@ -170,6 +197,51 @@ typedef enum
VACUUM_ERRCB_PHASE_TRUNCATE,
} VacErrPhase;

+/*
+ * Eager vacuums scan some all-visible but not all-frozen pages. Since our
+ * goal is to freeze these pages, an eager scan that fails to set the page
+ * all-frozen in the VM is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once we fail to freeze EAGER_SCAN_MAX_FAILS_PER_REGION
+ * blocks in a region of size EAGER_SCAN_REGION_SIZE, we suspend eager
+ * scanning until vacuum has progressed to another region of the table with
+ * potentially older data.
+ */
+#define EAGER_SCAN_REGION_SIZE 4096
+#define EAGER_SCAN_MAX_FAILS_PER_REGION 128
+
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple eager vacuums,
+ * we limit the number of successful eager page scans. The maximum number of
+ * successful eager page scans is calculated as a ratio of the all-visible but
+ * not all-frozen pages at the beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
+
+/*
+ * The eagerness level of a vacuum determines how many all-visible but
+ * not all-frozen pages it eagerly scans.
+ *
+ * A normal vacuum (eagerness VAC_NORMAL) scans no all-visible pages (with the
+ * exception of those scanned due to SKIP_PAGES_THRESHOLD).
+ *
+ * An eager vacuum (eagerness VAC_EAGER) scans a number of pages up to a limit
+ * based on whether or not it is succeeding or failing. An eager vacuum is
+ * downgraded to a normal vacuum when it hits its success quota. An aggressive
+ * vacuum cannot be downgraded. No eagerness level is ever upgraded.
+ *

At the risk of being overly nit-picky... eager vacuums scan their
subset of all-visible pages "up to a limit" based solely on the
success ratio. In the case of (excessive) failures, there is no limit
to the number of pages scanned, only a pause in the pages scanned
until the next region.

+ * An aggressive vacuum (eagerness EAGER_FULL) must scan all all-visible but
+ * not all-frozen pages.
+ */

I think the above should be VAC_AGGRESSIVE vs EAGER_FULL, no?

+typedef enum VacEagerness
+{
+     VAC_NORMAL,
+     VAC_EAGER,
+     VAC_AGGRESSIVE,
+} VacEagerness;
+

@@ -516,25 +772,20 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
* Force aggressive mode, and disable skipping blocks using the
* visibility map (even those set all-frozen)
*/
- vacrel->aggressive = true;
+ aggressive = true;
skipwithvm = false;
}

vacrel->skipwithvm = skipwithvm;

+     heap_vacuum_set_up_eagerness(vacrel, aggressive);
+
if (verbose)
-     {
-             if (vacrel->aggressive)
-                     ereport(INFO,
-                                     (errmsg("aggressively vacuuming \"%s.%s.%s\"",
-                                                     vacrel->dbname, vacrel->relnamespace,
-                                                     vacrel->relname)));
-             else
-                     ereport(INFO,
-                                     (errmsg("vacuuming \"%s.%s.%s\"",
-                                                     vacrel->dbname, vacrel->relnamespace,
-                                                     vacrel->relname)));
-     }
+             ereport(INFO,
+                             (errmsg("%s of \"%s.%s.%s\"",
+                                             vac_eagerness_description(vacrel->eagerness),
+                                             vacrel->dbname, vacrel->relnamespace,
+                                             vacrel->relname)));

/*
* Allocate dead_items memory using dead_items_alloc. This handles

One thing I am wondering about is that since we actually modify
vacrel->eagerness during the "success downgrade" cycle, a single
vacuum run could potentially produce messages with both eager vacuum
and normal vacuum language. I don't think that'd be a problem in the
above spot, but wondering if it might be elsewhere (maybe in
pg_stat_activity?).

Robert Treat
https://xzilla.net

#5Nazir Bilal Yavuz
byavuz81@gmail.com
In reply to: Melanie Plageman (#3)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Hi,

Thank you for working on this!

On Sat, 14 Dec 2024 at 01:53, Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Thu, Nov 7, 2024 at 10:42 AM Andres Freund <andres@anarazel.de> wrote:

Hi,

Thanks for the review!
Attached v2 should address your feedback and also fixes a few bugs with v1.

Here are couple of code comments:

=== [PATCH v2 07/10] ===

It took me a while to understand that heap_vac_scan_next_block() loops
until rel_pages. What do you think about adding
Assert(vacrel->current_block == rel_pages) before the
pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED,
rel_pages) and having a comment on main loop should process blocks
until rel_pages?

=== [PATCH v2 09/10] ===

+ * If there are no indexes or index scanning is disabled, phase II may be
+ * skipped. If phase I identified very few dead index entries, vacuum may skip
+ * phases II and III. Index vacuuming deletes the dead index entries from the
+ * TID store.

phase III is not mentioned in the previous comments. It could be
better to first explain what phase III is before mentioning it.

+ * After index vacuuming is complete, vacuum scans the blocks of the relation
+ * indicated by the TIDs in the TID store and reaps the dead tuples, freeing
+ * that space for future tuples. Finally, vacuum may truncate the relation if
+ * it has emptied pages at the end.
+ *
+ * After finishing all phases of work, vacuum updates relation statistics in
+ * pg_class and the cumulative statistics subsystem.

There is no clear definition of phase III here as well. I can not
understand what phase III is and which parts the vacuum may skip.

=== [PATCH v2 10/10] ===

+        /*
+         * The number of eagerly scanned blocks an eager vacuum failed to
+         * freeze (due to age) in the current eager scan region. Eager vacuums
+         * reset it to EAGER_SCAN_MAX_FAILS_PER_REGION each time they enter a
+         * new region of the relation. Aggressive vacuums also decrement this
+         * coutner but it is initialized to # blocks in the relation.
+         */

s/coutner/counter

/* non-export function prototypes */
+
static void lazy_scan_heap(LVRelState *vacrel);

Extra blank line.

+    if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+        TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+                                      vacrel->cutoffs.FreezeLimit))
+        oldest_unfrozen_requires_freeze = true;
+
+    if (MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+        MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+                                    vacrel->cutoffs.MultiXactCutoff))
+        oldest_unfrozen_requires_freeze = true;

You may want to short-circuit the second if condition with
!oldest_unfrozen_requires_freeze but it may increase the complexity,
up to you.

+    vacrel->eager_pages.remaining_fails = EAGER_SCAN_MAX_FAILS_PER_REGION *
+        (1 - vacrel->next_eager_scan_region_start / EAGER_SCAN_REGION_SIZE);

This will always return EAGER_SCAN_MAX_FAILS_PER_REGION or 0 because
of the integer dividing.

+    if (aggressive)
+    {
+        vacrel->eagerness = VAC_AGGRESSIVE;
+
+        /*
+         * An aggressive vacuum must scan every all-visible page to safely
+         * advance the relfrozenxid and/or relminmxid. As such, there is no
+         * cap to the number of allowed successes or failures.
+         */
+        vacrel->eager_pages.remaining_fails = vacrel->rel_pages + 1;
+        vacrel->eager_pages.remaining_successes = vacrel->rel_pages + 1;
+        return;
+    }
...
...
+        if (was_eager_scanned)
+        {
+            if (vm_page_frozen)
+            {
+                Assert(vacrel->eager_pages.remaining_successes > 0);
+                vacrel->eager_pages.remaining_successes--;
+
+                if (vacrel->eager_pages.remaining_successes == 0)
+                {
+                    Assert(vacrel->eagerness == VAC_EAGER);

My initial thought was that since *was_eager_scanned* is true,
Assert(vacrel->eagerness == VAC_EAGER) should be under the top if
condition (I assumed that was_eager_scanned is only true for eager
vacuums, not for aggressive vacuums too) but I see your point here.
Since you set vacrel->eager_pages.remaining_successes to
vacrel->rel_pages + 1, vacrel->eager_pages.remaining_successes can not
reach 0 although all pages are processed as successful. I think
comment is needed in both places to explain why
vacrel->eager_pages.[remaining_fails | remaining_successes] is set to
vacrel->rel_pages + 1 and why vacrel->eagerness should be VAC_EAGER
when was_eager_scanned is true and
vacrel->eager_pages.remaining_successes is 0.

--
Regards,
Nazir Bilal Yavuz
Microsoft

#6Melanie Plageman
melanieplageman@gmail.com
In reply to: Robert Treat (#4)
8 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Thanks for taking a look!

I've rebased and attached an updated v3 which also addresses review feedback.

On Sun, Dec 15, 2024 at 1:05 AM Robert Treat <rob@xzilla.net> wrote:

On Fri, Dec 13, 2024 at 5:53 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Thu, Nov 7, 2024 at 10:42 AM Andres Freund <andres@anarazel.de> wrote:

Hi,
One thing worth mentioning around here seems that we currently can't
partially-aggressively freeze tuples that are "too young" and how that
interacts with everything else.

I'm not sure I know what you mean. Are you talking about how we don't freeze
tuples that are visible to everyone but younger than the freeze limit?

FWIW that was my interpretation of his statement, though I had a
clarifying question around this topic myself, which is, from a user
perspective when would we expect to see these eager vacuums? ISTM we
would be doing 'normal vacuums' prior to vacuum_freeze_min_age, and
'aggressive vacuums' after (autovacuum_freeze_max_age -
vacuum_freeze_min_age), so the expectation is that 'eager vacuums'
would fall into the ~50 million transaction window between those two
points (assuming defaults, which admittedly I don't use). Does that
sound right?

Basically, yes (but 100 mill instead of 50)

By default, vacuum_freeze_min_age default is 50 million and
vacuum_freeze_table_age is 150 million (autovacuum_freeze_max_age
[default 200 mill] determines whether or not we kick off an anti-wrap
vac while vacuum_freeze_table_age determines whether or not a given
vacuum is an aggressive vacuum, which means that all anti-wrap vacs
are aggressive). Anyway, that means the eager vacuums will be
triggered somewhere in that 100 million xid window.

This may be an admittedly small window. However, for users tuning
these parameters with the intent of freezing, I would hope they are
decreasing vacuum_freeze_min_age and increasing
autovacuum_freeze_max_age.

In the attached chart.png, you can see the vm_page_freezes climbing
steadily with the patch, whereas on master, there are sudden spikes
aligned with the aggressive vacuums. You can also see that the number
of pages that are all-visible but not all-frozen grows steadily on
master until the aggressive vacuum. This is vacuum's "backlog" of
freezing work.

What's the reason for all-visible-but-not-all-frozen to increase to a higher
value initially than where it later settles?

My guess is that it has to do with shorter, more frequent vacuums at the
beginning of the benchmark when the relation is smaller (and we haven't
exceeded shared buffers or memory yet). They are setting pages all-visible, but
we haven't used up enough xids yet to qualify for an eager vacuum.

The peak of AVnAF pages aligns with the start of the first eager vacuum. We
don't do any eager scanning until we are sure there is some data requiring
freeze (see this criteria):

if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
vacrel->cutoffs.FreezeLimit))

Once we have used up enough xids to qualify for the first eager vacuum, the
number of AVnAF pages starts to go down.

It would follow from this theory that we would see a build-up like this after
each relfrozenxid advancement (so after the next aggressive vacuum).

But I think we don't see this because the vacuums are longer by the time
aggressive vacuums have started, so we end up using up enough XIDs between
vacuums to qualify for eager vacuums on vacuums after the aggressive vacuum.

That is just my theory though.

I like your theory but it's a little too counterintuitive for me :-)

I would expect we'd see a change in the vacuum time & rate after the
first aggressive scan, which incidentally your graph does show for
master, but it looks a bit too smooth on your original patchset. I
guess there could be a sweet spot where the rate of changes fit
perfectly with regards to the line between lazy / eager vacuums, but
hard to imagine you were that lucky.

I think it's harder to see differences on the chart for the patched
version in terms of how long the vacuums are taking. I went and took a
closer look at the logs and at the beginning of the benchmark vacuums
are taking ~10 seconds and from the end of one vacuum to the next,
about 1.5 million xids are used. By the time the aggressive vacuum
happens, vacuums are taking around 30-40 seconds (30 seconds is where
the vacuum duration stabilizes until the end of the benchmark) and ~3
million xids are being used between the end of one vacuum and the
next.

So, all vacuums are eager after the first eager vacuum (in this
workload). It still isn't a completely satisfactory explanation, but I
will admit that the version of the patch set on which I ran the
benchmarks and generated the chart from had a few bugs. Attached are
the same charts generated from a benchmark run I did on the patch set
you reviewed -- and it seems like this effect is basically gone.

From e36b4fac345be44954410c4f0e61467dc0f49a72 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Thu, 12 Dec 2024 16:44:37 -0500
Subject: [PATCH v2 10/10] Eagerly scan all-visible pages to amortize
aggressive vacuum

@@ -27,11 +27,37 @@
* to the end, skipping pages as permitted by their visibility status, vacuum
* options, and the eagerness level of the vacuum.
*
+ * There are three vacuum eagerness levels: normal vacuum, eager vacuum, and
+ * aggressive vacuum.
+ *
* When page skipping is enabled, non-aggressive vacuums may skip scanning
- * pages that are marked all-visible in the visibility map. We may choose not
+ * pages that are marked all-visible in the visibility map. It may choose not
* to skip pages if the range of skippable pages is below
* SKIP_PAGES_THRESHOLD.
*

I find the above confusing since page skipping is the regular activity
but referred to in the negative, and because you use the term
"non-aggressive vacuums" which in prior releases only mapped to
"normal" vacuums, but now would map to both "normal" and "eager"
vacuums, and it isn't clear that is desired (in my head anyway). Does
the following still convey what you meant (and hopefully work better
with the paragraphs that follow)?

When page skipping is not disabled, a normal vacuum may skip scanning
pages that are marked all-visible in the visibility map if the range
of skippable pages is below SKIP_PAGES_THRESHOLD.

Yes, that is much better. Thank you! I've incorporated this into the
new version.

+ * The eagerness level of a vacuum determines how many all-visible but
+ * not all-frozen pages it eagerly scans.
+ *
+ * A normal vacuum (eagerness VAC_NORMAL) scans no all-visible pages (with the
+ * exception of those scanned due to SKIP_PAGES_THRESHOLD).
+ *
+ * An eager vacuum (eagerness VAC_EAGER) scans a number of pages up to a limit
+ * based on whether or not it is succeeding or failing. An eager vacuum is
+ * downgraded to a normal vacuum when it hits its success quota. An aggressive
+ * vacuum cannot be downgraded. No eagerness level is ever upgraded.
+ *

At the risk of being overly nit-picky... eager vacuums scan their
subset of all-visible pages "up to a limit" based solely on the
success ratio. In the case of (excessive) failures, there is no limit
to the number of pages scanned, only a pause in the pages scanned
until the next region.

Yes, this is a good point. I've changed it to specifically indicate
the limit is based on successes. However, I feel like I should either
not mention the success limit here or mention the regional limiting
based on failures -- otherwise it is confusing. Can you think of a
wording that would be good for this comment?

+ * An aggressive vacuum (eagerness EAGER_FULL) must scan all all-visible but
+ * not all-frozen pages.
+ */

I think the above should be VAC_AGGRESSIVE vs EAGER_FULL, no?

Yep, thanks! Fixed.

vacrel->skipwithvm = skipwithvm;

+     heap_vacuum_set_up_eagerness(vacrel, aggressive);
+
if (verbose)
-     {
-             if (vacrel->aggressive)
-                     ereport(INFO,
-                                     (errmsg("aggressively vacuuming \"%s.%s.%s\"",
-                                                     vacrel->dbname, vacrel->relnamespace,
-                                                     vacrel->relname)));
-             else
-                     ereport(INFO,
-                                     (errmsg("vacuuming \"%s.%s.%s\"",
-                                                     vacrel->dbname, vacrel->relnamespace,
-                                                     vacrel->relname)));
-     }
+             ereport(INFO,
+                             (errmsg("%s of \"%s.%s.%s\"",
+                                             vac_eagerness_description(vacrel->eagerness),
+                                             vacrel->dbname, vacrel->relnamespace,
+                                             vacrel->relname)));

/*
* Allocate dead_items memory using dead_items_alloc. This handles

One thing I am wondering about is that since we actually modify
vacrel->eagerness during the "success downgrade" cycle, a single
vacuum run could potentially produce messages with both eager vacuum
and normal vacuum language. I don't think that'd be a problem in the
above spot, but wondering if it might be elsewhere (maybe in
pg_stat_activity?).

Great point. It's actually already an issue in the vacuum log output.
In the new patch, I save the eagerness level at the beginning and use
it in the logging output. Any future users of the eagerness level will
have to figure out if they care about the original eagerness level or
the current one.

- Melanie

Attachments:

appendonly.pngimage/png; name=appendonly.pngDownload
v3-0004-Make-heap_vac_scan_next_block-return-BlockNumber.patchtext/x-patch; charset=US-ASCII; name=v3-0004-Make-heap_vac_scan_next_block-return-BlockNumber.patchDownload
From 33a041ff21a8de652fc33747b56692205aefdb3a Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:07:50 -0400
Subject: [PATCH v3 4/7] Make heap_vac_scan_next_block() return BlockNumber

Pass rel_pages instead of blkno to vacuum progress reporting and free
space map vacuuming outside of the main loop in lazy_scan_heap(). This
allows us to reduce the scope of blkno and refactor
heap_vac_scan_next_block() to return the next block number.

This makes the interface more straightforward as well as paving the way
for heap_vac_scan_next_block() to be used by the read stream API as a
callback to implement streaming vacuum.

Reviewed-by: Andres Freund, Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 src/backend/access/heap/vacuumlazy.c | 50 ++++++++++++++++------------
 1 file changed, 28 insertions(+), 22 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 2d21ff7f0b8..e568396f0f5 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -242,8 +242,8 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
-static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+static BlockNumber heap_vac_scan_next_block(LVRelState *vacrel,
+											bool *all_visible_according_to_vm);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -851,7 +851,6 @@ static void
 lazy_scan_heap(LVRelState *vacrel)
 {
 	BlockNumber rel_pages = vacrel->rel_pages,
-				blkno,
 				next_fsm_block_to_vacuum = 0;
 	bool		all_visible_according_to_vm;
 
@@ -875,13 +874,21 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->next_unskippable_allvis = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	/* Loop until we've considered scanning all blocks in the relation */
+	while (true)
 	{
 		Buffer		buf;
+		BlockNumber blkno;
 		Page		page;
 		bool		has_lpdead_items;
 		bool		got_cleanup_lock = false;
 
+		blkno = heap_vac_scan_next_block(vacrel,
+										 &all_visible_according_to_vm);
+
+		if (!BlockNumberIsValid(blkno))
+			break;
+
 		vacrel->scanned_pages++;
 
 		/* Report as block scanned, update error traceback information */
@@ -1068,7 +1075,8 @@ lazy_scan_heap(LVRelState *vacrel)
 		ReleaseBuffer(vmbuffer);
 
 	/* report that everything is now scanned */
-	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
+	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED,
+								 rel_pages);
 
 	/* now we can compute the new value for pg_class.reltuples */
 	vacrel->new_live_tuples = vac_estimate_reltuples(vacrel->rel, rel_pages,
@@ -1094,11 +1102,14 @@ lazy_scan_heap(LVRelState *vacrel)
 	 * Vacuum the remainder of the Free Space Map.  We must do this whether or
 	 * not there were indexes, and whether or not we bypassed index vacuuming.
 	 */
-	if (blkno > next_fsm_block_to_vacuum)
-		FreeSpaceMapVacuumRange(vacrel->rel, next_fsm_block_to_vacuum, blkno);
+	if (rel_pages > next_fsm_block_to_vacuum)
+		FreeSpaceMapVacuumRange(vacrel->rel, next_fsm_block_to_vacuum,
+								rel_pages);
 
 	/* report all blocks vacuumed */
-	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_VACUUMED, blkno);
+	Assert(vacrel->current_block >= rel_pages);
+	pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_VACUUMED,
+								 rel_pages);
 
 	/* Do final index cleanup (call each index's amvacuumcleanup routine) */
 	if (vacrel->nindexes > 0 && vacrel->do_index_cleanup)
@@ -1111,11 +1122,11 @@ lazy_scan_heap(LVRelState *vacrel)
  * lazy_scan_heap() calls here every time it needs to get the next block to
  * prune and vacuum.  The function uses the visibility map, vacuum options,
  * and various thresholds to skip blocks which do not need to be processed and
- * sets blkno to the next block to process.
+ * returns the next block to process.
  *
- * The block number and visibility status of the next block to process are set
- * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * The block number and visibility status of the next block to process are
+ * returned and set in *all_visible_according_to_vm.  The return value is
+ * InvalidBlockNumber if there are no further blocks to process.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1123,8 +1134,8 @@ lazy_scan_heap(LVRelState *vacrel)
  * relfrozenxid in that case.  vacrel also holds information about the next
  * unskippable block, as bookkeeping for this function.
  */
-static bool
-heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
+static BlockNumber
+heap_vac_scan_next_block(LVRelState *vacrel,
 						 bool *all_visible_according_to_vm)
 {
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
@@ -1132,10 +1143,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 	/* Have we reached the end of the relation? */
 	if (vacrel->current_block >= vacrel->rel_pages)
-	{
-		*blkno = vacrel->rel_pages;
-		return false;
-	}
+		return InvalidBlockNumber;
 
 	/*
 	 * We must be in one of the three following states:
@@ -1184,9 +1192,8 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 * but chose not to.  We know that they are all-visible in the VM,
 		 * otherwise they would've been unskippable.
 		 */
-		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = true;
-		return true;
+		return vacrel->current_block;
 	}
 	else
 	{
@@ -1196,9 +1203,8 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 */
 		Assert(vacrel->current_block == vacrel->next_unskippable_block);
 
-		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
-		return true;
+		return vacrel->current_block;
 	}
 }
 
-- 
2.34.1

v3-0003-Remove-superfluous-next_block-local-variable-in-v.patchtext/x-patch; charset=US-ASCII; name=v3-0003-Remove-superfluous-next_block-local-variable-in-v.patchDownload
From f2b06658c9bf9d610c68e75d01964852ff2adb78 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:36:58 -0400
Subject: [PATCH v3 3/7] Remove superfluous next_block local variable in vacuum
 code

Reduce the number of block related variables in lazy_scan_heap() and its
helpers by removing the next_block local variable from
heap_vac_scan_next_block().
---
 src/backend/access/heap/vacuumlazy.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index c9e8ed0e049..2d21ff7f0b8 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -1127,13 +1127,11 @@ static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 						 bool *all_visible_according_to_vm)
 {
-	BlockNumber next_block;
-
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
-	next_block = vacrel->current_block + 1;
+	vacrel->current_block++;
 
 	/* Have we reached the end of the relation? */
-	if (next_block >= vacrel->rel_pages)
+	if (vacrel->current_block >= vacrel->rel_pages)
 	{
 		*blkno = vacrel->rel_pages;
 		return false;
@@ -1142,7 +1140,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 	/*
 	 * We must be in one of the three following states:
 	 */
-	if (next_block > vacrel->next_unskippable_block ||
+	if (vacrel->current_block > vacrel->next_unskippable_block ||
 		vacrel->next_unskippable_block == InvalidBlockNumber)
 	{
 		/*
@@ -1169,23 +1167,24 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 * pages then skipping makes updating relfrozenxid unsafe, which is a
 		 * real downside.
 		 */
-		if (vacrel->next_unskippable_block - next_block >= SKIP_PAGES_THRESHOLD)
+		if (vacrel->next_unskippable_block - vacrel->current_block >=
+			SKIP_PAGES_THRESHOLD)
 		{
-			next_block = vacrel->next_unskippable_block;
+			vacrel->current_block = vacrel->next_unskippable_block;
 			if (skipsallvis)
 				vacrel->skippedallvis = true;
 		}
 	}
 
 	/* Now we must be in one of the two remaining states: */
-	if (next_block < vacrel->next_unskippable_block)
+	if (vacrel->current_block < vacrel->next_unskippable_block)
 	{
 		/*
 		 * 2. We are processing a range of blocks that we could have skipped
 		 * but chose not to.  We know that they are all-visible in the VM,
 		 * otherwise they would've been unskippable.
 		 */
-		*blkno = vacrel->current_block = next_block;
+		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = true;
 		return true;
 	}
@@ -1195,9 +1194,9 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 		 * 3. We reached the next unskippable block.  Process it.  On next
 		 * iteration, we will be back in state 1.
 		 */
-		Assert(next_block == vacrel->next_unskippable_block);
+		Assert(vacrel->current_block == vacrel->next_unskippable_block);
 
-		*blkno = vacrel->current_block = next_block;
+		*blkno = vacrel->current_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
 		return true;
 	}
-- 
2.34.1

v3-0001-Remove-leftover-mentions-of-XLOG_HEAP2_FREEZE_PAG.patchtext/x-patch; charset=US-ASCII; name=v3-0001-Remove-leftover-mentions-of-XLOG_HEAP2_FREEZE_PAG.patchDownload
From 2570e4374fbd9334114600f387185ac2283f5e52 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Wed, 11 Dec 2024 13:36:29 -0500
Subject: [PATCH v3 1/7] Remove leftover mentions of XLOG_HEAP2_FREEZE_PAGE
 records

f83d709760d merged the separate XLOG_HEAP2_FREEZE_PAGE records into a
new combined prune, freeze, and vacuum record with opcode
XLOG_HEAP2_PRUNE_VACUUM_SCAN. Remove the last few references to
XLOG_HEAP2_FREEZE_PAGE records which were accidentally left behind.
---
 src/backend/access/heap/pruneheap.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c
index 869d82ad667..11c9532719d 100644
--- a/src/backend/access/heap/pruneheap.c
+++ b/src/backend/access/heap/pruneheap.c
@@ -1906,7 +1906,7 @@ heap_log_freeze_eq(xlhp_freeze_plan *plan, HeapTupleFreeze *frz)
 }
 
 /*
- * Comparator used to deduplicate XLOG_HEAP2_FREEZE_PAGE freeze plans
+ * Comparator used to deduplicate the freeze plans used in WAL records.
  */
 static int
 heap_log_freeze_cmp(const void *arg1, const void *arg2)
@@ -1966,7 +1966,7 @@ heap_log_freeze_new_plan(xlhp_freeze_plan *plan, HeapTupleFreeze *frz)
 
 /*
  * Deduplicate tuple-based freeze plans so that each distinct set of
- * processing steps is only stored once in XLOG_HEAP2_FREEZE_PAGE records.
+ * processing steps is only stored once in the WAL record.
  * Called during original execution of freezing (for logged relations).
  *
  * Return value is number of plans set in *plans_out for caller.  Also writes
-- 
2.34.1

v3-0002-Move-vacuum-VM-buffer-release.patchtext/x-patch; charset=US-ASCII; name=v3-0002-Move-vacuum-VM-buffer-release.patchDownload
From 53529ef281a1e57a6837035deeb40679e41a2013 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 28 Oct 2024 11:14:24 -0400
Subject: [PATCH v3 2/7] Move vacuum VM buffer release

The VM buffer for the next unskippable block can be released after the
main loop in lazy_scan_heap(). Doing so de-clutters
heap_vac_scan_next_block() and is more consistent. All other VM buffer
releases happen in lazy_scan_heap().
---
 src/backend/access/heap/vacuumlazy.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index f2ca9430581..c9e8ed0e049 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -1056,6 +1056,14 @@ lazy_scan_heap(LVRelState *vacrel)
 	}
 
 	vacrel->blkno = InvalidBlockNumber;
+
+	/* Release VM buffers */
+	if (BufferIsValid(vacrel->next_unskippable_vmbuffer))
+	{
+		ReleaseBuffer(vacrel->next_unskippable_vmbuffer);
+		vacrel->next_unskippable_vmbuffer = InvalidBuffer;
+	}
+
 	if (BufferIsValid(vmbuffer))
 		ReleaseBuffer(vmbuffer);
 
@@ -1127,11 +1135,6 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
-		if (BufferIsValid(vacrel->next_unskippable_vmbuffer))
-		{
-			ReleaseBuffer(vacrel->next_unskippable_vmbuffer);
-			vacrel->next_unskippable_vmbuffer = InvalidBuffer;
-		}
 		*blkno = vacrel->rel_pages;
 		return false;
 	}
-- 
2.34.1

v3-0005-Refactor-vacuum-assert-into-multiple-if-statement.patchtext/x-patch; charset=US-ASCII; name=v3-0005-Refactor-vacuum-assert-into-multiple-if-statement.patchDownload
From 6dfa79e9fba4e1d7d4ce8c9b88fc69e3d18944eb Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Fri, 13 Dec 2024 13:48:09 -0500
Subject: [PATCH v3 5/7] Refactor vacuum assert into multiple if statements

The assert in heap_vacuum_rel() before updating relfrozenxid and/or
relminmxid in pg_class was long and complicated. This commit refactors
it into several if statements for clarity.
---
 src/backend/access/heap/vacuumlazy.c | 45 +++++++++++++++++++++++-----
 1 file changed, 37 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index e568396f0f5..59637284d02 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -550,14 +550,43 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * value >= FreezeLimit, and relminmxid to a value >= MultiXactCutoff.
 	 * Non-aggressive VACUUMs may advance them by any amount, or not at all.
 	 */
-	Assert(vacrel->NewRelfrozenXid == vacrel->cutoffs.OldestXmin ||
-		   TransactionIdPrecedesOrEquals(vacrel->aggressive ? vacrel->cutoffs.FreezeLimit :
-										 vacrel->cutoffs.relfrozenxid,
-										 vacrel->NewRelfrozenXid));
-	Assert(vacrel->NewRelminMxid == vacrel->cutoffs.OldestMxact ||
-		   MultiXactIdPrecedesOrEquals(vacrel->aggressive ? vacrel->cutoffs.MultiXactCutoff :
-									   vacrel->cutoffs.relminmxid,
-									   vacrel->NewRelminMxid));
+
+#ifdef USE_ASSERT_CHECKING
+	if (vacrel->NewRelfrozenXid == vacrel->cutoffs.OldestXmin)
+	{
+		/* No new relfrozenxid identified */
+	}
+	else if (vacrel->aggressive)
+	{
+		/*
+		 * Aggressive vacuum must have frozen all tuples older than the freeze
+		 * limit.
+		 */
+		Assert(TransactionIdPrecedesOrEquals(vacrel->cutoffs.FreezeLimit,
+											 vacrel->NewRelfrozenXid));
+	}
+	else
+		Assert(TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+											 vacrel->NewRelfrozenXid));
+
+	if (vacrel->NewRelminMxid == vacrel->cutoffs.OldestMxact)
+	{
+		/* No new relminmxid identified */
+	}
+	else if (vacrel->aggressive)
+	{
+		/*
+		 * Aggressive vacuum must have frozen all tuples older than the
+		 * multixact cutoff.
+		 */
+		Assert(MultiXactIdPrecedesOrEquals(vacrel->cutoffs.MultiXactCutoff,
+										   vacrel->NewRelminMxid));
+	}
+	else
+		Assert(MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+										   vacrel->NewRelminMxid));
+#endif
+
 	if (vacrel->skippedallvis)
 	{
 		/*
-- 
2.34.1

v3-0006-Add-more-general-summary-to-vacuumlazy.c.patchtext/x-patch; charset=US-ASCII; name=v3-0006-Add-more-general-summary-to-vacuumlazy.c.patchDownload
From 2ecb6ea2b3bca4264083b732e91ad3ad693caea3 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Wed, 11 Dec 2024 14:13:34 -0500
Subject: [PATCH v3 6/7] Add more general summary to vacuumlazy.c

Add more details to how vacuuming heap relations works to vacuumlazy.c
Previously the top of vacuumlazy.c only had details related to the dead
TID storage added in Postgres 17. This commit adds a more general
summary to help future developers understand the heap relation vacuuming
implementation at a high level.

It would be good to add another sentence or two on index vacuuming.

Reviewed-by: Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 src/backend/access/heap/vacuumlazy.c | 37 ++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 59637284d02..2c30660f5eb 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -3,6 +3,43 @@
  * vacuumlazy.c
  *	  Concurrent ("lazy") vacuuming.
  *
+ * Heap relations are vacuumed in three main phases. In phase I, vacuum scans
+ * relation pages, pruning and freezing tuples and saving dead tuples' TIDs in
+ * a TID store. If that TID store fills up or vacuum finishes scanning the
+ * relation, it progresses to phase II: index vacuuming. Index vacuuming
+ * deletes the dead index entries referenced in the TID store. In phase III,
+ * vacuum scans the blocks of the relation indicated by the TIDs in the TID
+ * store and reaps the dead tuples, freeing that space for future tuples.
+ *
+ * If there are no indexes or index scanning is disabled, phase II may be
+ * skipped. If phase I identified very few dead index entries, vacuum may skip
+ * phases II and III.
+ *
+ * Finally, vacuum may truncate the relation if it has emptied pages at the
+ * end. After finishing all phases of work, vacuum updates relation statistics
+ * in pg_class and the cumulative statistics subsystem.
+ *
+ * Relation Scanning:
+ *
+ * Vacuum scans the heap relation, starting at the beginning and progressing
+ * to the end, skipping pages as permitted by their visibility status, vacuum
+ * options, and the eagerness level of the vacuum.
+ *
+ * When page skipping is enabled, non-aggressive vacuums may skip scanning
+ * pages that are marked all-visible in the visibility map. We may choose not
+ * to skip pages if the range of skippable pages is below
+ * SKIP_PAGES_THRESHOLD.
+ *
+ * Once vacuum has decided to scan a given block, it must read in the block
+ * and obtain a cleanup lock to prune tuples on the page. A non-aggressive
+ * vacuums may choose to skip pruning and freezing if it cannot acquire a
+ * cleanup lock on the buffer right away.
+ *
+ * After pruning and freezing, pages that are newly all-visible and all-frozen
+ * are marked as such in the visibility map.
+ *
+ * Dead TID Storage:
+ *
  * The major space usage for vacuuming is storage for the dead tuple IDs that
  * are to be removed from indexes.  We want to ensure we can vacuum even the
  * very largest relations with finite memory space usage.  To do that, we set
-- 
2.34.1

v3-0007-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchtext/x-patch; charset=US-ASCII; name=v3-0007-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchDownload
From 2a5de146c985c2aa7dc324f22839729e95d67f7f Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Tue, 17 Dec 2024 15:21:22 -0500
Subject: [PATCH v3 7/7] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Introduce eager vacuums, which scan some of the all-visible but not
all-frozen pages in the relation to amortize the cost of an aggressive
vacuum.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
considered successful eager scans and those not frozen are considered
failed eager scans.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. To effectively amortize
aggressive vacuums, we cap the number of successes as well. Once we
reach the maximum number of blocks successfully eager scanned and
frozen, the eager vacuum is downgraded to a normal vacuum.

All-visible pages scanned by both eager and aggressive vacuums are
counted and logged.

Reviewed-by: Andres Freund, Robert Treat, Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 src/backend/access/heap/vacuumlazy.c | 448 +++++++++++++++++++++++----
 src/tools/pgindent/typedefs.list     |   1 +
 2 files changed, 392 insertions(+), 57 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 2c30660f5eb..c328d15e754 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -25,10 +25,35 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and the eagerness level of the vacuum.
  *
- * When page skipping is enabled, non-aggressive vacuums may skip scanning
- * pages that are marked all-visible in the visibility map. We may choose not
- * to skip pages if the range of skippable pages is below
- * SKIP_PAGES_THRESHOLD.
+ * There are three vacuum eagerness levels: normal vacuum, eager vacuum, and
+ * aggressive vacuum.
+ *
+ * When page skipping is not disabled, a normal vacuum may skip scanning pages
+ * that are marked all-visible in the visibility map if the range of skippable
+ * pages is below SKIP_PAGES_THRESHOLD.
+ *
+ * Eager vacuums will scan skippable pages in an effort to freeze them and
+ * decrease the backlog of all-visible but not all-frozen pages that have to
+ * be processed to advance relfrozenxid and avoid transaction ID wraparound.
+ *
+ * Eager vacuums counts it as a success when they are able to set an eagerly
+ * scanned page all-frozen in the VM and a failure when they are not able to
+ * set the page all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, eager vacuums cap the number of successful eager scans to
+ * EAGER_SCAN_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, eager vacuums use a localized failure cap
+ * instead of a global cap for the whole relation. The failure count is reset
+ * for each region of the table -- comprised of EAGER_SCAN_REGION_SIZE blocks.
+ * In each region, we tolerate EAGER_SCAN_MAX_FAILS_PER_REGION before
+ * suspending eager scanning until the end of the region.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and are thus not
+ * subject to failure or success caps when eagerly scanning all-visible pages.
  *
  * Once vacuum has decided to scan a given block, it must read in the block
  * and obtain a cleanup lock to prune tuples on the page. A non-aggressive
@@ -83,6 +108,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -168,6 +194,51 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * Eager vacuums scan some all-visible but not all-frozen pages. Since our
+ * goal is to freeze these pages, an eager scan that fails to set the page
+ * all-frozen in the VM is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once we fail to freeze EAGER_SCAN_MAX_FAILS_PER_REGION
+ * blocks in a region of size EAGER_SCAN_REGION_SIZE, we suspend eager
+ * scanning until vacuum has progressed to another region of the table with
+ * potentially older data.
+ */
+#define EAGER_SCAN_REGION_SIZE 4096
+#define EAGER_SCAN_MAX_FAILS_PER_REGION 128
+
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple eager vacuums,
+ * we limit the number of successful eager page scans. The maximum number of
+ * successful eager page scans is calculated as a ratio of the all-visible but
+ * not all-frozen pages at the beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
+
+/*
+ * The eagerness level of a vacuum determines how many all-visible but
+ * not all-frozen pages it eagerly scans.
+ *
+ * A normal vacuum (eagerness VAC_NORMAL) scans no all-visible pages (with the
+ * exception of those scanned due to SKIP_PAGES_THRESHOLD).
+ *
+ * An eager vacuum (eagerness VAC_EAGER) scans a number of pages up to a limit
+ * of successes. An eager vacuum is downgraded to a normal vacuum when it hits
+ * its success quota. An aggressive vacuum cannot be downgraded. No eagerness
+ * level is ever upgraded.
+ *
+ * An aggressive vacuum (eagerness VAC_AGGRESSIVE) must scan all all-visible but
+ * not all-frozen pages.
+ */
+typedef enum VacEagerness
+{
+	VAC_NORMAL,
+	VAC_EAGER,
+	VAC_AGGRESSIVE,
+} VacEagerness;
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -179,8 +250,6 @@ typedef struct LVRelState
 	BufferAccessStrategy bstrategy;
 	ParallelVacuumState *pvs;
 
-	/* Aggressive VACUUM? (must set relfrozenxid >= FreezeLimit) */
-	bool		aggressive;
 	/* Use visibility map to skip? (disabled by DISABLE_PAGE_SKIPPING) */
 	bool		skipwithvm;
 	/* Consider index vacuuming bypass optimization? */
@@ -265,7 +334,48 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eager scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/*
+	 * Whether or not this is an normal, eager, or aggressive VACUUM. An
+	 * aggressive vacuum must set relfrozenxid >= FreezeLimit and therefore
+	 * must scan every unfrozen tuple. An eager vacuum will scan some number
+	 * number of all-visible pages until it is downgraded to a normal vacuum.
+	 */
+	VacEagerness eagerness;
+
+	/*
+	 * An eager vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a row suspends eager scanning. next_eager_scan_region_start
+	 * is the block number of the first block eligible for resumed eager
+	 * scanning. Normal and aggressive vacuums do not use this.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	struct
+	{
+		/*
+		 * The remaining number of blocks an eager vacuum will consider eager
+		 * scanning. This is initialized to EAGER_SCAN_SUCCESS_RATE of the
+		 * total number of all-visible but not all-frozen pages. Aggressive
+		 * vacuums also decrement this counter but it is initialized to #
+		 * blocks in the relation.
+		 */
+		BlockNumber remaining_successes;
+
+		/*
+		 * The number of eagerly scanned blocks an eager vacuum failed to
+		 * freeze (due to age) in the current eager scan region. Eager vacuums
+		 * reset it to EAGER_SCAN_MAX_FAILS_PER_REGION each time they enter a
+		 * new region of the relation. Aggressive vacuums also decrement this
+		 * counter, but it is initialized to # blocks in the relation.
+		 */
+		BlockNumber remaining_fails;
+
+		/* Count of all-visible blocks scanned (for logging only). */
+		BlockNumber scanned;
+	}			eager_pages;
 } LVRelState;
 
 /* Struct for saving and restoring vacuum error information. */
@@ -279,8 +389,12 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static const char *vac_eagerness_description(VacEagerness eagerness);
+static void heap_vacuum_set_up_eagerness(LVRelState *vacrel,
+										 bool aggressive);
 static BlockNumber heap_vac_scan_next_block(LVRelState *vacrel,
-											bool *all_visible_according_to_vm);
+											bool *all_visible_according_to_vm,
+											bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -288,7 +402,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -330,6 +444,151 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+/*
+ * Helper to return a text description of the vacuum eagerness level for
+ * logging output. The string is not localized but is marked for
+ * translation later.
+ */
+static const char *
+vac_eagerness_description(VacEagerness eagerness)
+{
+	switch (eagerness)
+	{
+		case VAC_NORMAL:
+			return gettext_noop("vacuum");
+		case VAC_EAGER:
+			return gettext_noop("eager vacuum");
+		case VAC_AGGRESSIVE:
+			return gettext_noop("aggressive vacuum");
+		default:
+			elog(ERROR, "Unknown vacuum eagerness level: %d", eagerness);
+	}
+}
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scanning related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_set_up_eagerness(LVRelState *vacrel,
+							 bool aggressive)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_requires_freeze = false;
+
+	vacrel->eager_pages.scanned = 0;
+
+	/* Normal and aggressive vacuums don't have eager scan regions */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs.
+	 */
+	if (aggressive)
+	{
+		vacrel->eagerness = VAC_AGGRESSIVE;
+
+		/*
+		 * An aggressive vacuum must scan every all-visible page to safely
+		 * advance the relfrozenxid and/or relminmxid. As such, there is no
+		 * cap to the number of allowed successes or failures. We still
+		 * initialize and decrement successes and failures to avoid brittle
+		 * special casing on vacuum eagerness level.
+		 */
+		vacrel->eager_pages.remaining_fails = vacrel->rel_pages + 1;
+		vacrel->eager_pages.remaining_successes = vacrel->rel_pages + 1;
+		return;
+	}
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation. We are only guaranteed to
+	 * freeze a freezable page if some of the tuples require freezing. Tuples
+	 * require freezing if any of their xids precede the freeze limit or
+	 * multixact cutoff. So, if the oldest unfrozen xid
+	 * (relfrozenxid/relminmxid) does not precede the freeze cutoff, we won't
+	 * find tuples requiring freezing.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+									  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_requires_freeze = true;
+
+	if (!oldest_unfrozen_requires_freeze &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+									vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_requires_freeze = true;
+
+	/*
+	 * If the relation is smaller than a single region, we won't bother eager
+	 * scanning it, as an aggressive vacuum shouldn't take very long anyway so
+	 * there is no point in amortization.
+	 *
+	 * Also, if the oldest unfrozen XID is not old enough to require freezing,
+	 * we won't bother eager scanning, as it will likely not succeed in
+	 * freezing pages.
+	 *
+	 * In both of these cases, we set up a non-eager vacuum. This will not
+	 * intentionally scan all-visible pages, so the success and failure limits
+	 * are initialized to 0.
+	 */
+	if (vacrel->rel_pages < EAGER_SCAN_REGION_SIZE ||
+		!oldest_unfrozen_requires_freeze)
+	{
+		vacrel->eagerness = VAC_NORMAL;
+
+		vacrel->eager_pages.remaining_fails = 0;
+		vacrel->eager_pages.remaining_successes = 0;
+		return;
+	}
+
+	/*
+	 * We are not required to do an aggressive vacuum and we have met the
+	 * criteria to do an eager vacuum.
+	 */
+	vacrel->eagerness = VAC_EAGER;
+
+	/*
+	 * Start at a random spot somewhere within the first eager scan region.
+	 * This avoids eager scanning and failing to freeze the exact same blocks
+	 * each vacuum of the relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed % EAGER_SCAN_REGION_SIZE;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager scan failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_pages.remaining_fails = EAGER_SCAN_MAX_FAILS_PER_REGION *
+		first_region_ratio;
+
+	/*
+	 * Our success cap is EAGER_SCAN_SUCCESS_RATE of the number of all-visible
+	 * but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel,
+						&allvisible,
+						&allfrozen);
+
+	vacrel->eager_pages.remaining_successes =
+		(BlockNumber) (EAGER_SCAN_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -361,7 +620,9 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	WalUsage	startwalusage = pgWalUsage;
 	BufferUsage startbufferusage = pgBufferUsage;
 	ErrorContextCallback errcallback;
+	VacEagerness orig_eagerness;
 	char	  **indnames = NULL;
+	bool		aggressive = false;
 
 	verbose = (params->options & VACOPT_VERBOSE) != 0;
 	instrument = (verbose || (AmAutoVacuumWorkerProcess() &&
@@ -500,7 +761,8 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * want to teach lazy_scan_prune to recompute vistest from time to time,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
-	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
+	aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
+
 	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
@@ -514,25 +776,22 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 		 * Force aggressive mode, and disable skipping blocks using the
 		 * visibility map (even those set all-frozen)
 		 */
-		vacrel->aggressive = true;
+		aggressive = true;
 		skipwithvm = false;
 	}
 
 	vacrel->skipwithvm = skipwithvm;
 
+	heap_vacuum_set_up_eagerness(vacrel, aggressive);
+	/* Save this so vacuum logging output displays the correct eagerness */
+	orig_eagerness = vacrel->eagerness;
+
 	if (verbose)
-	{
-		if (vacrel->aggressive)
-			ereport(INFO,
-					(errmsg("aggressively vacuuming \"%s.%s.%s\"",
-							vacrel->dbname, vacrel->relnamespace,
-							vacrel->relname)));
-		else
-			ereport(INFO,
-					(errmsg("vacuuming \"%s.%s.%s\"",
-							vacrel->dbname, vacrel->relnamespace,
-							vacrel->relname)));
-	}
+		ereport(INFO,
+				(errmsg("%s of \"%s.%s.%s\"",
+						vac_eagerness_description(vacrel->eagerness),
+						vacrel->dbname, vacrel->relnamespace,
+						vacrel->relname)));
 
 	/*
 	 * Allocate dead_items memory using dead_items_alloc.  This handles
@@ -593,7 +852,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	{
 		/* No new relfrozenxid identified */
 	}
-	else if (vacrel->aggressive)
+	else if (vacrel->eagerness == VAC_AGGRESSIVE)
 	{
 		/*
 		 * Aggressive vacuum must have frozen all tuples older than the freeze
@@ -610,7 +869,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	{
 		/* No new relminmxid identified */
 	}
-	else if (vacrel->aggressive)
+	else if (vacrel->eagerness == VAC_AGGRESSIVE)
 	{
 		/*
 		 * Aggressive vacuum must have frozen all tuples older than the
@@ -631,7 +890,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 		 * chose to skip an all-visible page range.  The state that tracks new
 		 * values will have missed unfrozen XIDs from the pages we skipped.
 		 */
-		Assert(!vacrel->aggressive);
+		Assert(vacrel->eagerness != VAC_AGGRESSIVE);
 		vacrel->NewRelfrozenXid = InvalidTransactionId;
 		vacrel->NewRelminMxid = InvalidMultiXactId;
 	}
@@ -716,7 +975,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 				 * VACUUM VERBOSE ereport
 				 */
 				Assert(!params->is_wraparound);
-				msgfmt = _("finished vacuuming \"%s.%s.%s\": index scans: %d\n");
+				msgfmt = _("finished %s of \"%s.%s.%s\": index scans: %d\n");
 			}
 			else if (params->is_wraparound)
 			{
@@ -726,29 +985,25 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 				 * implies aggressive.  Produce distinct output for the corner
 				 * case all the same, just in case.
 				 */
-				if (vacrel->aggressive)
-					msgfmt = _("automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n");
-				else
-					msgfmt = _("automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n");
+				msgfmt = _("automatic %s to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n");
 			}
 			else
-			{
-				if (vacrel->aggressive)
-					msgfmt = _("automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n");
-				else
-					msgfmt = _("automatic vacuum of table \"%s.%s.%s\": index scans: %d\n");
-			}
+				msgfmt = _("automatic %s of table \"%s.%s.%s\": index scans: %d\n");
+
 			appendStringInfo(&buf, msgfmt,
+							 vac_eagerness_description(orig_eagerness),
 							 vacrel->dbname,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u all-visible scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_pages.scanned);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -918,7 +1173,8 @@ lazy_scan_heap(LVRelState *vacrel)
 {
 	BlockNumber rel_pages = vacrel->rel_pages,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
 
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
@@ -938,6 +1194,7 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
 	/* Loop until we've considered scanning all blocks in the relation */
@@ -947,10 +1204,12 @@ lazy_scan_heap(LVRelState *vacrel)
 		BlockNumber blkno;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		blkno = heap_vac_scan_next_block(vacrel,
-										 &all_visible_according_to_vm);
+										 &all_visible_according_to_vm,
+										 &was_eager_scanned);
 
 		if (!BlockNumberIsValid(blkno))
 			break;
@@ -1058,7 +1317,7 @@ lazy_scan_heap(LVRelState *vacrel)
 			 * lazy_scan_noprune could not do all required processing.  Wait
 			 * for a cleanup lock, and call lazy_scan_prune in the usual way.
 			 */
-			Assert(vacrel->aggressive);
+			Assert(vacrel->eagerness == VAC_AGGRESSIVE);
 			LockBuffer(buf, BUFFER_LOCK_UNLOCK);
 			LockBufferForCleanup(buf);
 			got_cleanup_lock = true;
@@ -1080,7 +1339,43 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_pages.remaining_successes > 0);
+				vacrel->eager_pages.remaining_successes--;
+
+				if (vacrel->eager_pages.remaining_successes == 0)
+				{
+					/*
+					 * An aggressive vacuum's remaining_successes counter was
+					 * initialized to rel_pages + 1, so it should never get
+					 * here.
+					 */
+					Assert(vacrel->eagerness == VAC_EAGER);
+
+					/*
+					 * If we hit our success limit, there is no need to
+					 * eagerly scan any additional pages. Downgrade the vacuum
+					 * to a normal vacuum.
+					 */
+					vacrel->eagerness = VAC_NORMAL;
+					vacrel->eager_pages.remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_pages.remaining_fails > 0);
+				vacrel->eager_pages.remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1192,7 +1487,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are
  * returned and set in *all_visible_according_to_vm.  The return value is
- * InvalidBlockNumber if there are no further blocks to process.
+ * InvalidBlockNumber if there are no further blocks to process. If the block
+ * is being eagerly scanned, was_eager_scanned is set so that the caller can
+ * count whether or not we successfully freeze it.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1202,11 +1499,14 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static BlockNumber
 heap_vac_scan_next_block(LVRelState *vacrel,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	vacrel->current_block++;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (vacrel->current_block >= vacrel->rel_pages)
 		return InvalidBlockNumber;
@@ -1270,6 +1570,9 @@ heap_vac_scan_next_block(LVRelState *vacrel,
 		Assert(vacrel->current_block == vacrel->next_unskippable_block);
 
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
+		if (*was_eager_scanned)
+			vacrel->eager_pages.scanned++;
 		return vacrel->current_block;
 	}
 }
@@ -1293,11 +1596,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1305,6 +1609,18 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, eager vacuums reset the
+		 * failure counter, allowing them to resume eager scanning if it had
+		 * been disabled.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_pages.remaining_fails =
+				EAGER_SCAN_MAX_FAILS_PER_REGION;
+			vacrel->next_eager_scan_region_start += EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1337,24 +1653,31 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 		 * all-visible.  They may still skip all-frozen pages, which can't
 		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if (mapbits & VISIBILITYMAP_ALL_FROZEN)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip all-visible pages that are not also
+		 * all-frozen. Eager vacuums only skip such pages if they have hit the
+		 * failure limit for the current eager scan region.
+		 */
+		if (vacrel->eager_pages.remaining_fails > 0)
+		{
+			next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible block is safe to skip in a normal or eager vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1532,7 +1855,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1684,11 +2008,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1776,6 +2106,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1783,7 +2114,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
@@ -1872,7 +2206,7 @@ lazy_scan_noprune(LVRelState *vacrel,
 									 &NoFreezePageRelminMxid))
 		{
 			/* Tuple with XID < FreezeLimit (or MXID < MultiXactCutoff) */
-			if (vacrel->aggressive)
+			if (vacrel->eagerness == VAC_AGGRESSIVE)
 			{
 				/*
 				 * Aggressive VACUUMs must always be able to advance rel's
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index ce33e55bf1d..728ceb6441c 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -3063,6 +3063,7 @@ UserOpts
 VacAttrStats
 VacAttrStatsP
 VacDeadItemsInfo
+VacEagerness
 VacErrPhase
 VacObjFilter
 VacOptValue
-- 
2.34.1

#7Melanie Plageman
melanieplageman@gmail.com
In reply to: Nazir Bilal Yavuz (#5)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Thanks for the review!

On Tue, Dec 17, 2024 at 10:57 AM Nazir Bilal Yavuz <byavuz81@gmail.com> wrote:

Here are couple of code comments:

=== [PATCH v2 07/10] ===

It took me a while to understand that heap_vac_scan_next_block() loops
until rel_pages. What do you think about adding
Assert(vacrel->current_block == rel_pages) before the
pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED,
rel_pages) and having a comment on main loop should process blocks
until rel_pages?

I added these to the v3 I sent in [1]/messages/by-id/CAAKRu_Zni_idCUyKTBteRM-G5X1qiB9mf75rZGtHpt+nk1z4Gg@mail.gmail.com

=== [PATCH v2 09/10] ===

+ * If there are no indexes or index scanning is disabled, phase II may be
+ * skipped. If phase I identified very few dead index entries, vacuum may skip
+ * phases II and III. Index vacuuming deletes the dead index entries from the
+ * TID store.

phase III is not mentioned in the previous comments. It could be
better to first explain what phase III is before mentioning it.

+ * After index vacuuming is complete, vacuum scans the blocks of the relation
+ * indicated by the TIDs in the TID store and reaps the dead tuples, freeing
+ * that space for future tuples. Finally, vacuum may truncate the relation if
+ * it has emptied pages at the end.
+ *
+ * After finishing all phases of work, vacuum updates relation statistics in
+ * pg_class and the cumulative statistics subsystem.

There is no clear definition of phase III here as well. I can not
understand what phase III is and which parts the vacuum may skip.

I've attempted to address this in v3.

=== [PATCH v2 10/10] ===

+        /*
+         * The number of eagerly scanned blocks an eager vacuum failed to
+         * freeze (due to age) in the current eager scan region. Eager vacuums
+         * reset it to EAGER_SCAN_MAX_FAILS_PER_REGION each time they enter a
+         * new region of the relation. Aggressive vacuums also decrement this
+         * coutner but it is initialized to # blocks in the relation.
+         */

s/coutner/counter

Fixed

/* non-export function prototypes */
+
static void lazy_scan_heap(LVRelState *vacrel);

Extra blank line.

Fixed

+    if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+        TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+                                      vacrel->cutoffs.FreezeLimit))
+        oldest_unfrozen_requires_freeze = true;
+
+    if (MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+        MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+                                    vacrel->cutoffs.MultiXactCutoff))
+        oldest_unfrozen_requires_freeze = true;

You may want to short-circuit the second if condition with
!oldest_unfrozen_requires_freeze but it may increase the complexity,
up to you.

Good point. Done.

+    vacrel->eager_pages.remaining_fails = EAGER_SCAN_MAX_FAILS_PER_REGION *
+        (1 - vacrel->next_eager_scan_region_start / EAGER_SCAN_REGION_SIZE);

This will always return EAGER_SCAN_MAX_FAILS_PER_REGION or 0 because
of the integer dividing.

Ah, wow, thanks so much for catching that!

+    if (aggressive)
+    {
+        vacrel->eagerness = VAC_AGGRESSIVE;
+
+        /*
+         * An aggressive vacuum must scan every all-visible page to safely
+         * advance the relfrozenxid and/or relminmxid. As such, there is no
+         * cap to the number of allowed successes or failures.
+         */
+        vacrel->eager_pages.remaining_fails = vacrel->rel_pages + 1;
+        vacrel->eager_pages.remaining_successes = vacrel->rel_pages + 1;
+        return;
+    }
...
...
+        if (was_eager_scanned)
+        {
+            if (vm_page_frozen)
+            {
+                Assert(vacrel->eager_pages.remaining_successes > 0);
+                vacrel->eager_pages.remaining_successes--;
+
+                if (vacrel->eager_pages.remaining_successes == 0)
+                {
+                    Assert(vacrel->eagerness == VAC_EAGER);

My initial thought was that since *was_eager_scanned* is true,
Assert(vacrel->eagerness == VAC_EAGER) should be under the top if
condition (I assumed that was_eager_scanned is only true for eager
vacuums, not for aggressive vacuums too) but I see your point here.
Since you set vacrel->eager_pages.remaining_successes to
vacrel->rel_pages + 1, vacrel->eager_pages.remaining_successes can not
reach 0 although all pages are processed as successful. I think
comment is needed in both places to explain why
vacrel->eager_pages.[remaining_fails | remaining_successes] is set to
vacrel->rel_pages + 1 and why vacrel->eagerness should be VAC_EAGER
when was_eager_scanned is true and
vacrel->eager_pages.remaining_successes is 0.

Makes sense. I've attempted to clarify as you suggest in v3.

- Melanie

[1]: /messages/by-id/CAAKRu_Zni_idCUyKTBteRM-G5X1qiB9mf75rZGtHpt+nk1z4Gg@mail.gmail.com

#8Robert Haas
robertmhaas@gmail.com
In reply to: Melanie Plageman (#7)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Tue, Dec 17, 2024 at 5:54 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

Makes sense. I've attempted to clarify as you suggest in v3.

I would just commit 0001. There's nothing to be gained by waiting around.

I don't care about 0002 much. It doesn't seem particularly better or
worse. I would suggest that if you want to do this, maybe don't split
up this:

vacrel->blkno = InvalidBlockNumber;
if (BufferIsValid(vmbuffer))
ReleaseBuffer(vmbuffer);

You could put the moved code before or after after that instead of the
middle of it. Unless there's some reason it makes more sense in the
middle.

I don't care about 0003 much, either. It looks correct to me, but
whether it's better is subjective.

I dislike 0004 as presented. Reducing the scope of blkno is a false
economy; the function doesn't do much of anything interesting after
the main loop. And why do we want to report rel_pages to the progress
reporting machinery instead of blkno? I'd rather that the code report
where it actually ended up (blkno) rather than reporting where it
thinks it must have ended up (rel_pages).

I agree that the assert that 0005 replaces is confusing, but replacing
8 lines of code with 37 is not an improvement in my book.

I like 0006. The phase I-II-III terminology doesn't appear anywhere in
the code (at least, not to my knowledge) but we speak of it that way
so frequently in email and in conversation that mentioning it
someplace that a future developer might find seems advisable. I think
it would be worth mentioning in the second paragraph of the comment
that we may resume phase I after completing phase III if we entered
phase II due to lack of memory. I'm not sure what the right way to
phrase this is -- in a sense, this possibility means that these aren't
really phases at all, however much we may speak of them that way. But
as I say, we talk about them that way all the time, so it's good that
this is finally adding comments to match.

Regarding 0007:

- Why do we measure failure as an integer total but success as a
percentage? Maybe the thought here is that failures are counted per
region but successes are counted globally across the relation, but
then I wonder if that's what we want, and if so, whether we need some
comments to explain why we want that rather than doing both per
region.

- I do not like the nested struct definition for eager_pages. Either
define the struct separately, give it a name, and then refer to that
name here, or just define the elements individually, and maybe give
them a common prefix or something. I don't think what you have here is
a style we normally use. As you can see, pgindent is not particularly
fond of it. It seems particularly weird given that you didn't even put
all the stuff related to eagerness inside of it.

- It's a little weird that you mostly treat eager vacuums as an
intermediate position between aggressive and normal, but then we
decide whether we're eager in a different place than we decide whether
we're aggressive.

- On a related note, won't most vacuums be VAC_EAGER rather than
VAC_NORMAL, thus making VAC_NORMAL a misnomer? I wonder if it's better
to merge eager and normal together, and just treat the cases where we
judge eager scanning not worthwhile as a mild special case of an
otherwise-normal vacuum. It's important that a user can tell what
happened from the log message, but it doesn't seem absolutely
necessary for the start-of-vacuum message to make that clear. It could
just be that %u all-visible scanned => 0 all-visible scanned means we
didn't end up being at all eager.

- Right after the comment "Produce distinct output for the corner case
all the same, just in case," you've changed it so that there's no
longer an if-statement. While you haven't really falsified the comment
in any deep sense, some rewording is probably in order. Also, the
first sentence of this comment overtly contradicts itself without
really explaining anything useful. That's a preexisting problem for
which you're not responsible, but maybe it makes sense to fix it while
you're adjusting this comment.

- Perhaps it's unfair of me, but I think I would have hoped for an
acknowledgement in this commit message, considering that I believe I
was the one who suggested breaking the relation into logical regions,
trying to freeze a percentage of the all-visible-but-not-all-frozen
pages, and capping both successes and failures. Starting the region at
a random offset wasn't my idea, and the specific thresholds you've
chosen were not the ones I suggested, and limiting successes globally
rather than per-region was not what I think I had in mind, and I don't
mean to take away from everything you've done to move this forward,
but unless I am misunderstanding the situation, this particular patch
(0007) is basically an implementation of an algorithm that, as far as
I know, I was the first to propose.

- Which of course also means that I tend to like the idea, but also
that I'm biased. Still, what is the reasonable alternative to this
patch? I have a hard time believing that it's "do nothing". As far as
I know, pretty much everyone agrees that the large burst of work that
tends to occur when an aggressive vacuum kicks off is extremely
problematic, particularly but not only the first time it kicks off on
a table or group of tables that may have accumulated many
all-visible-but-not-all-frozen pages. This patch might conceivably err
in moving that work too aggressively to earlier vacuums, thus making
those vacuums too expensive or wasting work if the pages end up being
modified again; or it might conceivably err in moving work
insufficiently aggressively to earlier vacuums, leaving too much
remaining work when the aggressive vacuum finally happens. In fact, I
would be surprised if it doesn't have those problems in some
situations. But it could have moderately severe cases of those
problems and still be quite a bit better than what we have now
overall.

- So,I think we should avoid fine-tuning this and try to understand if
there's anything wrong with the big picture. Can we imagine a user who
is systematically unhappy with this change? Like, not a user who got
hosed once because of some bad luck, but someone who is constantly and
predictably getting hosed? They'd need to be accumulating lots of
all-visible-not-all-frozen pages in relatively large tables on a
regular basis, but then I guess they'd need to either drop the tables
before the aggressive vacuum happened, or they'd need to render the
pages not-all-visible again before the aggressive vacuum would have
happened. I'm not entirely sure how possible that is. My best guess is
that it's possible if the timing of your autovacuum runs is
particularly poor -- you just need to load some data, vacuum it early
enough that the XIDs are still young so it doesn't get frozen, then
have the eager vacuum hit it, and then update it. That doesn't seem
impossible, but I'm not sure if it's possible to make it happen often
enough and severely enough to really cause a problem. And I'm not sure
we're going to find that out before this is committed, so that brings
me to:

- If this patch is going to go into the source tree in PostgreSQL 18,
it should do that soon. This is a bad patch to be committing in late
March. I propose that it should be shipped by end of January or wait a
year. Even if it goes into the tree by the end of January, there is a
chance we'll find problems that we can't fix quickly and have to
revert the whole thing. But that becomes much more likely if it is
committed close to feature freeze. There is a certain kind of patch -
and I think it includes this patch - where you just can't ever really
know what the problems people are going to hit IRL are until it's
committed and people try things and hit problems, perhaps not even as
part of an intent to test this patch, but just testing in general. If
we don't find those problems with enough time remaining to react to
them in a thoughtful way, that's where full reverts start to happen.

--
Robert Haas
EDB: http://www.enterprisedb.com

#9Robert Treat
rob@xzilla.net
In reply to: Melanie Plageman (#6)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Tue, Dec 17, 2024 at 5:51 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

Thanks for taking a look!

I've rebased and attached an updated v3 which also addresses review feedback.

On Sun, Dec 15, 2024 at 1:05 AM Robert Treat <rob@xzilla.net> wrote:

On Fri, Dec 13, 2024 at 5:53 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

<snip>

So, all vacuums are eager after the first eager vacuum (in this
workload).

I have been thinking about this statement and a sense of awkwardness
that I felt about how this implementation came together which I think
Robert captured well with his statement "- It's a little weird that
you mostly treat eager vacuums as an intermediate position between
aggressive and normal, but then we decide whether we're eager in a
different place than we decide whether
we're aggressive."

It feels to me like eager vacuums are not so much a distinct thing,
but that, like how all vacuum do index cleanup unless told not to, all
vacuums are optimistic that they will convert avp to afp, only we bail
out quickly if the table is below vacuum_freeze_min_age and we throw
the limits out if it is above autovacuum_freeze_max_age, similar to
how we manage vacuum cost limit.

+ * The eagerness level of a vacuum determines how many all-visible but
+ * not all-frozen pages it eagerly scans.
+ *
+ * A normal vacuum (eagerness VAC_NORMAL) scans no all-visible pages (with the
+ * exception of those scanned due to SKIP_PAGES_THRESHOLD).
+ *
+ * An eager vacuum (eagerness VAC_EAGER) scans a number of pages up to a limit
+ * based on whether or not it is succeeding or failing. An eager vacuum is
+ * downgraded to a normal vacuum when it hits its success quota. An aggressive
+ * vacuum cannot be downgraded. No eagerness level is ever upgraded.
+ *

At the risk of being overly nit-picky... eager vacuums scan their
subset of all-visible pages "up to a limit" based solely on the
success ratio. In the case of (excessive) failures, there is no limit
to the number of pages scanned, only a pause in the pages scanned
until the next region.

Yes, this is a good point. I've changed it to specifically indicate
the limit is based on successes. However, I feel like I should either
not mention the success limit here or mention the regional limiting
based on failures -- otherwise it is confusing. Can you think of a
wording that would be good for this comment?

I don't feel like I came up with anything concise :-)

I think the gist is something like "a given vacuum will scan a number
of pages up to either a limit based on successes, after which it is
downgraded to a normal vacuum, or a subset of pages based on failures
across different regions within the heap." but even that feels like we
are relying on people already understanding what is going on rather
than defining/explaining it.

+ * An aggressive vacuum (eagerness EAGER_FULL) must scan all all-visible but
+ * not all-frozen pages.
+ */

I think the above should be VAC_AGGRESSIVE vs EAGER_FULL, no?

Yep, thanks! Fixed.

vacrel->skipwithvm = skipwithvm;

+     heap_vacuum_set_up_eagerness(vacrel, aggressive);
+
if (verbose)
-     {
-             if (vacrel->aggressive)
-                     ereport(INFO,
-                                     (errmsg("aggressively vacuuming \"%s.%s.%s\"",
-                                                     vacrel->dbname, vacrel->relnamespace,
-                                                     vacrel->relname)));
-             else
-                     ereport(INFO,
-                                     (errmsg("vacuuming \"%s.%s.%s\"",
-                                                     vacrel->dbname, vacrel->relnamespace,
-                                                     vacrel->relname)));
-     }
+             ereport(INFO,
+                             (errmsg("%s of \"%s.%s.%s\"",
+                                             vac_eagerness_description(vacrel->eagerness),
+                                             vacrel->dbname, vacrel->relnamespace,
+                                             vacrel->relname)));

/*
* Allocate dead_items memory using dead_items_alloc. This handles

One thing I am wondering about is that since we actually modify
vacrel->eagerness during the "success downgrade" cycle, a single
vacuum run could potentially produce messages with both eager vacuum
and normal vacuum language. I don't think that'd be a problem in the
above spot, but wondering if it might be elsewhere (maybe in
pg_stat_activity?).

Great point. It's actually already an issue in the vacuum log output.
In the new patch, I save the eagerness level at the beginning and use
it in the logging output. Any future users of the eagerness level will
have to figure out if they care about the original eagerness level or
the current one.

In a general sense, you want to know if your vacuums are converting
avp to afp since it can explain i/o usage. In this version of the
patch, we know it is turned on based on VacEagerness, but it'd be nice
to know if it got turned off; ie. basically if we end up in
if (vacrel->eager_pages.remaining_successes == 0) maybe drop a note in the logs.

In a world where all vacuums are eager vacuums, I think you still want
the latter messaging, but I think the former would end up being noted
based on the outcome of criteria in vacuum_get_cutoffs() (primarily if
we are over the freeze limit).

Robert Treat
https://xzilla.net

#10Melanie Plageman
melanieplageman@gmail.com
In reply to: Robert Haas (#8)
2 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Updated v4 attached.

On Wed, Dec 18, 2024 at 4:30 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Tue, Dec 17, 2024 at 5:54 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

Makes sense. I've attempted to clarify as you suggest in v3.

I would just commit 0001. There's nothing to be gained by waiting around.

Done.

I don't care about 0002 much. It doesn't seem particularly better or
worse. I would suggest that if you want to do this, maybe don't split
up this:

vacrel->blkno = InvalidBlockNumber;
if (BufferIsValid(vmbuffer))
ReleaseBuffer(vmbuffer);

You could put the moved code before or after after that instead of the
middle of it. Unless there's some reason it makes more sense in the
middle.

Good point. Anyway, I've dropped all the patches except 0006 and 0007
since no one seems to really like them.

I dislike 0004 as presented. Reducing the scope of blkno is a false
economy; the function doesn't do much of anything interesting after
the main loop. And why do we want to report rel_pages to the progress
reporting machinery instead of blkno? I'd rather that the code report
where it actually ended up (blkno) rather than reporting where it
thinks it must have ended up (rel_pages).

Well, part of the reason I didn't like it is that because we start
from 0, we have to artificially set blkno to rel_pages anyway because
we never actually scan a block with BlockNumber == rel_pages. In the
loop, pgstat_progress_update_param() passes blkno before it actually
scans blkno, so I think of it as reporting that it had scanned a total
number of blocks equal to blkno. That's why it seems weird to me that
we use blkno to indicate the number of blocks scanned outside the
loop.

Anyway, I'm fine with setting this aside for now if you feel it is
more confusing with rel_pages instead of blkno.

I agree that the assert that 0005 replaces is confusing, but replacing
8 lines of code with 37 is not an improvement in my book.

Right, yes. It is long. I dropped it along with the others.

I like 0006. The phase I-II-III terminology doesn't appear anywhere in
the code (at least, not to my knowledge) but we speak of it that way
so frequently in email and in conversation that mentioning it
someplace that a future developer might find seems advisable. I think
it would be worth mentioning in the second paragraph of the comment
that we may resume phase I after completing phase III if we entered
phase II due to lack of memory. I'm not sure what the right way to
phrase this is -- in a sense, this possibility means that these aren't
really phases at all, however much we may speak of them that way. But
as I say, we talk about them that way all the time, so it's good that
this is finally adding comments to match.

They are more like states in a state machine, I suppose. We've all
been calling them phases for so long though, it's probably best to go
with that. I've added more about how we can return to phases. I also
added a small note about how this makes them more like states but
we've always called them phases.

Regarding 0007:

- Why do we measure failure as an integer total but success as a
percentage? Maybe the thought here is that failures are counted per
region but successes are counted globally across the relation, but
then I wonder if that's what we want, and if so, whether we need some
comments to explain why we want that rather than doing both per
region.

I've added a comment about this to the top of the file. The idea is
that if you don't cap successes, you won't end up amortizing anything.
However, you don't want to limit yourself from freezing the data at
the beginning of the table if you are succeeding. Especially given
that append-mostly workloads will see the most benefit from this
feature.

I did wonder if we should also have some sort of global failure limit
to cap the total pages scanned, but I wondered if that was too much
extra complexity to have a global and local failure limit (also
unclear what to set the global failure limit to). It's probably better
to make the fails per region configurable.

- I do not like the nested struct definition for eager_pages. Either
define the struct separately, give it a name, and then refer to that
name here, or just define the elements individually, and maybe give
them a common prefix or something. I don't think what you have here is
a style we normally use. As you can see, pgindent is not particularly
fond of it. It seems particularly weird given that you didn't even put
all the stuff related to eagerness inside of it.

I don't mind changing it. This version has them prefixed with "eager" instead.

- It's a little weird that you mostly treat eager vacuums as an
intermediate position between aggressive and normal, but then we
decide whether we're eager in a different place than we decide whether
we're aggressive.

Yes, originally I had the code in heap_vacuum_set_up_eagerness() in
vacuum_get_cutoffs() but I moved it after noticing
vacuum_get_cutoffs() was in vacuum.c which is technically AM-agnostic.
I didn't want to pollute it too much with the eagerness logic which is
actually used in heap-specific code.

With the other changes to eliminate the idea of a separate eager
vacuum in this version, I think this is no longer an issue.

- On a related note, won't most vacuums be VAC_EAGER rather than
VAC_NORMAL, thus making VAC_NORMAL a misnomer? I wonder if it's better
to merge eager and normal together, and just treat the cases where we
judge eager scanning not worthwhile as a mild special case of an
otherwise-normal vacuum. It's important that a user can tell what
happened from the log message, but it doesn't seem absolutely
necessary for the start-of-vacuum message to make that clear. It could
just be that %u all-visible scanned => 0 all-visible scanned means we
didn't end up being at all eager.

I can see this. In this version, I've eliminated the concept of eager
vacuums and reverted the LVRelState flag back to a boolean indicating
aggressive or non-aggressive. Normal vacuums may eager scan some pages
if they qualify. If so, the eager scan management state is set up in
the LVRelState. Aggressive vacuums and normal vacuums with eager
scanning disabled have all of this state set to values indicating
eager scanning is disabled.

- Perhaps it's unfair of me, but I think I would have hoped for an
acknowledgement in this commit message, considering that I believe I
was the one who suggested breaking the relation into logical regions,
trying to freeze a percentage of the all-visible-but-not-all-frozen
pages, and capping both successes and failures. Starting the region at
a random offset wasn't my idea, and the specific thresholds you've
chosen were not the ones I suggested, and limiting successes globally
rather than per-region was not what I think I had in mind, and I don't
mean to take away from everything you've done to move this forward,
but unless I am misunderstanding the situation, this particular patch
(0007) is basically an implementation of an algorithm that, as far as
I know, I was the first to propose.

Ah, you're right. This was an oversight that I believe I've corrected
in the attached version's commit message.

- Which of course also means that I tend to like the idea, but also
that I'm biased. Still, what is the reasonable alternative to this
patch? I have a hard time believing that it's "do nothing". As far as
I know, pretty much everyone agrees that the large burst of work that
tends to occur when an aggressive vacuum kicks off is extremely
problematic, particularly but not only the first time it kicks off on
a table or group of tables that may have accumulated many
all-visible-but-not-all-frozen pages. This patch might conceivably err
in moving that work too aggressively to earlier vacuums, thus making
those vacuums too expensive or wasting work if the pages end up being
modified again; or it might conceivably err in moving work
insufficiently aggressively to earlier vacuums, leaving too much
remaining work when the aggressive vacuum finally happens. In fact, I
would be surprised if it doesn't have those problems in some
situations. But it could have moderately severe cases of those
problems and still be quite a bit better than what we have now
overall.

- So,I think we should avoid fine-tuning this and try to understand if
there's anything wrong with the big picture. Can we imagine a user who
is systematically unhappy with this change? Like, not a user who got
hosed once because of some bad luck, but someone who is constantly and
predictably getting hosed? They'd need to be accumulating lots of
all-visible-not-all-frozen pages in relatively large tables on a
regular basis, but then I guess they'd need to either drop the tables
before the aggressive vacuum happened, or they'd need to render the
pages not-all-visible again before the aggressive vacuum would have
happened. I'm not entirely sure how possible that is. My best guess is
that it's possible if the timing of your autovacuum runs is
particularly poor -- you just need to load some data, vacuum it early
enough that the XIDs are still young so it doesn't get frozen, then
have the eager vacuum hit it, and then update it. That doesn't seem
impossible, but I'm not sure if it's possible to make it happen often
enough and severely enough to really cause a problem. And I'm not sure
we're going to find that out before this is committed

I suppose in the worst case, if the timings all align poorly and
you've set your autovacuum_freeze_max_age/vacuum_freeze_table_age very
high and vacuum_freeze_min_age very low, you could end up uselessly
freezing the same page multiple times before aggressive vacuuming.

If you cycle through modifying a page, vacuuming it, setting it
all-visible, and eagerly scanning and freezing it multiple times
before an aggressive vacuum, this would be a lot of extra useless
freezing. It seems difficult to do because the page will likely be
frozen the first time you vacuum it if vacuum_freeze_min_age is set
sufficiently low.

The other "worst case" is just that you always scan and fail to freeze
an extra 3% of the relation while vacuuming the table. This one is
much easier to achieve. As such, it seems worthwhile to add a GUC and
table option to tune the EAGER_SCAN_MAX_FAILS_PER_REGION such that you
can disable eager scanning altogether (or increase or decrease how
aggressive it is).

- Melanie

Attachments:

v4-0001-Add-more-general-summary-to-vacuumlazy.c.patchtext/x-patch; charset=US-ASCII; name=v4-0001-Add-more-general-summary-to-vacuumlazy.c.patchDownload
From acd01bb8e7d77c076dbfbbcee8ea57da421228ae Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Wed, 11 Dec 2024 14:13:34 -0500
Subject: [PATCH v4 1/2] Add more general summary to vacuumlazy.c

Add more comments at the top of vacuumlazy.c on heap relation vacuuming
implementation.

Previously vacuumlazy.c only had details related to the dead TID storage
added in Postgres 17. This commit adds a more general summary to help
future developers understand the heap relation vacuum design and
implementation at a high level.

Reviewed-by: Robert Haas, Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 src/backend/access/heap/vacuumlazy.c | 42 ++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index f2ca9430581..f8edbab21d2 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -3,6 +3,48 @@
  * vacuumlazy.c
  *	  Concurrent ("lazy") vacuuming.
  *
+ * Heap relations are vacuumed in three main phases. In phase I, vacuum scans
+ * relation pages, pruning and freezing tuples and saving dead tuples' TIDs in
+ * a TID store. If that TID store fills up or vacuum finishes scanning the
+ * relation, it progresses to phase II: index vacuuming. Index vacuuming
+ * deletes the dead index entries referenced in the TID store. In phase III,
+ * vacuum scans the blocks of the relation indicated by the TIDs in the TID
+ * store and reaps the dead tuples, freeing that space for future tuples.
+ *
+ * If there are no indexes or index scanning is disabled, phase II may be
+ * skipped. If phase I identified very few dead index entries, vacuum may skip
+ * phases II and III. If the TID store fills up in phase I, vacuum suspends
+ * phase I, proceeds to phases II and II and cleans up the dead tuples
+ * referenced in the current TID store. This empties the TID store and allows
+ * vacuum to resume phase I. In this sense, the phases are more like states in
+ * a state machine, but they have been referred to colloquially as phases for
+ * long enough that it makes sense to refer to them in that way here.
+ *
+ * Finally, vacuum may truncate the relation if it has emptied pages at the
+ * end. After finishing all phases of work, vacuum updates relation statistics
+ * in pg_class and the cumulative statistics subsystem.
+ *
+ * Relation Scanning:
+ *
+ * Vacuum scans the heap relation, starting at the beginning and progressing
+ * to the end, skipping pages as permitted by their visibility status, vacuum
+ * options, and the eagerness level of the vacuum.
+ *
+ * When page skipping is enabled, non-aggressive vacuums may skip scanning
+ * pages that are marked all-visible in the visibility map. We may choose not
+ * to skip pages if the range of skippable pages is below
+ * SKIP_PAGES_THRESHOLD.
+ *
+ * Once vacuum has decided to scan a given block, it must read in the block
+ * and obtain a cleanup lock to prune tuples on the page. A non-aggressive
+ * vacuum may choose to skip pruning and freezing if it cannot acquire a
+ * cleanup lock on the buffer right away.
+ *
+ * After pruning and freezing, pages that are newly all-visible and all-frozen
+ * are marked as such in the visibility map.
+ *
+ * Dead TID Storage:
+ *
  * The major space usage for vacuuming is storage for the dead tuple IDs that
  * are to be removed from indexes.  We want to ensure we can vacuum even the
  * very largest relations with finite memory space usage.  To do that, we set
-- 
2.34.1

v4-0002-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchtext/x-patch; charset=US-ASCII; name=v4-0002-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchDownload
From 925dd0e487ee0a7910370810e0167cc4efa198e0 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Thu, 19 Dec 2024 19:42:54 -0500
Subject: [PATCH v4 2/2] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Introduce eager scanning normal vacuums, in which vacuum scans some of
the all-visible but not all-frozen pages in the relation to amortize the
cost of an aggressive vacuum.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
considered successful eager scans and those not frozen are considered
failed eager scans.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. To effectively amortize
aggressive vacuums, we cap the number of successes as well. Once we
reach the maximum number of blocks successfully eager scanned and
frozen, eager scanning is permanently disabled for the current vacuum.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Author: Melanie Plageman
Reviewed-by: Andres Freund, Robert Haas, Robert Treat, Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 src/backend/access/heap/vacuumlazy.c | 379 +++++++++++++++++++++++++--
 1 file changed, 352 insertions(+), 27 deletions(-)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index f8edbab21d2..0318650a2bf 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -30,10 +30,47 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and the eagerness level of the vacuum.
  *
- * When page skipping is enabled, non-aggressive vacuums may skip scanning
- * pages that are marked all-visible in the visibility map. We may choose not
- * to skip pages if the range of skippable pages is below
- * SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may eagerly scan otherwise skippable pages for
+ * one of two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may skip scanning pages
+ * that are marked all-visible (and even all-frozen) in the visibility map if
+ * the range of skippable pages is below SKIP_PAGES_THRESHOLD. This is
+ * primarily for the benefit of kernel readahead (see comment in
+ * heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager scans to
+ * EAGER_SCAN_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is permanently disabled.
+ *
+ * Success is a global cap because we don't want to limit our successes if old
+ * data happens to be concentrated in a particular part of the table. This is
+ * especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager scan failure cap
+ * instead of a global cap for the whole relation. The failure count is reset
+ * for each region of the table -- comprised of EAGER_SCAN_REGION_SIZE blocks.
+ * In each region, we tolerate EAGER_SCAN_MAX_FAILS_PER_REGION before
+ * suspending eager scanning until the end of the region.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and are thus not
+ * subject to failure or success caps when eagerly scanning all-visible pages.
  *
  * Once vacuum has decided to scan a given block, it must read in the block
  * and obtain a cleanup lock to prune tuples on the page. A non-aggressive
@@ -88,6 +125,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -173,6 +211,29 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * Normal vacuums may eagerly scan some all-visible but not all-frozen pages.
+ * Since our goal is to freeze these pages, an eager scan that fails to set
+ * the page all-frozen in the VM is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once we fail to freeze EAGER_SCAN_MAX_FAILS_PER_REGION
+ * blocks in a region of size EAGER_SCAN_REGION_SIZE, we suspend eager
+ * scanning until vacuum has progressed to another region of the table with
+ * potentially older data.
+ */
+#define EAGER_SCAN_REGION_SIZE 4096
+#define EAGER_SCAN_MAX_FAILS_PER_REGION 128
+
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple normal vacuums,
+ * we limit the number of successful eager page scans. The maximum number of
+ * successful eager page scans is calculated as a ratio of the all-visible but
+ * not all-frozen pages at the beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -229,6 +290,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -270,9 +338,46 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eager scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a row suspends eager scanning. next_eager_scan_region_start
+	 * is the block number of the first block eligible for resumed eager
+	 * scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success limit,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning. When eager scanning is enabled, this is initialized to
+	 * EAGER_SCAN_SUCCESS_RATE of the total number of all-visible but not
+	 * all-frozen pages. For each eager scan success, this is decremented.
+	 * Once it hits 0, eager scanning is permanently disabled. It is
+	 * initialized to 0 if eager scanning starts out disabled (including for
+	 * aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * EAGER_SCAN_MAX_FAILS_PER_REGION each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -284,8 +389,10 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -293,7 +400,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -335,6 +442,113 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_requires_freeze = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without old enough tuples will have eager scanning disabled.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scanning all-visible pages is not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * If the relation is smaller than a single region, we won't bother eager
+	 * scanning it, as a future aggressive vacuum shouldn't take very long
+	 * anyway so there is no point in amortization.
+	 */
+	if (vacrel->rel_pages < EAGER_SCAN_REGION_SIZE)
+		return;
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation. We are only guaranteed to
+	 * freeze a freezable page if some of the tuples require freezing. Tuples
+	 * require freezing if any of their xids precede the freeze limit or
+	 * multixact cutoff. So, if the oldest unfrozen xid
+	 * (relfrozenxid/relminmxid) does not precede the freeze cutoff, we won't
+	 * find tuples requiring freezing.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+									  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_requires_freeze = true;
+
+	if (!oldest_unfrozen_requires_freeze &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+									vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_requires_freeze = true;
+
+	if (!oldest_unfrozen_requires_freeze)
+		return;
+
+	/*
+	 * We are not required to do an aggressive vacuum and we have met the
+	 * criteria to eagerly scan some pages.
+	 */
+
+	/*
+	 * Our success cap is EAGER_SCAN_SUCCESS_RATE of the number of all-visible
+	 * but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (EAGER_SCAN_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If the table is entirely frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed % EAGER_SCAN_REGION_SIZE;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager scan failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails = EAGER_SCAN_MAX_FAILS_PER_REGION *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -463,6 +677,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -488,6 +703,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -506,11 +722,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -525,6 +746,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Next set up eager scan tracking state. This must happen after
+	 * determining whether or not the vacuum must be aggressive, because only
+	 * normal vacuums are considered to eagerly scan pages.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -719,12 +947,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eager scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -895,8 +1125,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -915,13 +1147,16 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
@@ -1049,7 +1284,48 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * An aggressive vacuum is not considered to eagerly scan
+					 * pages, so it should never get here.
+					 */
+					Assert(!vacrel->aggressive);
+
+					/*
+					 * If we hit our success limit, there is no need to
+					 * eagerly scan any additional pages. Permanently disable
+					 * eager scanning by setting the other eager scan
+					 * management fields to their disabled values as well.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+
+					ereport(INFO,
+							(errmsg("Vacuum successfully froze %u eager scanned blocks of \"%s.%s.%s\". Now disabling eager scanning.",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1149,7 +1425,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eager scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1159,13 +1437,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1238,6 +1519,9 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
+		if (*was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 		return true;
 	}
 }
@@ -1261,11 +1545,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1273,6 +1558,17 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing them to resume
+		 * eager scanning if it had been suspended in the previous region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails = EAGER_SCAN_MAX_FAILS_PER_REGION;
+			vacrel->next_eager_scan_region_start += EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1305,24 +1601,34 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 		 * all-visible.  They may still skip all-frozen pages, which can't
 		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if (mapbits & VISIBILITYMAP_ALL_FROZEN)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip all-visible pages that are not also
+		 * all-frozen. Normal vacuums with eager scanning enabled only skip
+		 * such pages if they have hit the failure limit for the current eager
+		 * scan region.
+		 */
+		if (vacrel->aggressive ||
+			vacrel->eager_scan_remaining_fails > 0)
+		{
+			if (!vacrel->aggressive)
+				next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1353,6 +1659,10 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because empty pages are always frozen and
+ * thus could never be eager scanned.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1492,6 +1802,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is set all-frozen in the VM. The
+ * caller currently only uses this for determining whether an eagerly scanned
+ * page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1500,7 +1814,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1652,11 +1967,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1744,6 +2065,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1751,7 +2073,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
-- 
2.34.1

#11Melanie Plageman
melanieplageman@gmail.com
In reply to: Robert Treat (#9)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Sat, Dec 21, 2024 at 10:28 AM Robert Treat <rob@xzilla.net> wrote:

On Tue, Dec 17, 2024 at 5:51 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

It feels to me like eager vacuums are not so much a distinct thing,
but that, like how all vacuum do index cleanup unless told not to, all
vacuums are optimistic that they will convert avp to afp, only we bail
out quickly if the table is below vacuum_freeze_min_age and we throw
the limits out if it is above autovacuum_freeze_max_age, similar to
how we manage vacuum cost limit.

I like this framing/way of thinking about it. v4 in [1]/messages/by-id/CAAKRu_byJgf3wB8ukv6caXROReS1SRZsVPb7RWP+8qPtdDGykw@mail.gmail.com eliminates the
concept of eager vacuums. I still use the aggressive vacuum and
non-aggressive vacuum framing. But, if we add a reloption/GUC to allow
configuring failures per region (proposed in [1]/messages/by-id/CAAKRu_byJgf3wB8ukv6caXROReS1SRZsVPb7RWP+8qPtdDGykw@mail.gmail.com), that means more
using-facing docs and I think this way of framing it as a spectrum of
all-visible page scanning based on relfrozenxid's relationship to each
of these GUCs might be a clear way to explain eager scanning to users.

In a general sense, you want to know if your vacuums are converting
avp to afp since it can explain i/o usage. In this version of the
patch, we know it is turned on based on VacEagerness, but it'd be nice
to know if it got turned off; ie. basically if we end up in
if (vacrel->eager_pages.remaining_successes == 0) maybe drop a note in the logs.

I've added a logging message like this.

In a world where all vacuums are eager vacuums, I think you still want
the latter messaging, but I think the former would end up being noted
based on the outcome of criteria in vacuum_get_cutoffs() (primarily if
we are over the freeze limit).

Hmm. Now that I've eliminated the concept of eager vacuums, users are
not informed whether or not eager scanning is enabled at the beginning
of vacuum. Only when eager scanning is disabled during vacuum or at
the end when they see the number of pages eagerly scanned would they
know whether or not this eager scanning happened.

- Melanie

[1]: /messages/by-id/CAAKRu_byJgf3wB8ukv6caXROReS1SRZsVPb7RWP+8qPtdDGykw@mail.gmail.com

#12Melanie Plageman
melanieplageman@gmail.com
In reply to: Melanie Plageman (#10)
3 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Mon, Dec 23, 2024 at 12:50 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

The other "worst case" is just that you always scan and fail to freeze
an extra 3% of the relation while vacuuming the table. This one is
much easier to achieve. As such, it seems worthwhile to add a GUC and
table option to tune the EAGER_SCAN_MAX_FAILS_PER_REGION such that you
can disable eager scanning altogether (or increase or decrease how
aggressive it is).

Attached v5 adds the GUC and table storage option controlling the
maximum number of eager scan failures tolerated for each region of the
table.

0001 is a version of a docs patch proposed in [1]/messages/by-id/CAAKRu_aQUOaMYrcjNuXeSkJtaX9oRUzKP57bsYbC0gVVWS+cbA@mail.gmail.com. It adds a new
Vacuuming subsection of the Server Configuration docs where the
proposed GUC in this patch is added in 0003.

While adding the table storage option and GUC, I struggled a bit with
where in the code to actually determine the final value of
vacuum_eager_scan_max_fails.

For table storage options, those related to vacuum but not autovacuum
are in the main StdRdOptions struct. Of those, some are overridden by
VACUUM command parameters which are parsed out into the VacuumParams
struct. Though the members of VacuumParams are initialized in
ExecVacuum(), the storage parameter overrides are determined in
vacuum_rel() and the final value goes in the VacuumParams struct which
is passed all the way through to heap_vacuum_rel().

Because VacuumParams is what ultimately gets passed down to the
table-AM specific vacuum implementation, autovacuum also initializes
its own instance of VacuumParams in the autovac_table struct in
table_recheck_autovac() (even though no VACUUM command parameters can
affect autovacuum). These are overridden in vacuum_rel() as well.

Ultimately vacuum_eager_scan_max_fails is a bit different from the
existing members of VacuumParams and StdRdOptions. It is a GUC and a
table storage option but not a SQL command parameter -- and both the
GUC and the table storage parameter affect both vacuum and autovacuum.
And it doesn't need to be initialized in different ways for autovacuum
and vacuum. In the end, I decided to follow the existing conventions
as closely as I could.

- Melanie

[1]: /messages/by-id/CAAKRu_aQUOaMYrcjNuXeSkJtaX9oRUzKP57bsYbC0gVVWS+cbA@mail.gmail.com

Attachments:

v5-0003-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchtext/x-patch; charset=US-ASCII; name=v5-0003-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchDownload
From d8f497508f2ef0eef3a6ef20b543bd2e0ad14551 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Tue, 7 Jan 2025 09:48:34 -0500
Subject: [PATCH v5 3/3] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Introduce eager scanning normal vacuums, in which vacuum scans some of
the all-visible but not all-frozen pages in the relation to amortize the
cost of an aggressive vacuum.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
considered successful eager scans and those not frozen are considered
failed eager scans.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager scanned
and frozen, eager scanning is permanently disabled for the current
vacuum.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Author: Melanie Plageman
Reviewed-by: Andres Freund, Robert Haas, Robert Treat, Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  20 +
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  13 +-
 src/backend/access/heap/vacuumlazy.c          | 382 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  13 +
 src/backend/postmaster/autovacuum.c           |   2 +
 src/backend/utils/misc/guc_tables.c           |  10 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/include/commands/vacuum.h                 |  23 ++
 src/include/utils/rel.h                       |   7 +
 10 files changed, 458 insertions(+), 28 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 3b2430eff55..bd5a63c8661 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9100,6 +9100,26 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+      <term><varname>vacuum_eager_scan_max_fails</varname> (<type>integer</type>)
+      <indexterm>
+       <primary><varname>vacuum_eager_scan_max_fails</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum number of all-visible pages that
+        <command>VACUUM</command> may scan and fail to set all-frozen in the
+        visibility map before disabling eager scanning until the next region
+        (currently 4096 blocks) of the relation. A value of 0 disables eager
+        scanning altogether. The default is 128. This parameter can be set in
+        postgresql.conf or on the server command line but is overridden for
+        individual tables by changing the corresponding table storage
+        parameter.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 70fa929caa4..ab1516b5e9d 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1901,6 +1901,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+    <term><literal>vacuum_eager_scan_max_fails</literal>, <literal>toast.vacuum_eager_scan_max_fails</literal> (<type>integer</type>)
+    <indexterm>
+     <primary><varname>vacuum_eager_scan_max_fails</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-eager-scan-max-fails"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..daff9f1fa8d 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -27,6 +27,7 @@
 #include "catalog/pg_type.h"
 #include "commands/defrem.h"
 #include "commands/tablespace.h"
+#include "commands/vacuum.h"
 #include "nodes/makefuncs.h"
 #include "utils/array.h"
 #include "utils/attoptcache.h"
@@ -319,6 +320,14 @@ static relopt_int intRelOpts[] =
 		},
 		-1, -1, INT_MAX
 	},
+	{
+		{
+			"vacuum_eager_scan_max_fails",
+			"Maximum number of all-visible pages that vacuum will eagerly scan and fail to freeze before giving up on eager scanning until the next region",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		}, -1, 0, VACUUM_EAGER_SCAN_REGION_SIZE
+	},
 	{
 		{
 			"toast_tuple_target",
@@ -1880,7 +1889,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_eager_scan_max_fails", RELOPT_TYPE_INT,
+		offsetof(StdRdOptions, vacuum_eager_scan_max_fails)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index c047fb20f7a..6c04b963c51 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -30,10 +30,47 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and the eagerness level of the vacuum.
  *
- * When page skipping is enabled, non-aggressive vacuums may skip scanning
- * pages that are marked all-visible in the visibility map. We may choose not
- * to skip pages if the range of skippable pages is below
- * SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager scans to
+ * EAGER_SCAN_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is permanently disabled.
+ *
+ * Success is a global cap because we don't want to limit our successes if old
+ * data happens to be concentrated in a particular part of the table. This is
+ * especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager scan failure cap
+ * instead of a global cap for the whole relation. The failure count is reset
+ * for each region of the table -- comprised of VACUUM_EAGER_SCAN_REGION_SIZE
+ * blocks. In each region, we tolerate vacuum_eager_scan_max_fails before
+ * suspending eager scanning until the end of the region.
+ * vacuum_eager_scan_max_fails is configurable both globally and per table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read in the block
  * and obtain a cleanup lock to prune tuples on the page. A non-aggressive
@@ -88,6 +125,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -173,6 +211,15 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple normal vacuums,
+ * we limit the number of successful eager page scans. The maximum number of
+ * successful eager page scans is calculated as a ratio of the all-visible but
+ * not all-frozen pages at the beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -229,6 +276,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -270,9 +324,55 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eager scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a row suspends eager scanning. next_eager_scan_region_start
+	 * is the block number of the first block eligible for resumed eager
+	 * scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success limit,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning. When eager scanning is enabled, this is initialized to
+	 * EAGER_SCAN_SUCCESS_RATE of the total number of all-visible but not
+	 * all-frozen pages. For each eager scan success, this is decremented.
+	 * Once it hits 0, eager scanning is permanently disabled. It is
+	 * initialized to 0 if eager scanning starts out disabled (including for
+	 * aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * vacuum_eager_scan_max_fails each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
+
+	/*
+	 * The maximum number of blocks which may be eager scanned and not frozen
+	 * before eager scanning is temporarily suspended. This is configurable
+	 * both globally, via the vacuum_eager_scan_max_fails GUC, and per table,
+	 * with a table storage parameter of the same name. It is 0 when eager
+	 * scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -284,8 +384,10 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -293,7 +395,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -335,6 +437,121 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_requires_freeze = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->eager_scan_max_fails == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * If the relation is smaller than a single region, we won't bother eager
+	 * scanning it. A future aggressive vacuum shouldn't take very long, so
+	 * there is no point in amortization.
+	 */
+	if (vacrel->rel_pages < VACUUM_EAGER_SCAN_REGION_SIZE)
+		return;
+
+	Assert(params->eager_scan_max_fails >= 0 &&
+		   params->eager_scan_max_fails <= 4096);
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation. We are only guaranteed to
+	 * freeze a page if some of the tuples _require_ freezing. Tuples require
+	 * freezing if any of their xids precede the freeze limit or multixact
+	 * cutoff (calculated from vacuum_[multixact_]freeze_min_age). So, if the
+	 * oldest unfrozen xid (relfrozenxid/relminmxid) does not precede the
+	 * freeze cutoff, we won't find tuples requiring freezing.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+									  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_requires_freeze = true;
+
+	if (!oldest_unfrozen_requires_freeze &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+									vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_requires_freeze = true;
+
+	if (!oldest_unfrozen_requires_freeze)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is EAGER_SCAN_SUCCESS_RATE of the number of all-visible
+	 * but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (EAGER_SCAN_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If the table is entirely frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed %
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_max_fails_per_region = params->eager_scan_max_fails;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager scan failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails = vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -463,6 +680,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -488,6 +706,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -506,11 +725,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -525,6 +749,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -719,12 +950,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eager scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -895,8 +1128,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -915,13 +1150,16 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
@@ -1049,7 +1287,46 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success limit, there is no need to
+					 * eagerly scan any additional pages. Permanently disable
+					 * eager scanning by setting the other eager scan
+					 * management fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(INFO,
+							(errmsg("Vacuum successfully froze %u eager scanned blocks of \"%s.%s.%s\". Now disabling eager scanning.",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1149,7 +1426,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eager scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1159,13 +1438,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1238,6 +1520,9 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
+		if (*was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 		return true;
 	}
 }
@@ -1261,11 +1546,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1273,6 +1559,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += VACUUM_EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1305,24 +1604,34 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 		 * all-visible.  They may still skip all-frozen pages, which can't
 		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if (mapbits & VISIBILITYMAP_ALL_FROZEN)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip all-visible pages that are not also
+		 * all-frozen. Normal vacuums with eager scanning enabled only skip
+		 * such pages if they have hit the failure limit for the current eager
+		 * scan region.
+		 */
+		if (vacrel->aggressive ||
+			vacrel->eager_scan_remaining_fails > 0)
+		{
+			if (!vacrel->aggressive)
+				next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1353,6 +1662,10 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because empty pages are always frozen and
+ * thus could never be eager scanned.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1492,6 +1805,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1500,7 +1817,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1652,11 +1970,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1744,6 +2068,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1751,7 +2076,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index 2640228bef4..655fd3fd853 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+int			vacuum_eager_scan_max_fails;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/* Later we check if a reloption override was specified */
+	params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2169,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_eager_scan_max_fails table storage parameter was
+	 * specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails >= 0)
+		params->eager_scan_max_fails =
+			((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..1d5ab1c89bc 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+		/* Later we check reloptions for vacuum_eager_scan_max_fails override */
+		tab->at_params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index c9d8cd796a8..22e61ab70b1 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -2743,6 +2743,16 @@ struct config_int ConfigureNamesInt[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"vacuum_eager_scan_max_fails", PGC_USERSET, CLIENT_CONN_STATEMENT,
+			gettext_noop("Maximum number of all-visible pages vacuum can eager scan and fail to freeze before suspending eager scanning until the next region of the table"),
+			NULL
+		},
+		&vacuum_eager_scan_max_fails,
+		128, 0, VACUUM_EAGER_SCAN_REGION_SIZE,
+		NULL, NULL, NULL
+	},
+
 	{
 		{"vacuum_freeze_table_age", PGC_USERSET, CLIENT_CONN_STATEMENT,
 			gettext_noop("Age at which VACUUM should scan whole table to freeze tuples."),
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index b2bc43383db..7501d2a317b 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -728,6 +728,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_eager_scan_max_fails = 128 # 0 disables eager scanning
 #bytea_output = 'hex'			# hex, escape
 #xmlbinary = 'base64'
 #xmloption = 'content'
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..6b5e5e04818 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,14 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * The maximum number of all-visible pages that can be scanned and failed
+	 * to be set all-frozen before eager scanning is disabled for the current
+	 * region. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	uint32		eager_scan_max_fails;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +305,21 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may eagerly
+ * scan some all-visible but not all-frozen pages. Since our goal is to freeze
+ * these pages, an eager scan that fails to set the page all-frozen in the VM
+ * is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have similarly
+ * aged data, once we fail to freeze vacuum_eager_scan_max_fails blocks in a
+ * region of size VACUUM_EAGER_SCAN_REGION_SIZE, we suspend eager scanning
+ * until vacuum has progressed to another region of the table with potentially
+ * older data.
+ */
+extern PGDLLIMPORT int vacuum_eager_scan_max_fails;
+#define VACUUM_EAGER_SCAN_REGION_SIZE 4096
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..d9fe68f4d86 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,13 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * The maximum number of all-visible pages vacuum may scan and fail to
+	 * freeze before eager scanning is disabled for the current region of the
+	 * table. 0 if disabled, -1 if unspecified.
+	 */
+	int			vacuum_eager_scan_max_fails;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.34.1

v5-0001-Consolidate-docs-for-vacuum-related-GUCs-in-new-s.patchtext/x-patch; charset=US-ASCII; name=v5-0001-Consolidate-docs-for-vacuum-related-GUCs-in-new-s.patchDownload
From 26ecb39b4b065ae466b9edd074a99d9d28fca476 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Tue, 7 Jan 2025 11:50:28 -0500
Subject: [PATCH v5 1/3] Consolidate docs for vacuum-related GUCs in new
 subsection

GUCs related to vacuum's freezing behavior were documented in a
subsection of the Client Connection Defaults documentation. These GUCs
don't belong there, as they affect the freezing behavior of all vacuums
-- including autovacuums.

There wasn't a clear alternative location, so this commit makes a new
Server Configuration docs subsection, "Vacuuming", with a subsection for
"Freezing". It also moves the "Automatic Vacuuming" subsection and the
docs on GUCs controlling cost-based vacuum delay under the new
"Vacuuming" subsection.

The other vacuum-related GUCs under the "Resource Consumption"
subsection have been left in their current location, as they seem to fit
there.

Discussion: https://postgr.es/m/flat/1373018.1736213217%40sss.pgh.pa.us#105c713a7966f87e4ac4301246e3cabe
---
 doc/src/sgml/config.sgml | 1237 +++++++++++++++++++-------------------
 1 file changed, 628 insertions(+), 609 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 740ff5d5044..3b2430eff55 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -2367,149 +2367,6 @@ include_dir 'conf.d'
      </variablelist>
     </sect2>
 
-    <sect2 id="runtime-config-resource-vacuum-cost">
-     <title>Cost-based Vacuum Delay</title>
-
-     <para>
-      During the execution of <xref linkend="sql-vacuum"/>
-      and <xref linkend="sql-analyze"/>
-      commands, the system maintains an
-      internal counter that keeps track of the estimated cost of the
-      various I/O operations that are performed.  When the accumulated
-      cost reaches a limit (specified by
-      <varname>vacuum_cost_limit</varname>), the process performing
-      the operation will sleep for a short period of time, as specified by
-      <varname>vacuum_cost_delay</varname>. Then it will reset the
-      counter and continue execution.
-     </para>
-
-     <para>
-      The intent of this feature is to allow administrators to reduce
-      the I/O impact of these commands on concurrent database
-      activity. There are many situations where it is not
-      important that maintenance commands like
-      <command>VACUUM</command> and <command>ANALYZE</command> finish
-      quickly; however, it is usually very important that these
-      commands do not significantly interfere with the ability of the
-      system to perform other database operations. Cost-based vacuum
-      delay provides a way for administrators to achieve this.
-     </para>
-
-     <para>
-      This feature is disabled by default for manually issued
-      <command>VACUUM</command> commands. To enable it, set the
-      <varname>vacuum_cost_delay</varname> variable to a nonzero
-      value.
-     </para>
-
-     <variablelist>
-      <varlistentry id="guc-vacuum-cost-delay" xreflabel="vacuum_cost_delay">
-       <term><varname>vacuum_cost_delay</varname> (<type>floating point</type>)
-       <indexterm>
-        <primary><varname>vacuum_cost_delay</varname> configuration parameter</primary>
-       </indexterm>
-       </term>
-       <listitem>
-        <para>
-         The amount of time that the process will sleep
-         when the cost limit has been exceeded.
-         If this value is specified without units, it is taken as milliseconds.
-         The default value is zero, which disables the cost-based vacuum
-         delay feature.  Positive values enable cost-based vacuuming.
-        </para>
-
-        <para>
-         When using cost-based vacuuming, appropriate values for
-         <varname>vacuum_cost_delay</varname> are usually quite small, perhaps
-         less than 1 millisecond.  While <varname>vacuum_cost_delay</varname>
-         can be set to fractional-millisecond values, such delays may not be
-         measured accurately on older platforms.  On such platforms,
-         increasing <command>VACUUM</command>'s throttled resource consumption
-         above what you get at 1ms will require changing the other vacuum cost
-         parameters.  You should, nonetheless,
-         keep <varname>vacuum_cost_delay</varname> as small as your platform
-         will consistently measure; large delays are not helpful.
-        </para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry id="guc-vacuum-cost-page-hit" xreflabel="vacuum_cost_page_hit">
-       <term><varname>vacuum_cost_page_hit</varname> (<type>integer</type>)
-       <indexterm>
-        <primary><varname>vacuum_cost_page_hit</varname> configuration parameter</primary>
-       </indexterm>
-       </term>
-       <listitem>
-        <para>
-         The estimated cost for vacuuming a buffer found in the shared buffer
-         cache. It represents the cost to lock the buffer pool, lookup
-         the shared hash table and scan the content of the page. The
-         default value is one.
-        </para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry id="guc-vacuum-cost-page-miss" xreflabel="vacuum_cost_page_miss">
-       <term><varname>vacuum_cost_page_miss</varname> (<type>integer</type>)
-       <indexterm>
-        <primary><varname>vacuum_cost_page_miss</varname> configuration parameter</primary>
-       </indexterm>
-       </term>
-       <listitem>
-        <para>
-         The estimated cost for vacuuming a buffer that has to be read from
-         disk.  This represents the effort to lock the buffer pool,
-         lookup the shared hash table, read the desired block in from
-         the disk and scan its content. The default value is 2.
-        </para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry id="guc-vacuum-cost-page-dirty" xreflabel="vacuum_cost_page_dirty">
-       <term><varname>vacuum_cost_page_dirty</varname> (<type>integer</type>)
-       <indexterm>
-        <primary><varname>vacuum_cost_page_dirty</varname> configuration parameter</primary>
-       </indexterm>
-       </term>
-       <listitem>
-        <para>
-         The estimated cost charged when vacuum modifies a block that was
-         previously clean. It represents the extra I/O required to
-         flush the dirty block out to disk again. The default value is
-         20.
-        </para>
-       </listitem>
-      </varlistentry>
-
-      <varlistentry id="guc-vacuum-cost-limit" xreflabel="vacuum_cost_limit">
-       <term><varname>vacuum_cost_limit</varname> (<type>integer</type>)
-       <indexterm>
-        <primary><varname>vacuum_cost_limit</varname> configuration parameter</primary>
-       </indexterm>
-       </term>
-       <listitem>
-        <para>
-         This is the accumulated cost that will cause the vacuuming process to sleep
-         for <varname>vacuum_cost_delay</varname>.  The default is 200.
-        </para>
-       </listitem>
-      </varlistentry>
-     </variablelist>
-
-     <note>
-      <para>
-       There are certain operations that hold critical locks and should
-       therefore complete as quickly as possible.  Cost-based vacuum
-       delays do not occur during such operations.  Therefore it is
-       possible that the cost accumulates far higher than the specified
-       limit.  To avoid uselessly long delays in such cases, the actual
-       delay is calculated as <varname>vacuum_cost_delay</varname> *
-       <varname>accumulated_balance</varname> /
-       <varname>vacuum_cost_limit</varname> with a maximum of
-       <varname>vacuum_cost_delay</varname> * 4.
-      </para>
-     </note>
-    </sect2>
 
     <sect2 id="runtime-config-resource-background-writer">
      <title>Background Writer</title>
@@ -8588,14 +8445,17 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
     </sect2>
    </sect1>
 
-   <sect1 id="runtime-config-autovacuum">
-    <title>Automatic Vacuuming</title>
+   <sect1 id="runtime-config-vacuum">
+    <title>Vacuuming</title>
 
     <indexterm>
-     <primary>autovacuum</primary>
+     <primary>vacuum</primary>
      <secondary>configuration parameters</secondary>
     </indexterm>
 
+    <sect2 id="runtime-config-autovacuum">
+     <title>Automatic Vacuuming</title>
+
      <para>
       These settings control the behavior of the <firstterm>autovacuum</firstterm>
       feature.  Refer to <xref linkend="autovacuum"/> for more information.
@@ -8603,324 +8463,645 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
       basis; see <xref linkend="sql-createtable-storage-parameters"/>.
      </para>
 
-    <variablelist>
+     <variablelist>
 
-     <varlistentry id="guc-autovacuum" xreflabel="autovacuum">
-      <term><varname>autovacuum</varname> (<type>boolean</type>)
-      <indexterm>
-       <primary><varname>autovacuum</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Controls whether the server should run the
-        autovacuum launcher daemon.  This is on by default; however,
-        <xref linkend="guc-track-counts"/> must also be enabled for
-        autovacuum to work.
-        This parameter can only be set in the <filename>postgresql.conf</filename>
-        file or on the server command line; however, autovacuuming can be
-        disabled for individual tables by changing table storage parameters.
-       </para>
-       <para>
-        Note that even when this parameter is disabled, the system
-        will launch autovacuum processes if necessary to
-        prevent transaction ID wraparound.  See <xref
-        linkend="vacuum-for-wraparound"/> for more information.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum" xreflabel="autovacuum">
+       <term><varname>autovacuum</varname> (<type>boolean</type>)
+       <indexterm>
+        <primary><varname>autovacuum</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Controls whether the server should run the
+         autovacuum launcher daemon.  This is on by default; however,
+         <xref linkend="guc-track-counts"/> must also be enabled for
+         autovacuum to work.
+         This parameter can only be set in the <filename>postgresql.conf</filename>
+         file or on the server command line; however, autovacuuming can be
+         disabled for individual tables by changing table storage parameters.
+        </para>
+        <para>
+         Note that even when this parameter is disabled, the system
+         will launch autovacuum processes if necessary to
+         prevent transaction ID wraparound.  See <xref
+         linkend="vacuum-for-wraparound"/> for more information.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-worker-slots" xreflabel="autovacuum_worker_slots">
-      <term><varname>autovacuum_worker_slots</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>autovacuum_worker_slots</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the number of backend slots to reserve for autovacuum worker
-        processes.  The default is 16.  This parameter can only be set at server
-        start.
-       </para>
-       <para>
-        When changing this value, consider also adjusting
-        <xref linkend="guc-autovacuum-max-workers"/>.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum-worker-slots" xreflabel="autovacuum_worker_slots">
+       <term><varname>autovacuum_worker_slots</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>autovacuum_worker_slots</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the number of backend slots to reserve for autovacuum worker
+         processes.  The default is 16.  This parameter can only be set at server
+         start.
+        </para>
+        <para>
+         When changing this value, consider also adjusting
+         <xref linkend="guc-autovacuum-max-workers"/>.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-max-workers" xreflabel="autovacuum_max_workers">
-      <term><varname>autovacuum_max_workers</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>autovacuum_max_workers</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the maximum number of autovacuum processes (other than the
-        autovacuum launcher) that may be running at any one time.  The default
-        is three.  This parameter can only be set in the
-        <filename>postgresql.conf</filename> file or on the server command line.
-       </para>
-       <para>
-        Note that a setting for this value which is higher than
-        <xref linkend="guc-autovacuum-worker-slots"/> will have no effect,
-        since autovacuum workers are taken from the pool of slots established
-        by that setting.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum-max-workers" xreflabel="autovacuum_max_workers">
+       <term><varname>autovacuum_max_workers</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>autovacuum_max_workers</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the maximum number of autovacuum processes (other than the
+         autovacuum launcher) that may be running at any one time.  The default
+         is three.  This parameter can only be set in the
+         <filename>postgresql.conf</filename> file or on the server command line.
+        </para>
+        <para>
+         Note that a setting for this value which is higher than
+         <xref linkend="guc-autovacuum-worker-slots"/> will have no effect,
+         since autovacuum workers are taken from the pool of slots established
+         by that setting.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-naptime" xreflabel="autovacuum_naptime">
-      <term><varname>autovacuum_naptime</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>autovacuum_naptime</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the minimum delay between autovacuum runs on any given
-        database.  In each round the daemon examines the
-        database and issues <command>VACUUM</command> and <command>ANALYZE</command> commands
-        as needed for tables in that database.
-        If this value is specified without units, it is taken as seconds.
-        The default is one minute (<literal>1min</literal>).
-        This parameter can only be set in the <filename>postgresql.conf</filename>
-        file or on the server command line.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum-naptime" xreflabel="autovacuum_naptime">
+       <term><varname>autovacuum_naptime</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>autovacuum_naptime</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the minimum delay between autovacuum runs on any given
+         database.  In each round the daemon examines the
+         database and issues <command>VACUUM</command> and <command>ANALYZE</command> commands
+         as needed for tables in that database.
+         If this value is specified without units, it is taken as seconds.
+         The default is one minute (<literal>1min</literal>).
+         This parameter can only be set in the <filename>postgresql.conf</filename>
+         file or on the server command line.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-vacuum-threshold" xreflabel="autovacuum_vacuum_threshold">
-      <term><varname>autovacuum_vacuum_threshold</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>autovacuum_vacuum_threshold</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the minimum number of updated or deleted tuples needed
-        to trigger a <command>VACUUM</command> in any one table.
-        The default is 50 tuples.
-        This parameter can only be set in the <filename>postgresql.conf</filename>
-        file or on the server command line;
-        but the setting can be overridden for individual tables by
-        changing table storage parameters.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum-vacuum-threshold" xreflabel="autovacuum_vacuum_threshold">
+       <term><varname>autovacuum_vacuum_threshold</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>autovacuum_vacuum_threshold</varname></primary>
+        <secondary>configuration parameter</secondary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the minimum number of updated or deleted tuples needed
+         to trigger a <command>VACUUM</command> in any one table.
+         The default is 50 tuples.
+         This parameter can only be set in the <filename>postgresql.conf</filename>
+         file or on the server command line;
+         but the setting can be overridden for individual tables by
+         changing table storage parameters.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-vacuum-insert-threshold" xreflabel="autovacuum_vacuum_insert_threshold">
-      <term><varname>autovacuum_vacuum_insert_threshold</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>autovacuum_vacuum_insert_threshold</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the number of inserted tuples needed to trigger a
-        <command>VACUUM</command> in any one table.
-        The default is 1000 tuples.  If -1 is specified, autovacuum will not
-        trigger a <command>VACUUM</command> operation on any tables based on
-        the number of inserts.
-        This parameter can only be set in the <filename>postgresql.conf</filename>
-        file or on the server command line;
-        but the setting can be overridden for individual tables by
-        changing table storage parameters.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum-vacuum-insert-threshold" xreflabel="autovacuum_vacuum_insert_threshold">
+       <term><varname>autovacuum_vacuum_insert_threshold</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>autovacuum_vacuum_insert_threshold</varname></primary>
+        <secondary>configuration parameter</secondary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the number of inserted tuples needed to trigger a
+         <command>VACUUM</command> in any one table.
+         The default is 1000 tuples.  If -1 is specified, autovacuum will not
+         trigger a <command>VACUUM</command> operation on any tables based on
+         the number of inserts.
+         This parameter can only be set in the <filename>postgresql.conf</filename>
+         file or on the server command line;
+         but the setting can be overridden for individual tables by
+         changing table storage parameters.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-analyze-threshold" xreflabel="autovacuum_analyze_threshold">
-      <term><varname>autovacuum_analyze_threshold</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>autovacuum_analyze_threshold</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the minimum number of inserted, updated or deleted tuples
-        needed to trigger an <command>ANALYZE</command> in any one table.
-        The default is 50 tuples.
-        This parameter can only be set in the <filename>postgresql.conf</filename>
-        file or on the server command line;
-        but the setting can be overridden for individual tables by
-        changing table storage parameters.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum-analyze-threshold" xreflabel="autovacuum_analyze_threshold">
+       <term><varname>autovacuum_analyze_threshold</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>autovacuum_analyze_threshold</varname></primary>
+        <secondary>configuration parameter</secondary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the minimum number of inserted, updated or deleted tuples
+         needed to trigger an <command>ANALYZE</command> in any one table.
+         The default is 50 tuples.
+         This parameter can only be set in the <filename>postgresql.conf</filename>
+         file or on the server command line;
+         but the setting can be overridden for individual tables by
+         changing table storage parameters.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-vacuum-scale-factor" xreflabel="autovacuum_vacuum_scale_factor">
-      <term><varname>autovacuum_vacuum_scale_factor</varname> (<type>floating point</type>)
-      <indexterm>
-       <primary><varname>autovacuum_vacuum_scale_factor</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies a fraction of the table size to add to
-        <varname>autovacuum_vacuum_threshold</varname>
-        when deciding whether to trigger a <command>VACUUM</command>.
-        The default is 0.2 (20% of table size).
-        This parameter can only be set in the <filename>postgresql.conf</filename>
-        file or on the server command line;
-        but the setting can be overridden for individual tables by
-        changing table storage parameters.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum-vacuum-scale-factor" xreflabel="autovacuum_vacuum_scale_factor">
+       <term><varname>autovacuum_vacuum_scale_factor</varname> (<type>floating point</type>)
+       <indexterm>
+        <primary><varname>autovacuum_vacuum_scale_factor</varname></primary>
+        <secondary>configuration parameter</secondary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies a fraction of the table size to add to
+         <varname>autovacuum_vacuum_threshold</varname>
+         when deciding whether to trigger a <command>VACUUM</command>.
+         The default is 0.2 (20% of table size).
+         This parameter can only be set in the <filename>postgresql.conf</filename>
+         file or on the server command line;
+         but the setting can be overridden for individual tables by
+         changing table storage parameters.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-vacuum-insert-scale-factor" xreflabel="autovacuum_vacuum_insert_scale_factor">
-      <term><varname>autovacuum_vacuum_insert_scale_factor</varname> (<type>floating point</type>)
-      <indexterm>
-       <primary><varname>autovacuum_vacuum_insert_scale_factor</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies a fraction of the table size to add to
-        <varname>autovacuum_vacuum_insert_threshold</varname>
-        when deciding whether to trigger a <command>VACUUM</command>.
-        The default is 0.2 (20% of table size).
-        This parameter can only be set in the <filename>postgresql.conf</filename>
-        file or on the server command line;
-        but the setting can be overridden for individual tables by
-        changing table storage parameters.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum-vacuum-insert-scale-factor" xreflabel="autovacuum_vacuum_insert_scale_factor">
+       <term><varname>autovacuum_vacuum_insert_scale_factor</varname> (<type>floating point</type>)
+       <indexterm>
+        <primary><varname>autovacuum_vacuum_insert_scale_factor</varname></primary>
+        <secondary>configuration parameter</secondary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies a fraction of the table size to add to
+         <varname>autovacuum_vacuum_insert_threshold</varname>
+         when deciding whether to trigger a <command>VACUUM</command>.
+         The default is 0.2 (20% of table size).
+         This parameter can only be set in the <filename>postgresql.conf</filename>
+         file or on the server command line;
+         but the setting can be overridden for individual tables by
+         changing table storage parameters.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-analyze-scale-factor" xreflabel="autovacuum_analyze_scale_factor">
-      <term><varname>autovacuum_analyze_scale_factor</varname> (<type>floating point</type>)
-      <indexterm>
-       <primary><varname>autovacuum_analyze_scale_factor</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies a fraction of the table size to add to
-        <varname>autovacuum_analyze_threshold</varname>
-        when deciding whether to trigger an <command>ANALYZE</command>.
-        The default is 0.1 (10% of table size).
-        This parameter can only be set in the <filename>postgresql.conf</filename>
-        file or on the server command line;
-        but the setting can be overridden for individual tables by
-        changing table storage parameters.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum-analyze-scale-factor" xreflabel="autovacuum_analyze_scale_factor">
+       <term><varname>autovacuum_analyze_scale_factor</varname> (<type>floating point</type>)
+       <indexterm>
+        <primary><varname>autovacuum_analyze_scale_factor</varname></primary>
+        <secondary>configuration parameter</secondary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies a fraction of the table size to add to
+         <varname>autovacuum_analyze_threshold</varname>
+         when deciding whether to trigger an <command>ANALYZE</command>.
+         The default is 0.1 (10% of table size).
+         This parameter can only be set in the <filename>postgresql.conf</filename>
+         file or on the server command line;
+         but the setting can be overridden for individual tables by
+         changing table storage parameters.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-freeze-max-age" xreflabel="autovacuum_freeze_max_age">
-      <term><varname>autovacuum_freeze_max_age</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>autovacuum_freeze_max_age</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the maximum age (in transactions) that a table's
-        <structname>pg_class</structname>.<structfield>relfrozenxid</structfield> field can
-        attain before a <command>VACUUM</command> operation is forced
-        to prevent transaction ID wraparound within the table.
-        Note that the system will launch autovacuum processes to
-        prevent wraparound even when autovacuum is otherwise disabled.
-       </para>
+      <varlistentry id="guc-autovacuum-freeze-max-age" xreflabel="autovacuum_freeze_max_age">
+       <term><varname>autovacuum_freeze_max_age</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>autovacuum_freeze_max_age</varname></primary>
+        <secondary>configuration parameter</secondary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the maximum age (in transactions) that a table's
+         <structname>pg_class</structname>.<structfield>relfrozenxid</structfield> field can
+         attain before a <command>VACUUM</command> operation is forced
+         to prevent transaction ID wraparound within the table.
+         Note that the system will launch autovacuum processes to
+         prevent wraparound even when autovacuum is otherwise disabled.
+        </para>
 
-       <para>
-        Vacuum also allows removal of old files from the
-        <filename>pg_xact</filename> subdirectory, which is why the default
-        is a relatively low 200 million transactions.
-        This parameter can only be set at server start, but the setting
-        can be reduced for individual tables by
-        changing table storage parameters.
-        For more information see <xref linkend="vacuum-for-wraparound"/>.
-       </para>
-      </listitem>
-     </varlistentry>
+        <para>
+         Vacuum also allows removal of old files from the
+         <filename>pg_xact</filename> subdirectory, which is why the default
+         is a relatively low 200 million transactions.
+         This parameter can only be set at server start, but the setting
+         can be reduced for individual tables by
+         changing table storage parameters.
+         For more information see <xref linkend="vacuum-for-wraparound"/>.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-multixact-freeze-max-age" xreflabel="autovacuum_multixact_freeze_max_age">
-      <term><varname>autovacuum_multixact_freeze_max_age</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>autovacuum_multixact_freeze_max_age</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the maximum age (in multixacts) that a table's
-        <structname>pg_class</structname>.<structfield>relminmxid</structfield> field can
-        attain before a <command>VACUUM</command> operation is forced to
-        prevent multixact ID wraparound within the table.
-        Note that the system will launch autovacuum processes to
-        prevent wraparound even when autovacuum is otherwise disabled.
-       </para>
+      <varlistentry id="guc-autovacuum-multixact-freeze-max-age" xreflabel="autovacuum_multixact_freeze_max_age">
+       <term><varname>autovacuum_multixact_freeze_max_age</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>autovacuum_multixact_freeze_max_age</varname></primary>
+        <secondary>configuration parameter</secondary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the maximum age (in multixacts) that a table's
+         <structname>pg_class</structname>.<structfield>relminmxid</structfield> field can
+         attain before a <command>VACUUM</command> operation is forced to
+         prevent multixact ID wraparound within the table.
+         Note that the system will launch autovacuum processes to
+         prevent wraparound even when autovacuum is otherwise disabled.
+        </para>
 
-       <para>
-        Vacuuming multixacts also allows removal of old files from the
-        <filename>pg_multixact/members</filename> and <filename>pg_multixact/offsets</filename>
-        subdirectories, which is why the default is a relatively low
-        400 million multixacts.
-        This parameter can only be set at server start, but the setting can
-        be reduced for individual tables by changing table storage parameters.
-        For more information see <xref linkend="vacuum-for-multixact-wraparound"/>.
-       </para>
-      </listitem>
-     </varlistentry>
+        <para>
+         Vacuuming multixacts also allows removal of old files from the
+         <filename>pg_multixact/members</filename> and <filename>pg_multixact/offsets</filename>
+         subdirectories, which is why the default is a relatively low
+         400 million multixacts.
+         This parameter can only be set at server start, but the setting can
+         be reduced for individual tables by changing table storage parameters.
+         For more information see <xref linkend="vacuum-for-multixact-wraparound"/>.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-vacuum-cost-delay" xreflabel="autovacuum_vacuum_cost_delay">
-      <term><varname>autovacuum_vacuum_cost_delay</varname> (<type>floating point</type>)
-      <indexterm>
-       <primary><varname>autovacuum_vacuum_cost_delay</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the cost delay value that will be used in automatic
-        <command>VACUUM</command> operations.  If -1 is specified, the regular
-        <xref linkend="guc-vacuum-cost-delay"/> value will be used.
-        If this value is specified without units, it is taken as milliseconds.
-        The default value is 2 milliseconds.
-        This parameter can only be set in the <filename>postgresql.conf</filename>
-        file or on the server command line;
-        but the setting can be overridden for individual tables by
-        changing table storage parameters.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum-vacuum-cost-delay" xreflabel="autovacuum_vacuum_cost_delay">
+       <term><varname>autovacuum_vacuum_cost_delay</varname> (<type>floating point</type>)
+       <indexterm>
+        <primary><varname>autovacuum_vacuum_cost_delay</varname></primary>
+        <secondary>configuration parameter</secondary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the cost delay value that will be used in automatic
+         <command>VACUUM</command> operations.  If -1 is specified, the regular
+         <xref linkend="guc-vacuum-cost-delay"/> value will be used.
+         If this value is specified without units, it is taken as milliseconds.
+         The default value is 2 milliseconds.
+         This parameter can only be set in the <filename>postgresql.conf</filename>
+         file or on the server command line;
+         but the setting can be overridden for individual tables by
+         changing table storage parameters.
+        </para>
+       </listitem>
+      </varlistentry>
 
-     <varlistentry id="guc-autovacuum-vacuum-cost-limit" xreflabel="autovacuum_vacuum_cost_limit">
-      <term><varname>autovacuum_vacuum_cost_limit</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>autovacuum_vacuum_cost_limit</varname></primary>
-       <secondary>configuration parameter</secondary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the cost limit value that will be used in automatic
-        <command>VACUUM</command> operations.  If -1 is specified (which is the
-        default), the regular
-        <xref linkend="guc-vacuum-cost-limit"/> value will be used.  Note that
-        the value is distributed proportionally among the running autovacuum
-        workers, if there is more than one, so that the sum of the limits for
-        each worker does not exceed the value of this variable.
-        This parameter can only be set in the <filename>postgresql.conf</filename>
-        file or on the server command line;
-        but the setting can be overridden for individual tables by
-        changing table storage parameters.
-       </para>
-      </listitem>
-     </varlistentry>
+      <varlistentry id="guc-autovacuum-vacuum-cost-limit" xreflabel="autovacuum_vacuum_cost_limit">
+       <term><varname>autovacuum_vacuum_cost_limit</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>autovacuum_vacuum_cost_limit</varname></primary>
+        <secondary>configuration parameter</secondary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the cost limit value that will be used in automatic
+         <command>VACUUM</command> operations.  If -1 is specified (which is the
+         default), the regular
+         <xref linkend="guc-vacuum-cost-limit"/> value will be used.  Note that
+         the value is distributed proportionally among the running autovacuum
+         workers, if there is more than one, so that the sum of the limits for
+         each worker does not exceed the value of this variable.
+         This parameter can only be set in the <filename>postgresql.conf</filename>
+         file or on the server command line;
+         but the setting can be overridden for individual tables by
+         changing table storage parameters.
+        </para>
+       </listitem>
+      </varlistentry>
 
-    </variablelist>
+     </variablelist>
+    </sect2>
+
+    <sect2 id="runtime-config-resource-vacuum-cost">
+     <title>Cost-based Vacuum Delay</title>
+
+     <para>
+      During the execution of <xref linkend="sql-vacuum"/>
+      and <xref linkend="sql-analyze"/>
+      commands, the system maintains an
+      internal counter that keeps track of the estimated cost of the
+      various I/O operations that are performed.  When the accumulated
+      cost reaches a limit (specified by
+      <varname>vacuum_cost_limit</varname>), the process performing
+      the operation will sleep for a short period of time, as specified by
+      <varname>vacuum_cost_delay</varname>. Then it will reset the
+      counter and continue execution.
+     </para>
+
+     <para>
+      The intent of this feature is to allow administrators to reduce
+      the I/O impact of these commands on concurrent database
+      activity. There are many situations where it is not
+      important that maintenance commands like
+      <command>VACUUM</command> and <command>ANALYZE</command> finish
+      quickly; however, it is usually very important that these
+      commands do not significantly interfere with the ability of the
+      system to perform other database operations. Cost-based vacuum
+      delay provides a way for administrators to achieve this.
+     </para>
+
+     <para>
+      This feature is disabled by default for manually issued
+      <command>VACUUM</command> commands. To enable it, set the
+      <varname>vacuum_cost_delay</varname> variable to a nonzero
+      value.
+     </para>
+
+     <variablelist>
+      <varlistentry id="guc-vacuum-cost-delay" xreflabel="vacuum_cost_delay">
+       <term><varname>vacuum_cost_delay</varname> (<type>floating point</type>)
+       <indexterm>
+        <primary><varname>vacuum_cost_delay</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         The amount of time that the process will sleep
+         when the cost limit has been exceeded.
+         If this value is specified without units, it is taken as milliseconds.
+         The default value is zero, which disables the cost-based vacuum
+         delay feature.  Positive values enable cost-based vacuuming.
+        </para>
+
+        <para>
+         When using cost-based vacuuming, appropriate values for
+         <varname>vacuum_cost_delay</varname> are usually quite small, perhaps
+         less than 1 millisecond.  While <varname>vacuum_cost_delay</varname>
+         can be set to fractional-millisecond values, such delays may not be
+         measured accurately on older platforms.  On such platforms,
+         increasing <command>VACUUM</command>'s throttled resource consumption
+         above what you get at 1ms will require changing the other vacuum cost
+         parameters.  You should, nonetheless,
+         keep <varname>vacuum_cost_delay</varname> as small as your platform
+         will consistently measure; large delays are not helpful.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="guc-vacuum-cost-page-hit" xreflabel="vacuum_cost_page_hit">
+       <term><varname>vacuum_cost_page_hit</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>vacuum_cost_page_hit</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         The estimated cost for vacuuming a buffer found in the shared buffer
+         cache. It represents the cost to lock the buffer pool, lookup
+         the shared hash table and scan the content of the page. The
+         default value is one.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="guc-vacuum-cost-page-miss" xreflabel="vacuum_cost_page_miss">
+       <term><varname>vacuum_cost_page_miss</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>vacuum_cost_page_miss</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         The estimated cost for vacuuming a buffer that has to be read from
+         disk.  This represents the effort to lock the buffer pool,
+         lookup the shared hash table, read the desired block in from
+         the disk and scan its content. The default value is 2.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="guc-vacuum-cost-page-dirty" xreflabel="vacuum_cost_page_dirty">
+       <term><varname>vacuum_cost_page_dirty</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>vacuum_cost_page_dirty</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         The estimated cost charged when vacuum modifies a block that was
+         previously clean. It represents the extra I/O required to
+         flush the dirty block out to disk again. The default value is
+         20.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="guc-vacuum-cost-limit" xreflabel="vacuum_cost_limit">
+       <term><varname>vacuum_cost_limit</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>vacuum_cost_limit</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         This is the accumulated cost that will cause the vacuuming process to sleep
+         for <varname>vacuum_cost_delay</varname>.  The default is 200.
+        </para>
+       </listitem>
+      </varlistentry>
+     </variablelist>
+
+     <note>
+      <para>
+       There are certain operations that hold critical locks and should
+       therefore complete as quickly as possible.  Cost-based vacuum
+       delays do not occur during such operations.  Therefore it is
+       possible that the cost accumulates far higher than the specified
+       limit.  To avoid uselessly long delays in such cases, the actual
+       delay is calculated as <varname>vacuum_cost_delay</varname> *
+       <varname>accumulated_balance</varname> /
+       <varname>vacuum_cost_limit</varname> with a maximum of
+       <varname>vacuum_cost_delay</varname> * 4.
+      </para>
+     </note>
+    </sect2>
+
+    <sect2 id="runtime-config-vacuum-freezing">
+     <title>Freezing</title>
+
+     <para>
+      Vacuum operations are also responsible for freezing rows to avoid
+      transaction ID wraparound. These settings control vacuum's freezing
+      behavior. See <xref linkend="vacuum-for-wraparound"/> for more
+      information on transaction ID wraparound and tuning these parameters.
+     </para>
+
+     <variablelist>
+      <varlistentry id="guc-vacuum-freeze-table-age" xreflabel="vacuum_freeze_table_age">
+       <term><varname>vacuum_freeze_table_age</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>vacuum_freeze_table_age</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         <command>VACUUM</command> performs an aggressive scan if the table's
+         <structname>pg_class</structname>.<structfield>relfrozenxid</structfield> field has reached
+         the age specified by this setting.  An aggressive scan differs from
+         a regular <command>VACUUM</command> in that it visits every page that might
+         contain unfrozen XIDs or MXIDs, not just those that might contain dead
+         tuples.  The default is 150 million transactions.  Although users can
+         set this value anywhere from zero to two billion, <command>VACUUM</command>
+         will silently limit the effective value to 95% of
+         <xref linkend="guc-autovacuum-freeze-max-age"/>, so that a
+         periodic manual <command>VACUUM</command> has a chance to run before an
+         anti-wraparound autovacuum is launched for the table. For more
+         information see
+         <xref linkend="vacuum-for-wraparound"/>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="guc-vacuum-freeze-min-age" xreflabel="vacuum_freeze_min_age">
+       <term><varname>vacuum_freeze_min_age</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>vacuum_freeze_min_age</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the cutoff age (in transactions) that
+         <command>VACUUM</command> should use to decide whether to
+         trigger freezing of pages that have an older XID.
+         The default is 50 million transactions.  Although
+         users can set this value anywhere from zero to one billion,
+         <command>VACUUM</command> will silently limit the effective value to half
+         the value of <xref linkend="guc-autovacuum-freeze-max-age"/>, so
+         that there is not an unreasonably short time between forced
+         autovacuums.  For more information see <xref
+         linkend="vacuum-for-wraparound"/>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="guc-vacuum-failsafe-age" xreflabel="vacuum_failsafe_age">
+       <term><varname>vacuum_failsafe_age</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>vacuum_failsafe_age</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the maximum age (in transactions) that a table's
+         <structname>pg_class</structname>.<structfield>relfrozenxid</structfield>
+         field can attain before <command>VACUUM</command> takes
+         extraordinary measures to avoid system-wide transaction ID
+         wraparound failure.  This is <command>VACUUM</command>'s
+         strategy of last resort.  The failsafe typically triggers
+         when an autovacuum to prevent transaction ID wraparound has
+         already been running for some time, though it's possible for
+         the failsafe to trigger during any <command>VACUUM</command>.
+        </para>
+        <para>
+         When the failsafe is triggered, any cost-based delay that is
+         in effect will no longer be applied, further non-essential
+         maintenance tasks (such as index vacuuming) are bypassed, and any
+         <glossterm linkend="glossary-buffer-access-strategy">Buffer Access Strategy</glossterm>
+         in use will be disabled resulting in <command>VACUUM</command> being
+         free to make use of all of
+         <glossterm linkend="glossary-shared-memory">shared buffers</glossterm>.
+        </para>
+        <para>
+         The default is 1.6 billion transactions.  Although users can
+         set this value anywhere from zero to 2.1 billion,
+         <command>VACUUM</command> will silently adjust the effective
+         value to no less than 105% of <xref
+          linkend="guc-autovacuum-freeze-max-age"/>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="guc-vacuum-multixact-freeze-table-age" xreflabel="vacuum_multixact_freeze_table_age">
+       <term><varname>vacuum_multixact_freeze_table_age</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>vacuum_multixact_freeze_table_age</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         <command>VACUUM</command> performs an aggressive scan if the table's
+         <structname>pg_class</structname>.<structfield>relminmxid</structfield> field has reached
+         the age specified by this setting.  An aggressive scan differs from
+         a regular <command>VACUUM</command> in that it visits every page that might
+         contain unfrozen XIDs or MXIDs, not just those that might contain dead
+         tuples.  The default is 150 million multixacts.
+         Although users can set this value anywhere from zero to two billion,
+         <command>VACUUM</command> will silently limit the effective value to 95% of
+         <xref linkend="guc-autovacuum-multixact-freeze-max-age"/>, so that a
+         periodic manual <command>VACUUM</command> has a chance to run before an
+         anti-wraparound is launched for the table.
+         For more information see <xref linkend="vacuum-for-multixact-wraparound"/>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="guc-vacuum-multixact-freeze-min-age" xreflabel="vacuum_multixact_freeze_min_age">
+       <term><varname>vacuum_multixact_freeze_min_age</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>vacuum_multixact_freeze_min_age</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the cutoff age (in multixacts) that <command>VACUUM</command>
+         should use to decide whether to trigger freezing of pages with
+         an older multixact ID.  The default is 5 million multixacts.
+         Although users can set this value anywhere from zero to one billion,
+         <command>VACUUM</command> will silently limit the effective value to half
+         the value of <xref linkend="guc-autovacuum-multixact-freeze-max-age"/>,
+         so that there is not an unreasonably short time between forced
+         autovacuums.
+         For more information see <xref linkend="vacuum-for-multixact-wraparound"/>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+      <varlistentry id="guc-vacuum-multixact-failsafe-age" xreflabel="vacuum_multixact_failsafe_age">
+       <term><varname>vacuum_multixact_failsafe_age</varname> (<type>integer</type>)
+       <indexterm>
+        <primary><varname>vacuum_multixact_failsafe_age</varname> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Specifies the maximum age (in multixacts) that a table's
+         <structname>pg_class</structname>.<structfield>relminmxid</structfield>
+         field can attain before <command>VACUUM</command> takes
+         extraordinary measures to avoid system-wide multixact ID
+         wraparound failure.  This is <command>VACUUM</command>'s
+         strategy of last resort.  The failsafe typically triggers when
+         an autovacuum to prevent transaction ID wraparound has already
+         been running for some time, though it's possible for the
+         failsafe to trigger during any <command>VACUUM</command>.
+        </para>
+        <para>
+         When the failsafe is triggered, any cost-based delay that is
+         in effect will no longer be applied, and further non-essential
+         maintenance tasks (such as index vacuuming) are bypassed.
+        </para>
+        <para>
+         The default is 1.6 billion multixacts.  Although users can set
+         this value anywhere from zero to 2.1 billion,
+         <command>VACUUM</command> will silently adjust the effective
+         value to no less than 105% of <xref
+          linkend="guc-autovacuum-multixact-freeze-max-age"/>.
+        </para>
+       </listitem>
+      </varlistentry>
+
+     </variablelist>
+    </sect2>
    </sect1>
 
    <sect1 id="runtime-config-client">
@@ -9592,168 +9773,6 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
       </listitem>
      </varlistentry>
 
-     <varlistentry id="guc-vacuum-freeze-table-age" xreflabel="vacuum_freeze_table_age">
-      <term><varname>vacuum_freeze_table_age</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>vacuum_freeze_table_age</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        <command>VACUUM</command> performs an aggressive scan if the table's
-        <structname>pg_class</structname>.<structfield>relfrozenxid</structfield> field has reached
-        the age specified by this setting.  An aggressive scan differs from
-        a regular <command>VACUUM</command> in that it visits every page that might
-        contain unfrozen XIDs or MXIDs, not just those that might contain dead
-        tuples.  The default is 150 million transactions.  Although users can
-        set this value anywhere from zero to two billion, <command>VACUUM</command>
-        will silently limit the effective value to 95% of
-        <xref linkend="guc-autovacuum-freeze-max-age"/>, so that a
-        periodic manual <command>VACUUM</command> has a chance to run before an
-        anti-wraparound autovacuum is launched for the table. For more
-        information see
-        <xref linkend="vacuum-for-wraparound"/>.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry id="guc-vacuum-freeze-min-age" xreflabel="vacuum_freeze_min_age">
-      <term><varname>vacuum_freeze_min_age</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>vacuum_freeze_min_age</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the cutoff age (in transactions) that
-        <command>VACUUM</command> should use to decide whether to
-        trigger freezing of pages that have an older XID.
-        The default is 50 million transactions.  Although
-        users can set this value anywhere from zero to one billion,
-        <command>VACUUM</command> will silently limit the effective value to half
-        the value of <xref linkend="guc-autovacuum-freeze-max-age"/>, so
-        that there is not an unreasonably short time between forced
-        autovacuums.  For more information see <xref
-        linkend="vacuum-for-wraparound"/>.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry id="guc-vacuum-failsafe-age" xreflabel="vacuum_failsafe_age">
-      <term><varname>vacuum_failsafe_age</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>vacuum_failsafe_age</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the maximum age (in transactions) that a table's
-        <structname>pg_class</structname>.<structfield>relfrozenxid</structfield>
-        field can attain before <command>VACUUM</command> takes
-        extraordinary measures to avoid system-wide transaction ID
-        wraparound failure.  This is <command>VACUUM</command>'s
-        strategy of last resort.  The failsafe typically triggers
-        when an autovacuum to prevent transaction ID wraparound has
-        already been running for some time, though it's possible for
-        the failsafe to trigger during any <command>VACUUM</command>.
-       </para>
-       <para>
-        When the failsafe is triggered, any cost-based delay that is
-        in effect will no longer be applied, further non-essential
-        maintenance tasks (such as index vacuuming) are bypassed, and any
-        <glossterm linkend="glossary-buffer-access-strategy">Buffer Access Strategy</glossterm>
-        in use will be disabled resulting in <command>VACUUM</command> being
-        free to make use of all of
-        <glossterm linkend="glossary-shared-memory">shared buffers</glossterm>.
-       </para>
-       <para>
-        The default is 1.6 billion transactions.  Although users can
-        set this value anywhere from zero to 2.1 billion,
-        <command>VACUUM</command> will silently adjust the effective
-        value to no less than 105% of <xref
-         linkend="guc-autovacuum-freeze-max-age"/>.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry id="guc-vacuum-multixact-freeze-table-age" xreflabel="vacuum_multixact_freeze_table_age">
-      <term><varname>vacuum_multixact_freeze_table_age</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>vacuum_multixact_freeze_table_age</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        <command>VACUUM</command> performs an aggressive scan if the table's
-        <structname>pg_class</structname>.<structfield>relminmxid</structfield> field has reached
-        the age specified by this setting.  An aggressive scan differs from
-        a regular <command>VACUUM</command> in that it visits every page that might
-        contain unfrozen XIDs or MXIDs, not just those that might contain dead
-        tuples.  The default is 150 million multixacts.
-        Although users can set this value anywhere from zero to two billion,
-        <command>VACUUM</command> will silently limit the effective value to 95% of
-        <xref linkend="guc-autovacuum-multixact-freeze-max-age"/>, so that a
-        periodic manual <command>VACUUM</command> has a chance to run before an
-        anti-wraparound is launched for the table.
-        For more information see <xref linkend="vacuum-for-multixact-wraparound"/>.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry id="guc-vacuum-multixact-freeze-min-age" xreflabel="vacuum_multixact_freeze_min_age">
-      <term><varname>vacuum_multixact_freeze_min_age</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>vacuum_multixact_freeze_min_age</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the cutoff age (in multixacts) that <command>VACUUM</command>
-        should use to decide whether to trigger freezing of pages with
-        an older multixact ID.  The default is 5 million multixacts.
-        Although users can set this value anywhere from zero to one billion,
-        <command>VACUUM</command> will silently limit the effective value to half
-        the value of <xref linkend="guc-autovacuum-multixact-freeze-max-age"/>,
-        so that there is not an unreasonably short time between forced
-        autovacuums.
-        For more information see <xref linkend="vacuum-for-multixact-wraparound"/>.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry id="guc-vacuum-multixact-failsafe-age" xreflabel="vacuum_multixact_failsafe_age">
-      <term><varname>vacuum_multixact_failsafe_age</varname> (<type>integer</type>)
-      <indexterm>
-       <primary><varname>vacuum_multixact_failsafe_age</varname> configuration parameter</primary>
-      </indexterm>
-      </term>
-      <listitem>
-       <para>
-        Specifies the maximum age (in multixacts) that a table's
-        <structname>pg_class</structname>.<structfield>relminmxid</structfield>
-        field can attain before <command>VACUUM</command> takes
-        extraordinary measures to avoid system-wide multixact ID
-        wraparound failure.  This is <command>VACUUM</command>'s
-        strategy of last resort.  The failsafe typically triggers when
-        an autovacuum to prevent transaction ID wraparound has already
-        been running for some time, though it's possible for the
-        failsafe to trigger during any <command>VACUUM</command>.
-       </para>
-       <para>
-        When the failsafe is triggered, any cost-based delay that is
-        in effect will no longer be applied, and further non-essential
-        maintenance tasks (such as index vacuuming) are bypassed.
-       </para>
-       <para>
-        The default is 1.6 billion multixacts.  Although users can set
-        this value anywhere from zero to 2.1 billion,
-        <command>VACUUM</command> will silently adjust the effective
-        value to no less than 105% of <xref
-         linkend="guc-autovacuum-multixact-freeze-max-age"/>.
-       </para>
-      </listitem>
-     </varlistentry>
-
      <varlistentry id="guc-bytea-output" xreflabel="bytea_output">
       <term><varname>bytea_output</varname> (<type>enum</type>)
       <indexterm>
-- 
2.34.1

v5-0002-Add-more-general-summary-to-vacuumlazy.c.patchtext/x-patch; charset=US-ASCII; name=v5-0002-Add-more-general-summary-to-vacuumlazy.c.patchDownload
From b544d0de0f98f8ba1ea36c4e50032016d6561844 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Wed, 11 Dec 2024 14:13:34 -0500
Subject: [PATCH v5 2/3] Add more general summary to vacuumlazy.c

Add more comments at the top of vacuumlazy.c on heap relation vacuuming
implementation.

Previously vacuumlazy.c only had details related to the dead TID storage
added in Postgres 17. This commit adds a more general summary to help
future developers understand the heap relation vacuum design and
implementation at a high level.

Reviewed-by: Robert Haas, Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 src/backend/access/heap/vacuumlazy.c | 42 ++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 09fab08b8e1..c047fb20f7a 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -3,6 +3,48 @@
  * vacuumlazy.c
  *	  Concurrent ("lazy") vacuuming.
  *
+ * Heap relations are vacuumed in three main phases. In phase I, vacuum scans
+ * relation pages, pruning and freezing tuples and saving dead tuples' TIDs in
+ * a TID store. If that TID store fills up or vacuum finishes scanning the
+ * relation, it progresses to phase II: index vacuuming. Index vacuuming
+ * deletes the dead index entries referenced in the TID store. In phase III,
+ * vacuum scans the blocks of the relation indicated by the TIDs in the TID
+ * store and reaps the dead tuples, freeing that space for future tuples.
+ *
+ * If there are no indexes or index scanning is disabled, phase II may be
+ * skipped. If phase I identified very few dead index entries, vacuum may skip
+ * phases II and III. If the TID store fills up in phase I, vacuum suspends
+ * phase I, proceeds to phases II and II and cleans up the dead tuples
+ * referenced in the current TID store. This empties the TID store and allows
+ * vacuum to resume phase I. In this sense, the phases are more like states in
+ * a state machine, but they have been referred to colloquially as phases for
+ * long enough that it makes sense to refer to them in that way here.
+ *
+ * Finally, vacuum may truncate the relation if it has emptied pages at the
+ * end. After finishing all phases of work, vacuum updates relation statistics
+ * in pg_class and the cumulative statistics subsystem.
+ *
+ * Relation Scanning:
+ *
+ * Vacuum scans the heap relation, starting at the beginning and progressing
+ * to the end, skipping pages as permitted by their visibility status, vacuum
+ * options, and the eagerness level of the vacuum.
+ *
+ * When page skipping is enabled, non-aggressive vacuums may skip scanning
+ * pages that are marked all-visible in the visibility map. We may choose not
+ * to skip pages if the range of skippable pages is below
+ * SKIP_PAGES_THRESHOLD.
+ *
+ * Once vacuum has decided to scan a given block, it must read in the block
+ * and obtain a cleanup lock to prune tuples on the page. A non-aggressive
+ * vacuum may choose to skip pruning and freezing if it cannot acquire a
+ * cleanup lock on the buffer right away.
+ *
+ * After pruning and freezing, pages that are newly all-visible and all-frozen
+ * are marked as such in the visibility map.
+ *
+ * Dead TID Storage:
+ *
  * The major space usage for vacuuming is storage for the dead tuple IDs that
  * are to be removed from indexes.  We want to ensure we can vacuum even the
  * very largest relations with finite memory space usage.  To do that, we set
-- 
2.34.1

#13Andres Freund
andres@anarazel.de
In reply to: Melanie Plageman (#12)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Hi,

On 2025-01-07 15:46:26 -0500, Melanie Plageman wrote:

For table storage options, those related to vacuum but not autovacuum
are in the main StdRdOptions struct. Of those, some are overridden by
VACUUM command parameters which are parsed out into the VacuumParams
struct. Though the members of VacuumParams are initialized in
ExecVacuum(), the storage parameter overrides are determined in
vacuum_rel() and the final value goes in the VacuumParams struct which
is passed all the way through to heap_vacuum_rel().

Because VacuumParams is what ultimately gets passed down to the
table-AM specific vacuum implementation, autovacuum also initializes
its own instance of VacuumParams in the autovac_table struct in
table_recheck_autovac() (even though no VACUUM command parameters can
affect autovacuum). These are overridden in vacuum_rel() as well.

Ultimately vacuum_eager_scan_max_fails is a bit different from the
existing members of VacuumParams and StdRdOptions. It is a GUC and a
table storage option but not a SQL command parameter -- and both the
GUC and the table storage parameter affect both vacuum and autovacuum.
And it doesn't need to be initialized in different ways for autovacuum
and vacuum. In the end, I decided to follow the existing conventions
as closely as I could.

I think that's fine. The abstractions in this area aren't exactly perfect, and
I don't think this makes it worse in any meaningful way. It's not really
different from having other heap-specific params like freeze_min_age in
VacuumParams.

Greetings,

Andres Freund

#14Melanie Plageman
melanieplageman@gmail.com
In reply to: Andres Freund (#13)
2 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Thu, Jan 9, 2025 at 1:24 PM Andres Freund <andres@anarazel.de> wrote:

On 2025-01-07 15:46:26 -0500, Melanie Plageman wrote:

For table storage options, those related to vacuum but not autovacuum
are in the main StdRdOptions struct. Of those, some are overridden by
VACUUM command parameters which are parsed out into the VacuumParams
struct. Though the members of VacuumParams are initialized in
ExecVacuum(), the storage parameter overrides are determined in
vacuum_rel() and the final value goes in the VacuumParams struct which
is passed all the way through to heap_vacuum_rel().

Because VacuumParams is what ultimately gets passed down to the
table-AM specific vacuum implementation, autovacuum also initializes
its own instance of VacuumParams in the autovac_table struct in
table_recheck_autovac() (even though no VACUUM command parameters can
affect autovacuum). These are overridden in vacuum_rel() as well.

Ultimately vacuum_eager_scan_max_fails is a bit different from the
existing members of VacuumParams and StdRdOptions. It is a GUC and a
table storage option but not a SQL command parameter -- and both the
GUC and the table storage parameter affect both vacuum and autovacuum.
And it doesn't need to be initialized in different ways for autovacuum
and vacuum. In the end, I decided to follow the existing conventions
as closely as I could.

I think that's fine. The abstractions in this area aren't exactly perfect, and
I don't think this makes it worse in any meaningful way. It's not really
different from having other heap-specific params like freeze_min_age in
VacuumParams.

Got it. I've left it as is, then.

Attached v6 is rebased over recent changes in the vacuum-related docs.
I've also updated the "Routine Vacuuming" section of the docs to
mention eager scanning.

I'm planning to commit 0001 (which updates the code comment at the top
of vacuumlazy.c to explain heap vacuuming) --barring any objections.

I've been running a few multi-day benchmarks to ensure that the patch
behaves the same in a "normal" timeframe as it did in a compressed
one.

So far, it looks good. For a multi-day transactional benchmark with a
gaussian data access pattern, it looks about the same as a shorter
version (that is, aggressive vacuums are much shorter and there is no
difference when compared to master WRT total WAL volume, TPS, etc).

The final long benchmarks I'm waiting on are a hot tail workload with
a job that deletes old data.

- Melanie

Attachments:

v6-0002-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchtext/x-patch; charset=US-ASCII; name=v6-0002-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchDownload
From a5080bb6c630af932451d56a0931c9bc96eb8417 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Tue, 7 Jan 2025 09:48:34 -0500
Subject: [PATCH v6 2/2] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Introduce eager scanning normal vacuums, in which vacuum scans some of
the all-visible but not all-frozen pages in the relation to amortize the
cost of an aggressive vacuum.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
considered successful eager scans and those not frozen are considered
failed eager scans.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager scanned
and frozen, eager scanning is permanently disabled for the current
vacuum.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Author: Melanie Plageman
Reviewed-by: Andres Freund, Robert Haas, Robert Treat, Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  20 +
 doc/src/sgml/maintenance.sgml                 |  47 ++-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  13 +-
 src/backend/access/heap/vacuumlazy.c          | 382 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  13 +
 src/backend/postmaster/autovacuum.c           |   2 +
 src/backend/utils/misc/guc_tables.c           |  10 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/include/commands/vacuum.h                 |  23 ++
 src/include/utils/rel.h                       |   7 +
 11 files changed, 488 insertions(+), 45 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 3f41a17b1fe..305f4065495 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9116,6 +9116,26 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+      <term><varname>vacuum_eager_scan_max_fails</varname> (<type>integer</type>)
+      <indexterm>
+       <primary><varname>vacuum_eager_scan_max_fails</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum number of all-visible pages that
+        <command>VACUUM</command> may scan and fail to set all-frozen in the
+        visibility map before disabling eager scanning until the next region
+        (currently 4096 blocks) of the relation. A value of 0 disables eager
+        scanning altogether. The default is 128. This parameter can be set in
+        postgresql.conf or on the server command line but is overridden for
+        individual tables by changing the
+        <link linkend="reloption-vacuum-eager-scan-max-fails">corresponding table storage parameter</link>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 0be90bdc7ef..3cafba24a1a 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -488,22 +488,33 @@
    </para>
 
    <para>
-    <command>VACUUM</command> uses the <link linkend="storage-vm">visibility map</link>
-    to determine which pages of a table must be scanned.  Normally, it
-    will skip pages that don't have any dead row versions even if those pages
-    might still have row versions with old XID values.  Therefore, normal
-    <command>VACUUM</command>s won't always freeze every old row version in the table.
-    When that happens, <command>VACUUM</command> will eventually need to perform an
-    <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
-    XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+    <command>VACUUM</command> uses the <link linkend="storage-vm">visibility
+    map</link> to determine which pages of a table must be scanned.  Normally,
+    it may skip pages that don't have any dead row versions even if those
+    pages might still have row versions with old XID values.  Therefore,
+    normal <command>VACUUM</command>s won't always freeze every old row
+    version in the table. When that happens, <command>VACUUM</command> will
+    eventually need to perform an <firstterm>aggressive vacuum</firstterm>,
+    which will freeze all eligible unfrozen XID and MXID values, including
+    those from all-visible but not all-frozen pages. If a table is building up
+    a backlog of all-visible but not all-frozen pages, a normal vacuum may
+    choose to scan skippable pages in an effort to freeze them. These are
+    referred to as <firstterm>eagerly scanned</firstterm> pages. Eager
+    scanning can be tuned to scan and attempt to freeze more all-visible pages
+    by increasing <xref linkend="guc-vacuum-eager-scan-max-fails"/>. Even if
+    eager scanning has kept the number of all-visible but not all-frozen pages
+    to a minimum, most tables still require periodic aggressive vacuuming.
+   </para>
+
+   <para>
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
-    pages are scanned if the number of transactions that have passed since the
-    last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
+    controls when a table is aggressively vacuumed. All all-visible but
+    not all-frozen pages are scanned if the number of transactions that
+    have passed since the last such scan is greater than
+    <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
-    <varname>vacuum_freeze_table_age</varname> to 0 forces <command>VACUUM</command> to
-    always use its aggressive strategy.
+    <varname>vacuum_freeze_table_age</varname> to 0 forces
+    <command>VACUUM</command> to always use its aggressive strategy.
    </para>
 
    <para>
@@ -626,9 +637,11 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
+    <command>VACUUM</command> mostly scans pages that have been modified
+    since the last vacuum. All-visible but not all-frozen pages are
+    eagerly scanned to try and freeze them. But the
+    <structfield>relfrozenxid</structfield> can only be advanced when
+    every page of the table
     that might contain unfrozen XIDs is scanned.  This happens when
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2237321cb4f..679490e47aa 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1931,6 +1931,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+    <term><literal>vacuum_eager_scan_max_fails</literal>, <literal>toast.vacuum_eager_scan_max_fails</literal> (<type>integer</type>)
+    <indexterm>
+     <primary><varname>vacuum_eager_scan_max_fails</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-eager-scan-max-fails"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..daff9f1fa8d 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -27,6 +27,7 @@
 #include "catalog/pg_type.h"
 #include "commands/defrem.h"
 #include "commands/tablespace.h"
+#include "commands/vacuum.h"
 #include "nodes/makefuncs.h"
 #include "utils/array.h"
 #include "utils/attoptcache.h"
@@ -319,6 +320,14 @@ static relopt_int intRelOpts[] =
 		},
 		-1, -1, INT_MAX
 	},
+	{
+		{
+			"vacuum_eager_scan_max_fails",
+			"Maximum number of all-visible pages that vacuum will eagerly scan and fail to freeze before giving up on eager scanning until the next region",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		}, -1, 0, VACUUM_EAGER_SCAN_REGION_SIZE
+	},
 	{
 		{
 			"toast_tuple_target",
@@ -1880,7 +1889,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_eager_scan_max_fails", RELOPT_TYPE_INT,
+		offsetof(StdRdOptions, vacuum_eager_scan_max_fails)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 85af7ada46d..28ff4e739db 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -30,10 +30,47 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and the eagerness level of the vacuum.
  *
- * When page skipping is enabled, non-aggressive vacuums may skip scanning
- * pages that are marked all-visible in the visibility map. It may choose not
- * to skip pages if the range of skippable pages is below
- * SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager scans to
+ * EAGER_SCAN_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is permanently disabled.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager scan failure cap.
+ * The failure count is reset for each region of the table -- comprised of
+ * VACUUM_EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_eager_scan_max_fails before suspending eager scanning until the end
+ * of the region. vacuum_eager_scan_max_fails is configurable both globally
+ * and per table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -88,6 +125,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -173,6 +211,15 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple normal vacuums,
+ * we limit the number of successful eager page scans. The maximum number of
+ * successful eager page scans is calculated as a ratio of the all-visible but
+ * not all-frozen pages at the beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -229,6 +276,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -270,9 +324,55 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eager scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a row suspends eager scanning. next_eager_scan_region_start
+	 * is the block number of the first block eligible for resumed eager
+	 * scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success limit,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning. When eager scanning is enabled, this is initialized to
+	 * EAGER_SCAN_SUCCESS_RATE of the total number of all-visible but not
+	 * all-frozen pages. For each eager scan success, this is decremented.
+	 * Once it hits 0, eager scanning is permanently disabled. It is
+	 * initialized to 0 if eager scanning starts out disabled (including for
+	 * aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * vacuum_eager_scan_max_fails each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
+
+	/*
+	 * The maximum number of blocks which may be eager scanned and not frozen
+	 * before eager scanning is temporarily suspended. This is configurable
+	 * both globally, via the vacuum_eager_scan_max_fails GUC, and per table,
+	 * with a table storage parameter of the same name. It is 0 when eager
+	 * scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -284,8 +384,10 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -293,7 +395,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -335,6 +437,121 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_requires_freeze = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->eager_scan_max_fails == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * If the relation is smaller than a single region, we won't bother eager
+	 * scanning it. A future aggressive vacuum shouldn't take very long, so
+	 * there is no point in amortization.
+	 */
+	if (vacrel->rel_pages < VACUUM_EAGER_SCAN_REGION_SIZE)
+		return;
+
+	Assert(params->eager_scan_max_fails >= 0 &&
+		   params->eager_scan_max_fails <= 4096);
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation. We are only guaranteed to
+	 * freeze a page if some of the tuples _require_ freezing. Tuples require
+	 * freezing if any of their xids precede the freeze limit or multixact
+	 * cutoff (calculated from vacuum_[multixact_]freeze_min_age). So, if the
+	 * oldest unfrozen xid (relfrozenxid/relminmxid) does not precede the
+	 * freeze cutoff, we won't find tuples requiring freezing.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+									  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_requires_freeze = true;
+
+	if (!oldest_unfrozen_requires_freeze &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+									vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_requires_freeze = true;
+
+	if (!oldest_unfrozen_requires_freeze)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is EAGER_SCAN_SUCCESS_RATE of the number of all-visible
+	 * but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (EAGER_SCAN_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If the table is entirely frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed %
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_max_fails_per_region = params->eager_scan_max_fails;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager scan failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails = vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -463,6 +680,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -488,6 +706,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -506,11 +725,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -525,6 +749,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -719,12 +950,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eager scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -895,8 +1128,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -915,13 +1150,16 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
@@ -1049,7 +1287,46 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success limit, there is no need to
+					 * eagerly scan any additional pages. Permanently disable
+					 * eager scanning by setting the other eager scan
+					 * management fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(INFO,
+							(errmsg("Vacuum successfully froze %u eager scanned blocks of \"%s.%s.%s\". Now disabling eager scanning.",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1149,7 +1426,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eager scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1159,13 +1438,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1238,6 +1520,9 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
+		if (*was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 		return true;
 	}
 }
@@ -1261,11 +1546,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1273,6 +1559,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += VACUUM_EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1305,24 +1604,34 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 		 * all-visible.  They may still skip all-frozen pages, which can't
 		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if (mapbits & VISIBILITYMAP_ALL_FROZEN)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip all-visible pages that are not also
+		 * all-frozen. Normal vacuums with eager scanning enabled only skip
+		 * such pages if they have hit the failure limit for the current eager
+		 * scan region.
+		 */
+		if (vacrel->aggressive ||
+			vacrel->eager_scan_remaining_fails > 0)
+		{
+			if (!vacrel->aggressive)
+				next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1353,6 +1662,10 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because empty pages are always frozen and
+ * thus could never be eager scanned.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1492,6 +1805,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1500,7 +1817,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1652,11 +1970,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1744,6 +2068,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1751,7 +2076,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..eb3764de693 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+int			vacuum_eager_scan_max_fails;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/* Later we check if a reloption override was specified */
+	params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2169,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_eager_scan_max_fails table storage parameter was
+	 * specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails >= 0)
+		params->eager_scan_max_fails =
+			((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..1d5ab1c89bc 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+		/* Later we check reloptions for vacuum_eager_scan_max_fails override */
+		tab->at_params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index c9d8cd796a8..22e61ab70b1 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -2743,6 +2743,16 @@ struct config_int ConfigureNamesInt[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"vacuum_eager_scan_max_fails", PGC_USERSET, CLIENT_CONN_STATEMENT,
+			gettext_noop("Maximum number of all-visible pages vacuum can eager scan and fail to freeze before suspending eager scanning until the next region of the table"),
+			NULL
+		},
+		&vacuum_eager_scan_max_fails,
+		128, 0, VACUUM_EAGER_SCAN_REGION_SIZE,
+		NULL, NULL, NULL
+	},
+
 	{
 		{"vacuum_freeze_table_age", PGC_USERSET, CLIENT_CONN_STATEMENT,
 			gettext_noop("Age at which VACUUM should scan whole table to freeze tuples."),
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 079efa1baa7..b1a98367d3b 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -698,6 +698,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_eager_scan_max_fails = 128 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..6b5e5e04818 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,14 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * The maximum number of all-visible pages that can be scanned and failed
+	 * to be set all-frozen before eager scanning is disabled for the current
+	 * region. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	uint32		eager_scan_max_fails;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +305,21 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may eagerly
+ * scan some all-visible but not all-frozen pages. Since our goal is to freeze
+ * these pages, an eager scan that fails to set the page all-frozen in the VM
+ * is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have similarly
+ * aged data, once we fail to freeze vacuum_eager_scan_max_fails blocks in a
+ * region of size VACUUM_EAGER_SCAN_REGION_SIZE, we suspend eager scanning
+ * until vacuum has progressed to another region of the table with potentially
+ * older data.
+ */
+extern PGDLLIMPORT int vacuum_eager_scan_max_fails;
+#define VACUUM_EAGER_SCAN_REGION_SIZE 4096
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..d9fe68f4d86 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,13 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * The maximum number of all-visible pages vacuum may scan and fail to
+	 * freeze before eager scanning is disabled for the current region of the
+	 * table. 0 if disabled, -1 if unspecified.
+	 */
+	int			vacuum_eager_scan_max_fails;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.34.1

v6-0001-Add-more-general-summary-to-vacuumlazy.c.patchtext/x-patch; charset=US-ASCII; name=v6-0001-Add-more-general-summary-to-vacuumlazy.c.patchDownload
From ca53b57d70d6e9212b3e82aa41ddfe42b5f3dc4f Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Wed, 11 Dec 2024 14:13:34 -0500
Subject: [PATCH v6 1/2] Add more general summary to vacuumlazy.c

Add more comments at the top of vacuumlazy.c on heap relation vacuuming
implementation.

Previously vacuumlazy.c only had details related to the dead TID storage
added in Postgres 17. This commit adds a more general summary to help
future developers understand the heap relation vacuum design and
implementation at a high level.

Reviewed-by: Robert Haas, Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 src/backend/access/heap/vacuumlazy.c | 42 ++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 09fab08b8e1..85af7ada46d 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -3,6 +3,48 @@
  * vacuumlazy.c
  *	  Concurrent ("lazy") vacuuming.
  *
+ * Heap relations are vacuumed in three main phases. In phase I, vacuum scans
+ * relation pages, pruning and freezing tuples and saving dead tuples' TIDs in
+ * a TID store. If that TID store fills up or vacuum finishes scanning the
+ * relation, it progresses to phase II: index vacuuming. Index vacuuming
+ * deletes the dead index entries referenced in the TID store. In phase III,
+ * vacuum scans the blocks of the relation indicated by the TIDs in the TID
+ * store and reaps the dead tuples, freeing that space for future tuples.
+ *
+ * If there are no indexes or index scanning is disabled, phase II may be
+ * skipped. If phase I identified very few dead index entries, vacuum may skip
+ * phases II and III. If the TID store fills up in phase I, vacuum suspends
+ * phase I, proceeds to phases II and II and cleans up the dead tuples
+ * referenced in the current TID store. This empties the TID store and allows
+ * vacuum to resume phase I. In this sense, the phases are more like states in
+ * a state machine, but they have been referred to colloquially as phases for
+ * long enough that it makes sense to refer to them in that way here.
+ *
+ * Finally, vacuum may truncate the relation if it has emptied pages at the
+ * end. After finishing all phases of work, vacuum updates relation statistics
+ * in pg_class and the cumulative statistics subsystem.
+ *
+ * Relation Scanning:
+ *
+ * Vacuum scans the heap relation, starting at the beginning and progressing
+ * to the end, skipping pages as permitted by their visibility status, vacuum
+ * options, and the eagerness level of the vacuum.
+ *
+ * When page skipping is enabled, non-aggressive vacuums may skip scanning
+ * pages that are marked all-visible in the visibility map. It may choose not
+ * to skip pages if the range of skippable pages is below
+ * SKIP_PAGES_THRESHOLD.
+ *
+ * Once vacuum has decided to scan a given block, it must read the block and
+ * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
+ * may choose to skip pruning and freezing if it cannot acquire a cleanup lock
+ * on the buffer right away.
+ *
+ * After pruning and freezing, pages that are newly all-visible and all-frozen
+ * are marked as such in the visibility map.
+ *
+ * Dead TID Storage:
+ *
  * The major space usage for vacuuming is storage for the dead tuple IDs that
  * are to be removed from indexes.  We want to ensure we can vacuum even the
  * very largest relations with finite memory space usage.  To do that, we set
-- 
2.34.1

#15Alena Rybakina
a.rybakina@postgrespro.ru
In reply to: Melanie Plageman (#14)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Hi!

On 14.01.2025 00:46, Melanie Plageman wrote:

On Thu, Jan 9, 2025 at 1:24 PM Andres Freund<andres@anarazel.de> wrote:

On 2025-01-07 15:46:26 -0500, Melanie Plageman wrote:

For table storage options, those related to vacuum but not autovacuum
are in the main StdRdOptions struct. Of those, some are overridden by
VACUUM command parameters which are parsed out into the VacuumParams
struct. Though the members of VacuumParams are initialized in
ExecVacuum(), the storage parameter overrides are determined in
vacuum_rel() and the final value goes in the VacuumParams struct which
is passed all the way through to heap_vacuum_rel().

Because VacuumParams is what ultimately gets passed down to the
table-AM specific vacuum implementation, autovacuum also initializes
its own instance of VacuumParams in the autovac_table struct in
table_recheck_autovac() (even though no VACUUM command parameters can
affect autovacuum). These are overridden in vacuum_rel() as well.

Ultimately vacuum_eager_scan_max_fails is a bit different from the
existing members of VacuumParams and StdRdOptions. It is a GUC and a
table storage option but not a SQL command parameter -- and both the
GUC and the table storage parameter affect both vacuum and autovacuum.
And it doesn't need to be initialized in different ways for autovacuum
and vacuum. In the end, I decided to follow the existing conventions
as closely as I could.

I think that's fine. The abstractions in this area aren't exactly perfect, and
I don't think this makes it worse in any meaningful way. It's not really
different from having other heap-specific params like freeze_min_age in
VacuumParams.

Got it. I've left it as is, then.

Attached v6 is rebased over recent changes in the vacuum-related docs.
I've also updated the "Routine Vacuuming" section of the docs to
mention eager scanning.

I'm planning to commit 0001 (which updates the code comment at the top
of vacuumlazy.c to explain heap vacuuming) --barring any objections.

Thank you for working on this patch, without this explanation it is
difficult to understand what is happening, to put it mildly.

While working on the vacuum statistics, I'll add you a link to the
thread just in case [0]https://commitfest.postgresql.org/51/5012/, I discovered some more important points that I
think can be mentioned.

The first of them is related to the fact that vacuum will not clean
tuples referenced in indexes, since it was previously unable to take a
cleanup lock on the index. You can look at the increment of
missed_dead_tuples and vacrel->missed_dead_pages in the
lazy_scan_noprune function. That is, these are absolutely dead tuples
for vacuum that it simply could not clean.

Secondly, I think it is worth mentioning the moment when vacuum urgently
starts cleaning the heap relationship when there is a threat of a
wraparound round. At this point, it skips the index processing phase and
heap relationship truncation.

Thirdly, FreeSpaceMap is updated every time after the complete
completion of index and table cleaning (after the lazy_vacuum function)
and after table heap pruning stage (the lazy_scan_prune function). Maybe
you should add it.

I think it is possible to add additional information about parallel
vacuum - firstly, workers are generated for each index, which perform
their cleaning. Some indexes are defined by vacuum as unsafe for
processing by a parallel worker and can be processed only by a
postmaster (or leader). These are indexes that do not support parallel
bulk-deletion, parallel cleanup (see
parallel_vacuum_index_is_parallel_safe function).

I noticed an interesting point, but I don’t know if it is necessary to
write about it, but for me it was not obvious and informative that the
buffer and wal statistics are thrown by the indexes that were processed
by workers and are thrown separately in (pvs->buffer_usage, pvs->wal_usage).

[0]: https://commitfest.postgresql.org/51/5012/

--
Regards,
Alena Rybakina
Postgres Professional

#16Melanie Plageman
melanieplageman@gmail.com
In reply to: Alena Rybakina (#15)
2 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Mon, Jan 13, 2025 at 5:37 PM Alena Rybakina
<a.rybakina@postgrespro.ru> wrote:

Thank you for working on this patch, without this explanation it is difficult to understand what is happening, to put it mildly.

Thanks for the review! I've incorporated most of them into attached v7.

The first of them is related to the fact that vacuum will not clean tuples referenced in indexes, since it was previously unable to take a cleanup lock on the index. You can look at the increment of missed_dead_tuples and vacrel->missed_dead_pages in the lazy_scan_noprune function. That is, these are absolutely dead tuples for vacuum that it simply could not clean.

I had mentioned that if a (non-aggressive) vacuum cannot get a cleanup
lock on a page, it will skip pruning and freezing. I have expanded the
note to mention that this means it will not remove those dead tuples
or index entries.

Secondly, I think it is worth mentioning the moment when vacuum urgently starts cleaning the heap relationship when there is a threat of a wraparound round. At this point, it skips the index processing phase and heap relationship truncation.

I've added failsafe to the list of reasons why we might skip phase II and III.

Thirdly, FreeSpaceMap is updated every time after the complete completion of index and table cleaning (after the lazy_vacuum function) and after table heap pruning stage (the lazy_scan_prune function). Maybe you should add it.

I've added a sentence about this. It looks a bit awkward by itself,
but it doesn't really go with the other paragraphs. Anyway, I think it
is probably fine.

I think it is possible to add additional information about parallel vacuum - firstly, workers are generated for each index, which perform their cleaning. Some indexes are defined by vacuum as unsafe for processing by a parallel worker and can be processed only by a postmaster (or leader). These are indexes that do not support parallel bulk-deletion, parallel cleanup (see parallel_vacuum_index_is_parallel_safe function).

I hesitated to add too much about parallel index vacuuming to
vacuumlazy.c. I have added a line which mentions that manual vacuums
may vacuum indexes in parallel and to look at vacuumparallel.c for
more info.

I noticed an interesting point, but I don’t know if it is necessary to write about it, but for me it was not obvious and informative that the buffer and wal statistics are thrown by the indexes that were processed by workers and are thrown separately in (pvs->buffer_usage, pvs->wal_usage).

This is interesting, but I think it might belong as commentary in
vacuumparallel.c instead.

Thanks again for your close reading and detailed thoughts!

- Melanie

Attachments:

v7-0002-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchtext/x-patch; charset=US-ASCII; name=v7-0002-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchDownload
From d579e6fa22982f66b7e23efc80e7e528d2059d51 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Tue, 7 Jan 2025 09:48:34 -0500
Subject: [PATCH v7 2/2] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Introduce eager scanning normal vacuums, in which vacuum scans some of
the all-visible but not all-frozen pages in the relation to amortize the
cost of an aggressive vacuum.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
considered successful eager scans and those not frozen are considered
failed eager scans.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager scanned
and frozen, eager scanning is permanently disabled for the current
vacuum.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Author: Melanie Plageman
Reviewed-by: Andres Freund, Robert Haas, Robert Treat, Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  20 +
 doc/src/sgml/maintenance.sgml                 |  47 ++-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  13 +-
 src/backend/access/heap/vacuumlazy.c          | 382 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  13 +
 src/backend/postmaster/autovacuum.c           |   2 +
 src/backend/utils/misc/guc_tables.c           |  10 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/include/commands/vacuum.h                 |  23 ++
 src/include/utils/rel.h                       |   7 +
 11 files changed, 488 insertions(+), 45 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 3f41a17b1fe..305f4065495 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9116,6 +9116,26 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+      <term><varname>vacuum_eager_scan_max_fails</varname> (<type>integer</type>)
+      <indexterm>
+       <primary><varname>vacuum_eager_scan_max_fails</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum number of all-visible pages that
+        <command>VACUUM</command> may scan and fail to set all-frozen in the
+        visibility map before disabling eager scanning until the next region
+        (currently 4096 blocks) of the relation. A value of 0 disables eager
+        scanning altogether. The default is 128. This parameter can be set in
+        postgresql.conf or on the server command line but is overridden for
+        individual tables by changing the
+        <link linkend="reloption-vacuum-eager-scan-max-fails">corresponding table storage parameter</link>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 0be90bdc7ef..3cafba24a1a 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -488,22 +488,33 @@
    </para>
 
    <para>
-    <command>VACUUM</command> uses the <link linkend="storage-vm">visibility map</link>
-    to determine which pages of a table must be scanned.  Normally, it
-    will skip pages that don't have any dead row versions even if those pages
-    might still have row versions with old XID values.  Therefore, normal
-    <command>VACUUM</command>s won't always freeze every old row version in the table.
-    When that happens, <command>VACUUM</command> will eventually need to perform an
-    <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
-    XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+    <command>VACUUM</command> uses the <link linkend="storage-vm">visibility
+    map</link> to determine which pages of a table must be scanned.  Normally,
+    it may skip pages that don't have any dead row versions even if those
+    pages might still have row versions with old XID values.  Therefore,
+    normal <command>VACUUM</command>s won't always freeze every old row
+    version in the table. When that happens, <command>VACUUM</command> will
+    eventually need to perform an <firstterm>aggressive vacuum</firstterm>,
+    which will freeze all eligible unfrozen XID and MXID values, including
+    those from all-visible but not all-frozen pages. If a table is building up
+    a backlog of all-visible but not all-frozen pages, a normal vacuum may
+    choose to scan skippable pages in an effort to freeze them. These are
+    referred to as <firstterm>eagerly scanned</firstterm> pages. Eager
+    scanning can be tuned to scan and attempt to freeze more all-visible pages
+    by increasing <xref linkend="guc-vacuum-eager-scan-max-fails"/>. Even if
+    eager scanning has kept the number of all-visible but not all-frozen pages
+    to a minimum, most tables still require periodic aggressive vacuuming.
+   </para>
+
+   <para>
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
-    pages are scanned if the number of transactions that have passed since the
-    last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
+    controls when a table is aggressively vacuumed. All all-visible but
+    not all-frozen pages are scanned if the number of transactions that
+    have passed since the last such scan is greater than
+    <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
-    <varname>vacuum_freeze_table_age</varname> to 0 forces <command>VACUUM</command> to
-    always use its aggressive strategy.
+    <varname>vacuum_freeze_table_age</varname> to 0 forces
+    <command>VACUUM</command> to always use its aggressive strategy.
    </para>
 
    <para>
@@ -626,9 +637,11 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
+    <command>VACUUM</command> mostly scans pages that have been modified
+    since the last vacuum. All-visible but not all-frozen pages are
+    eagerly scanned to try and freeze them. But the
+    <structfield>relfrozenxid</structfield> can only be advanced when
+    every page of the table
     that might contain unfrozen XIDs is scanned.  This happens when
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2237321cb4f..679490e47aa 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1931,6 +1931,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+    <term><literal>vacuum_eager_scan_max_fails</literal>, <literal>toast.vacuum_eager_scan_max_fails</literal> (<type>integer</type>)
+    <indexterm>
+     <primary><varname>vacuum_eager_scan_max_fails</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-eager-scan-max-fails"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..daff9f1fa8d 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -27,6 +27,7 @@
 #include "catalog/pg_type.h"
 #include "commands/defrem.h"
 #include "commands/tablespace.h"
+#include "commands/vacuum.h"
 #include "nodes/makefuncs.h"
 #include "utils/array.h"
 #include "utils/attoptcache.h"
@@ -319,6 +320,14 @@ static relopt_int intRelOpts[] =
 		},
 		-1, -1, INT_MAX
 	},
+	{
+		{
+			"vacuum_eager_scan_max_fails",
+			"Maximum number of all-visible pages that vacuum will eagerly scan and fail to freeze before giving up on eager scanning until the next region",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		}, -1, 0, VACUUM_EAGER_SCAN_REGION_SIZE
+	},
 	{
 		{
 			"toast_tuple_target",
@@ -1880,7 +1889,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_eager_scan_max_fails", RELOPT_TYPE_INT,
+		offsetof(StdRdOptions, vacuum_eager_scan_max_fails)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 5028759024b..5166c7c57fa 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -40,10 +40,47 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and the eagerness level of the vacuum.
  *
- * When page skipping is enabled, non-aggressive vacuums may skip scanning
- * pages that are marked all-visible in the visibility map. It may choose not
- * to skip pages if the range of skippable pages is below
- * SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager scans to
+ * EAGER_SCAN_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is permanently disabled.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager scan failure cap.
+ * The failure count is reset for each region of the table -- comprised of
+ * VACUUM_EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_eager_scan_max_fails before suspending eager scanning until the end
+ * of the region. vacuum_eager_scan_max_fails is configurable both globally
+ * and per table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -100,6 +137,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -185,6 +223,15 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple normal vacuums,
+ * we limit the number of successful eager page scans. The maximum number of
+ * successful eager page scans is calculated as a ratio of the all-visible but
+ * not all-frozen pages at the beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -241,6 +288,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -282,9 +336,55 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eager scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a row suspends eager scanning. next_eager_scan_region_start
+	 * is the block number of the first block eligible for resumed eager
+	 * scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success limit,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning. When eager scanning is enabled, this is initialized to
+	 * EAGER_SCAN_SUCCESS_RATE of the total number of all-visible but not
+	 * all-frozen pages. For each eager scan success, this is decremented.
+	 * Once it hits 0, eager scanning is permanently disabled. It is
+	 * initialized to 0 if eager scanning starts out disabled (including for
+	 * aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * vacuum_eager_scan_max_fails each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
+
+	/*
+	 * The maximum number of blocks which may be eager scanned and not frozen
+	 * before eager scanning is temporarily suspended. This is configurable
+	 * both globally, via the vacuum_eager_scan_max_fails GUC, and per table,
+	 * with a table storage parameter of the same name. It is 0 when eager
+	 * scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -296,8 +396,10 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -305,7 +407,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -347,6 +449,121 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_requires_freeze = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->eager_scan_max_fails == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * If the relation is smaller than a single region, we won't bother eager
+	 * scanning it. A future aggressive vacuum shouldn't take very long, so
+	 * there is no point in amortization.
+	 */
+	if (vacrel->rel_pages < VACUUM_EAGER_SCAN_REGION_SIZE)
+		return;
+
+	Assert(params->eager_scan_max_fails >= 0 &&
+		   params->eager_scan_max_fails <= 4096);
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation. We are only guaranteed to
+	 * freeze a page if some of the tuples _require_ freezing. Tuples require
+	 * freezing if any of their xids precede the freeze limit or multixact
+	 * cutoff (calculated from vacuum_[multixact_]freeze_min_age). So, if the
+	 * oldest unfrozen xid (relfrozenxid/relminmxid) does not precede the
+	 * freeze cutoff, we won't find tuples requiring freezing.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+									  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_requires_freeze = true;
+
+	if (!oldest_unfrozen_requires_freeze &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+									vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_requires_freeze = true;
+
+	if (!oldest_unfrozen_requires_freeze)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is EAGER_SCAN_SUCCESS_RATE of the number of all-visible
+	 * but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (EAGER_SCAN_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If the table is entirely frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed %
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_max_fails_per_region = params->eager_scan_max_fails;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager scan failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails = vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -475,6 +692,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -500,6 +718,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -518,11 +737,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -537,6 +761,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -731,12 +962,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eager scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -907,8 +1140,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -927,13 +1162,16 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
@@ -1061,7 +1299,46 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success limit, there is no need to
+					 * eagerly scan any additional pages. Permanently disable
+					 * eager scanning by setting the other eager scan
+					 * management fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(INFO,
+							(errmsg("Vacuum successfully froze %u eager scanned blocks of \"%s.%s.%s\". Now disabling eager scanning.",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1161,7 +1438,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eager scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1171,13 +1450,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1250,6 +1532,9 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
+		if (*was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 		return true;
 	}
 }
@@ -1273,11 +1558,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1285,6 +1571,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += VACUUM_EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1317,24 +1616,34 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 		 * all-visible.  They may still skip all-frozen pages, which can't
 		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if (mapbits & VISIBILITYMAP_ALL_FROZEN)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip all-visible pages that are not also
+		 * all-frozen. Normal vacuums with eager scanning enabled only skip
+		 * such pages if they have hit the failure limit for the current eager
+		 * scan region.
+		 */
+		if (vacrel->aggressive ||
+			vacrel->eager_scan_remaining_fails > 0)
+		{
+			if (!vacrel->aggressive)
+				next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1365,6 +1674,10 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because empty pages are always frozen and
+ * thus could never be eager scanned.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1504,6 +1817,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1512,7 +1829,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1664,11 +1982,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1756,6 +2080,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1763,7 +2088,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..eb3764de693 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+int			vacuum_eager_scan_max_fails;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/* Later we check if a reloption override was specified */
+	params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2169,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_eager_scan_max_fails table storage parameter was
+	 * specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails >= 0)
+		params->eager_scan_max_fails =
+			((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..1d5ab1c89bc 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+		/* Later we check reloptions for vacuum_eager_scan_max_fails override */
+		tab->at_params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index c9d8cd796a8..22e61ab70b1 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -2743,6 +2743,16 @@ struct config_int ConfigureNamesInt[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"vacuum_eager_scan_max_fails", PGC_USERSET, CLIENT_CONN_STATEMENT,
+			gettext_noop("Maximum number of all-visible pages vacuum can eager scan and fail to freeze before suspending eager scanning until the next region of the table"),
+			NULL
+		},
+		&vacuum_eager_scan_max_fails,
+		128, 0, VACUUM_EAGER_SCAN_REGION_SIZE,
+		NULL, NULL, NULL
+	},
+
 	{
 		{"vacuum_freeze_table_age", PGC_USERSET, CLIENT_CONN_STATEMENT,
 			gettext_noop("Age at which VACUUM should scan whole table to freeze tuples."),
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 079efa1baa7..b1a98367d3b 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -698,6 +698,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_eager_scan_max_fails = 128 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..6b5e5e04818 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,14 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * The maximum number of all-visible pages that can be scanned and failed
+	 * to be set all-frozen before eager scanning is disabled for the current
+	 * region. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	uint32		eager_scan_max_fails;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +305,21 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may eagerly
+ * scan some all-visible but not all-frozen pages. Since our goal is to freeze
+ * these pages, an eager scan that fails to set the page all-frozen in the VM
+ * is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have similarly
+ * aged data, once we fail to freeze vacuum_eager_scan_max_fails blocks in a
+ * region of size VACUUM_EAGER_SCAN_REGION_SIZE, we suspend eager scanning
+ * until vacuum has progressed to another region of the table with potentially
+ * older data.
+ */
+extern PGDLLIMPORT int vacuum_eager_scan_max_fails;
+#define VACUUM_EAGER_SCAN_REGION_SIZE 4096
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..d9fe68f4d86 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,13 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * The maximum number of all-visible pages vacuum may scan and fail to
+	 * freeze before eager scanning is disabled for the current region of the
+	 * table. 0 if disabled, -1 if unspecified.
+	 */
+	int			vacuum_eager_scan_max_fails;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.34.1

v7-0001-Add-more-general-summary-to-vacuumlazy.c.patchtext/x-patch; charset=US-ASCII; name=v7-0001-Add-more-general-summary-to-vacuumlazy.c.patchDownload
From a560d52a6cc212f7de30b085e777b955078f4aa2 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Wed, 11 Dec 2024 14:13:34 -0500
Subject: [PATCH v7 1/2] Add more general summary to vacuumlazy.c

Add more comments at the top of vacuumlazy.c on heap relation vacuuming
implementation.

Previously vacuumlazy.c only had details related to the dead TID storage
added in Postgres 17. This commit adds a more general summary to help
future developers understand the heap relation vacuum design and
implementation at a high level.

Reviewed-by: Alena Rybakina, Robert Haas, Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 src/backend/access/heap/vacuumlazy.c | 54 ++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 09fab08b8e1..5028759024b 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -3,6 +3,60 @@
  * vacuumlazy.c
  *	  Concurrent ("lazy") vacuuming.
  *
+ * Heap relations are vacuumed in three main phases. In phase I, vacuum scans
+ * relation pages, pruning and freezing tuples and saving dead tuples' TIDs in
+ * a TID store. If that TID store fills up or vacuum finishes scanning the
+ * relation, it progresses to phase II: index vacuuming. Index vacuuming
+ * deletes the dead index entries referenced in the TID store. In phase III,
+ * vacuum scans the blocks of the relation indicated by the TIDs in the TID
+ * store and reaps the dead tuples, freeing that space for future tuples.
+ *
+ * If there are no indexes or index scanning is disabled, phase II may be
+ * skipped. If phase I identified very few dead index entries or if vacuum's
+ * failsafe mechanism has triggered (to avoid transaction ID wraparound),
+ * vacuum may skip phases II and III.
+ *
+ * If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
+ * phases II and II and cleans up the dead tuples referenced in the current
+ * TID store. This empties the TID store and allows vacuum to resume phase I.
+ *
+ * In a way, the phases are more like states in a state machine, but they have
+ * been referred to colloquially as phases for so long that they are referred
+ * to as such here.
+ *
+ * Manually invoked VACUUMs may scan indexes during phase II in parallel. For
+ * more information on this, see the comment at the top of vacuumparallel.c.
+ *
+ * In between phases, vacuum updates the freespace map (every
+ * VACUUM_FSM_EVERY_PAGES).
+ *
+ * Finally, vacuum may truncate the relation if it has emptied pages at the
+ * end. After finishing all phases of work, vacuum updates relation statistics
+ * in pg_class and the cumulative statistics subsystem.
+ *
+ * Relation Scanning:
+ *
+ * Vacuum scans the heap relation, starting at the beginning and progressing
+ * to the end, skipping pages as permitted by their visibility status, vacuum
+ * options, and the eagerness level of the vacuum.
+ *
+ * When page skipping is enabled, non-aggressive vacuums may skip scanning
+ * pages that are marked all-visible in the visibility map. It may choose not
+ * to skip pages if the range of skippable pages is below
+ * SKIP_PAGES_THRESHOLD.
+ *
+ * Once vacuum has decided to scan a given block, it must read the block and
+ * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
+ * may choose to skip pruning and freezing if it cannot acquire a cleanup lock
+ * on the buffer right away. In this case, it may miss cleaning up dead tuples
+ * (and their associated index entries); though it is free to reap any
+ * existing dead items on the page.
+ *
+ * After pruning and freezing, pages that are newly all-visible and all-frozen
+ * are marked as such in the visibility map.
+ *
+ * Dead TID Storage:
+ *
  * The major space usage for vacuuming is storage for the dead tuple IDs that
  * are to be removed from indexes.  We want to ensure we can vacuum even the
  * very largest relations with finite memory space usage.  To do that, we set
-- 
2.34.1

#17Alena Rybakina
a.rybakina@postgrespro.ru
In reply to: Melanie Plageman (#16)
1 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On 14.01.2025 22:51, Melanie Plageman wrote:

On Mon, Jan 13, 2025 at 5:37 PM Alena Rybakina
<a.rybakina@postgrespro.ru> wrote:

Thank you for working on this patch, without this explanation it is difficult to understand what is happening, to put it mildly.

Thanks for the review! I've incorporated most of them into attached v7.

You are welcome! Thank you too)

The first of them is related to the fact that vacuum will not clean tuples referenced in indexes, since it was previously unable to take a cleanup lock on the index. You can look at the increment of missed_dead_tuples and vacrel->missed_dead_pages in the lazy_scan_noprune function. That is, these are absolutely dead tuples for vacuum that it simply could not clean.

I had mentioned that if a (non-aggressive) vacuum cannot get a cleanup
lock on a page, it will skip pruning and freezing. I have expanded the
note to mention that this means it will not remove those dead tuples
or index entries.

Secondly, I think it is worth mentioning the moment when vacuum urgently starts cleaning the heap relationship when there is a threat of a wraparound round. At this point, it skips the index processing phase and heap relationship truncation.

I've added failsafe to the list of reasons why we might skip phase II and III.

Yes, I agree with you. After reviewing the patch again, I noticed them.

Thirdly, FreeSpaceMap is updated every time after the complete completion of index and table cleaning (after the lazy_vacuum function) and after table heap pruning stage (the lazy_scan_prune function). Maybe you should add it.

I've added a sentence about this. It looks a bit awkward by itself,
but it doesn't really go with the other paragraphs. Anyway, I think it
is probably fine.

I think it is fine.

I think it is possible to add additional information about parallel vacuum - firstly, workers are generated for each index, which perform their cleaning. Some indexes are defined by vacuum as unsafe for processing by a parallel worker and can be processed only by a postmaster (or leader). These are indexes that do not support parallel bulk-deletion, parallel cleanup (see parallel_vacuum_index_is_parallel_safe function).

I hesitated to add too much about parallel index vacuuming to
vacuumlazy.c. I have added a line which mentions that manual vacuums
may vacuum indexes in parallel and to look at vacuumparallel.c for
more info.

In my opinion, there is enough information about it. Additionally, the
code for parallel vacuums is located there. I believe a brief
description of what a parallel vacuum is and where to find more
information about it is sufficient, so it is fine as it is now.

I noticed an interesting point, but I don’t know if it is necessary to write about it, but for me it was not obvious and informative that the buffer and wal statistics are thrown by the indexes that were processed by workers and are thrown separately in (pvs->buffer_usage, pvs->wal_usage).

This is interesting, but I think it might belong as commentary in
vacuumparallel.c instead.

I added some description about it, I hope it is fine. I attached
vacuum_description.diff

Thanks again for your close reading and detailed thoughts!

Thank you for your contribution!)

--
Regards,
Alena Rybakina
Postgres Professional

Attachments:

vacuum_description.difftext/x-patch; charset=UTF-8; name=vacuum_description.diffDownload
diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c
index 0d92e694d6a..6ac4909794a 100644
--- a/src/backend/commands/vacuumparallel.c
+++ b/src/backend/commands/vacuumparallel.c
@@ -9,8 +9,12 @@
  * In a parallel vacuum, we perform both index bulk deletion and index cleanup
  * with parallel worker processes.  Individual indexes are processed by one
  * vacuum process.  ParallelVacuumState contains shared information as well as
- * the memory space for storing dead items allocated in the DSA area.  We
- * launch parallel worker processes at the start of parallel index
+ * the memory space for storing dead items allocated in the DSA area. Furthemore
+ * the primary statistical information about indexes gathered during vacuuming
+ * is stored in the IndexBulkDeleteResult structure. In addition, the buffer and
+ * WAL statistics for indexes processed by parallel workers are stored in the
+ * buffer_usage and wal_usage fields of the ParallelVacuumState.
+ * We launch parallel worker processes at the start of parallel index
  * bulk-deletion and index cleanup and once all indexes are processed, the
  * parallel worker processes exit.  Each time we process indexes in parallel,
  * the parallel context is re-initialized so that the same DSM can be used for
#18Marcos Pegoraro
marcos@f10.com.br
In reply to: Alena Rybakina (#17)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On 14.01.2025 22:51, Melanie Plageman wrote:

There is a typo on committed vacuumlazy.c file
* If the TID store fills up in phase I, vacuum suspends phase I, proceeds
to
* phases II and II, cleaning up the dead tuples referenced in the current
TID
* store. This empties the TID store resumes phase I.

Probably you meant phases II and III

regards
Marcos

#19Melanie Plageman
melanieplageman@gmail.com
In reply to: Marcos Pegoraro (#18)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Wed, Jan 15, 2025 at 2:36 PM Marcos Pegoraro <marcos@f10.com.br> wrote:

On 14.01.2025 22:51, Melanie Plageman wrote:

There is a typo on committed vacuumlazy.c file
* If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
* phases II and II, cleaning up the dead tuples referenced in the current TID
* store. This empties the TID store resumes phase I.

Probably you meant phases II and III

Oops. Thanks for catching this. I'll fix that and the following
sentence in the main patch proposed in this thread to avoid extra
noise.

- Melanie

#20Melanie Plageman
melanieplageman@gmail.com
In reply to: Alena Rybakina (#17)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Wed, Jan 15, 2025 at 12:08 PM Alena Rybakina
<a.rybakina@postgrespro.ru> wrote:

This is interesting, but I think it might belong as commentary in
vacuumparallel.c instead.

I added some description about it, I hope it is fine. I attached vacuum_description.diff

Alena, thanks again for your review. I pushed the part that we worked
on so far. I didn't end up adding in your proposed addition to
vacuumparallel.c. Honestly, I am not as familiar with the parallel
vacuuming code, so I wasn't sure what information rises to the level
of importance of being in the comment at the top of the file.

- Melanie

#21Melanie Plageman
melanieplageman@gmail.com
In reply to: Melanie Plageman (#19)
1 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Wed, Jan 15, 2025 at 3:03 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Wed, Jan 15, 2025 at 2:36 PM Marcos Pegoraro <marcos@f10.com.br> wrote:

There is a typo on committed vacuumlazy.c file
* If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
* phases II and II, cleaning up the dead tuples referenced in the current TID
* store. This empties the TID store resumes phase I.

Probably you meant phases II and III

Oops. Thanks for catching this. I'll fix that and the following
sentence in the main patch proposed in this thread to avoid extra
noise.

Attached v8 is rebased and has various comment cleanups.

- Melanie

Attachments:

v8-0001-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchapplication/octet-stream; name=v8-0001-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchDownload
From 17da2fa27cb8da85affd5ca3ba36db0a5edf6873 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Tue, 7 Jan 2025 09:48:34 -0500
Subject: [PATCH v8] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Amortize the cost of an aggressive vacuum by eagerly scanning some
number of all-visible but not all-frozen pages during normal vacuums.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
considered successful eager scans and those not frozen are considered
failed eager scans.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager scanned
and frozen, eager scanning is permanently disabled for the current
vacuum of the relation.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Author: Melanie Plageman
Reviewed-by: Andres Freund, Robert Haas, Robert Treat, Bilal Yavuz
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  20 +
 doc/src/sgml/maintenance.sgml                 |  48 ++-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  13 +-
 src/backend/access/heap/vacuumlazy.c          | 387 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  13 +
 src/backend/postmaster/autovacuum.c           |   2 +
 src/backend/utils/misc/guc_tables.c           |   9 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/include/commands/vacuum.h                 |  23 ++
 src/include/utils/rel.h                       |   7 +
 11 files changed, 491 insertions(+), 47 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 3f41a17b1fe..305f4065495 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9116,6 +9116,26 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+      <term><varname>vacuum_eager_scan_max_fails</varname> (<type>integer</type>)
+      <indexterm>
+       <primary><varname>vacuum_eager_scan_max_fails</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum number of all-visible pages that
+        <command>VACUUM</command> may scan and fail to set all-frozen in the
+        visibility map before disabling eager scanning until the next region
+        (currently 4096 blocks) of the relation. A value of 0 disables eager
+        scanning altogether. The default is 128. This parameter can be set in
+        postgresql.conf or on the server command line but is overridden for
+        individual tables by changing the
+        <link linkend="reloption-vacuum-eager-scan-max-fails">corresponding table storage parameter</link>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 0be90bdc7ef..2c620567c59 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -488,22 +488,34 @@
    </para>
 
    <para>
-    <command>VACUUM</command> uses the <link linkend="storage-vm">visibility map</link>
-    to determine which pages of a table must be scanned.  Normally, it
-    will skip pages that don't have any dead row versions even if those pages
+    <command>VACUUM</command> uses the <link linkend="storage-vm">visibility
+    map</link> to determine which pages of a table must be scanned.  Normally,
+    it may skip pages that don't have any dead row versions even if those pages
     might still have row versions with old XID values.  Therefore, normal
-    <command>VACUUM</command>s won't always freeze every old row version in the table.
-    When that happens, <command>VACUUM</command> will eventually need to perform an
-    <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
-    XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+    <command>VACUUM</command>s won't always freeze every old row version in the
+    table. When that happens, <command>VACUUM</command> will eventually need to
+    perform an <firstterm>aggressive vacuum</firstterm>, which will freeze all
+    eligible unfrozen XID and MXID values, including those from all-visible but
+    not all-frozen pages. If a table is building up a backlog of all-visible
+    but not all-frozen pages, a normal vacuum may choose to scan skippable
+    pages in an effort to freeze them. Doing so decreases the number of pages
+    the next aggressive vacuum must scan. These are referred to as
+    <firstterm>eagerly scanned</firstterm> pages. Eager scanning can be tuned
+    to scan and attempt to freeze more all-visible pages by increasing <xref
+    linkend="guc-vacuum-eager-scan-max-fails"/>. Even if eager scanning has
+    kept the number of all-visible but not all-frozen pages to a minimum, most
+    tables still require periodic aggressive vacuuming.
+   </para>
+
+   <para>
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
-    pages are scanned if the number of transactions that have passed since the
-    last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
+    controls when a table is aggressively vacuumed. All all-visible but
+    not all-frozen pages are scanned if the number of transactions that
+    have passed since the last such scan is greater than
+    <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
-    <varname>vacuum_freeze_table_age</varname> to 0 forces <command>VACUUM</command> to
-    always use its aggressive strategy.
+    <varname>vacuum_freeze_table_age</varname> to 0 forces
+    <command>VACUUM</command> to always use its aggressive strategy.
    </para>
 
    <para>
@@ -626,10 +638,12 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    <command>VACUUM</command> mostly scans pages that have been modified since
+    the last vacuum. Some all-visible but not all-frozen pages are eagerly
+    scanned to try and freeze them. But the
+    <structfield>relfrozenxid</structfield> can only be advanced when every
+    page of the table that might contain unfrozen XIDs is scanned.  This
+    happens when
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
     <command>VACUUM</command>'s <literal>FREEZE</literal> option is used, or when all
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2237321cb4f..679490e47aa 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1931,6 +1931,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+    <term><literal>vacuum_eager_scan_max_fails</literal>, <literal>toast.vacuum_eager_scan_max_fails</literal> (<type>integer</type>)
+    <indexterm>
+     <primary><varname>vacuum_eager_scan_max_fails</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-eager-scan-max-fails"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..daff9f1fa8d 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -27,6 +27,7 @@
 #include "catalog/pg_type.h"
 #include "commands/defrem.h"
 #include "commands/tablespace.h"
+#include "commands/vacuum.h"
 #include "nodes/makefuncs.h"
 #include "utils/array.h"
 #include "utils/attoptcache.h"
@@ -319,6 +320,14 @@ static relopt_int intRelOpts[] =
 		},
 		-1, -1, INT_MAX
 	},
+	{
+		{
+			"vacuum_eager_scan_max_fails",
+			"Maximum number of all-visible pages that vacuum will eagerly scan and fail to freeze before giving up on eager scanning until the next region",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		}, -1, 0, VACUUM_EAGER_SCAN_REGION_SIZE
+	},
 	{
 		{
 			"toast_tuple_target",
@@ -1880,7 +1889,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_eager_scan_max_fails", RELOPT_TYPE_INT,
+		offsetof(StdRdOptions, vacuum_eager_scan_max_fails)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 5b0e790e121..17e69bf59fe 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -17,9 +17,9 @@
  * failsafe mechanism has triggered (to avoid transaction ID wraparound),
  * vacuum may skip phases II and III.
  *
- * If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
- * phases II and II, cleaning up the dead tuples referenced in the current TID
- * store. This empties the TID store resumes phase I.
+ * If the TID store fills up in phase I, vacuum suspends phase I and proceeds
+ * to phases II and III, cleaning up the dead tuples referenced in the current
+ * TID store. This empties the TID store, allowing vacuum to resume phase I.
  *
  * In a way, the phases are more like states in a state machine, but they have
  * been referred to colloquially as phases for so long that they are referred
@@ -41,9 +41,47 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and various other requirements.
  *
- * When page skipping is not disabled, a non-aggressive vacuum may scan pages
- * that are marked all-visible (and even all-frozen) in the visibility map if
- * the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager scans to
+ * EAGER_SCAN_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is permanently disabled.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager scan failure cap.
+ * The failure count is reset for each region of the table -- comprised of
+ * VACUUM_EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_eager_scan_max_fails before suspending eager scanning until the end
+ * of the region. vacuum_eager_scan_max_fails is configurable both globally
+ * and per table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -100,6 +138,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -185,6 +224,15 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple normal vacuums,
+ * we limit the number of successful eager page scans. The maximum number of
+ * successful eager page scans is calculated as a ratio of the all-visible but
+ * not all-frozen pages at the beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -241,6 +289,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -282,9 +337,55 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eager scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a row suspends eager scanning. next_eager_scan_region_start
+	 * is the block number of the first block eligible for resumed eager
+	 * scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success limit,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning. When eager scanning is enabled, this is initialized to
+	 * EAGER_SCAN_SUCCESS_RATE of the total number of all-visible but not
+	 * all-frozen pages. For each eager scan success, this is decremented.
+	 * Once it hits 0, eager scanning is permanently disabled. It is
+	 * initialized to 0 if eager scanning starts out disabled (including for
+	 * aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * vacuum_eager_scan_max_fails each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
+
+	/*
+	 * The maximum number of blocks which may be eager scanned and not frozen
+	 * before eager scanning is temporarily suspended. This is configurable
+	 * both globally, via the vacuum_eager_scan_max_fails GUC, and per table,
+	 * with a table storage parameter of the same name. It is 0 when eager
+	 * scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -296,8 +397,10 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -305,7 +408,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -347,6 +450,122 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_before_cutoff = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->eager_scan_max_fails == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * If the relation is smaller than a single region, we won't bother eager
+	 * scanning it. A future aggressive vacuum shouldn't take very long, so
+	 * there is no point in amortization.
+	 */
+	if (vacrel->rel_pages < VACUUM_EAGER_SCAN_REGION_SIZE)
+		return;
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation. We can freeze tuples older
+	 * than the visibility horizon calculated at the beginning of vacuum, but
+	 * we are only guaranteed to freeze them if at least one tuple on the page
+	 * precedes the freeze limit or multixact cutoff (calculated from
+	 * vacuum_[multixact_]freeze_min_age). So, if the oldest unfrozen xid
+	 * (relfrozenxid/relminmxid) does not precede the freeze cutoff, we aren't
+	 * likely to freeze many tuples.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+									  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+									vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is EAGER_SCAN_SUCCESS_RATE of the number of all-visible
+	 * but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (EAGER_SCAN_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If every all-visible page is frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed %
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	Assert(params->eager_scan_max_fails > 0 &&
+		   params->eager_scan_max_fails <= VACUUM_EAGER_SCAN_REGION_SIZE);
+
+	vacrel->eager_scan_max_fails_per_region = params->eager_scan_max_fails;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager scan failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails = vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -475,6 +694,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -500,6 +720,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -518,11 +739,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -537,6 +763,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -731,12 +964,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eager scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -907,8 +1142,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -927,13 +1164,16 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
@@ -1061,7 +1301,45 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success limit, permanently disable eager
+					 * scanning by setting the other eager scan management
+					 * fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(INFO,
+							(errmsg("Vacuum successfully froze %u eager scanned blocks of \"%s.%s.%s\". Now disabling eager scanning.",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1161,7 +1439,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eager scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1171,13 +1451,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1250,6 +1533,9 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
+		if (*was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 		return true;
 	}
 }
@@ -1273,11 +1559,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1285,6 +1572,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += VACUUM_EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1317,24 +1617,34 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 		 * all-visible.  They may still skip all-frozen pages, which can't
 		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) != 0)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip all-visible pages that are not also
+		 * all-frozen. Normal vacuums with eager scanning enabled only skip
+		 * such pages if they have hit the failure limit for the current eager
+		 * scan region.
+		 */
+		if (vacrel->aggressive ||
+			vacrel->eager_scan_remaining_fails > 0)
+		{
+			if (!vacrel->aggressive)
+				next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1365,6 +1675,10 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because empty pages are always frozen and
+ * thus could never be eager scanned.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1504,6 +1818,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1512,7 +1830,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1664,11 +1983,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1756,6 +2081,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1763,7 +2089,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..eb3764de693 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+int			vacuum_eager_scan_max_fails;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/* Later we check if a reloption override was specified */
+	params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2169,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_eager_scan_max_fails table storage parameter was
+	 * specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails >= 0)
+		params->eager_scan_max_fails =
+			((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..1d5ab1c89bc 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+		/* Later we check reloptions for vacuum_eager_scan_max_fails override */
+		tab->at_params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index 38cb9e970d5..bbffadcaab8 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -2792,6 +2792,15 @@ struct config_int ConfigureNamesInt[] =
 		1600000000, 0, 2100000000,
 		NULL, NULL, NULL
 	},
+	{
+		{"vacuum_eager_scan_max_fails", PGC_USERSET, VACUUM_FREEZING,
+			gettext_noop("Maximum number of all-visible pages vacuum can eager scan and fail to freeze before suspending eager scanning until the next region of the table"),
+			NULL
+		},
+		&vacuum_eager_scan_max_fails,
+		128, 0, VACUUM_EAGER_SCAN_REGION_SIZE,
+		NULL, NULL, NULL
+	},
 
 	/*
 	 * See also CheckRequiredParameterValues() if this parameter changes
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 079efa1baa7..b1a98367d3b 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -698,6 +698,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_eager_scan_max_fails = 128 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..f1868be1bb7 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,14 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * The maximum number of all-visible pages that can be scanned and failed
+	 * to be set all-frozen before eager scanning is disabled for the current
+	 * region. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	uint32		eager_scan_max_fails;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +305,21 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may eagerly
+ * scan some all-visible but not all-frozen pages. Since the goal is to freeze
+ * these pages, an eager scan that fails to set the page all-frozen in the VM
+ * is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have similarly
+ * aged data, once vacuum fails to freeze vacuum_eager_scan_max_fails blocks in
+ * a region of size VACUUM_EAGER_SCAN_REGION_SIZE, it suspends eager scanning
+ * until it has progressed to another region of the table with potentially
+ * older data.
+ */
+extern PGDLLIMPORT int vacuum_eager_scan_max_fails;
+#define VACUUM_EAGER_SCAN_REGION_SIZE 4096
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..d9fe68f4d86 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,13 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * The maximum number of all-visible pages vacuum may scan and fail to
+	 * freeze before eager scanning is disabled for the current region of the
+	 * table. 0 if disabled, -1 if unspecified.
+	 */
+	int			vacuum_eager_scan_max_fails;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.45.2

#22Alena Rybakina
a.rybakina@postgrespro.ru
In reply to: Melanie Plageman (#20)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On 15.01.2025 23:09, Melanie Plageman wrote:

On Wed, Jan 15, 2025 at 12:08 PM Alena Rybakina
<a.rybakina@postgrespro.ru> wrote:

This is interesting, but I think it might belong as commentary in
vacuumparallel.c instead.

I added some description about it, I hope it is fine. I attached vacuum_description.diff

Alena, thanks again for your review. I pushed the part that we worked
on so far. I didn't end up adding in your proposed addition to
vacuumparallel.c. Honestly, I am not as familiar with the parallel
vacuuming code, so I wasn't sure what information rises to the level
of importance of being in the comment at the top of the file.

Yes, I see. ok)

--
Regards,
Alena Rybakina
Postgres Professional

#23Robert Treat
rob@xzilla.net
In reply to: Melanie Plageman (#21)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Wed, Jan 15, 2025 at 3:56 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Wed, Jan 15, 2025 at 3:03 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Wed, Jan 15, 2025 at 2:36 PM Marcos Pegoraro <marcos@f10.com.br> wrote:

There is a typo on committed vacuumlazy.c file
* If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
* phases II and II, cleaning up the dead tuples referenced in the current TID
* store. This empties the TID store resumes phase I.

Probably you meant phases II and III

Oops. Thanks for catching this. I'll fix that and the following
sentence in the main patch proposed in this thread to avoid extra
noise.

Attached v8 is rebased and has various comment cleanups.

Hey Melanie, took a walk through this version, some minor thoughts below.

--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9128,9 +9128,10 @@ COPY postgres_log FROM
'/full/path/to/logfile.csv' WITH csv;
         <command>VACUUM</command> may scan and fail to set all-frozen in the
         visibility map before disabling eager scanning until the next region
         (currently 4096 blocks) of the relation. A value of 0 disables eager
-        scanning altogether. The default is 128. This parameter can be set in
-        postgresql.conf or on the server command line but is overridden for
-        individual tables by changing the
+        scanning altogether. The default is 128. This parameter can only be set
+        in the <filename>postgresql.conf</filename> file or on the server
+        command line; but the setting can be overridden for individual tables
+        by changing the
         <link linkend="reloption-vacuum-eager-scan-max-fails">corresponding
table storage parameter</link>.
+        For more information see <xref linkend="vacuum-for-wraparound"/>.
        </para>
       </listitem>

The above aligns with the boiler plate text we usually use for these
types of settings, though typically we just link to the table
parameter section, but I left the direct link you included, since it
seems like a nice addition (I'm contemplating doing that for all such
params, but that should be done separately)

As a complete aside, I think we should re-order these sections to have
freezing first, then cost delay, then autovac stuff, since I feel like
most people learn about vacuum first, then build on that with
autovacuum, not to mention the general priority of managing
wraparound. Granted, that's not directly germane to eager scanning.

--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -638,9 +638,9 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
    <para>
-    <command>VACUUM</command> mostly scans pages that have been modified since
-    the last vacuum. Some all-visible but not all-frozen pages are eagerly
-    scanned to try and freeze them. But the
+    <command>VACUUM</command> typically scans pages that have been
modified since
+    the last vacuum. While some all-visible but not all-frozen pages
are eagerly
+    scanned to try and freeze them, the
     <structfield>relfrozenxid</structfield> can only be advanced when every
     page of the table that might contain unfrozen XIDs is scanned.  This

above is an attempt to make this wording less awkward.

wrt this portion of src/backend/access/heap/vacuumlazy.c
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is permanently disabled.
+ *
Maybe this is obvious enough to the reader, but should we change this
to something like "eager scanning is disabled for the remainder of
this vacuum" or similar? I guess I'm trying to make clear that it
isn't disabled "permanently" or until an aggressive vacuum run
completes or a vacuum freeze or some other scenario; we can/will eager
scan again essentially immediately if we just run vacuum again. (It
seems obvious in the actual code, just less so in the context of the
introductory wording)
And one last bit of overthinking... in src/backend/access/heap/vacuumlazy.c
+   if (vacrel->rel_pages < VACUUM_EAGER_SCAN_REGION_SIZE)
+       return;
It's easy to agree that anything less than the region size doesn't
make sense to eager scan, but I wondered about the "region_size +1"
scenario; essentially cases where we are not very much larger in total
than a single region, where it also feels like there isn't much gain
from eager scanning. Perhaps we should wait until 2x region size, in
which case we'd at least start in a scenario where the bucketing is
more equal?

Robert Treat
https://xzilla.net

#24Melanie Plageman
melanieplageman@gmail.com
In reply to: Robert Treat (#23)
1 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Sat, Jan 18, 2025 at 12:10 PM Robert Treat <rob@xzilla.net> wrote:

Hey Melanie, took a walk through this version, some minor thoughts below.

Thanks! Attached v9 incorporates all your suggested changes.

--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9128,9 +9128,10 @@ COPY postgres_log FROM
'/full/path/to/logfile.csv' WITH csv;
<command>VACUUM</command> may scan and fail to set all-frozen in the
visibility map before disabling eager scanning until the next region
(currently 4096 blocks) of the relation. A value of 0 disables eager
-        scanning altogether. The default is 128. This parameter can be set in
-        postgresql.conf or on the server command line but is overridden for
-        individual tables by changing the
+        scanning altogether. The default is 128. This parameter can only be set
+        in the <filename>postgresql.conf</filename> file or on the server
+        command line; but the setting can be overridden for individual tables
+        by changing the
<link linkend="reloption-vacuum-eager-scan-max-fails">corresponding
table storage parameter</link>.
+        For more information see <xref linkend="vacuum-for-wraparound"/>.
</para>
</listitem>

The above aligns with the boiler plate text we usually use for these
types of settings, though typically we just link to the table
parameter section, but I left the direct link you included, since it
seems like a nice addition (I'm contemplating doing that for all such
params, but that should be done separately)

I've made these suggested changes.

As a complete aside, I think we should re-order these sections to have
freezing first, then cost delay, then autovac stuff, since I feel like
most people learn about vacuum first, then build on that with
autovacuum, not to mention the general priority of managing
wraparound. Granted, that's not directly germane to eager scanning.

I could see that making sense.

--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -638,9 +638,9 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
</tip>
<para>
-    <command>VACUUM</command> mostly scans pages that have been modified since
-    the last vacuum. Some all-visible but not all-frozen pages are eagerly
-    scanned to try and freeze them. But the
+    <command>VACUUM</command> typically scans pages that have been
modified since
+    the last vacuum. While some all-visible but not all-frozen pages
are eagerly
+    scanned to try and freeze them, the
<structfield>relfrozenxid</structfield> can only be advanced when every
page of the table that might contain unfrozen XIDs is scanned.  This

above is an attempt to make this wording less awkward.

Thanks! I've adopted this wording.

wrt this portion of src/backend/access/heap/vacuumlazy.c
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is permanently disabled.
+ *
Maybe this is obvious enough to the reader, but should we change this
to something like "eager scanning is disabled for the remainder of
this vacuum" or similar? I guess I'm trying to make clear that it
isn't disabled "permanently" or until an aggressive vacuum run
completes or a vacuum freeze or some other scenario; we can/will eager
scan again essentially immediately if we just run vacuum again. (It
seems obvious in the actual code, just less so in the context of the
introductory wording)

Good point. I've changed this.

And one last bit of overthinking... in src/backend/access/heap/vacuumlazy.c
+   if (vacrel->rel_pages < VACUUM_EAGER_SCAN_REGION_SIZE)
+       return;
It's easy to agree that anything less than the region size doesn't
make sense to eager scan, but I wondered about the "region_size +1"
scenario; essentially cases where we are not very much larger in total
than a single region, where it also feels like there isn't much gain
from eager scanning. Perhaps we should wait until 2x region size, in
which case we'd at least start in a scenario where the bucketing is
more equal?

Good idea. Because we start somewhere randomly in the first region,
the whole first region isn't completely subject to the eager scan
algorithm anyway. I've changed it to 2x the region size.

Circling back to benchmarking, I've been running the most adversarial
benchmarks I could devise and can share a bit of what I've found.

I created a "hot tail" benchmark where 16 clients insert some data and
then update some data older than what they just inserted but still
towards the end of the relation. The adversarial part is that I bulk
delete all the data older than X hours where X hours is always after
the data is eligible to be frozen but before it would be aggressively
vacuumed.

That means that there are a bunch of pages that will never be frozen
on master but are frozen with the patch -- wasting vacuum resources. I
tuned vacuum_freeze_min_age and vacuum_freeze_table_age and picked the
DELETE window to specifically have this behavior.

With my patch, I do see a 15-20% increase in the total time spent
vacuuming over the course of the multi-hour benchmark. (I only see a
1% increase in the total WAL volume, though.)

Interestingly, I see an improvement to the bulk delete performance.
The deletes are much faster with the patch -- in fact DELETE p99
latency improves by over 30%. And, looking at pg_stat_io, it seems
that this must be due to far fewer reads by the delete (20% less time
spent in client backend bulkreads). I imagine this is because vacuum
has more recently read in those pages, so the DELETE finds them in the
kernel buffer cache.

Some of this is down to timing that varies run-to-run of the
benchmark. These numbers vary a bit depending on exactly when DELETEs
started, when checkpoints happen, and what blocks were updated (the
UPDATE uses a bit of randomness to decide what to update). And, of
course, on different machines with different amounts of memory, the
performance boost to the DELETEs is likely to disappear. So, we have
to assume that the extra time spent vacuuming comes with no benefit to
offset the cost in the worst case.

The question is, is this extra time spent vacuuming in the worst case
acceptable?

- Melanie

Attachments:

v9-0001-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchtext/x-patch; charset=US-ASCII; name=v9-0001-Eagerly-scan-all-visible-pages-to-amortize-aggres.patchDownload
From 3171aa3ac3380506c24c37c95ab21d8f3d10508d Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Wed, 22 Jan 2025 17:24:32 -0500
Subject: [PATCH v9] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Amortize the cost of an aggressive vacuum by eagerly scanning some
number of all-visible but not all-frozen pages during normal vacuums.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
considered successful eager scans and those not frozen are considered
failed eager scans.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager scanned
and frozen, eager scanning is disabled for the remainder of the vacuum
of the relation.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Robert Treat <rob@xzilla.net>
Reviewed-by: Bilal Yavuz <byavuz81@gmail.com>
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  24 ++
 doc/src/sgml/maintenance.sgml                 |  48 ++-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  13 +-
 src/backend/access/heap/vacuumlazy.c          | 389 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  13 +
 src/backend/postmaster/autovacuum.c           |   2 +
 src/backend/utils/misc/guc_tables.c           |   9 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/include/commands/vacuum.h                 |  23 ++
 src/include/utils/rel.h                       |   7 +
 11 files changed, 497 insertions(+), 47 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index a782f109982..ede134c19eb 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9117,6 +9117,30 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+      <term><varname>vacuum_eager_scan_max_fails</varname> (<type>integer</type>)
+      <indexterm>
+       <primary><varname>vacuum_eager_scan_max_fails</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum number of all-visible pages that
+        <command>VACUUM</command> may scan and fail to set all-frozen in
+        the visibility map before disabling eager scanning until the next
+        region (currently 4096 blocks) of the relation. A value of 0
+        disables eager scanning altogether. The default is 128. This
+        parameter can only be set in the
+        <filename>postgresql.conf</filename> file or on the server command
+        line; but the setting can be overridden for individual tables by
+        changing the
+        <link linkend="reloption-vacuum-eager-scan-max-fails">
+        corresponding table storage parameter</link>.
+        For more information see <xref linkend="vacuum-for-wraparound"/>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 0be90bdc7ef..7c1bce610e4 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -488,22 +488,34 @@
    </para>
 
    <para>
-    <command>VACUUM</command> uses the <link linkend="storage-vm">visibility map</link>
-    to determine which pages of a table must be scanned.  Normally, it
-    will skip pages that don't have any dead row versions even if those pages
+    <command>VACUUM</command> uses the <link linkend="storage-vm">visibility
+    map</link> to determine which pages of a table must be scanned.  Normally,
+    it may skip pages that don't have any dead row versions even if those pages
     might still have row versions with old XID values.  Therefore, normal
-    <command>VACUUM</command>s won't always freeze every old row version in the table.
-    When that happens, <command>VACUUM</command> will eventually need to perform an
-    <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
-    XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+    <command>VACUUM</command>s won't always freeze every old row version in the
+    table. When that happens, <command>VACUUM</command> will eventually need to
+    perform an <firstterm>aggressive vacuum</firstterm>, which will freeze all
+    eligible unfrozen XID and MXID values, including those from all-visible but
+    not all-frozen pages. If a table is building up a backlog of all-visible
+    but not all-frozen pages, a normal vacuum may choose to scan skippable
+    pages in an effort to freeze them. Doing so decreases the number of pages
+    the next aggressive vacuum must scan. These are referred to as
+    <firstterm>eagerly scanned</firstterm> pages. Eager scanning can be tuned
+    to scan and attempt to freeze more all-visible pages by increasing <xref
+    linkend="guc-vacuum-eager-scan-max-fails"/>. Even if eager scanning has
+    kept the number of all-visible but not all-frozen pages to a minimum, most
+    tables still require periodic aggressive vacuuming.
+   </para>
+
+   <para>
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
-    pages are scanned if the number of transactions that have passed since the
-    last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
+    controls when a table is aggressively vacuumed. All all-visible but
+    not all-frozen pages are scanned if the number of transactions that
+    have passed since the last such scan is greater than
+    <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
-    <varname>vacuum_freeze_table_age</varname> to 0 forces <command>VACUUM</command> to
-    always use its aggressive strategy.
+    <varname>vacuum_freeze_table_age</varname> to 0 forces
+    <command>VACUUM</command> to always use its aggressive strategy.
    </para>
 
    <para>
@@ -626,10 +638,12 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    <command>VACUUM</command> typically scans pages that have been
+    modified since the last vacuum. While some all-visible but not
+    all-frozen pages are eagerly scanned to try and freeze them, the
+    <structfield>relfrozenxid</structfield> can only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.
+    This happens when
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
     <command>VACUUM</command>'s <literal>FREEZE</literal> option is used, or when all
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2237321cb4f..679490e47aa 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1931,6 +1931,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+    <term><literal>vacuum_eager_scan_max_fails</literal>, <literal>toast.vacuum_eager_scan_max_fails</literal> (<type>integer</type>)
+    <indexterm>
+     <primary><varname>vacuum_eager_scan_max_fails</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-eager-scan-max-fails"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..daff9f1fa8d 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -27,6 +27,7 @@
 #include "catalog/pg_type.h"
 #include "commands/defrem.h"
 #include "commands/tablespace.h"
+#include "commands/vacuum.h"
 #include "nodes/makefuncs.h"
 #include "utils/array.h"
 #include "utils/attoptcache.h"
@@ -319,6 +320,14 @@ static relopt_int intRelOpts[] =
 		},
 		-1, -1, INT_MAX
 	},
+	{
+		{
+			"vacuum_eager_scan_max_fails",
+			"Maximum number of all-visible pages that vacuum will eagerly scan and fail to freeze before giving up on eager scanning until the next region",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		}, -1, 0, VACUUM_EAGER_SCAN_REGION_SIZE
+	},
 	{
 		{
 			"toast_tuple_target",
@@ -1880,7 +1889,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_eager_scan_max_fails", RELOPT_TYPE_INT,
+		offsetof(StdRdOptions, vacuum_eager_scan_max_fails)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 5b0e790e121..19d1381f997 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -17,9 +17,9 @@
  * failsafe mechanism has triggered (to avoid transaction ID wraparound),
  * vacuum may skip phases II and III.
  *
- * If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
- * phases II and II, cleaning up the dead tuples referenced in the current TID
- * store. This empties the TID store resumes phase I.
+ * If the TID store fills up in phase I, vacuum suspends phase I and proceeds
+ * to phases II and III, cleaning up the dead tuples referenced in the current
+ * TID store. This empties the TID store, allowing vacuum to resume phase I.
  *
  * In a way, the phases are more like states in a state machine, but they have
  * been referred to colloquially as phases for so long that they are referred
@@ -41,9 +41,47 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and various other requirements.
  *
- * When page skipping is not disabled, a non-aggressive vacuum may scan pages
- * that are marked all-visible (and even all-frozen) in the visibility map if
- * the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager scans to
+ * EAGER_SCAN_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is disabled for the remainder of the vacuum of the relation.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager scan failure cap.
+ * The failure count is reset for each region of the table -- comprised of
+ * VACUUM_EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_eager_scan_max_fails before suspending eager scanning until the end
+ * of the region. vacuum_eager_scan_max_fails is configurable both globally
+ * and per table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -100,6 +138,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -185,6 +224,15 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple normal vacuums,
+ * we limit the number of successful eager page scans. The maximum number of
+ * successful eager page scans is calculated as a ratio of the all-visible but
+ * not all-frozen pages at the beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -241,6 +289,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -282,9 +337,55 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eager scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a row suspends eager scanning. next_eager_scan_region_start
+	 * is the block number of the first block eligible for resumed eager
+	 * scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success limit,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning. When eager scanning is enabled, this is initialized to
+	 * EAGER_SCAN_SUCCESS_RATE of the total number of all-visible but not
+	 * all-frozen pages. For each eager scan success, this is decremented.
+	 * Once it hits 0, eager scanning is permanently disabled. It is
+	 * initialized to 0 if eager scanning starts out disabled (including for
+	 * aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * vacuum_eager_scan_max_fails each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
+
+	/*
+	 * The maximum number of blocks which may be eager scanned and not frozen
+	 * before eager scanning is temporarily suspended. This is configurable
+	 * both globally, via the vacuum_eager_scan_max_fails GUC, and per table,
+	 * with a table storage parameter of the same name. It is 0 when eager
+	 * scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -296,8 +397,10 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -305,7 +408,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -347,6 +450,124 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_before_cutoff = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->eager_scan_max_fails == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * Aggressively vacuuming a small relation shouldn't take long, so it
+	 * isn't worth amortizing. We use two times the region size as the size
+	 * cutoff because the eager scan start block is a random spot somewhere in
+	 * the first region, making the second region the first to be eager
+	 * scanned normally.
+	 */
+	if (vacrel->rel_pages < 2 * VACUUM_EAGER_SCAN_REGION_SIZE)
+		return;
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation. We can freeze tuples older
+	 * than the visibility horizon calculated at the beginning of vacuum, but
+	 * we are only guaranteed to freeze them if at least one tuple on the page
+	 * precedes the freeze limit or multixact cutoff (calculated from
+	 * vacuum_[multixact_]freeze_min_age). So, if the oldest unfrozen xid
+	 * (relfrozenxid/relminmxid) does not precede the freeze cutoff, we aren't
+	 * likely to freeze many tuples.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+									  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+									vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is EAGER_SCAN_SUCCESS_RATE of the number of all-visible
+	 * but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (EAGER_SCAN_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If every all-visible page is frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed %
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	Assert(params->eager_scan_max_fails > 0 &&
+		   params->eager_scan_max_fails <= VACUUM_EAGER_SCAN_REGION_SIZE);
+
+	vacrel->eager_scan_max_fails_per_region = params->eager_scan_max_fails;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager scan failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails = vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -475,6 +696,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -500,6 +722,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -518,11 +741,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -537,6 +765,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -731,12 +966,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eager scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -907,8 +1144,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -927,13 +1166,16 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
@@ -1061,7 +1303,45 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success limit, permanently disable eager
+					 * scanning by setting the other eager scan management
+					 * fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(INFO,
+							(errmsg("Vacuum successfully froze %u eager scanned blocks of \"%s.%s.%s\". Now disabling eager scanning.",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1161,7 +1441,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eager scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1171,13 +1453,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1250,6 +1535,9 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
+		if (*was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 		return true;
 	}
 }
@@ -1273,11 +1561,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1285,6 +1574,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += VACUUM_EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1317,24 +1619,34 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 		 * all-visible.  They may still skip all-frozen pages, which can't
 		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) != 0)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip all-visible pages that are not also
+		 * all-frozen. Normal vacuums with eager scanning enabled only skip
+		 * such pages if they have hit the failure limit for the current eager
+		 * scan region.
+		 */
+		if (vacrel->aggressive ||
+			vacrel->eager_scan_remaining_fails > 0)
+		{
+			if (!vacrel->aggressive)
+				next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1365,6 +1677,10 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because empty pages are always frozen and
+ * thus could never be eager scanned.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1504,6 +1820,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1512,7 +1832,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1664,11 +1985,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1756,6 +2083,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1763,7 +2091,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..eb3764de693 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+int			vacuum_eager_scan_max_fails;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/* Later we check if a reloption override was specified */
+	params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2169,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_eager_scan_max_fails table storage parameter was
+	 * specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails >= 0)
+		params->eager_scan_max_fails =
+			((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..1d5ab1c89bc 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+		/* Later we check reloptions for vacuum_eager_scan_max_fails override */
+		tab->at_params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index 38cb9e970d5..bbffadcaab8 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -2792,6 +2792,15 @@ struct config_int ConfigureNamesInt[] =
 		1600000000, 0, 2100000000,
 		NULL, NULL, NULL
 	},
+	{
+		{"vacuum_eager_scan_max_fails", PGC_USERSET, VACUUM_FREEZING,
+			gettext_noop("Maximum number of all-visible pages vacuum can eager scan and fail to freeze before suspending eager scanning until the next region of the table"),
+			NULL
+		},
+		&vacuum_eager_scan_max_fails,
+		128, 0, VACUUM_EAGER_SCAN_REGION_SIZE,
+		NULL, NULL, NULL
+	},
 
 	/*
 	 * See also CheckRequiredParameterValues() if this parameter changes
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 079efa1baa7..b1a98367d3b 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -698,6 +698,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_eager_scan_max_fails = 128 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..f1868be1bb7 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,14 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * The maximum number of all-visible pages that can be scanned and failed
+	 * to be set all-frozen before eager scanning is disabled for the current
+	 * region. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	uint32		eager_scan_max_fails;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +305,21 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may eagerly
+ * scan some all-visible but not all-frozen pages. Since the goal is to freeze
+ * these pages, an eager scan that fails to set the page all-frozen in the VM
+ * is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have similarly
+ * aged data, once vacuum fails to freeze vacuum_eager_scan_max_fails blocks in
+ * a region of size VACUUM_EAGER_SCAN_REGION_SIZE, it suspends eager scanning
+ * until it has progressed to another region of the table with potentially
+ * older data.
+ */
+extern PGDLLIMPORT int vacuum_eager_scan_max_fails;
+#define VACUUM_EAGER_SCAN_REGION_SIZE 4096
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..d9fe68f4d86 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,13 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * The maximum number of all-visible pages vacuum may scan and fail to
+	 * freeze before eager scanning is disabled for the current region of the
+	 * table. 0 if disabled, -1 if unspecified.
+	 */
+	int			vacuum_eager_scan_max_fails;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.34.1

#25Robert Haas
robertmhaas@gmail.com
In reply to: Melanie Plageman (#24)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Wed, Jan 22, 2025 at 5:48 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

Circling back to benchmarking, I've been running the most adversarial
benchmarks I could devise and can share a bit of what I've found.

I created a "hot tail" benchmark where 16 clients insert some data and
then update some data older than what they just inserted but still
towards the end of the relation. The adversarial part is that I bulk
delete all the data older than X hours where X hours is always after
the data is eligible to be frozen but before it would be aggressively
vacuumed.

That means that there are a bunch of pages that will never be frozen
on master but are frozen with the patch -- wasting vacuum resources. I
tuned vacuum_freeze_min_age and vacuum_freeze_table_age and picked the
DELETE window to specifically have this behavior.

With my patch, I do see a 15-20% increase in the total time spent
vacuuming over the course of the multi-hour benchmark. (I only see a
1% increase in the total WAL volume, though.)

How much time is that in absolute terms? If the benchmark runs for 3
hours and during that time we have 1 autovacuum worker active for 30
minutes out of those 3 hours, that is different than if we have 5
autovacuum workers active nearly all the time. Or, maybe a clearer way
to put it, what percentage of the total work was the VACUUM work? If
the total work was $100 and the VACUUM work accounted for $80 of that,
then a 15-20% increase is pretty significant; if the total work was
$100 and the VACUUM work accounted for $5 of that, then a 15-20%
increase matters a lot less.

But tentatively I'm inclined to say this is fine. Some of the work
that VACUUM is doing is probably work that otherwise would have needed
to happen in the foreground. For instance, the speedup in DELETEs that
you observed might be not only because the pages are cached but
perhaps also because DELETE doesn't need to do any non-trivial
visibility checks. Also, users don't have to anti-optimize their
configuration settings for their workload as you did when constructing
the adversarial case.

--
Robert Haas
EDB: http://www.enterprisedb.com

#26Robert Haas
robertmhaas@gmail.com
In reply to: Melanie Plageman (#24)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Wed, Jan 22, 2025 at 5:48 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

Thanks! Attached v9 incorporates all your suggested changes.

I'm not exactly sure what to do about it, but I feel like the
documentation of vacuum_eager_scan_max_fails is going to be
incomprehensible to someone who doesn't already have a deep knowledge
of how this patch works.

--
Robert Haas
EDB: http://www.enterprisedb.com

#27Robert Haas
robertmhaas@gmail.com
In reply to: Robert Haas (#26)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Thu, Jan 23, 2025 at 1:31 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Wed, Jan 22, 2025 at 5:48 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

Thanks! Attached v9 incorporates all your suggested changes.

I'm not exactly sure what to do about it, but I feel like the
documentation of vacuum_eager_scan_max_fails is going to be
incomprehensible to someone who doesn't already have a deep knowledge
of how this patch works.

[ hit "Send" WAY too early ]

There's a lot of magic numbers here: 4096 blocks per region, 128 fails
per region, some other number of successes per region. I don't know
why this particular one is configurable and none of the others are.
I'm not saying it's the wrong decision, but it's not clear to me what
the reasoning is.

Also, the units of this parameter are pretty terrible. Like, it could
be measured in some unit that involves bytes or kilobytes or
megabytes, or, maybe better, it could be measured as a percentage.
Instead of either of those things, it's an integer that only makes
sense in reference to another (hard-coded, magical) integer. If you
made this a percentage, then you wouldn't necessarily even have to
tell people that the magic internal number is 4096. Or at least that
knowledge would be a lot less critical.

+    <command>VACUUM</command> typically scans pages that have been
+    modified since the last vacuum. While some all-visible but not
+    all-frozen pages are eagerly scanned to try and freeze them, the
+    <structfield>relfrozenxid</structfield> can only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.

The phrase "While some all-visible but not all-frozen pages are
eagerly scanned to try and freeze them" seems odd here, because what
follows is true either way. This is like saying "When it's Tuesday, I
get hungry if I don't eat any food."

+ /*
+ * A normal vacuum that has failed to freeze too many eagerly scanned
+ * blocks in a row suspends eager scanning. next_eager_scan_region_start
+ * is the block number of the first block eligible for resumed eager
+ * scanning.
+ *
+ * When eager scanning is permanently disabled, either initially
+ * (including for aggressive vacuum) or due to hitting the success limit,
+ * this is set to InvalidBlockNumber.
+ */

This and the other comments for the new LVRelState members are quite
long, but I really like them. Arguably we ought to have more of this
kind of thing.

+ /*
+ * We only want to enable eager scanning if we are likely to be able to
+ * freeze some of the pages in the relation. We can freeze tuples older
+ * than the visibility horizon calculated at the beginning of vacuum, but
+ * we are only guaranteed to freeze them if at least one tuple on the page
+ * precedes the freeze limit or multixact cutoff (calculated from
+ * vacuum_[multixact_]freeze_min_age). So, if the oldest unfrozen xid
+ * (relfrozenxid/relminmxid) does not precede the freeze cutoff, we aren't
+ * likely to freeze many tuples.
+ */

I think this could be clearer. And I wonder if "We can freeze tuples
older" is actually a typo for "We can freeze tuples newer", because
otherwise I can't make sense of the rest of the sentence. Right now it
seems to boil down to something like: We can freeze tuples older...but
we are only guaranteed to freeze them if they are older.

Maybe what we want to say here is something like: We only want to
enable eager scanning if we are likely to be able to freeze some of
the pages in the relation. If FreezeLimit has not advanced past
relfrozenxid, or if MultiXactCutoff has not advanced passed
relminmxid, then there's a good chance we won't be able to freeze
anything more than we already have. Success would not be impossible,
because there may be pages we didn't try to freeze previously, and
it's also possible that some XID greater than FreezeLimit has ended,
allowing for freezing. But as a heuristic, we wait until the
FreezeLimit advances, so that we won't repeatedly attempt eager
freezing while the same long-running transaction blocks progress every
time.

+ ereport(INFO,
+ (errmsg("Vacuum successfully froze %u eager scanned blocks of
\"%s.%s.%s\". Now disabling eager scanning.",

I predict that if Tom sees this, you will get complaints about both
the wording of the message, which pretty clearly does not conform to
style guidelines for a primary error message, and also about the use
of the INFO level. Allow me to suggest DEBUG1 or DEBUG2 and "disabling
eager scanning after freezing %u eagerly scanned blocks".

+ /*
+ * Aggressive vacuums cannot skip all-visible pages that are not also
+ * all-frozen. Normal vacuums with eager scanning enabled only skip
+ * such pages if they have hit the failure limit for the current eager
+ * scan region.
+ */
+ if (vacrel->aggressive ||
+ vacrel->eager_scan_remaining_fails > 0)
+ {
+ if (!vacrel->aggressive)
+ next_unskippable_eager_scanned = true;
+ break;
  }

I think this would be clearer as two separate if statements. if
(aggressive) break; if (vacrel->eager_scan_remaining_fails) {
next_unskippable_eager_scanned = true; break; }

--
Robert Haas
EDB: http://www.enterprisedb.com

#28Melanie Plageman
melanieplageman@gmail.com
In reply to: Robert Haas (#25)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Thu, Jan 23, 2025 at 12:16 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Wed, Jan 22, 2025 at 5:48 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

Circling back to benchmarking, I've been running the most adversarial
benchmarks I could devise and can share a bit of what I've found.

I created a "hot tail" benchmark where 16 clients insert some data and
then update some data older than what they just inserted but still
towards the end of the relation. The adversarial part is that I bulk
delete all the data older than X hours where X hours is always after
the data is eligible to be frozen but before it would be aggressively
vacuumed.

That means that there are a bunch of pages that will never be frozen
on master but are frozen with the patch -- wasting vacuum resources. I
tuned vacuum_freeze_min_age and vacuum_freeze_table_age and picked the
DELETE window to specifically have this behavior.

With my patch, I do see a 15-20% increase in the total time spent
vacuuming over the course of the multi-hour benchmark. (I only see a
1% increase in the total WAL volume, though.)

How much time is that in absolute terms? If the benchmark runs for 3
hours and during that time we have 1 autovacuum worker active for 30
minutes out of those 3 hours, that is different than if we have 5
autovacuum workers active nearly all the time. Or, maybe a clearer way
to put it, what percentage of the total work was the VACUUM work? If
the total work was $100 and the VACUUM work accounted for $80 of that,
then a 15-20% increase is pretty significant; if the total work was
$100 and the VACUUM work accounted for $5 of that, then a 15-20%
increase matters a lot less.

So, in this case, there is only one table in question, so 1 autovacuum
worker (and up to 2 maintenance parallel workers for index vacuuming).
The duration I provided is just the absolute duration from start of
vacuum to finish -- not considering the amount of time each parallel
worker may have been working (also it includes time spent delaying).
The benchmark ran for 2.8 hours. I configured vacuum to run
frequently. In this case, master spent 47% of the total time vacuuming
and the patch spent 56%.

There was a fair amount of run-to-run variance which is down to vacuum
and checkpoint timing. Andres suggested off-list that I rerun the
benchmarks with checksums and FPIs disabled to remove some of this
variation. That, of course, won't give accurate total time numbers but
it should make the proportional increase more stable. I'll share some
results once I've done this.

But tentatively I'm inclined to say this is fine.

Inherent in frontloading work is wasting it if it turns out the work
is unneeded. Unneeded work is from one of two sources 1) we failed to
freeze the page or 2) we succeed in freezing the page but then the
page is unfrozen before the next aggressive vacuum. Avoiding 1 would
require knowledge about the distribution of page ages throughout the
relation that we decided was too expensive to get and store. Avoiding
2 would require prescience about the future of the workload. We found
building and storing a model to make predictions like that too
complicated, error-prone, and expensive.

I think your algorithm is the best we can do if we won't do either 1
or 2. If this general kind of algorithm is the best we can do, then
the only levers we have are changing the caps for success and failure
or changing when we try to eager scan. I suspect the latter won't make
much of a difference (i.e. some ways will work better for some
workloads and worse for others). For the former, we have choices about
what we make configurable (e.g. success, failure, region size). As for
choosing the defaults, I did some experimentation, and it went pretty
much as expected -- raising the failure cap or success cap results in
more unneeded work and lowering it results in less. There are some
workloads where there is a perfect point which results in the least
unneeded work for the most benefit -- but that point is totally
different for different workloads and configurations of Postgres.

Some of the work
that VACUUM is doing is probably work that otherwise would have needed
to happen in the foreground. For instance, the speedup in DELETEs that
you observed might be not only because the pages are cached but
perhaps also because DELETE doesn't need to do any non-trivial
visibility checks. Also, users don't have to anti-optimize their
configuration settings for their workload as you did when constructing
the adversarial case.

Yes, like I hope users won't tune their vacuum_freeze_min_age very low
if they are going to delete all data older than an hour. The
benchmarks were mostly to look for unexpected interactions -- of which
the DELETE performance was one. But other things, like a massive
increase in WAL volume did not happen.

- Melanie

#29Robert Haas
robertmhaas@gmail.com
In reply to: Melanie Plageman (#28)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Fri, Jan 24, 2025 at 9:15 AM Melanie Plageman
<melanieplageman@gmail.com> wrote:

So, in this case, there is only one table in question, so 1 autovacuum
worker (and up to 2 maintenance parallel workers for index vacuuming).
The duration I provided is just the absolute duration from start of
vacuum to finish -- not considering the amount of time each parallel
worker may have been working (also it includes time spent delaying).
The benchmark ran for 2.8 hours. I configured vacuum to run
frequently. In this case, master spent 47% of the total time vacuuming
and the patch spent 56%.

Definitely not insignificant, but I think it's OK for a worst case.
Autovacuum is a background process, so it's not like a 20% regression
on query performance.

Inherent in frontloading work is wasting it if it turns out the work
is unneeded. Unneeded work is from one of two sources 1) we failed to
freeze the page or 2) we succeed in freezing the page but then the
page is unfrozen before the next aggressive vacuum. Avoiding 1 would
require knowledge about the distribution of page ages throughout the
relation that we decided was too expensive to get and store. Avoiding
2 would require prescience about the future of the workload. We found
building and storing a model to make predictions like that too
complicated, error-prone, and expensive.

Well, the algorithm has guards against doing too much of (1). I think
that's really important. One of the really bad things about the AV
algorithm in general is that it will happily keep retrying VACUUM on
tables where there's no chance of removing any more tuples because no
relevant transactions have ended since the last time we vacuumed. But
this patch stops trying to do the thing that it does if we see that it
isn't working out -- and the thresholds are pretty tight. We could
make them even tighter, but it's already the case, I think, that after
a pretty modest amount of not freezing things, we stop trying to
freeze things.

As far as (2) goes, I'm open to the idea that this can be further
improved in the future, but I believe it will be really hard to do
better than looking at the time since last modification. The model you
proposed needed a fairly large amount of new statistics, and it still
couldn't handle something as simple as "half of the pages are modified
after X amount of time, and the other and are modified after X+Y
amount of time". I think what we'd really want to be able to make good
predictions is to look at a Fourier transform of the
inter-modification times -- but that would require even more detailed
data than you were gathering, and that was already pushing the limits
of what was realistic.

In short, I feel like this algorithm is more vulnerable to (2) than
(1), but I agree that we can't do much better right now. It will be
interesting to see what users think of the results, assuming this does
go forward. My intuition is that large amounts of VACUUM work that
happen when an aggressive VACUUM is triggered are so much more painful
for users than an ordinary non-aggressive VACUUM being a bit more
expensive that this should be a win overall even if the total effort
expended is a bit greater than now -- but my intuition is sometimes
wrong. I don't think we're going to find out without something being
committed, though.

--
Robert Haas
EDB: http://www.enterprisedb.com

#30Melanie Plageman
melanieplageman@gmail.com
In reply to: Robert Haas (#27)
1 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Thanks for the review! Attached v10 addresses the review feedback
except that about the GUC/table option meaning and format.

On Thu, Jan 23, 2025 at 2:22 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Thu, Jan 23, 2025 at 1:31 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Wed, Jan 22, 2025 at 5:48 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

Thanks! Attached v9 incorporates all your suggested changes.

I'm not exactly sure what to do about it, but I feel like the
documentation of vacuum_eager_scan_max_fails is going to be
incomprehensible to someone who doesn't already have a deep knowledge
of how this patch works.

There's a lot of magic numbers here: 4096 blocks per region, 128 fails
per region, some other number of successes per region. I don't know
why this particular one is configurable and none of the others are.
I'm not saying it's the wrong decision, but it's not clear to me what
the reasoning is.

The reasoning for making the delete cap configurable and not the
success cap is that it made more sense to me to configure your failure
tolerance and not your success tolerance. If you make the success cap
configurable, you can end up scanning and failing to freeze just as
many pages when it is 0 as when it is 100.

This thought exercise made me realize something is wrong with my
current patch, though. If you set the failure tolerance
(vacuum_eager_scan_max_fails) to 0 right now, it disables eager
scanning altogether. That might be unexpected. You would probably
expect setting that to 0 to still allow eager scanning if it is only
succeeding. That made me think that perhaps I should have a -1 value
that disables eager scanning altogether and 0 just sets the failure
tolerance to 0.

I don't think the region size should be configurable because it is
unclear how you might tune that based on your workload to get
different results. We knew we wanted some kind of retry interval, so
we picked one that seemed reasonable.

Also, the units of this parameter are pretty terrible. Like, it could
be measured in some unit that involves bytes or kilobytes or
megabytes, or, maybe better, it could be measured as a percentage.
Instead of either of those things, it's an integer that only makes
sense in reference to another (hard-coded, magical) integer. If you
made this a percentage, then you wouldn't necessarily even have to
tell people that the magic internal number is 4096. Or at least that
knowledge would be a lot less critical.

I think you're right. I would go with a percentage. I don't see many
other GUCs that are percents. What would you call it? Perhaps
vacuum_eager_scan_fail_threshold? The % of the blocks in the table
vacuum may scan and fail to freeze.

There is an issue I see with making it a percentage. The current
default vacuum_eager_scan_max_fails is 128 out of 4096. That means you
are allowed to scan about 3% of the blocks in the table even if you
fail to freeze every one. I don't think there are very many reasonable
values above 256, personally. So, it might be weird to add a
percentage GUC value with only very low acceptable values. Part of
this is that we are not making the success cap configurable, so that
means that you might have lots of extra I/O if you are both failing
and succeeding. Someone configuring this GUC might think this is
controlling the amount of extra I/O they are incurring.

Note attached v10 does not change the GUC. I thought I would wait for
additional discussion.

+    <command>VACUUM</command> typically scans pages that have been
+    modified since the last vacuum. While some all-visible but not
+    all-frozen pages are eagerly scanned to try and freeze them, the
+    <structfield>relfrozenxid</structfield> can only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.

The phrase "While some all-visible but not all-frozen pages are
eagerly scanned to try and freeze them" seems odd here, because what
follows is true either way. This is like saying "When it's Tuesday, I
get hungry if I don't eat any food."

The while was meant to contrast the sentence before it about typically
only scanning pages that have been modified since the previous vacuum.
But, I see how that didn't work out for me. How about this:

"""
<command>VACUUM</command> typically scans pages that have been
modified since the last vacuum. However, some all-visible but not
all-frozen pages are eagerly scanned to try and freeze them. Note that
the <structfield>relfrozenxid</structfield> can only be advanced when
every page of the table that might contain unfrozen XIDs is scanned.
"""

I know the last sentence seems a bit unrelated to the sentence before
it. But I am trying to contrast the three situations. Most of the
pages vacuum scanned are ones that have been modified since the
previous vacuum. Some of them might be unmodified and we are scanning
them because we want to freeze them. But, we also need to advance the
relfrozenxid, so occasionally a large number of the pages that we scan
might be unmodified.

+ /*
+ * We only want to enable eager scanning if we are likely to be able to
+ * freeze some of the pages in the relation. We can freeze tuples older
+ * than the visibility horizon calculated at the beginning of vacuum, but
+ * we are only guaranteed to freeze them if at least one tuple on the page
+ * precedes the freeze limit or multixact cutoff (calculated from
+ * vacuum_[multixact_]freeze_min_age). So, if the oldest unfrozen xid
+ * (relfrozenxid/relminmxid) does not precede the freeze cutoff, we aren't
+ * likely to freeze many tuples.
+ */

I think this could be clearer. And I wonder if "We can freeze tuples
older" is actually a typo for "We can freeze tuples newer", because
otherwise I can't make sense of the rest of the sentence. Right now it
seems to boil down to something like: We can freeze tuples older...but
we are only guaranteed to freeze them if they are older.

I was trying to contrast opportunistic freezing with "guaranteed
freezing". I was trying to say that we can freeze tuples older than
FreezeLimit but we are only guaranteed to freeze tuples older than
OldestXmin.

Maybe what we want to say here is something like: We only want to
enable eager scanning if we are likely to be able to freeze some of
the pages in the relation. If FreezeLimit has not advanced past
relfrozenxid, or if MultiXactCutoff has not advanced passed
relminmxid, then there's a good chance we won't be able to freeze
anything more than we already have. Success would not be impossible,
because there may be pages we didn't try to freeze previously, and
it's also possible that some XID greater than FreezeLimit has ended,
allowing for freezing. But as a heuristic, we wait until the
FreezeLimit advances, so that we won't repeatedly attempt eager
freezing while the same long-running transaction blocks progress every
time.

I rewrote the comment using some of your input and trying to clarify
my initial point about opportunistic vs guaranteed freezing.

"""
If FreezeLimit has not advanced past the relfrozenxid or
MultiXactCutoff has not advanced past relminmxid, we are unlikely to
be able to freeze anything new.
Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
are technically freezable, but we won't freeze them unless some other
criteria for opportunistic freezing is met.
It is also possible than a transaction newer than the FreezeLimit has
ended, rendering additional tuples freezable.
As a heuristic, however, it makes sense to wait until the FreezeLimit
or MultiXactCutoff has advanced before eager scanning.
"""

+ ereport(INFO,
+ (errmsg("Vacuum successfully froze %u eager scanned blocks of
\"%s.%s.%s\". Now disabling eager scanning.",

I predict that if Tom sees this, you will get complaints about both
the wording of the message, which pretty clearly does not conform to
style guidelines for a primary error message, and also about the use
of the INFO level. Allow me to suggest DEBUG1 or DEBUG2 and "disabling
eager scanning after freezing %u eagerly scanned blocks".

I've used your wording. Just for future reference, are the style
guidelines I was violating the capitalization and punctuation? Are
these documented somewhere? Also, what is a primary error message?
INFO level? Or ones that use ereport and are translated? I looked at
other messages and saw that they don't capitalize the first word or
use punctuation, so I assume that those were problems.

+ /*
+ * Aggressive vacuums cannot skip all-visible pages that are not also
+ * all-frozen. Normal vacuums with eager scanning enabled only skip
+ * such pages if they have hit the failure limit for the current eager
+ * scan region.
+ */
+ if (vacrel->aggressive ||
+ vacrel->eager_scan_remaining_fails > 0)
+ {
+ if (!vacrel->aggressive)
+ next_unskippable_eager_scanned = true;
+ break;
}

I think this would be clearer as two separate if statements. if
(aggressive) break; if (vacrel->eager_scan_remaining_fails) {
next_unskippable_eager_scanned = true; break; }

Very true. Fixed.

- Melanie

Attachments:

v10-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchapplication/octet-stream; name=v10-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchDownload
From 45c49a5432e929a8a7c35d280d60def7419c4f7c Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Wed, 22 Jan 2025 17:24:32 -0500
Subject: [PATCH v10] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Amortize the cost of an aggressive vacuum by eagerly scanning some
number of all-visible but not all-frozen pages during normal vacuums.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
considered successful eager scans and those not frozen are considered
failed eager scans.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager scanned
and frozen, eager scanning is disabled for the remainder of the vacuum
of the relation.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Robert Treat <rob@xzilla.net>
Reviewed-by: Bilal Yavuz <byavuz81@gmail.com>
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  24 ++
 doc/src/sgml/maintenance.sgml                 |  48 ++-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  13 +-
 src/backend/access/heap/vacuumlazy.c          | 404 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  13 +
 src/backend/postmaster/autovacuum.c           |   2 +
 src/backend/utils/misc/guc_tables.c           |   9 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/include/commands/vacuum.h                 |  23 +
 src/include/utils/rel.h                       |   7 +
 11 files changed, 509 insertions(+), 50 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index a782f109982..ede134c19eb 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9117,6 +9117,30 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+      <term><varname>vacuum_eager_scan_max_fails</varname> (<type>integer</type>)
+      <indexterm>
+       <primary><varname>vacuum_eager_scan_max_fails</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum number of all-visible pages that
+        <command>VACUUM</command> may scan and fail to set all-frozen in
+        the visibility map before disabling eager scanning until the next
+        region (currently 4096 blocks) of the relation. A value of 0
+        disables eager scanning altogether. The default is 128. This
+        parameter can only be set in the
+        <filename>postgresql.conf</filename> file or on the server command
+        line; but the setting can be overridden for individual tables by
+        changing the
+        <link linkend="reloption-vacuum-eager-scan-max-fails">
+        corresponding table storage parameter</link>.
+        For more information see <xref linkend="vacuum-for-wraparound"/>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 0be90bdc7ef..e0eee067f8f 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -488,22 +488,34 @@
    </para>
 
    <para>
-    <command>VACUUM</command> uses the <link linkend="storage-vm">visibility map</link>
-    to determine which pages of a table must be scanned.  Normally, it
-    will skip pages that don't have any dead row versions even if those pages
+    <command>VACUUM</command> uses the <link linkend="storage-vm">visibility
+    map</link> to determine which pages of a table must be scanned.  Normally,
+    it may skip pages that don't have any dead row versions even if those pages
     might still have row versions with old XID values.  Therefore, normal
-    <command>VACUUM</command>s won't always freeze every old row version in the table.
-    When that happens, <command>VACUUM</command> will eventually need to perform an
-    <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
-    XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+    <command>VACUUM</command>s won't always freeze every old row version in the
+    table. When that happens, <command>VACUUM</command> will eventually need to
+    perform an <firstterm>aggressive vacuum</firstterm>, which will freeze all
+    eligible unfrozen XID and MXID values, including those from all-visible but
+    not all-frozen pages. If a table is building up a backlog of all-visible
+    but not all-frozen pages, a normal vacuum may choose to scan skippable
+    pages in an effort to freeze them. Doing so decreases the number of pages
+    the next aggressive vacuum must scan. These are referred to as
+    <firstterm>eagerly scanned</firstterm> pages. Eager scanning can be tuned
+    to scan and attempt to freeze more all-visible pages by increasing <xref
+    linkend="guc-vacuum-eager-scan-max-fails"/>. Even if eager scanning has
+    kept the number of all-visible but not all-frozen pages to a minimum, most
+    tables still require periodic aggressive vacuuming.
+   </para>
+
+   <para>
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
-    pages are scanned if the number of transactions that have passed since the
-    last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
+    controls when a table is aggressively vacuumed. All all-visible but
+    not all-frozen pages are scanned if the number of transactions that
+    have passed since the last such scan is greater than
+    <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
-    <varname>vacuum_freeze_table_age</varname> to 0 forces <command>VACUUM</command> to
-    always use its aggressive strategy.
+    <varname>vacuum_freeze_table_age</varname> to 0 forces
+    <command>VACUUM</command> to always use its aggressive strategy.
    </para>
 
    <para>
@@ -626,10 +638,12 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    <command>VACUUM</command> typically scans pages that have been modified
+    since the last vacuum. However, some all-visible but not all-frozen pages
+    are eagerly scanned to try and freeze them. Note that the
+    <structfield>relfrozenxid</structfield> can only be advanced when every
+    page of the table that might contain unfrozen XIDs is scanned.
+    This happens when the
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
     <command>VACUUM</command>'s <literal>FREEZE</literal> option is used, or when all
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2237321cb4f..679490e47aa 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1931,6 +1931,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-eager-scan-max-fails" xreflabel="vacuum_eager_scan_max_fails">
+    <term><literal>vacuum_eager_scan_max_fails</literal>, <literal>toast.vacuum_eager_scan_max_fails</literal> (<type>integer</type>)
+    <indexterm>
+     <primary><varname>vacuum_eager_scan_max_fails</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-eager-scan-max-fails"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..daff9f1fa8d 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -27,6 +27,7 @@
 #include "catalog/pg_type.h"
 #include "commands/defrem.h"
 #include "commands/tablespace.h"
+#include "commands/vacuum.h"
 #include "nodes/makefuncs.h"
 #include "utils/array.h"
 #include "utils/attoptcache.h"
@@ -319,6 +320,14 @@ static relopt_int intRelOpts[] =
 		},
 		-1, -1, INT_MAX
 	},
+	{
+		{
+			"vacuum_eager_scan_max_fails",
+			"Maximum number of all-visible pages that vacuum will eagerly scan and fail to freeze before giving up on eager scanning until the next region",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		}, -1, 0, VACUUM_EAGER_SCAN_REGION_SIZE
+	},
 	{
 		{
 			"toast_tuple_target",
@@ -1880,7 +1889,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_eager_scan_max_fails", RELOPT_TYPE_INT,
+		offsetof(StdRdOptions, vacuum_eager_scan_max_fails)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 5b0e790e121..8e807473183 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -17,9 +17,9 @@
  * failsafe mechanism has triggered (to avoid transaction ID wraparound),
  * vacuum may skip phases II and III.
  *
- * If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
- * phases II and II, cleaning up the dead tuples referenced in the current TID
- * store. This empties the TID store resumes phase I.
+ * If the TID store fills up in phase I, vacuum suspends phase I and proceeds
+ * to phases II and III, cleaning up the dead tuples referenced in the current
+ * TID store. This empties the TID store, allowing vacuum to resume phase I.
  *
  * In a way, the phases are more like states in a state machine, but they have
  * been referred to colloquially as phases for so long that they are referred
@@ -41,9 +41,47 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and various other requirements.
  *
- * When page skipping is not disabled, a non-aggressive vacuum may scan pages
- * that are marked all-visible (and even all-frozen) in the visibility map if
- * the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager scans to
+ * EAGER_SCAN_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is disabled for the remainder of the vacuum of the relation.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager scan failure cap.
+ * The failure count is reset for each region of the table -- comprised of
+ * VACUUM_EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_eager_scan_max_fails before suspending eager scanning until the end
+ * of the region. vacuum_eager_scan_max_fails is configurable both globally
+ * and per table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -100,6 +138,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -185,6 +224,15 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out eager scanning across multiple normal vacuums,
+ * we limit the number of successful eager page scans. The maximum number of
+ * successful eager page scans is calculated as a ratio of the all-visible but
+ * not all-frozen pages at the beginning of the vacuum.
+ */
+#define EAGER_SCAN_SUCCESS_RATE 0.2
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -241,6 +289,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -282,9 +337,55 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eagerly scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a row suspends eager scanning. next_eager_scan_region_start
+	 * is the block number of the first block eligible for resumed eager
+	 * scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success limit,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning. When eager scanning is enabled, this is initialized to
+	 * EAGER_SCAN_SUCCESS_RATE of the total number of all-visible but not
+	 * all-frozen pages. For each eager scan success, this is decremented.
+	 * Once it hits 0, eager scanning is permanently disabled. It is
+	 * initialized to 0 if eager scanning starts out disabled (including for
+	 * aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * vacuum_eager_scan_max_fails each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
+
+	/*
+	 * The maximum number of blocks which may be eagerly scanned and not frozen
+	 * before eager scanning is temporarily suspended. This is configurable
+	 * both globally, via the vacuum_eager_scan_max_fails GUC, and per table,
+	 * with a table storage parameter of the same name. It is 0 when eager
+	 * scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -296,8 +397,10 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -305,7 +408,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -347,6 +450,130 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_before_cutoff = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->eager_scan_max_fails == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * Aggressively vacuuming a small relation shouldn't take long, so it
+	 * isn't worth amortizing. We use two times the region size as the size
+	 * cutoff because the eager scan start block is a random spot somewhere in
+	 * the first region, making the second region the first to be eager
+	 * scanned normally.
+	 */
+	if (vacrel->rel_pages < 2 * VACUUM_EAGER_SCAN_REGION_SIZE)
+		return;
+
+	/*
+	 * If FreezeLimit has not advanced past the relfrozenxid or
+	 * MultiXactCutoff has not advanced past relminmxid, we are unlikely to be
+	 * able to freeze anything new.
+	 *
+	 * Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
+	 * are technically freezable, but we won't freeze them unless some other
+	 * criteria for opportunistic freezing is met.
+	 *
+	 * It is also possible than a transaction newer than the
+	 * FreezeLimit/MultiXactCutoff has ended, rendering additional tuples
+	 * freezable.
+	 *
+	 * As a heuristic, however, it makes sense to wait until the FreezeLimit
+	 * or MultiXactCutoff has advanced before eager scanning.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+									  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+									vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is EAGER_SCAN_SUCCESS_RATE of the number of all-visible
+	 * but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (EAGER_SCAN_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If every all-visible page is frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed %
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	Assert(params->eager_scan_max_fails > 0 &&
+		   params->eager_scan_max_fails <= VACUUM_EAGER_SCAN_REGION_SIZE);
+
+	vacrel->eager_scan_max_fails_per_region = params->eager_scan_max_fails;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager scan failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		VACUUM_EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails = vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -475,6 +702,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -500,6 +728,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -518,11 +747,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -537,6 +771,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -731,12 +972,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eagerly scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -907,8 +1150,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -927,13 +1172,16 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
@@ -1061,7 +1309,45 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success limit, permanently disable eager
+					 * scanning by setting the other eager scan management
+					 * fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(DEBUG1,
+							(errmsg("disabling eager scanning after freezing %u eagerly scanned blocks of \"%s.%s.%s\"",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1161,7 +1447,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eagerly scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1171,13 +1459,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1250,6 +1541,9 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
+		if (*was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 		return true;
 	}
 }
@@ -1273,11 +1567,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1285,6 +1580,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += VACUUM_EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1313,28 +1621,41 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 			break;
 
 		/*
-		 * Aggressive VACUUM caller can't skip pages just because they are
-		 * all-visible.  They may still skip all-frozen pages, which can't
-		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
+		 * All-frozen pages cannot contain XIDs < OldestXmin (XIDs that aren't
+		 * already frozen by now), so this page can be skipped.
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) != 0)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip any all-visible pages that are not
+		 * also all-frozen.
+		 */
+		if (vacrel->aggressive)
+			break;
+
+		/*
+		 * Normal vacuums with eager scanning enabled only skip all-visible
+		 * but not all-frozen pages if they have hit the failure limit for the
+		 * current eager scan region.
+		 */
+		if (vacrel->eager_scan_remaining_fails > 0)
+		{
+			next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1365,6 +1686,10 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because empty pages are always frozen and
+ * thus could never be eagerly scanned.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1504,6 +1829,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1512,7 +1841,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1664,11 +1994,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1756,6 +2092,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1763,7 +2100,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..eb3764de693 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+int			vacuum_eager_scan_max_fails;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/* Later we check if a reloption override was specified */
+	params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2169,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_eager_scan_max_fails table storage parameter was
+	 * specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails >= 0)
+		params->eager_scan_max_fails =
+			((StdRdOptions *) rel->rd_options)->vacuum_eager_scan_max_fails;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..1d5ab1c89bc 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+		/* Later we check reloptions for vacuum_eager_scan_max_fails override */
+		tab->at_params.eager_scan_max_fails = vacuum_eager_scan_max_fails;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index 38cb9e970d5..bbffadcaab8 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -2792,6 +2792,15 @@ struct config_int ConfigureNamesInt[] =
 		1600000000, 0, 2100000000,
 		NULL, NULL, NULL
 	},
+	{
+		{"vacuum_eager_scan_max_fails", PGC_USERSET, VACUUM_FREEZING,
+			gettext_noop("Maximum number of all-visible pages vacuum can eager scan and fail to freeze before suspending eager scanning until the next region of the table"),
+			NULL
+		},
+		&vacuum_eager_scan_max_fails,
+		128, 0, VACUUM_EAGER_SCAN_REGION_SIZE,
+		NULL, NULL, NULL
+	},
 
 	/*
 	 * See also CheckRequiredParameterValues() if this parameter changes
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 079efa1baa7..b1a98367d3b 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -698,6 +698,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_eager_scan_max_fails = 128 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..f1868be1bb7 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,14 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * The maximum number of all-visible pages that can be scanned and failed
+	 * to be set all-frozen before eager scanning is disabled for the current
+	 * region. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	uint32		eager_scan_max_fails;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +305,21 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may eagerly
+ * scan some all-visible but not all-frozen pages. Since the goal is to freeze
+ * these pages, an eager scan that fails to set the page all-frozen in the VM
+ * is considered to have "failed".
+ *
+ * On the assumption that different regions of the table tend to have similarly
+ * aged data, once vacuum fails to freeze vacuum_eager_scan_max_fails blocks in
+ * a region of size VACUUM_EAGER_SCAN_REGION_SIZE, it suspends eager scanning
+ * until it has progressed to another region of the table with potentially
+ * older data.
+ */
+extern PGDLLIMPORT int vacuum_eager_scan_max_fails;
+#define VACUUM_EAGER_SCAN_REGION_SIZE 4096
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..d9fe68f4d86 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,13 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * The maximum number of all-visible pages vacuum may scan and fail to
+	 * freeze before eager scanning is disabled for the current region of the
+	 * table. 0 if disabled, -1 if unspecified.
+	 */
+	int			vacuum_eager_scan_max_fails;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.45.2

#31Robert Haas
robertmhaas@gmail.com
In reply to: Melanie Plageman (#30)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Fri, Jan 24, 2025 at 3:02 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

This thought exercise made me realize something is wrong with my
current patch, though. If you set the failure tolerance
(vacuum_eager_scan_max_fails) to 0 right now, it disables eager
scanning altogether. That might be unexpected. You would probably
expect setting that to 0 to still allow eager scanning if it is only
succeeding. That made me think that perhaps I should have a -1 value
that disables eager scanning altogether and 0 just sets the failure
tolerance to 0.

I would not expect that. I would expect setting a value of N to mean
"try until we have N failures". "Try until you have 0 failures" is
logically equivalent to "don't try".

I think you're right. I would go with a percentage. I don't see many
other GUCs that are percents. What would you call it? Perhaps
vacuum_eager_scan_fail_threshold? The % of the blocks in the table
vacuum may scan and fail to freeze.

There is an issue I see with making it a percentage. The current
default vacuum_eager_scan_max_fails is 128 out of 4096. That means you
are allowed to scan about 3% of the blocks in the table even if you
fail to freeze every one. I don't think there are very many reasonable
values above 256, personally. So, it might be weird to add a
percentage GUC value with only very low acceptable values. Part of
this is that we are not making the success cap configurable, so that
means that you might have lots of extra I/O if you are both failing
and succeeding. Someone configuring this GUC might think this is
controlling the amount of extra I/O they are incurring.

Why would it be unreasonable to set this value to 25% or even 100%? I
grant that it doesn't sound like the most prudent possible value, but
if I'm willing to fritter away my VACUUM resources to have the best
possible chance of eagerly freezing stuff, isn't that up to me? I
think setting this value to 100% would be WAY less damaging than
work_mem='1TB' or autovacuum_naptime='7d', both of which are allowed.
In fact, setting this to 100% could theoretically have no negative
consequences at all, if it so happens that no freeze failures occur.
Couldn't it even be a win, if freeze failures are common but
minimizing the impact of aggressive vacuum is of overwhelming
importance?

Looking at ConfigureNamesReal[], some existing words we use to talk
about real-valued GUCs include: cost, fraction, factor, bias,
multiplier, target, rate. Of those, I like "fraction" and "rate" best
here, because they imply a range of 0-1 rather than anything broader.
vacuum_max_eager_freeze_failure_rate? Kinda long...

The while was meant to contrast the sentence before it about typically
only scanning pages that have been modified since the previous vacuum.
But, I see how that didn't work out for me. How about this:

"""
<command>VACUUM</command> typically scans pages that have been
modified since the last vacuum. However, some all-visible but not
all-frozen pages are eagerly scanned to try and freeze them. Note that
the <structfield>relfrozenxid</structfield> can only be advanced when
every page of the table that might contain unfrozen XIDs is scanned.
"""

"to try and freeze them" seems a little awkward to me. The rest seems fine.

"in the hope that we can freeze them"?

That still doesn't seem great to me. Maybe it's worth expending more
text here, not sure.

I rewrote the comment using some of your input and trying to clarify
my initial point about opportunistic vs guaranteed freezing.

"""
If FreezeLimit has not advanced past the relfrozenxid or
MultiXactCutoff has not advanced past relminmxid, we are unlikely to
be able to freeze anything new.
Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
are technically freezable, but we won't freeze them unless some other
criteria for opportunistic freezing is met.

It's not super clear to me what "some other criteria" means here, but
maybe it's fine.

It is also possible than a transaction newer than the FreezeLimit has

than->that

ended, rendering additional tuples freezable.
As a heuristic, however, it makes sense to wait until the FreezeLimit
or MultiXactCutoff has advanced before eager scanning.
"""

+ ereport(INFO,
+ (errmsg("Vacuum successfully froze %u eager scanned blocks of
\"%s.%s.%s\". Now disabling eager scanning.",

I predict that if Tom sees this, you will get complaints about both
the wording of the message, which pretty clearly does not conform to
style guidelines for a primary error message, and also about the use
of the INFO level. Allow me to suggest DEBUG1 or DEBUG2 and "disabling
eager scanning after freezing %u eagerly scanned blocks".

I've used your wording. Just for future reference, are the style
guidelines I was violating the capitalization and punctuation? Are
these documented somewhere? Also, what is a primary error message?
INFO level? Or ones that use ereport and are translated? I looked at
other messages and saw that they don't capitalize the first word or
use punctuation, so I assume that those were problems.

Yes. Primary error messages, i.e. errmsg(), are not capitalized and
punctuated, unlike errdetail() and errhint() messages, which are.

See https://www.postgresql.org/docs/current/error-style-guide.html

INFO level is used for VERY few things. I can't tell you off the top
of my head when it's appropriate, but I think the answer is "almost
never".

--
Robert Haas
EDB: http://www.enterprisedb.com

#32Robert Treat
rob@xzilla.net
In reply to: Robert Haas (#31)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Fri, Jan 24, 2025 at 3:43 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Fri, Jan 24, 2025 at 3:02 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

+ ereport(INFO,
+ (errmsg("Vacuum successfully froze %u eager scanned blocks of
\"%s.%s.%s\". Now disabling eager scanning.",

I predict that if Tom sees this, you will get complaints about both
the wording of the message, which pretty clearly does not conform to
style guidelines for a primary error message, and also about the use
of the INFO level. Allow me to suggest DEBUG1 or DEBUG2 and "disabling
eager scanning after freezing %u eagerly scanned blocks".

I've used your wording. Just for future reference, are the style
guidelines I was violating the capitalization and punctuation? Are
these documented somewhere? Also, what is a primary error message?
INFO level? Or ones that use ereport and are translated? I looked at
other messages and saw that they don't capitalize the first word or
use punctuation, so I assume that those were problems.

Yes. Primary error messages, i.e. errmsg(), are not capitalized and
punctuated, unlike errdetail() and errhint() messages, which are.

See https://www.postgresql.org/docs/current/error-style-guide.html

INFO level is used for VERY few things. I can't tell you off the top
of my head when it's appropriate, but I think the answer is "almost
never".

Maybe, but one of the areas that INFO is used for is providing
additional details in VACUUM VERBOSE output, and this seems like it
would be pretty useful information to have if you are trying to
discern changes in i/o rate during a vacuum, or trying to tune the
failure rate setting, or several other related fields (including
automated capture by tools like pganalyze), so I believe INFO is the
right choice for this.

Robert Treat
https://xzilla.net

#33Robert Treat
rob@xzilla.net
In reply to: Robert Haas (#31)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Fri, Jan 24, 2025 at 3:43 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Fri, Jan 24, 2025 at 3:02 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

This thought exercise made me realize something is wrong with my
current patch, though. If you set the failure tolerance
(vacuum_eager_scan_max_fails) to 0 right now, it disables eager
scanning altogether. That might be unexpected. You would probably
expect setting that to 0 to still allow eager scanning if it is only
succeeding. That made me think that perhaps I should have a -1 value
that disables eager scanning altogether and 0 just sets the failure
tolerance to 0.

I would not expect that. I would expect setting a value of N to mean
"try until we have N failures". "Try until you have 0 failures" is
logically equivalent to "don't try".

Hmm... isn't "don't try" really more logically equivalent to "stop
after zero failures", with "try until zero failures" more of the
inverse... more like "never stop never stopping"?

I think you're right. I would go with a percentage. I don't see many
other GUCs that are percents. What would you call it? Perhaps
vacuum_eager_scan_fail_threshold? The % of the blocks in the table
vacuum may scan and fail to freeze.

There is an issue I see with making it a percentage. The current
default vacuum_eager_scan_max_fails is 128 out of 4096. That means you
are allowed to scan about 3% of the blocks in the table even if you
fail to freeze every one. I don't think there are very many reasonable
values above 256, personally. So, it might be weird to add a
percentage GUC value with only very low acceptable values. Part of
this is that we are not making the success cap configurable, so that
means that you might have lots of extra I/O if you are both failing
and succeeding. Someone configuring this GUC might think this is
controlling the amount of extra I/O they are incurring.

Why would it be unreasonable to set this value to 25% or even 100%? I
grant that it doesn't sound like the most prudent possible value, but
if I'm willing to fritter away my VACUUM resources to have the best
possible chance of eagerly freezing stuff, isn't that up to me? I
think setting this value to 100% would be WAY less damaging than
work_mem='1TB' or autovacuum_naptime='7d', both of which are allowed.
In fact, setting this to 100% could theoretically have no negative
consequences at all, if it so happens that no freeze failures occur.
Couldn't it even be a win, if freeze failures are common but
minimizing the impact of aggressive vacuum is of overwhelming
importance?

Yeah, I don't see much reason to be concerned about this being a foot
gun; I don't think there is a way to configure it to be more
disruptive than the folks I have seen running vacuum freeze in cron
jobs :-)

And I do think there is potential upside; we've mostly talked about
this in cases that use settings close to the defaults, but I think
there is a significant number of people who use numbers quite
different from the defaults (specifically, increasing
autovac_max_freeze_age / vacuum_freeze_table_age considerably higher)
where a higher failure rate is probably worth it, especially as vacuum
time increases. (It feels very analogous to checkpoint smoothing when
put this way)

The while was meant to contrast the sentence before it about typically
only scanning pages that have been modified since the previous vacuum.
But, I see how that didn't work out for me. How about this:

"""
<command>VACUUM</command> typically scans pages that have been
modified since the last vacuum. However, some all-visible but not
all-frozen pages are eagerly scanned to try and freeze them. Note that
the <structfield>relfrozenxid</structfield> can only be advanced when
every page of the table that might contain unfrozen XIDs is scanned.
"""

"to try and freeze them" seems a little awkward to me. The rest seems fine.

"in the hope that we can freeze them"?

That still doesn't seem great to me. Maybe it's worth expending more
text here, not sure.

Yeah, this feels like a net negative. As I see it, we're trying to
connect three not-obviously related ideas for users who are trying to
understand how this system works especially with regards to
relfrozenxid advanced (based on the section of the docs we are in),
loosely
1. you've probably heard vacuum mainly scans modified pages for cleanup
2. you might notice it also scans non-modified pages, because
sometimes it wants to freeze stuff
3. you might think, if we are freezing stuff, why doesn't relfrozenxid advance?

So that middle bit is trying to act as glue that pulls this all
together. I thought the previous version was closer, with Haas's
feedback I might go with something more like this:

    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but
<structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    While <command>VACUUM</command> typically scans pages that have been
+    modified since the last vacuum, it may also eagerly scan some
all-visible but not
+    all-frozen pages in an attempt to freeze them, but the
+    <structfield>relfrozenxid</structfield> will only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.
+    This happens when

I rewrote the comment using some of your input and trying to clarify
my initial point about opportunistic vs guaranteed freezing.

"""
If FreezeLimit has not advanced past the relfrozenxid or
MultiXactCutoff has not advanced past relminmxid, we are unlikely to
be able to freeze anything new.
Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
are technically freezable, but we won't freeze them unless some other
criteria for opportunistic freezing is met.

It's not super clear to me what "some other criteria" means here, but
maybe it's fine.

It is also possible that a transaction newer than the FreezeLimit has
ended, rendering additional tuples freezable.
As a heuristic, however, it makes sense to wait until the FreezeLimit
or MultiXactCutoff has advanced before eager scanning.
"""

Yeah, I also think the "some other criteria" part seems poor, although
tbh this all feels like a net negative to the previous wording or
Haas's suggested change, like you're describing what the code below it
does rather than what the intentions of the code are. For example, I
like the "freeze horizon" language vs explicit FreezeLimit since the
code could change even if the goal doesn't. But in lue of going back
to that wording (modulo your 1 line explanation in your email), if I
were to attempt to split the difference:

We only want to
enable eager scanning if we are likely to be able to freeze some of
the pages in the relation, which is unlikely if FreezeLimit has not
advanced past
relfrozenxid or if MultiXactCutoff has not advanced passed
relminmxid. Granted, there may be pages we didn't try to freeze
before, or some previously blocking XID greater than FreezeLimit may
have now ended (allowing for freezing), but as a heuristic we wait
until the
FreezeLimit advances to increase our chances of successful freezing.

Robert Treat
https://xzilla.net

#34Robert Haas
robertmhaas@gmail.com
In reply to: Robert Treat (#33)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Sun, Jan 26, 2025 at 3:11 PM Robert Treat <rob@xzilla.net> wrote:

Hmm... isn't "don't try" really more logically equivalent to "stop
after zero failures", with "try until zero failures" more of the
inverse... more like "never stop never stopping"?

No. Or at least, I don't think that's how English works.

So that middle bit is trying to act as glue that pulls this all
together. I thought the previous version was closer, with Haas's
feedback I might go with something more like this:

<para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but
<structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    While <command>VACUUM</command> typically scans pages that have been
+    modified since the last vacuum, it may also eagerly scan some
all-visible but not
+    all-frozen pages in an attempt to freeze them, but the
+    <structfield>relfrozenxid</structfield> will only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.
+    This happens when

I like that.

--
Robert Haas
EDB: http://www.enterprisedb.com

#35Melanie Plageman
melanieplageman@gmail.com
In reply to: Robert Haas (#31)
1 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Fri, Jan 24, 2025 at 3:43 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Fri, Jan 24, 2025 at 3:02 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

I think you're right. I would go with a percentage. I don't see many
other GUCs that are percents. What would you call it? Perhaps
vacuum_eager_scan_fail_threshold? The % of the blocks in the table
vacuum may scan and fail to freeze.

There is an issue I see with making it a percentage. The current
default vacuum_eager_scan_max_fails is 128 out of 4096. That means you
are allowed to scan about 3% of the blocks in the table even if you
fail to freeze every one. I don't think there are very many reasonable
values above 256, personally. So, it might be weird to add a
percentage GUC value with only very low acceptable values. Part of
this is that we are not making the success cap configurable, so that
means that you might have lots of extra I/O if you are both failing
and succeeding. Someone configuring this GUC might think this is
controlling the amount of extra I/O they are incurring.

Why would it be unreasonable to set this value to 25% or even 100%? I
grant that it doesn't sound like the most prudent possible value, but
if I'm willing to fritter away my VACUUM resources to have the best
possible chance of eagerly freezing stuff, isn't that up to me? I
think setting this value to 100% would be WAY less damaging than
work_mem='1TB' or autovacuum_naptime='7d', both of which are allowed.
In fact, setting this to 100% could theoretically have no negative
consequences at all, if it so happens that no freeze failures occur.
Couldn't it even be a win, if freeze failures are common but
minimizing the impact of aggressive vacuum is of overwhelming
importance?

Looking at ConfigureNamesReal[], some existing words we use to talk
about real-valued GUCs include: cost, fraction, factor, bias,
multiplier, target, rate. Of those, I like "fraction" and "rate" best
here, because they imply a range of 0-1 rather than anything broader.
vacuum_max_eager_freeze_failure_rate? Kinda long...

attached v11 uses a fraction with this name. It follows the
conventions and I find it descriptive.

Changing the configuration to a fraction does mean that quite a few of
the comments are different in this version. I think the description of
the guc in
config.sgml could use some review in particular. I tried to make it
clear that the percentage is not the maximum number of blocks that
could be eager scanned, because you may also eagerly scan blocks and
succeed.

Other note: I noticed AutoVacOpts that are floating point numbers (like
vacuum_cost_delay) are float8s but their associated GUCs (like
autovacuum_vacuum_cost_delay) are doubles. These are going to be equivalent,
but I wanted to note the inconsistency in case I was missing something.

"""
<command>VACUUM</command> typically scans pages that have been
modified since the last vacuum. However, some all-visible but not
all-frozen pages are eagerly scanned to try and freeze them. Note that
the <structfield>relfrozenxid</structfield> can only be advanced when
every page of the table that might contain unfrozen XIDs is scanned.
"""

"to try and freeze them" seems a little awkward to me. The rest seems fine.

"in the hope that we can freeze them"?

That still doesn't seem great to me. Maybe it's worth expending more
text here, not sure.

Given this and Treat's input from a different mail:

Yeah, this feels like a net negative. As I see it, we're trying to
connect three not-obviously related ideas for users who are trying to
understand how this system works especially with regards to
relfrozenxid advanced (based on the section of the docs we are in),
loosely
1. you've probably heard vacuum mainly scans modified pages for cleanup
2. you might notice it also scans non-modified pages, because
sometimes it wants to freeze stuff
3. you might think, if we are freezing stuff, why doesn't relfrozenxid advance?

So that middle bit is trying to act as glue that pulls this all
together. I thought the previous version was closer, with Haas's
feedback I might go with something more like this:

I've mostly used his suggested wording in attached v11.

I rewrote the comment using some of your input and trying to clarify
my initial point about opportunistic vs guaranteed freezing.

"""
If FreezeLimit has not advanced past the relfrozenxid or
MultiXactCutoff has not advanced past relminmxid, we are unlikely to
be able to freeze anything new.
Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
are technically freezable, but we won't freeze them unless some other
criteria for opportunistic freezing is met.

It's not super clear to me what "some other criteria" means here, but
maybe it's fine.

Given this thought and Treat's feedback below

Yeah, I also think the "some other criteria" part seems poor, although
tbh this all feels like a net negative to the previous wording or
Haas's suggested change, like you're describing what the code below it
does rather than what the intentions of the code are. For example, I
like the "freeze horizon" language vs explicit FreezeLimit since the
code could change even if the goal doesn't. But in lue of going back
to that wording (modulo your 1 line explanation in your email), if I
were to attempt to split the difference:

We only want to
enable eager scanning if we are likely to be able to freeze some of
the pages in the relation, which is unlikely if FreezeLimit has not
advanced past
relfrozenxid or if MultiXactCutoff has not advanced passed
relminmxid. Granted, there may be pages we didn't try to freeze
before, or some previously blocking XID greater than FreezeLimit may
have now ended (allowing for freezing), but as a heuristic we wait
until the
FreezeLimit advances to increase our chances of successful freezing.

I've updated the proposed text to mostly be in line with what he suggested.

ended, rendering additional tuples freezable.
As a heuristic, however, it makes sense to wait until the FreezeLimit
or MultiXactCutoff has advanced before eager scanning.
"""

+ ereport(INFO,
+ (errmsg("Vacuum successfully froze %u eager scanned blocks of
\"%s.%s.%s\". Now disabling eager scanning.",

I predict that if Tom sees this, you will get complaints about both
the wording of the message, which pretty clearly does not conform to
style guidelines for a primary error message, and also about the use
of the INFO level. Allow me to suggest DEBUG1 or DEBUG2 and "disabling
eager scanning after freezing %u eagerly scanned blocks".

I've used your wording. Just for future reference, are the style
guidelines I was violating the capitalization and punctuation? Are
these documented somewhere? Also, what is a primary error message?
INFO level? Or ones that use ereport and are translated? I looked at
other messages and saw that they don't capitalize the first word or
use punctuation, so I assume that those were problems.

Yes. Primary error messages, i.e. errmsg(), are not capitalized and
punctuated, unlike errdetail() and errhint() messages, which are.

See https://www.postgresql.org/docs/current/error-style-guide.html

INFO level is used for VERY few things. I can't tell you off the top
of my head when it's appropriate, but I think the answer is "almost
never".

I have changed it to DEBUG2. I started it as INFO because the other vacuum
messages about whether or not the vacuum is an aggressive vacuum were at INFO
level.I don't know what a user might prefer. Treat said this downthread:

Maybe, but one of the areas that INFO is used for is providing
additional details in VACUUM VERBOSE output, and this seems like it
would be pretty useful information to have if you are trying to
discern changes in i/o rate during a vacuum, or trying to tune the
failure rate setting, or several other related fields (including
automated capture by tools like pganalyze), so I believe INFO is the
right choice for this.

I'm happy to go either way. I don't want users mad about verbosity, but if they
think it's helpful, then that seems good.

- Melanie

Attachments:

v11-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchapplication/octet-stream; name=v11-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchDownload
From 839e2f4d6173481cd87e16b36e3da2994d94df05 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 27 Jan 2025 12:23:00 -0500
Subject: [PATCH v11] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Amortize the cost of an aggressive vacuum by eagerly scanning some
number of all-visible but not all-frozen pages during normal vacuums.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
counted as successful eager freezes and those not frozen are considered
failed eager freezes.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager frozen,
eager scanning is disabled for the remainder of the vacuum of the
relation.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Robert Treat <rob@xzilla.net>
Reviewed-by: Bilal Yavuz <byavuz81@gmail.com>
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  39 ++
 doc/src/sgml/maintenance.sgml                 |  37 +-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  14 +-
 src/backend/access/heap/vacuumlazy.c          | 419 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  13 +
 src/backend/postmaster/autovacuum.c           |   2 +
 src/backend/utils/misc/guc_tables.c           |  10 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/include/commands/vacuum.h                 |  16 +
 src/include/utils/rel.h                       |   6 +
 11 files changed, 527 insertions(+), 45 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index a782f109982..a50a871ef9c 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9117,6 +9117,45 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+      <term><varname>vacuum_max_eager_freeze_failure_rate</varname> (<type>floating point</type>)
+      <indexterm>
+       <primary><varname>vacuum_max_eager_freeze_failure_rate</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum fraction of pages in a relation that
+        <command>VACUUM</command> may scan and <emphasis>fail</emphasis> to set
+        all-frozen in the visibility map before disabling eager scanning. A
+        value of <literal>0</literal> disables eager scanning altogether. The
+        default is <literal>0.03</literal> (3%).
+       </para>
+
+       <para>
+        If <varname>vacuum_max_eager_freeze_failure_rate</varname> is greater
+        than <literal>0</literal> and <command>VACUUM</command>
+        <emphasis>successfully</emphasis> freezes some pages of the relation,
+        it may eager scan up to the
+        <varname>vacuum_max_eager_freeze_failure_rate</varname> plus twenty
+        percent of the all-visible but not all-frozen pages in the relation.
+        Eager scanning seeks to amortize the overhead of an aggressive vacuum,
+        so successful freezing is also capped.
+       </para>
+
+       <para>
+        This parameter can only be set in the
+        <filename>postgresql.conf</filename> file or on the server command
+        line; but the setting can be overridden for individual tables by
+        changing the
+        <link linkend="reloption-vacuum-max-eager-freeze-failure-rate">
+        corresponding table storage parameter</link>.
+        For more information on tuning vacuum,
+        see <xref linkend="vacuum-for-wraparound"/>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 0be90bdc7ef..ba25887fc88 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -496,14 +496,26 @@
     When that happens, <command>VACUUM</command> will eventually need to perform an
     <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
     XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+   </para>
+
+   <para>
+    If a table is building up a backlog of all-visible but not all-frozen
+    pages, a normal vacuum may choose to scan skippable pages in an effort to
+    freeze them. Doing so decreases the number of pages the next aggressive
+    vacuum must scan. These are referred to as <firstterm>eagerly
+    scanned</firstterm>pages. Eager scanning can be tuned to scan and attempt
+    to freeze more all-visible pages by increasing
+    <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>. Even if eager
+    scanning has kept the number of all-visible but not all-frozen pages to a
+    minimum, most tables still require periodic aggressive vacuuming.
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
-    pages are scanned if the number of transactions that have passed since the
-    last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
+    controls when a table is aggressively vacuumed. All all-visible but
+    not all-frozen pages are scanned if the number of transactions that
+    have passed since the last such scan is greater than
+    <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
-    <varname>vacuum_freeze_table_age</varname> to 0 forces <command>VACUUM</command> to
-    always use its aggressive strategy.
+    <varname>vacuum_freeze_table_age</varname> to 0 forces
+    <command>VACUUM</command> to always use its aggressive strategy.
    </para>
 
    <para>
@@ -626,10 +638,12 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    While <command>VACUUM</command> scans mostly pages that have been
+    modified since the last vacuum, it may also eagerly scan some
+    all-visible but not all-frozen pages in an attempt to freeze them, but
+    the <structfield>relfrozenxid</structfield> will only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.
+    This happens when
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
     <command>VACUUM</command>'s <literal>FREEZE</literal> option is used, or when all
@@ -929,8 +943,7 @@ vacuum insert threshold = vacuum base insert threshold + vacuum insert scale fac
     If the <structfield>relfrozenxid</structfield> value of the table
     is more than <varname>vacuum_freeze_table_age</varname> transactions old,
     an aggressive vacuum is performed to freeze old tuples and advance
-    <structfield>relfrozenxid</structfield>; otherwise, only pages that have been modified
-    since the last vacuum are scanned.
+    <structfield>relfrozenxid</structfield>.
    </para>
 
    <para>
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2237321cb4f..7e2deeebfad 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1931,6 +1931,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+    <term><literal>vacuum_max_eager_freeze_failure_rate</literal>, <literal>toast.vacuum_max_eager_freeze_failure_rate</literal> (<type>floating point</type>)
+    <indexterm>
+     <primary><varname>vacuum_max_eager_freeze_failure_rate</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..31a8212faf1 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -423,6 +423,16 @@ static relopt_real realRelOpts[] =
 		},
 		-1, 0.0, 100.0
 	},
+	{
+		{
+			"vacuum_max_eager_freeze_failure_rate",
+			"Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning.",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		},
+		-1, 0.0, 1.0
+	},
+
 	{
 		{
 			"seq_page_cost",
@@ -1880,7 +1890,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_max_eager_freeze_failure_rate", RELOPT_TYPE_REAL,
+		offsetof(StdRdOptions, vacuum_max_eager_freeze_failure_rate)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 5b0e790e121..d8e6d723d57 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -17,9 +17,9 @@
  * failsafe mechanism has triggered (to avoid transaction ID wraparound),
  * vacuum may skip phases II and III.
  *
- * If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
- * phases II and II, cleaning up the dead tuples referenced in the current TID
- * store. This empties the TID store resumes phase I.
+ * If the TID store fills up in phase I, vacuum suspends phase I and proceeds
+ * to phases II and III, cleaning up the dead tuples referenced in the current
+ * TID store. This empties the TID store, allowing vacuum to resume phase I.
  *
  * In a way, the phases are more like states in a state machine, but they have
  * been referred to colloquially as phases for so long that they are referred
@@ -41,9 +41,48 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and various other requirements.
  *
- * When page skipping is not disabled, a non-aggressive vacuum may scan pages
- * that are marked all-visible (and even all-frozen) in the visibility map if
- * the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager freezes to
+ * MAX_EAGER_FREEZE_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is disabled for the remainder of the vacuum of the relation.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager freeze failure cap.
+ * The failure count is reset for each region of the table -- comprised of
+ * EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE failures
+ * before suspending eager scanning until the end of the region.
+ * vacuum_max_eager_freeze_failure_rate is configurable both globally and per
+ * table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -100,6 +139,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -185,6 +225,24 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out freezing overhead across multiple normal
+ * vacuums, we limit the number of successful eager page freezes. The maximum
+ * number of eager page freezes is calculated as a ratio of the all-visible
+ * but not all-frozen pages at the beginning of the vacuum.
+ */
+#define MAX_EAGER_FREEZE_SUCCESS_RATE 0.2
+
+/*
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once vacuum fails to freeze
+ * vacuum_max_eager_freeze_failure_rate of the blocks in a region of size
+ * EAGER_SCAN_REGION_SIZE, it suspends eager scanning until it has progressed
+ * to another region of the table with potentially older data.
+ */
+#define EAGER_SCAN_REGION_SIZE 4096
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -241,6 +299,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -282,9 +347,57 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eagerly scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a region suspends eager scanning.
+	 * next_eager_scan_region_start is the block number of the first block
+	 * eligible for resumed eager scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success cap,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning when it is successful. When eager scanning is enabled, this is
+	 * initialized to MAX_EAGER_FREEZE_SUCCESS_RATE of the total number of
+	 * all-visible but not all-frozen pages. For each eager freeze success, this
+	 * is decremented. Once it hits 0, eager scanning is permanently disabled.
+	 * It is initialized to 0 if eager scanning starts out disabled (including
+	 * for aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The maximum number of blocks which may be eagerly scanned and not
+	 * frozen before eager scanning is temporarily suspended. This is
+	 * configurable both globally, via the
+	 * vacuum_max_eager_freeze_failure_rate GUC, and per table, with a table
+	 * storage parameter of the same name. It is calculated as
+	 * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE blocks.
+	 * It is 0 when eager scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * eager_scan_max_fails_per_region each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -296,8 +409,10 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -305,7 +420,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -347,6 +462,133 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_before_cutoff = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->max_eager_freeze_failure_rate == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * Aggressively vacuuming a small relation shouldn't take long, so it
+	 * isn't worth amortizing. We use two times the region size as the size
+	 * cutoff because the eager scan start block is a random spot somewhere in
+	 * the first region, making the second region the first to be eager
+	 * scanned normally.
+	 */
+	if (vacrel->rel_pages < 2 * EAGER_SCAN_REGION_SIZE)
+		return;
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able
+	 * freeze some of the pages in the relation -- which is unlikely if
+	 * FreezeLimit has not advanced past the relfrozenxid or MultiXactCutoff
+	 * has not advanced past relminmxid
+	 *
+	 * Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
+	 * are technically freezable, but we won't freeze them unless the criteria
+	 * for opportunistic freezing is met.
+	 *
+	 * It is also possible that a transaction newer than the
+	 * FreezeLimit/MultiXactCutoff has ended, rendering additional tuples
+	 * freezable.
+	 *
+	 * As a heuristic, however, we wait until the FreezeLimit
+	 * or MultiXactCutoff has advanced to increase our chances of successful
+	 * freezing.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+									  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+									vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is MAX_EAGER_FREEZE_SUCCESS_RATE of the number of all-visible
+	 * but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (MAX_EAGER_FREEZE_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If every all-visible page is frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed % EAGER_SCAN_REGION_SIZE;
+
+	Assert(params->max_eager_freeze_failure_rate > 0 &&
+		   params->max_eager_freeze_failure_rate <= 1);
+
+	vacrel->eager_scan_max_fails_per_region =
+		params->max_eager_freeze_failure_rate *
+				EAGER_SCAN_REGION_SIZE;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager freeze failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails = vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -475,6 +717,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -500,6 +743,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -518,11 +762,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -537,6 +786,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -731,12 +987,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eagerly scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -907,8 +1165,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -927,13 +1187,16 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
@@ -1061,7 +1324,45 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success cap, permanently disable eager
+					 * scanning by setting the other eager scan management
+					 * fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(DEBUG1,
+							(errmsg("disabling eager scanning after freezing %u eagerly scanned blocks of \"%s.%s.%s\"",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1161,7 +1462,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eagerly scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1171,13 +1474,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1250,6 +1556,9 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
+		if (*was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 		return true;
 	}
 }
@@ -1273,11 +1582,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1285,6 +1595,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1313,28 +1636,41 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 			break;
 
 		/*
-		 * Aggressive VACUUM caller can't skip pages just because they are
-		 * all-visible.  They may still skip all-frozen pages, which can't
-		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
+		 * All-frozen pages cannot contain XIDs < OldestXmin (XIDs that aren't
+		 * already frozen by now), so this page can be skipped.
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) != 0)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip any all-visible pages that are not
+		 * also all-frozen.
+		 */
+		if (vacrel->aggressive)
+			break;
+
+		/*
+		 * Normal vacuums with eager scanning enabled only skip all-visible
+		 * but not all-frozen pages if they have hit the failure limit for the
+		 * current eager scan region.
+		 */
+		if (vacrel->eager_scan_remaining_fails > 0)
+		{
+			next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1365,6 +1701,10 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because empty pages are always frozen and
+ * thus could never be eagerly scanned.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1504,6 +1844,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1512,7 +1856,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1664,11 +2009,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1756,6 +2107,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1763,7 +2115,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..4526dfe1a7a 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+double		vacuum_max_eager_freeze_failure_rate;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/* Later we check if a reloption override was specified */
+	params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2169,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_max_eager_freeze_failure_rate table storage
+	 * parameter was specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0)
+		params->max_eager_freeze_failure_rate =
+			((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..8c278952965 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+		/* Later we check reloptions for vacuum_max_eager_freeze_failure_ratge override */
+		tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index 38cb9e970d5..f2b8d87fc70 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -4024,6 +4024,16 @@ struct config_real ConfigureNamesReal[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"vacuum_max_eager_freeze_failure_rate", PGC_USERSET, VACUUM_FREEZING,
+			gettext_noop("Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning."),
+			gettext_noop("A value of 0.0 disables eager scanning and a value of 1.0 will eagerly scan up to 100 percent of the all-visible pages in the relation. If vacuum successfully freezes these pages, the cap is lower than 100 percent, because the goal is to amortize page freezing across multiple vacuums.")
+		},
+		&vacuum_max_eager_freeze_failure_rate,
+		0.03, 0.0, 1.0,
+		NULL, NULL, NULL
+	},
+
 	/* End-of-list marker */
 	{
 		{NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL, NULL
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 079efa1baa7..48f8b1cedc5 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -698,6 +698,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_max_eager_freeze_failure_rate = 0.03 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..eb8363a2888 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,13 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail to
+	 * freeze. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	double		max_eager_freeze_failure_rate;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +304,15 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may eagerly
+ * scan some all-visible but not all-frozen pages. Since the goal is to freeze
+ * these pages, an eager scan that fails to set the page all-frozen in the VM
+ * is considered to have "failed". This is the fraction of pages in the
+ * relation vacuum may scan and fail to freeze before disabling eager scanning.
+ */
+extern PGDLLIMPORT double vacuum_max_eager_freeze_failure_rate;
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..525516b10d3 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,12 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail to
+	 * freeze. 0 if disabled, -1 if unspecified.
+	 */
+	double		vacuum_max_eager_freeze_failure_rate;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.45.2

#36Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Melanie Plageman (#35)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Mon, Jan 27, 2025 at 9:45 AM Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Fri, Jan 24, 2025 at 3:43 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Fri, Jan 24, 2025 at 3:02 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

I think you're right. I would go with a percentage. I don't see many
other GUCs that are percents. What would you call it? Perhaps
vacuum_eager_scan_fail_threshold? The % of the blocks in the table
vacuum may scan and fail to freeze.

There is an issue I see with making it a percentage. The current
default vacuum_eager_scan_max_fails is 128 out of 4096. That means you
are allowed to scan about 3% of the blocks in the table even if you
fail to freeze every one. I don't think there are very many reasonable
values above 256, personally. So, it might be weird to add a
percentage GUC value with only very low acceptable values. Part of
this is that we are not making the success cap configurable, so that
means that you might have lots of extra I/O if you are both failing
and succeeding. Someone configuring this GUC might think this is
controlling the amount of extra I/O they are incurring.

Why would it be unreasonable to set this value to 25% or even 100%? I
grant that it doesn't sound like the most prudent possible value, but
if I'm willing to fritter away my VACUUM resources to have the best
possible chance of eagerly freezing stuff, isn't that up to me? I
think setting this value to 100% would be WAY less damaging than
work_mem='1TB' or autovacuum_naptime='7d', both of which are allowed.
In fact, setting this to 100% could theoretically have no negative
consequences at all, if it so happens that no freeze failures occur.
Couldn't it even be a win, if freeze failures are common but
minimizing the impact of aggressive vacuum is of overwhelming
importance?

Looking at ConfigureNamesReal[], some existing words we use to talk
about real-valued GUCs include: cost, fraction, factor, bias,
multiplier, target, rate. Of those, I like "fraction" and "rate" best
here, because they imply a range of 0-1 rather than anything broader.
vacuum_max_eager_freeze_failure_rate? Kinda long...

attached v11 uses a fraction with this name. It follows the
conventions and I find it descriptive.

Changing the configuration to a fraction does mean that quite a few of
the comments are different in this version. I think the description of
the guc in
config.sgml could use some review in particular. I tried to make it
clear that the percentage is not the maximum number of blocks that
could be eager scanned, because you may also eagerly scan blocks and
succeed.

Other note: I noticed AutoVacOpts that are floating point numbers (like
vacuum_cost_delay) are float8s but their associated GUCs (like
autovacuum_vacuum_cost_delay) are doubles. These are going to be equivalent,
but I wanted to note the inconsistency in case I was missing something.

"""
<command>VACUUM</command> typically scans pages that have been
modified since the last vacuum. However, some all-visible but not
all-frozen pages are eagerly scanned to try and freeze them. Note that
the <structfield>relfrozenxid</structfield> can only be advanced when
every page of the table that might contain unfrozen XIDs is scanned.
"""

"to try and freeze them" seems a little awkward to me. The rest seems fine.

"in the hope that we can freeze them"?

That still doesn't seem great to me. Maybe it's worth expending more
text here, not sure.

Given this and Treat's input from a different mail:

Yeah, this feels like a net negative. As I see it, we're trying to
connect three not-obviously related ideas for users who are trying to
understand how this system works especially with regards to
relfrozenxid advanced (based on the section of the docs we are in),
loosely
1. you've probably heard vacuum mainly scans modified pages for cleanup
2. you might notice it also scans non-modified pages, because
sometimes it wants to freeze stuff
3. you might think, if we are freezing stuff, why doesn't relfrozenxid advance?

So that middle bit is trying to act as glue that pulls this all
together. I thought the previous version was closer, with Haas's
feedback I might go with something more like this:

I've mostly used his suggested wording in attached v11.

I rewrote the comment using some of your input and trying to clarify
my initial point about opportunistic vs guaranteed freezing.

"""
If FreezeLimit has not advanced past the relfrozenxid or
MultiXactCutoff has not advanced past relminmxid, we are unlikely to
be able to freeze anything new.
Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
are technically freezable, but we won't freeze them unless some other
criteria for opportunistic freezing is met.

It's not super clear to me what "some other criteria" means here, but
maybe it's fine.

Given this thought and Treat's feedback below

Yeah, I also think the "some other criteria" part seems poor, although
tbh this all feels like a net negative to the previous wording or
Haas's suggested change, like you're describing what the code below it
does rather than what the intentions of the code are. For example, I
like the "freeze horizon" language vs explicit FreezeLimit since the
code could change even if the goal doesn't. But in lue of going back
to that wording (modulo your 1 line explanation in your email), if I
were to attempt to split the difference:

We only want to
enable eager scanning if we are likely to be able to freeze some of
the pages in the relation, which is unlikely if FreezeLimit has not
advanced past
relfrozenxid or if MultiXactCutoff has not advanced passed
relminmxid. Granted, there may be pages we didn't try to freeze
before, or some previously blocking XID greater than FreezeLimit may
have now ended (allowing for freezing), but as a heuristic we wait
until the
FreezeLimit advances to increase our chances of successful freezing.

I've updated the proposed text to mostly be in line with what he suggested.

ended, rendering additional tuples freezable.
As a heuristic, however, it makes sense to wait until the FreezeLimit
or MultiXactCutoff has advanced before eager scanning.
"""

+ ereport(INFO,
+ (errmsg("Vacuum successfully froze %u eager scanned blocks of
\"%s.%s.%s\". Now disabling eager scanning.",

I predict that if Tom sees this, you will get complaints about both
the wording of the message, which pretty clearly does not conform to
style guidelines for a primary error message, and also about the use
of the INFO level. Allow me to suggest DEBUG1 or DEBUG2 and "disabling
eager scanning after freezing %u eagerly scanned blocks".

I've used your wording. Just for future reference, are the style
guidelines I was violating the capitalization and punctuation? Are
these documented somewhere? Also, what is a primary error message?
INFO level? Or ones that use ereport and are translated? I looked at
other messages and saw that they don't capitalize the first word or
use punctuation, so I assume that those were problems.

Yes. Primary error messages, i.e. errmsg(), are not capitalized and
punctuated, unlike errdetail() and errhint() messages, which are.

See https://www.postgresql.org/docs/current/error-style-guide.html

INFO level is used for VERY few things. I can't tell you off the top
of my head when it's appropriate, but I think the answer is "almost
never".

I have changed it to DEBUG2. I started it as INFO because the other vacuum
messages about whether or not the vacuum is an aggressive vacuum were at INFO
level.I don't know what a user might prefer. Treat said this downthread:

Maybe, but one of the areas that INFO is used for is providing
additional details in VACUUM VERBOSE output, and this seems like it
would be pretty useful information to have if you are trying to
discern changes in i/o rate during a vacuum, or trying to tune the
failure rate setting, or several other related fields (including
automated capture by tools like pganalyze), so I believe INFO is the
right choice for this.

I'm happy to go either way. I don't want users mad about verbosity, but if they
think it's helpful, then that seems good.

Thank you for updating the patch. I was reviewing the v10 patch and
had some comments. I believe these comments are still valid for v11,
but please ignore them if outdated.

+       if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+               TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+
   vacrel->cutoffs.FreezeLimit))
+               oldest_unfrozen_before_cutoff = true;
+
+       if (!oldest_unfrozen_before_cutoff &&
+               MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+               MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+
 vacrel->cutoffs.MultiXactCutoff))
+               oldest_unfrozen_before_cutoff = true;

Given that our freeze check strictly checks if an xid is older than
the cutoff (exclusive bound), I think we should check if the
relfrozenxid and relminmxid strictly precede the cutoff values.

---
if (*was_eager_scanned)
vacrel->eager_scanned_pages++;

How about incrementing this counter near the place where incrementing
scanned_pages (i.e., at the beginning of the loop of
heap_vac_scan_next_block())? It would make it easy to understand the
difference between eager_scanned_pages and scanned_pages.

---
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because empty pages are always frozen and
+ * thus could never be eagerly scanned.

The last part "thus could never be eagerly scanned" confused me a bit;
IIUC we count all pages that are scanned because of this new eager
scan feature as "eagerly scanned pages". We increment
eager_scanned_pages counter even if the page is either new or empty.
This fact seems to contradict the sentence "empty pages could never be
eagerly scanned".

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com

#37Melanie Plageman
melanieplageman@gmail.com
In reply to: Masahiko Sawada (#36)
1 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Mon, Jan 27, 2025 at 12:52 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

Thank you for updating the patch. I was reviewing the v10 patch and
had some comments. I believe these comments are still valid for v11,
but please ignore them if outdated.

Thanks so much for the review!

+       if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+               TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+
vacrel->cutoffs.FreezeLimit))
+               oldest_unfrozen_before_cutoff = true;
+
+       if (!oldest_unfrozen_before_cutoff &&
+               MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+               MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+
vacrel->cutoffs.MultiXactCutoff))
+               oldest_unfrozen_before_cutoff = true;

Given that our freeze check strictly checks if an xid is older than
the cutoff (exclusive bound), I think we should check if the
relfrozenxid and relminmxid strictly precede the cutoff values.

Makes sense. I've changed that.

---
if (*was_eager_scanned)
vacrel->eager_scanned_pages++;

How about incrementing this counter near the place where incrementing
scanned_pages (i.e., at the beginning of the loop of
heap_vac_scan_next_block())? It would make it easy to understand the
difference between eager_scanned_pages and scanned_pages.

Right. That makes sense. I've changed that in the attached v12.

---
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because empty pages are always frozen and
+ * thus could never be eagerly scanned.

The last part "thus could never be eagerly scanned" confused me a bit;
IIUC we count all pages that are scanned because of this new eager
scan feature as "eagerly scanned pages". We increment
eager_scanned_pages counter even if the page is either new or empty.
This fact seems to contradict the sentence "empty pages could never be
eagerly scanned".

Ah, so what I mean by this is that the first time an empty page is
vacuumed, it is set all-visible and all-frozen in the VM. We only
eagerly scan pages that are _only_ all-visible (not also all-frozen).
So, no empty pages will ever be eligible for eager scanning. I've
updated the comment, because I agree it was confusing. See what you
think now.

- Melanie

Attachments:

v12-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchapplication/octet-stream; name=v12-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchDownload
From 272f93175a72b5bb27fc5b898914e0c511ef1955 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 27 Jan 2025 12:23:00 -0500
Subject: [PATCH v12] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Amortize the cost of an aggressive vacuum by eagerly scanning some
all-visible but not all-frozen pages during normal vacuums.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
counted as successful eager freezes and those not frozen are considered
failed eager freezes.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager frozen,
eager scanning is disabled for the remainder of the vacuum of the
relation.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Robert Treat <rob@xzilla.net>
Reviewed-by: Bilal Yavuz <byavuz81@gmail.com>
Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com>
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  39 ++
 doc/src/sgml/maintenance.sgml                 |  37 +-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  14 +-
 src/backend/access/heap/vacuumlazy.c          | 421 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  13 +
 src/backend/postmaster/autovacuum.c           |   2 +
 src/backend/utils/misc/guc_tables.c           |  10 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/include/commands/vacuum.h                 |  16 +
 src/include/utils/rel.h                       |   6 +
 11 files changed, 529 insertions(+), 45 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index a782f109982..a50a871ef9c 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9117,6 +9117,45 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+      <term><varname>vacuum_max_eager_freeze_failure_rate</varname> (<type>floating point</type>)
+      <indexterm>
+       <primary><varname>vacuum_max_eager_freeze_failure_rate</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum fraction of pages in a relation that
+        <command>VACUUM</command> may scan and <emphasis>fail</emphasis> to set
+        all-frozen in the visibility map before disabling eager scanning. A
+        value of <literal>0</literal> disables eager scanning altogether. The
+        default is <literal>0.03</literal> (3%).
+       </para>
+
+       <para>
+        If <varname>vacuum_max_eager_freeze_failure_rate</varname> is greater
+        than <literal>0</literal> and <command>VACUUM</command>
+        <emphasis>successfully</emphasis> freezes some pages of the relation,
+        it may eager scan up to the
+        <varname>vacuum_max_eager_freeze_failure_rate</varname> plus twenty
+        percent of the all-visible but not all-frozen pages in the relation.
+        Eager scanning seeks to amortize the overhead of an aggressive vacuum,
+        so successful freezing is also capped.
+       </para>
+
+       <para>
+        This parameter can only be set in the
+        <filename>postgresql.conf</filename> file or on the server command
+        line; but the setting can be overridden for individual tables by
+        changing the
+        <link linkend="reloption-vacuum-max-eager-freeze-failure-rate">
+        corresponding table storage parameter</link>.
+        For more information on tuning vacuum,
+        see <xref linkend="vacuum-for-wraparound"/>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 0be90bdc7ef..ba25887fc88 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -496,14 +496,26 @@
     When that happens, <command>VACUUM</command> will eventually need to perform an
     <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
     XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+   </para>
+
+   <para>
+    If a table is building up a backlog of all-visible but not all-frozen
+    pages, a normal vacuum may choose to scan skippable pages in an effort to
+    freeze them. Doing so decreases the number of pages the next aggressive
+    vacuum must scan. These are referred to as <firstterm>eagerly
+    scanned</firstterm>pages. Eager scanning can be tuned to scan and attempt
+    to freeze more all-visible pages by increasing
+    <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>. Even if eager
+    scanning has kept the number of all-visible but not all-frozen pages to a
+    minimum, most tables still require periodic aggressive vacuuming.
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
-    pages are scanned if the number of transactions that have passed since the
-    last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
+    controls when a table is aggressively vacuumed. All all-visible but
+    not all-frozen pages are scanned if the number of transactions that
+    have passed since the last such scan is greater than
+    <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
-    <varname>vacuum_freeze_table_age</varname> to 0 forces <command>VACUUM</command> to
-    always use its aggressive strategy.
+    <varname>vacuum_freeze_table_age</varname> to 0 forces
+    <command>VACUUM</command> to always use its aggressive strategy.
    </para>
 
    <para>
@@ -626,10 +638,12 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    While <command>VACUUM</command> scans mostly pages that have been
+    modified since the last vacuum, it may also eagerly scan some
+    all-visible but not all-frozen pages in an attempt to freeze them, but
+    the <structfield>relfrozenxid</structfield> will only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.
+    This happens when
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
     <command>VACUUM</command>'s <literal>FREEZE</literal> option is used, or when all
@@ -929,8 +943,7 @@ vacuum insert threshold = vacuum base insert threshold + vacuum insert scale fac
     If the <structfield>relfrozenxid</structfield> value of the table
     is more than <varname>vacuum_freeze_table_age</varname> transactions old,
     an aggressive vacuum is performed to freeze old tuples and advance
-    <structfield>relfrozenxid</structfield>; otherwise, only pages that have been modified
-    since the last vacuum are scanned.
+    <structfield>relfrozenxid</structfield>.
    </para>
 
    <para>
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2237321cb4f..7e2deeebfad 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1931,6 +1931,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+    <term><literal>vacuum_max_eager_freeze_failure_rate</literal>, <literal>toast.vacuum_max_eager_freeze_failure_rate</literal> (<type>floating point</type>)
+    <indexterm>
+     <primary><varname>vacuum_max_eager_freeze_failure_rate</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..31a8212faf1 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -423,6 +423,16 @@ static relopt_real realRelOpts[] =
 		},
 		-1, 0.0, 100.0
 	},
+	{
+		{
+			"vacuum_max_eager_freeze_failure_rate",
+			"Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning.",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		},
+		-1, 0.0, 1.0
+	},
+
 	{
 		{
 			"seq_page_cost",
@@ -1880,7 +1890,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_max_eager_freeze_failure_rate", RELOPT_TYPE_REAL,
+		offsetof(StdRdOptions, vacuum_max_eager_freeze_failure_rate)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 5b0e790e121..cb7e7c995d7 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -17,9 +17,9 @@
  * failsafe mechanism has triggered (to avoid transaction ID wraparound),
  * vacuum may skip phases II and III.
  *
- * If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
- * phases II and II, cleaning up the dead tuples referenced in the current TID
- * store. This empties the TID store resumes phase I.
+ * If the TID store fills up in phase I, vacuum suspends phase I and proceeds
+ * to phases II and III, cleaning up the dead tuples referenced in the current
+ * TID store. This empties the TID store, allowing vacuum to resume phase I.
  *
  * In a way, the phases are more like states in a state machine, but they have
  * been referred to colloquially as phases for so long that they are referred
@@ -41,9 +41,48 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and various other requirements.
  *
- * When page skipping is not disabled, a non-aggressive vacuum may scan pages
- * that are marked all-visible (and even all-frozen) in the visibility map if
- * the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager freezes to
+ * MAX_EAGER_FREEZE_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is disabled for the remainder of the vacuum of the relation.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager freeze failure cap.
+ * The failure count is reset for each region of the table -- comprised of
+ * EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE failures
+ * before suspending eager scanning until the end of the region.
+ * vacuum_max_eager_freeze_failure_rate is configurable both globally and per
+ * table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -100,6 +139,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -185,6 +225,24 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out freezing overhead across multiple normal
+ * vacuums, we limit the number of successful eager page freezes. The maximum
+ * number of eager page freezes is calculated as a ratio of the all-visible
+ * but not all-frozen pages at the beginning of the vacuum.
+ */
+#define MAX_EAGER_FREEZE_SUCCESS_RATE 0.2
+
+/*
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once vacuum fails to freeze
+ * vacuum_max_eager_freeze_failure_rate of the blocks in a region of size
+ * EAGER_SCAN_REGION_SIZE, it suspends eager scanning until it has progressed
+ * to another region of the table with potentially older data.
+ */
+#define EAGER_SCAN_REGION_SIZE 4096
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -241,6 +299,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -282,9 +347,57 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eagerly scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a region suspends eager scanning.
+	 * next_eager_scan_region_start is the block number of the first block
+	 * eligible for resumed eager scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success cap,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning when it is successful. When eager scanning is enabled, this is
+	 * initialized to MAX_EAGER_FREEZE_SUCCESS_RATE of the total number of
+	 * all-visible but not all-frozen pages. For each eager freeze success, this
+	 * is decremented. Once it hits 0, eager scanning is permanently disabled.
+	 * It is initialized to 0 if eager scanning starts out disabled (including
+	 * for aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The maximum number of blocks which may be eagerly scanned and not
+	 * frozen before eager scanning is temporarily suspended. This is
+	 * configurable both globally, via the
+	 * vacuum_max_eager_freeze_failure_rate GUC, and per table, with a table
+	 * storage parameter of the same name. It is calculated as
+	 * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE blocks.
+	 * It is 0 when eager scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * eager_scan_max_fails_per_region each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -296,8 +409,10 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -305,7 +420,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -347,6 +462,133 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_before_cutoff = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->max_eager_freeze_failure_rate == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * Aggressively vacuuming a small relation shouldn't take long, so it
+	 * isn't worth amortizing. We use two times the region size as the size
+	 * cutoff because the eager scan start block is a random spot somewhere in
+	 * the first region, making the second region the first to be eager
+	 * scanned normally.
+	 */
+	if (vacrel->rel_pages < 2 * EAGER_SCAN_REGION_SIZE)
+		return;
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able
+	 * freeze some of the pages in the relation -- which is unlikely if
+	 * FreezeLimit has not advanced past the relfrozenxid or MultiXactCutoff
+	 * has not advanced past relminmxid
+	 *
+	 * Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
+	 * are technically freezable, but we won't freeze them unless the criteria
+	 * for opportunistic freezing is met.
+	 *
+	 * It is also possible that a transaction newer than the
+	 * FreezeLimit/MultiXactCutoff has ended, rendering additional tuples
+	 * freezable.
+	 *
+	 * As a heuristic, however, we wait until the FreezeLimit
+	 * or MultiXactCutoff has advanced to increase our chances of successful
+	 * freezing.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedes(vacrel->cutoffs.relfrozenxid,
+									  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedes(vacrel->cutoffs.relminmxid,
+									vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is MAX_EAGER_FREEZE_SUCCESS_RATE of the number of all-visible
+	 * but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (MAX_EAGER_FREEZE_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If every all-visible page is frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed % EAGER_SCAN_REGION_SIZE;
+
+	Assert(params->max_eager_freeze_failure_rate > 0 &&
+		   params->max_eager_freeze_failure_rate <= 1);
+
+	vacrel->eager_scan_max_fails_per_region =
+		params->max_eager_freeze_failure_rate *
+				EAGER_SCAN_REGION_SIZE;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager freeze failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails = vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -475,6 +717,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -500,6 +743,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -518,11 +762,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -537,6 +786,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -731,12 +987,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eagerly scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -907,8 +1165,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -927,16 +1187,21 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
+		if (was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 
 		/* Report as block scanned, update error traceback information */
 		pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
@@ -1061,7 +1326,45 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success cap, permanently disable eager
+					 * scanning by setting the other eager scan management
+					 * fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(DEBUG1,
+							(errmsg("disabling eager scanning after freezing %u eagerly scanned blocks of \"%s.%s.%s\"",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1161,7 +1464,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eagerly scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1171,13 +1476,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1250,6 +1558,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
 		return true;
 	}
 }
@@ -1273,11 +1582,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1285,6 +1595,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1313,28 +1636,41 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 			break;
 
 		/*
-		 * Aggressive VACUUM caller can't skip pages just because they are
-		 * all-visible.  They may still skip all-frozen pages, which can't
-		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
+		 * All-frozen pages cannot contain XIDs < OldestXmin (XIDs that aren't
+		 * already frozen by now), so this page can be skipped.
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) != 0)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip any all-visible pages that are not
+		 * also all-frozen.
+		 */
+		if (vacrel->aggressive)
+			break;
+
+		/*
+		 * Normal vacuums with eager scanning enabled only skip all-visible
+		 * but not all-frozen pages if they have hit the failure limit for the
+		 * current eager scan region.
+		 */
+		if (vacrel->eager_scan_remaining_fails > 0)
+		{
+			next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1365,6 +1701,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because neither empty nor new pages can
+ * be eagerly frozen. New pages are never frozen. Empty pages are always set
+ * frozen in the VM at the same time that they are set all-visible, and we
+ * don't eagerly scan frozen pages.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1504,6 +1846,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1512,7 +1858,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1664,11 +2011,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1756,6 +2109,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1763,7 +2117,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..4526dfe1a7a 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+double		vacuum_max_eager_freeze_failure_rate;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/* Later we check if a reloption override was specified */
+	params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2169,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_max_eager_freeze_failure_rate table storage
+	 * parameter was specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0)
+		params->max_eager_freeze_failure_rate =
+			((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..8c278952965 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+		/* Later we check reloptions for vacuum_max_eager_freeze_failure_ratge override */
+		tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index 38cb9e970d5..f2b8d87fc70 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -4024,6 +4024,16 @@ struct config_real ConfigureNamesReal[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"vacuum_max_eager_freeze_failure_rate", PGC_USERSET, VACUUM_FREEZING,
+			gettext_noop("Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning."),
+			gettext_noop("A value of 0.0 disables eager scanning and a value of 1.0 will eagerly scan up to 100 percent of the all-visible pages in the relation. If vacuum successfully freezes these pages, the cap is lower than 100 percent, because the goal is to amortize page freezing across multiple vacuums.")
+		},
+		&vacuum_max_eager_freeze_failure_rate,
+		0.03, 0.0, 1.0,
+		NULL, NULL, NULL
+	},
+
 	/* End-of-list marker */
 	{
 		{NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL, NULL
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 079efa1baa7..48f8b1cedc5 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -698,6 +698,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_max_eager_freeze_failure_rate = 0.03 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..eb8363a2888 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,13 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail to
+	 * freeze. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	double		max_eager_freeze_failure_rate;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +304,15 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may eagerly
+ * scan some all-visible but not all-frozen pages. Since the goal is to freeze
+ * these pages, an eager scan that fails to set the page all-frozen in the VM
+ * is considered to have "failed". This is the fraction of pages in the
+ * relation vacuum may scan and fail to freeze before disabling eager scanning.
+ */
+extern PGDLLIMPORT double vacuum_max_eager_freeze_failure_rate;
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..525516b10d3 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,12 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail to
+	 * freeze. 0 if disabled, -1 if unspecified.
+	 */
+	double		vacuum_max_eager_freeze_failure_rate;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.45.2

#38Robert Treat
rob@xzilla.net
In reply to: Melanie Plageman (#35)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Mon, Jan 27, 2025 at 12:45 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Fri, Jan 24, 2025 at 3:43 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Fri, Jan 24, 2025 at 3:02 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

attached v11 uses a fraction with this name. It follows the
conventions and I find it descriptive.

Changing the configuration to a fraction does mean that quite a few of
the comments are different in this version. I think the description of
the guc in
config.sgml could use some review in particular. I tried to make it
clear that the percentage is not the maximum number of blocks that
could be eager scanned, because you may also eagerly scan blocks and
succeed.

Specifies the maximum fraction of pages that <command>VACUUM</command>
may scan and <emphasis>fail</emphasis> to set all-frozen in the
visibility map before disabling eager scanning. A value of 0 disables
eager scanning altogether. The default is 0.03 (3%).

Note that when eager scanning is enabled, successful page freeze
attempts will not count against this limit, although they are
internally capped at 20% of the all-visible but not all-frozen pages
within the relation, in an effort to amortize overhead for future
aggressive vacuums.

This parameter can only be set in the
<filename>postgresql.conf</filename> file or on the server command
line; but the setting can be overridden for individual tables by
changing the <link
linkend="reloption-vacuum-max-eager-freeze-failure-rate">corresponding
table storage parameter</link>. For more information, see <xref
linkend="vacuum-for-wraparound"/>.

Other note: I noticed AutoVacOpts that are floating point numbers (like
vacuum_cost_delay) are float8s but their associated GUCs (like
autovacuum_vacuum_cost_delay) are doubles. These are going to be equivalent,
but I wanted to note the inconsistency in case I was missing something.

::thinking emoji::

I think what you have is right, though certainly better to have a more
qualified opinion.
On a not entirely related item, I find it interesting that you set
your max value to 1.0, but vacuum_scale_factor (and similar) set to
100.00.
I think you have it right though, what does it mean to set a table's
scale factor to 10,000%?

+ ereport(INFO,
+ (errmsg("Vacuum successfully froze %u eager scanned blocks of
\"%s.%s.%s\". Now disabling eager scanning.",

I predict that if Tom sees this, you will get complaints about both
the wording of the message, which pretty clearly does not conform to
style guidelines for a primary error message, and also about the use
of the INFO level. Allow me to suggest DEBUG1 or DEBUG2 and "disabling
eager scanning after freezing %u eagerly scanned blocks".

I've used your wording. Just for future reference, are the style
guidelines I was violating the capitalization and punctuation? Are
these documented somewhere? Also, what is a primary error message?
INFO level? Or ones that use ereport and are translated? I looked at
other messages and saw that they don't capitalize the first word or
use punctuation, so I assume that those were problems.

Yes. Primary error messages, i.e. errmsg(), are not capitalized and
punctuated, unlike errdetail() and errhint() messages, which are.

See https://www.postgresql.org/docs/current/error-style-guide.html

INFO level is used for VERY few things. I can't tell you off the top
of my head when it's appropriate, but I think the answer is "almost
never".

I have changed it to DEBUG2. I started it as INFO because the other vacuum
messages about whether or not the vacuum is an aggressive vacuum were at INFO
level.I don't know what a user might prefer. Treat said this downthread:

Maybe, but one of the areas that INFO is used for is providing
additional details in VACUUM VERBOSE output, and this seems like it
would be pretty useful information to have if you are trying to
discern changes in i/o rate during a vacuum, or trying to tune the
failure rate setting, or several other related fields (including
automated capture by tools like pganalyze), so I believe INFO is the
right choice for this.

I'm happy to go either way. I don't want users mad about verbosity, but if they
think it's helpful, then that seems good.

If there is a configurable, people will want to tune it, and DEBUG
level messages aren't a usable solution.

Robert Treat
https://xzilla.net

#39Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Melanie Plageman (#37)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Mon, Jan 27, 2025 at 1:22 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Mon, Jan 27, 2025 at 12:52 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

Thank you for updating the patch. I was reviewing the v10 patch and
had some comments. I believe these comments are still valid for v11,
but please ignore them if outdated.

Thanks so much for the review!

+       if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+               TransactionIdPrecedesOrEquals(vacrel->cutoffs.relfrozenxid,
+
vacrel->cutoffs.FreezeLimit))
+               oldest_unfrozen_before_cutoff = true;
+
+       if (!oldest_unfrozen_before_cutoff &&
+               MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+               MultiXactIdPrecedesOrEquals(vacrel->cutoffs.relminmxid,
+
vacrel->cutoffs.MultiXactCutoff))
+               oldest_unfrozen_before_cutoff = true;

Given that our freeze check strictly checks if an xid is older than
the cutoff (exclusive bound), I think we should check if the
relfrozenxid and relminmxid strictly precede the cutoff values.

Makes sense. I've changed that.

---
if (*was_eager_scanned)
vacrel->eager_scanned_pages++;

How about incrementing this counter near the place where incrementing
scanned_pages (i.e., at the beginning of the loop of
heap_vac_scan_next_block())? It would make it easy to understand the
difference between eager_scanned_pages and scanned_pages.

Right. That makes sense. I've changed that in the attached v12.

---
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because empty pages are always frozen and
+ * thus could never be eagerly scanned.

The last part "thus could never be eagerly scanned" confused me a bit;
IIUC we count all pages that are scanned because of this new eager
scan feature as "eagerly scanned pages". We increment
eager_scanned_pages counter even if the page is either new or empty.
This fact seems to contradict the sentence "empty pages could never be
eagerly scanned".

Ah, so what I mean by this is that the first time an empty page is
vacuumed, it is set all-visible and all-frozen in the VM. We only
eagerly scan pages that are _only_ all-visible (not also all-frozen).
So, no empty pages will ever be eligible for eager scanning. I've
updated the comment, because I agree it was confusing. See what you
think now.

Thank you for updating the patch! These updates look good to me.

BTW I realized that we need to update tab-complete.c too to support
the tab-completion for vacuum_max_eager_freeze_failure_rate.

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com

#40Melanie Plageman
melanieplageman@gmail.com
In reply to: Robert Treat (#38)
1 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

version 13 attached.

On Tue, Jan 28, 2025 at 1:49 PM Robert Treat <rob@xzilla.net> wrote:

On Mon, Jan 27, 2025 at 12:45 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Fri, Jan 24, 2025 at 3:43 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Fri, Jan 24, 2025 at 3:02 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

attached v11 uses a fraction with this name. It follows the
conventions and I find it descriptive.

Changing the configuration to a fraction does mean that quite a few of
the comments are different in this version. I think the description of
the guc in
config.sgml could use some review in particular. I tried to make it
clear that the percentage is not the maximum number of blocks that
could be eager scanned, because you may also eagerly scan blocks and
succeed.

Specifies the maximum fraction of pages that <command>VACUUM</command>
may scan and <emphasis>fail</emphasis> to set all-frozen in the
visibility map before disabling eager scanning. A value of 0 disables
eager scanning altogether. The default is 0.03 (3%).

Note that when eager scanning is enabled, successful page freeze
attempts will not count against this limit, although they are
internally capped at 20% of the all-visible but not all-frozen pages
within the relation, in an effort to amortize overhead for future
aggressive vacuums.

This parameter can only be set in the
<filename>postgresql.conf</filename> file or on the server command
line; but the setting can be overridden for individual tables by
changing the <link
linkend="reloption-vacuum-max-eager-freeze-failure-rate">corresponding
table storage parameter</link>. For more information, see <xref
linkend="vacuum-for-wraparound"/>.

Thanks! I've updated it to mostly be the same as your suggestion.

Other note: I noticed AutoVacOpts that are floating point numbers (like
vacuum_cost_delay) are float8s but their associated GUCs (like
autovacuum_vacuum_cost_delay) are doubles. These are going to be equivalent,
but I wanted to note the inconsistency in case I was missing something.

::thinking emoji::

I think what you have is right, though certainly better to have a more
qualified opinion.
On a not entirely related item, I find it interesting that you set
your max value to 1.0, but vacuum_scale_factor (and similar) set to
100.00.
I think you have it right though, what does it mean to set a table's
scale factor to 10,000%?

Yes, I was a bit torn about this. The other GUCs with "rate" or
"fraction" in the name -- log_transaction_sample_rate,
log_statement_sample_rate, cursor_tuple_fraction, etc have a min of 0
and a max of 1 -- and their docs mention they are a "fraction of X".

However, the gucs with "factor" in the name -- e.g.
autovacuum_vacuum_scale_factor have a min of 0 and a max of 100 -- but
those are taken as fractions. So, if you specify 50, that isn't 50%
but 5000% (which is what you are saying).
AFAICT, that just gets multiplied by reltuples and added to the base
threshold in relation_needs_vacanalyze(). So, I mean I guess maybe
that is purposeful, but it is quite confusing. I imagine there are
some users out there with it set to 20 thinking that means 20% of
reltuples when it really means 20x reltuples.

I have changed it to DEBUG2. I started it as INFO because the other vacuum
messages about whether or not the vacuum is an aggressive vacuum were at INFO
level.I don't know what a user might prefer. Treat said this downthread:

snip

I'm happy to go either way. I don't want users mad about verbosity, but if they
think it's helpful, then that seems good.

If there is a configurable, people will want to tune it, and DEBUG
level messages aren't a usable solution.

In this version, I've made it INFO when verbose is set and DEBUG1
otherwise -- which aligns somewhat with some of the other messages in
vacuumlazy.c

- Melanie

Attachments:

v13-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchapplication/octet-stream; name=v13-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchDownload
From 8e59d6c0f9e02c9812d364bdcbce28711706a8ef Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 27 Jan 2025 12:23:00 -0500
Subject: [PATCH v13] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Amortize the cost of an aggressive vacuum by eagerly scanning some
all-visible but not all-frozen pages during normal vacuums.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
counted as successful eager freezes and those not frozen are considered
failed eager freezes.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager frozen,
eager scanning is disabled for the remainder of the vacuum of the
relation.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Robert Treat <rob@xzilla.net>
Reviewed-by: Bilal Yavuz <byavuz81@gmail.com>
Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com>
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  36 ++
 doc/src/sgml/maintenance.sgml                 |  37 +-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  14 +-
 src/backend/access/heap/vacuumlazy.c          | 421 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  13 +
 src/backend/postmaster/autovacuum.c           |   6 +
 src/backend/utils/misc/guc_tables.c           |  10 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/include/commands/vacuum.h                 |  16 +
 src/include/utils/rel.h                       |   6 +
 11 files changed, 530 insertions(+), 45 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index a782f109982..578492a25fe 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9117,6 +9117,42 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+      <term><varname>vacuum_max_eager_freeze_failure_rate</varname> (<type>floating point</type>)
+      <indexterm>
+       <primary><varname>vacuum_max_eager_freeze_failure_rate</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum fraction of pages that
+        <command>VACUUM</command> may scan and <emphasis>fail</emphasis> to set
+        all-frozen in the visibility map before disabling eager scanning. A
+        value of <literal>0</literal> disables eager scanning altogether. The
+        default is <literal>0.03</literal> (3%).
+       </para>
+
+       <para>
+        Note that when eager scanning is enabled, successful page freezes
+        do not count against this limit, although they are internally
+        capped at twenty percent of the all-visible but not all-frozen
+        pages in the relation. Capping successful page freezes amortizes
+        the overhead across multiple normal vacuums.
+       </para>
+
+       <para>
+        This parameter can only be set in the
+        <filename>postgresql.conf</filename> file or on the server command
+        line; but the setting can be overridden for individual tables by
+        changing the
+        <link linkend="reloption-vacuum-max-eager-freeze-failure-rate">
+        corresponding table storage parameter</link>.
+        For more information on tuning vacuum,
+        see <xref linkend="vacuum-for-wraparound"/>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 0be90bdc7ef..ba25887fc88 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -496,14 +496,26 @@
     When that happens, <command>VACUUM</command> will eventually need to perform an
     <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
     XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+   </para>
+
+   <para>
+    If a table is building up a backlog of all-visible but not all-frozen
+    pages, a normal vacuum may choose to scan skippable pages in an effort to
+    freeze them. Doing so decreases the number of pages the next aggressive
+    vacuum must scan. These are referred to as <firstterm>eagerly
+    scanned</firstterm>pages. Eager scanning can be tuned to scan and attempt
+    to freeze more all-visible pages by increasing
+    <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>. Even if eager
+    scanning has kept the number of all-visible but not all-frozen pages to a
+    minimum, most tables still require periodic aggressive vacuuming.
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
-    pages are scanned if the number of transactions that have passed since the
-    last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
+    controls when a table is aggressively vacuumed. All all-visible but
+    not all-frozen pages are scanned if the number of transactions that
+    have passed since the last such scan is greater than
+    <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
-    <varname>vacuum_freeze_table_age</varname> to 0 forces <command>VACUUM</command> to
-    always use its aggressive strategy.
+    <varname>vacuum_freeze_table_age</varname> to 0 forces
+    <command>VACUUM</command> to always use its aggressive strategy.
    </para>
 
    <para>
@@ -626,10 +638,12 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    While <command>VACUUM</command> scans mostly pages that have been
+    modified since the last vacuum, it may also eagerly scan some
+    all-visible but not all-frozen pages in an attempt to freeze them, but
+    the <structfield>relfrozenxid</structfield> will only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.
+    This happens when
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
     <command>VACUUM</command>'s <literal>FREEZE</literal> option is used, or when all
@@ -929,8 +943,7 @@ vacuum insert threshold = vacuum base insert threshold + vacuum insert scale fac
     If the <structfield>relfrozenxid</structfield> value of the table
     is more than <varname>vacuum_freeze_table_age</varname> transactions old,
     an aggressive vacuum is performed to freeze old tuples and advance
-    <structfield>relfrozenxid</structfield>; otherwise, only pages that have been modified
-    since the last vacuum are scanned.
+    <structfield>relfrozenxid</structfield>.
    </para>
 
    <para>
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2237321cb4f..7e2deeebfad 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1931,6 +1931,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+    <term><literal>vacuum_max_eager_freeze_failure_rate</literal>, <literal>toast.vacuum_max_eager_freeze_failure_rate</literal> (<type>floating point</type>)
+    <indexterm>
+     <primary><varname>vacuum_max_eager_freeze_failure_rate</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..31a8212faf1 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -423,6 +423,16 @@ static relopt_real realRelOpts[] =
 		},
 		-1, 0.0, 100.0
 	},
+	{
+		{
+			"vacuum_max_eager_freeze_failure_rate",
+			"Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning.",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		},
+		-1, 0.0, 1.0
+	},
+
 	{
 		{
 			"seq_page_cost",
@@ -1880,7 +1890,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_max_eager_freeze_failure_rate", RELOPT_TYPE_REAL,
+		offsetof(StdRdOptions, vacuum_max_eager_freeze_failure_rate)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 5ed43e43914..fe4f5fa6a48 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -17,9 +17,9 @@
  * failsafe mechanism has triggered (to avoid transaction ID wraparound),
  * vacuum may skip phases II and III.
  *
- * If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
- * phases II and II, cleaning up the dead tuples referenced in the current TID
- * store. This empties the TID store resumes phase I.
+ * If the TID store fills up in phase I, vacuum suspends phase I and proceeds
+ * to phases II and III, cleaning up the dead tuples referenced in the current
+ * TID store. This empties the TID store, allowing vacuum to resume phase I.
  *
  * In a way, the phases are more like states in a state machine, but they have
  * been referred to colloquially as phases for so long that they are referred
@@ -41,9 +41,48 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and various other requirements.
  *
- * When page skipping is not disabled, a non-aggressive vacuum may scan pages
- * that are marked all-visible (and even all-frozen) in the visibility map if
- * the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager freezes to
+ * MAX_EAGER_FREEZE_SUCCESS_RATE of the number of all-visible but not all-frozen
+ * pages at the beginning of the vacuum. Once the success cap has been hit,
+ * eager scanning is disabled for the remainder of the vacuum of the relation.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager freeze failure cap.
+ * The failure count is reset for each region of the table -- comprised of
+ * EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE failures
+ * before suspending eager scanning until the end of the region.
+ * vacuum_max_eager_freeze_failure_rate is configurable both globally and per
+ * table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -100,6 +139,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -185,6 +225,24 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out freezing overhead across multiple normal
+ * vacuums, we limit the number of successful eager page freezes. The maximum
+ * number of eager page freezes is calculated as a ratio of the all-visible
+ * but not all-frozen pages at the beginning of the vacuum.
+ */
+#define MAX_EAGER_FREEZE_SUCCESS_RATE 0.2
+
+/*
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once vacuum fails to freeze
+ * vacuum_max_eager_freeze_failure_rate of the blocks in a region of size
+ * EAGER_SCAN_REGION_SIZE, it suspends eager scanning until it has progressed
+ * to another region of the table with potentially older data.
+ */
+#define EAGER_SCAN_REGION_SIZE 4096
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -241,6 +299,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -282,9 +347,57 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eagerly scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a region suspends eager scanning.
+	 * next_eager_scan_region_start is the block number of the first block
+	 * eligible for resumed eager scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success cap,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning when it is successful. When eager scanning is enabled, this is
+	 * initialized to MAX_EAGER_FREEZE_SUCCESS_RATE of the total number of
+	 * all-visible but not all-frozen pages. For each eager freeze success,
+	 * this is decremented. Once it hits 0, eager scanning is permanently
+	 * disabled. It is initialized to 0 if eager scanning starts out disabled
+	 * (including for aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The maximum number of blocks which may be eagerly scanned and not
+	 * frozen before eager scanning is temporarily suspended. This is
+	 * configurable both globally, via the
+	 * vacuum_max_eager_freeze_failure_rate GUC, and per table, with a table
+	 * storage parameter of the same name. It is calculated as
+	 * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE blocks.
+	 * It is 0 when eager scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * eager_scan_max_fails_per_region each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -296,8 +409,10 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -305,7 +420,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -347,6 +462,133 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_before_cutoff = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->max_eager_freeze_failure_rate == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * Aggressively vacuuming a small relation shouldn't take long, so it
+	 * isn't worth amortizing. We use two times the region size as the size
+	 * cutoff because the eager scan start block is a random spot somewhere in
+	 * the first region, making the second region the first to be eager
+	 * scanned normally.
+	 */
+	if (vacrel->rel_pages < 2 * EAGER_SCAN_REGION_SIZE)
+		return;
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able
+	 * freeze some of the pages in the relation -- which is unlikely if
+	 * FreezeLimit has not advanced past the relfrozenxid or MultiXactCutoff
+	 * has not advanced past relminmxid
+	 *
+	 * Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
+	 * are technically freezable, but we won't freeze them unless the criteria
+	 * for opportunistic freezing is met.
+	 *
+	 * It is also possible that a transaction newer than the
+	 * FreezeLimit/MultiXactCutoff has ended, rendering additional tuples
+	 * freezable.
+	 *
+	 * As a heuristic, however, we wait until the FreezeLimit or
+	 * MultiXactCutoff has advanced to increase our chances of successful
+	 * freezing.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedes(vacrel->cutoffs.relfrozenxid,
+							  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedes(vacrel->cutoffs.relminmxid,
+							vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is MAX_EAGER_FREEZE_SUCCESS_RATE of the number of
+	 * all-visible but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (MAX_EAGER_FREEZE_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If every all-visible page is frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed % EAGER_SCAN_REGION_SIZE;
+
+	Assert(params->max_eager_freeze_failure_rate > 0 &&
+		   params->max_eager_freeze_failure_rate <= 1);
+
+	vacrel->eager_scan_max_fails_per_region =
+		params->max_eager_freeze_failure_rate *
+		EAGER_SCAN_REGION_SIZE;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager freeze failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails = vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -477,6 +719,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -502,6 +745,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -520,11 +764,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -539,6 +788,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -734,12 +990,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eagerly scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -910,8 +1168,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -930,16 +1190,21 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
+		if (was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 
 		/* Report as block scanned, update error traceback information */
 		pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
@@ -1064,7 +1329,45 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success cap, permanently disable eager
+					 * scanning by setting the other eager scan management
+					 * fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(vacrel->verbose ? INFO : DEBUG2,
+							(errmsg("disabling eager scanning after freezing %u eagerly scanned blocks of \"%s.%s.%s\"",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1164,7 +1467,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eagerly scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1174,13 +1479,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1253,6 +1561,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
 		return true;
 	}
 }
@@ -1276,11 +1585,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1288,6 +1598,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1316,28 +1639,41 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 			break;
 
 		/*
-		 * Aggressive VACUUM caller can't skip pages just because they are
-		 * all-visible.  They may still skip all-frozen pages, which can't
-		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
+		 * All-frozen pages cannot contain XIDs < OldestXmin (XIDs that aren't
+		 * already frozen by now), so this page can be skipped.
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) != 0)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip any all-visible pages that are not
+		 * also all-frozen.
+		 */
+		if (vacrel->aggressive)
+			break;
+
+		/*
+		 * Normal vacuums with eager scanning enabled only skip all-visible
+		 * but not all-frozen pages if they have hit the failure limit for the
+		 * current eager scan region.
+		 */
+		if (vacrel->eager_scan_remaining_fails > 0)
+		{
+			next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1368,6 +1704,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like what is passed to
+ * lazy_scan_prune()) is passed here because neither empty nor new pages can
+ * be eagerly frozen. New pages are never frozen. Empty pages are always set
+ * frozen in the VM at the same time that they are set all-visible, and we
+ * don't eagerly scan frozen pages.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1507,6 +1849,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1515,7 +1861,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1667,11 +2014,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1759,6 +2112,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1766,7 +2120,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..4526dfe1a7a 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+double		vacuum_max_eager_freeze_failure_rate;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/* Later we check if a reloption override was specified */
+	params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2169,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_max_eager_freeze_failure_rate table storage
+	 * parameter was specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0)
+		params->max_eager_freeze_failure_rate =
+			((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..6db17b8e1db 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,12 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+
+		/*
+		 * Later we check reloptions for vacuum_max_eager_freeze_failure_ratge
+		 * override
+		 */
+		tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index 38cb9e970d5..f2b8d87fc70 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -4024,6 +4024,16 @@ struct config_real ConfigureNamesReal[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"vacuum_max_eager_freeze_failure_rate", PGC_USERSET, VACUUM_FREEZING,
+			gettext_noop("Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning."),
+			gettext_noop("A value of 0.0 disables eager scanning and a value of 1.0 will eagerly scan up to 100 percent of the all-visible pages in the relation. If vacuum successfully freezes these pages, the cap is lower than 100 percent, because the goal is to amortize page freezing across multiple vacuums.")
+		},
+		&vacuum_max_eager_freeze_failure_rate,
+		0.03, 0.0, 1.0,
+		NULL, NULL, NULL
+	},
+
 	/* End-of-list marker */
 	{
 		{NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL, NULL
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 079efa1baa7..48f8b1cedc5 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -698,6 +698,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_max_eager_freeze_failure_rate = 0.03 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..34ad20800ad 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,13 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail
+	 * to freeze. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	double		max_eager_freeze_failure_rate;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +304,15 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may eagerly
+ * scan some all-visible but not all-frozen pages. Since the goal is to freeze
+ * these pages, an eager scan that fails to set the page all-frozen in the VM
+ * is considered to have "failed". This is the fraction of pages in the
+ * relation vacuum may scan and fail to freeze before disabling eager scanning.
+ */
+extern PGDLLIMPORT double vacuum_max_eager_freeze_failure_rate;
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..3453fbe1c41 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,12 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail
+	 * to freeze. 0 if disabled, -1 if unspecified.
+	 */
+	double		vacuum_max_eager_freeze_failure_rate;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.45.2

#41Melanie Plageman
melanieplageman@gmail.com
In reply to: Masahiko Sawada (#39)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Tue, Jan 28, 2025 at 4:38 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

Thank you for updating the patch! These updates look good to me.

Thanks for taking another look!

BTW I realized that we need to update tab-complete.c too to support
the tab-completion for vacuum_max_eager_freeze_failure_rate.

I'm pretty sure tab-complete.c is auto-generated now. Tab completion
for vacuum_max_eager_freeze_failure_rate worked for me without doing
anything extra.

- Melanie

#42Melanie Plageman
melanieplageman@gmail.com
In reply to: Robert Haas (#29)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Fri, Jan 24, 2025 at 11:20 AM Robert Haas <robertmhaas@gmail.com> wrote:

On Fri, Jan 24, 2025 at 9:15 AM Melanie Plageman
<melanieplageman@gmail.com> wrote:

So, in this case, there is only one table in question, so 1 autovacuum
worker (and up to 2 maintenance parallel workers for index vacuuming).
The duration I provided is just the absolute duration from start of
vacuum to finish -- not considering the amount of time each parallel
worker may have been working (also it includes time spent delaying).
The benchmark ran for 2.8 hours. I configured vacuum to run
frequently. In this case, master spent 47% of the total time vacuuming
and the patch spent 56%.

Definitely not insignificant, but I think it's OK for a worst case.
Autovacuum is a background process, so it's not like a 20% regression
on query performance.

So, I've done a few runs with FPIs turned off to reduce run variance
caused by vacuum and checkpoint timing.
Of course this means that the amount of IO done by vacuum is very
different from a benchmark run with realistic settings.

I reran two of my simulations:

1)
- hot tail
32 clients inserting 20 rows then updating 1 row
duration: 3 hours

There is a small increase in total time spent vacuuming (< 10%). But
it is spread out. The first aggressive vacuum of the table is 20
seconds with the patch and 9 minutes on master. And this is not an
append-only workload -- the tail of the table (up to 200,000 rows old)
is being updated (and potentially unfrozen). So, this feels like a
win.

The insert/update P99 latency is lower (better) with the patch around
the time of the aggressive vacuum.

2)
- hot tail with delete (worst-case)
32 clients inserting 20 rows then updating 1 row and 1
rate-limited client deleting all data before it can be aggressively
vacuumed
durations: 3 hours

There is a 10-15% increase in total time spent vacuuming with the
patch (30-40% of total benchmark runtime is spent vacuuming).

I ran the benchmark for 4 hours as well, and for that duration I
started to see a larger increase in vacuum IO time with the patch.
However, the 4 hour run had only one aggressive vacuum (around the 2.5
hour mark), so the numbers are hard to compare because the patch is
meant to do some of the work of the next aggressive vacuum in advance.

The insert/update P99 latency is the same or lower (better) with the patch.

Next I plan to run the hottail delete benchmark with default settings
(including FPIs) with master and with the patch for about 24 hours
each. I'm hoping the long duration will smooth out some of the run
variance even with FPIs.

- Melanie

#43Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Melanie Plageman (#41)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Wed, Jan 29, 2025 at 6:08 AM Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Tue, Jan 28, 2025 at 4:38 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

Thank you for updating the patch! These updates look good to me.

Thanks for taking another look!

BTW I realized that we need to update tab-complete.c too to support
the tab-completion for vacuum_max_eager_freeze_failure_rate.

I'm pretty sure tab-complete.c is auto-generated now. Tab completion
for vacuum_max_eager_freeze_failure_rate worked for me without doing
anything extra.

I missed to mention; it's about the tab completion for
vacuum_max_easter_freeze_failure storage parameter. We still need to
update the tab-complete.in.c file (I mentioned the wrong file
previously) for that.

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com

#44Melanie Plageman
melanieplageman@gmail.com
In reply to: Masahiko Sawada (#43)
1 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Wed, Jan 29, 2025 at 12:59 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

I missed to mention; it's about the tab completion for
vacuum_max_easter_freeze_failure storage parameter. We still need to
update the tab-complete.in.c file (I mentioned the wrong file
previously) for that.

Ah, thanks! I didn't realize that reloptions had tab-complete (and
that it was not automatically generated). I've fixed it now. Thanks so
much.

I also went through and took another pass at cleaning up comments.

- Melanie

Attachments:

v14-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchapplication/octet-stream; name=v14-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchDownload
From 71f32189aad510b73d221fb0478ffd916e5e5dde Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 27 Jan 2025 12:23:00 -0500
Subject: [PATCH v14] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Amortize the cost of an aggressive vacuum by eagerly scanning some
all-visible but not all-frozen pages during normal vacuums.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
counted as successful eager freezes and those not frozen are considered
failed eager freezes.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager frozen,
eager scanning is disabled for the remainder of the vacuum of the
relation.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Robert Treat <rob@xzilla.net>
Reviewed-by: Bilal Yavuz <byavuz81@gmail.com>
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  36 ++
 doc/src/sgml/maintenance.sgml                 |  31 +-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  14 +-
 src/backend/access/heap/vacuumlazy.c          | 419 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  13 +
 src/backend/postmaster/autovacuum.c           |   6 +
 src/backend/utils/misc/guc_tables.c           |  10 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/bin/psql/tab-complete.in.c                |   2 +
 src/include/commands/vacuum.h                 |  17 +
 src/include/utils/rel.h                       |   6 +
 12 files changed, 529 insertions(+), 41 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index a782f109982..d83e3b5dc07 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9117,6 +9117,42 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+      <term><varname>vacuum_max_eager_freeze_failure_rate</varname> (<type>floating point</type>)
+      <indexterm>
+       <primary><varname>vacuum_max_eager_freeze_failure_rate</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum fraction of pages that
+        <command>VACUUM</command> may scan and <emphasis>fail</emphasis> to set
+        all-frozen in the visibility map before disabling eager scanning. A
+        value of <literal>0</literal> disables eager scanning altogether. The
+        default is <literal>0.03</literal> (3%).
+       </para>
+
+       <para>
+        Note that when eager scanning is enabled, successful page freezes
+        do not count against this limit, although they are internally
+        capped at 20% of the all-visible but not all-frozen pages in the
+        relation. Capping successful page freezes helps amortize the
+        overhead across multiple normal vacuums.
+       </para>
+
+       <para>
+        This parameter can only be set in the
+        <filename>postgresql.conf</filename> file or on the server command
+        line; but the setting can be overridden for individual tables by
+        changing the
+        <link linkend="reloption-vacuum-max-eager-freeze-failure-rate">
+        corresponding table storage parameter</link>.
+        For more information on tuning vacuum's freezing behavior,
+        see <xref linkend="vacuum-for-wraparound"/>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 0be90bdc7ef..a5baafb70ad 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -496,9 +496,23 @@
     When that happens, <command>VACUUM</command> will eventually need to perform an
     <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
     XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+   </para>
+
+   <para>
+    If a table is building up a backlog of all-visible but not all-frozen
+    pages, a normal vacuum may choose to scan skippable pages in an effort to
+    freeze them. Doing so decreases the number of pages the next aggressive
+    vacuum must scan. These are referred to as <firstterm>eagerly
+    scanned</firstterm> pages. Eager scanning can be tuned to attempt
+    to freeze more all-visible pages by increasing
+    <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>. Even if eager
+    scanning has kept the number of all-visible but not all-frozen pages to a
+    minimum, most tables still require periodic aggressive vacuuming.
+   </para>
+
+   <para>
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
+    controls when a table is aggressively vacuumed. All all-visible but not all-frozen
     pages are scanned if the number of transactions that have passed since the
     last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
@@ -626,10 +640,12 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    While <command>VACUUM</command> scans mostly pages that have been
+    modified since the last vacuum, it may also eagerly scan some
+    all-visible but not all-frozen pages in an attempt to freeze them, but
+    the <structfield>relfrozenxid</structfield> will only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.
+    This happens when
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
     <command>VACUUM</command>'s <literal>FREEZE</literal> option is used, or when all
@@ -929,8 +945,7 @@ vacuum insert threshold = vacuum base insert threshold + vacuum insert scale fac
     If the <structfield>relfrozenxid</structfield> value of the table
     is more than <varname>vacuum_freeze_table_age</varname> transactions old,
     an aggressive vacuum is performed to freeze old tuples and advance
-    <structfield>relfrozenxid</structfield>; otherwise, only pages that have been modified
-    since the last vacuum are scanned.
+    <structfield>relfrozenxid</structfield>.
    </para>
 
    <para>
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2237321cb4f..7e2deeebfad 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1931,6 +1931,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+    <term><literal>vacuum_max_eager_freeze_failure_rate</literal>, <literal>toast.vacuum_max_eager_freeze_failure_rate</literal> (<type>floating point</type>)
+    <indexterm>
+     <primary><varname>vacuum_max_eager_freeze_failure_rate</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..31a8212faf1 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -423,6 +423,16 @@ static relopt_real realRelOpts[] =
 		},
 		-1, 0.0, 100.0
 	},
+	{
+		{
+			"vacuum_max_eager_freeze_failure_rate",
+			"Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning.",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		},
+		-1, 0.0, 1.0
+	},
+
 	{
 		{
 			"seq_page_cost",
@@ -1880,7 +1890,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_max_eager_freeze_failure_rate", RELOPT_TYPE_REAL,
+		offsetof(StdRdOptions, vacuum_max_eager_freeze_failure_rate)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 5ed43e43914..cfdce180030 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -17,9 +17,9 @@
  * failsafe mechanism has triggered (to avoid transaction ID wraparound),
  * vacuum may skip phases II and III.
  *
- * If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
- * phases II and II, cleaning up the dead tuples referenced in the current TID
- * store. This empties the TID store resumes phase I.
+ * If the TID store fills up in phase I, vacuum suspends phase I and proceeds
+ * to phases II and III, cleaning up the dead tuples referenced in the current
+ * TID store. This empties the TID store, allowing vacuum to resume phase I.
  *
  * In a way, the phases are more like states in a state machine, but they have
  * been referred to colloquially as phases for so long that they are referred
@@ -41,9 +41,49 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and various other requirements.
  *
- * When page skipping is not disabled, a non-aggressive vacuum may scan pages
- * that are marked all-visible (and even all-frozen) in the visibility map if
- * the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager freezes to
+ * MAX_EAGER_FREEZE_SUCCESS_RATE of the number of all-visible but not
+ * all-frozen pages at the beginning of the vacuum. Once the success cap has
+ * been hit, eager scanning is disabled for the remainder of the vacuum of the
+ * relation.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager freeze failure
+ * cap. The failure count is reset for each region of the table -- comprised
+ * of EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE failures
+ * before suspending eager scanning until the end of the region.
+ * vacuum_max_eager_freeze_failure_rate is configurable both globally and per
+ * table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -100,6 +140,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -185,6 +226,24 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out freezing overhead across multiple normal
+ * vacuums, we limit the number of successful eager page freezes. The maximum
+ * number of eager page freezes is calculated as a ratio of the all-visible
+ * but not all-frozen pages at the beginning of the vacuum.
+ */
+#define MAX_EAGER_FREEZE_SUCCESS_RATE 0.2
+
+/*
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once vacuum fails to freeze
+ * vacuum_max_eager_freeze_failure_rate of the blocks in a region of size
+ * EAGER_SCAN_REGION_SIZE, it suspends eager scanning until it has progressed
+ * to another region of the table with potentially older data.
+ */
+#define EAGER_SCAN_REGION_SIZE 4096
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -241,6 +300,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -282,9 +348,57 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eagerly scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a region suspends eager scanning.
+	 * next_eager_scan_region_start is the block number of the first block
+	 * eligible for resumed eager scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success cap,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning when it is successful. When eager scanning is enabled, this is
+	 * initialized to MAX_EAGER_FREEZE_SUCCESS_RATE of the total number of
+	 * all-visible but not all-frozen pages. For each eager freeze success,
+	 * this is decremented. Once it hits 0, eager scanning is permanently
+	 * disabled. It is initialized to 0 if eager scanning starts out disabled
+	 * (including for aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The maximum number of blocks which may be eagerly scanned and not
+	 * frozen before eager scanning is temporarily suspended. This is
+	 * configurable both globally, via the
+	 * vacuum_max_eager_freeze_failure_rate GUC, and per table, with a table
+	 * storage parameter of the same name. It is calculated as
+	 * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE blocks.
+	 * It is 0 when eager scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * eager_scan_max_fails_per_region each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -296,8 +410,11 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel,
+										 VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -305,7 +422,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -347,6 +464,129 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_before_cutoff = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->max_eager_freeze_failure_rate == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * Aggressively vacuuming a small relation shouldn't take long, so it
+	 * isn't worth amortizing. We use two times the region size as the size
+	 * cutoff because the eager scan start block is a random spot somewhere in
+	 * the first region, making the second region the first to be eager
+	 * scanned normally.
+	 */
+	if (vacrel->rel_pages < 2 * EAGER_SCAN_REGION_SIZE)
+		return;
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation.
+	 *
+	 * Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
+	 * are technically freezable, but we won't freeze them unless the criteria
+	 * for opportunistic freezing is met. Only tuples with XIDs/MXIDs older
+	 * than the the FreezeLimit/MultiXactCutoff are frozen in the common case.
+	 *
+	 * So, as a heuristic, we wait until the FreezeLimit has advanced past the
+	 * relfrozenxid or the MultiXactCutoff has advanced past the relminmxid to
+	 * enable eager scanning.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedes(vacrel->cutoffs.relfrozenxid,
+							  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedes(vacrel->cutoffs.relminmxid,
+							vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is MAX_EAGER_FREEZE_SUCCESS_RATE of the number of
+	 * all-visible but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (MAX_EAGER_FREEZE_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If every all-visible page is frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed % EAGER_SCAN_REGION_SIZE;
+
+	Assert(params->max_eager_freeze_failure_rate > 0 &&
+		   params->max_eager_freeze_failure_rate <= 1);
+
+	vacrel->eager_scan_max_fails_per_region =
+		params->max_eager_freeze_failure_rate *
+		EAGER_SCAN_REGION_SIZE;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager freeze failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails =
+		vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -477,6 +717,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -502,6 +743,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -520,11 +762,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -539,6 +786,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -734,12 +988,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eagerly scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -910,8 +1166,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -930,16 +1188,21 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
+		if (was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 
 		/* Report as block scanned, update error traceback information */
 		pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
@@ -1064,7 +1327,45 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success cap, permanently disable eager
+					 * scanning by setting the other eager scan management
+					 * fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(vacrel->verbose ? INFO : DEBUG2,
+							(errmsg("disabling eager scanning after freezing %u eagerly scanned blocks of \"%s.%s.%s\"",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1164,7 +1465,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eagerly scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1174,13 +1477,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1253,6 +1559,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
 		return true;
 	}
 }
@@ -1276,11 +1583,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1288,6 +1596,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1316,28 +1637,41 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 			break;
 
 		/*
-		 * Aggressive VACUUM caller can't skip pages just because they are
-		 * all-visible.  They may still skip all-frozen pages, which can't
-		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
+		 * All-frozen pages cannot contain XIDs < OldestXmin (XIDs that aren't
+		 * already frozen by now), so this page can be skipped.
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) != 0)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip any all-visible pages that are not
+		 * also all-frozen.
+		 */
+		if (vacrel->aggressive)
+			break;
+
+		/*
+		 * Normal vacuums with eager scanning enabled only skip all-visible
+		 * but not all-frozen pages if they have hit the failure limit for the
+		 * current eager scan region.
+		 */
+		if (vacrel->eager_scan_remaining_fails > 0)
+		{
+			next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1368,6 +1702,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like that passed to lazy_scan_prune())
+ * is passed here because neither empty nor new pages can be eagerly frozen.
+ * New pages are never frozen. Empty pages are always set frozen in the VM at
+ * the same time that they are set all-visible, and we don't eagerly scan
+ * frozen pages.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1507,6 +1847,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1515,7 +1859,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1667,11 +2012,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1759,6 +2110,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1766,7 +2118,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..4526dfe1a7a 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+double		vacuum_max_eager_freeze_failure_rate;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/* Later we check if a reloption override was specified */
+	params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2169,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_max_eager_freeze_failure_rate table storage
+	 * parameter was specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0)
+		params->max_eager_freeze_failure_rate =
+			((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..32a1b8c46a1 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,12 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+
+		/*
+		 * Later we check reloptions for vacuum_max_eager_freeze_failure_rate
+		 * override
+		 */
+		tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index 38cb9e970d5..f2b8d87fc70 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -4024,6 +4024,16 @@ struct config_real ConfigureNamesReal[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"vacuum_max_eager_freeze_failure_rate", PGC_USERSET, VACUUM_FREEZING,
+			gettext_noop("Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning."),
+			gettext_noop("A value of 0.0 disables eager scanning and a value of 1.0 will eagerly scan up to 100 percent of the all-visible pages in the relation. If vacuum successfully freezes these pages, the cap is lower than 100 percent, because the goal is to amortize page freezing across multiple vacuums.")
+		},
+		&vacuum_max_eager_freeze_failure_rate,
+		0.03, 0.0, 1.0,
+		NULL, NULL, NULL
+	},
+
 	/* End-of-list marker */
 	{
 		{NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL, NULL
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 079efa1baa7..48f8b1cedc5 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -698,6 +698,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_max_eager_freeze_failure_rate = 0.03 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c
index 81cbf10aa28..dc122ed1837 100644
--- a/src/bin/psql/tab-complete.in.c
+++ b/src/bin/psql/tab-complete.in.c
@@ -1388,10 +1388,12 @@ static const char *const table_storage_parameters[] = {
 	"toast.autovacuum_vacuum_threshold",
 	"toast.log_autovacuum_min_duration",
 	"toast.vacuum_index_cleanup",
+	"toast.vacuum_max_eager_freeze_failure_rate",
 	"toast.vacuum_truncate",
 	"toast_tuple_target",
 	"user_catalog_table",
 	"vacuum_index_cleanup",
+	"vacuum_max_eager_freeze_failure_rate",
 	"vacuum_truncate",
 	NULL
 };
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..7dad14319a1 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,13 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail
+	 * to freeze. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	double		max_eager_freeze_failure_rate;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +304,16 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may
+ * eagerly scan some all-visible but not all-frozen pages. Since the goal
+ * is to freeze these pages, an eager scan that fails to set the page
+ * all-frozen in the VM is considered to have "failed". This is the
+ * fraction of pages in the relation vacuum may scan and fail to freeze
+ * before disabling eager scanning.
+ */
+extern PGDLLIMPORT double vacuum_max_eager_freeze_failure_rate;
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..3453fbe1c41 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,12 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail
+	 * to freeze. 0 if disabled, -1 if unspecified.
+	 */
+	double		vacuum_max_eager_freeze_failure_rate;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.45.2

#45Melanie Plageman
melanieplageman@gmail.com
In reply to: Melanie Plageman (#42)
2 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Wed, Jan 29, 2025 at 11:34 AM Melanie Plageman
<melanieplageman@gmail.com> wrote:

Next I plan to run the hottail delete benchmark with default settings
(including FPIs) with master and with the patch for about 24 hours
each. I'm hoping the long duration will smooth out some of the run
variance even with FPIs.

I've done this as well as a few other benchmarks of varying durations

Hot Tail Delete before Aggressive Vacuum:

I ran a 20 hour version of the hot tail benchmark that deletes all
data before it is aggressively vacuumed. The performance is a bit
better with the patch applied. This differed from the runs of the hot
tail delete benchmark that I ran with FPIs disabled. For this
benchmark (20 hours with FPIs enabled), I saw a decrease in vacuum I/O
time with the patch applied. I saw a similar change in client backend
bulkread evictions (the DELETE does bulkreads) and client backend
writes. This could be run variance due to checkpoint timing or even
benchmark run order interacting with SSD sustained write performance
issues.

Overall, I think this long-running hot tail delete benchmark shows
that the patch will not have surprising negative behavior for this
type of workload.

TPCB-like Gaussian Update Distribution:

I also ran a 22 hour version of the built-in tpcb-like benchmark with
a gaussian update distribution. I did see a large decrease in I/O done
by vacuum. However, the gaussian tpcb-like benchmark spends much less
time in vacuum overall, so the results, while positive, are not
dramatically different when considering overall performance of the
workload. The vacuum I/O decrease seems mainly to be reads of
pgbench_history -- which were much higher on master, likely due to
aggressive vacuums reading pages that had already been evicted from
shared buffers and, potentially, the kernel buffer cache.

I attached a chart from the 22 hour gaussian tpcb-like benchmark of
the read and write time increases corresponding with aggressive
vacuums of pgbench_history.

I was re-running some of the shorter benchmarks as a quick soundness
check on this version of the patch and attached a chart from the
append-only benchmark.

Similar to the gaussian tpcb-like workload, you can see that when the
aggressive vacuum triggers on master, the vacuum read and write times
jumps. This is pretty consistent with what I see on all of the
benchmarks.

In these two examples, the overall time spent in vacuum I/O isn't very
high, so the performance improvement may not be noticeable. However,
it seems like the patch has an overall smoothing effect on vacuum's
performance.

- Melanie

Attachments:

gaussian_tpcb_22hr.pngimage/png; name=gaussian_tpcb_22hr.pngDownload
�PNG


IHDR��A0�[9tEXtSoftwareMatplotlib version3.9.1, https://matplotlib.org/��!	pHYs.#.#x�?vIDATx���w����>���E�",�Ai���bAcOl�&'��FF
����1&�9�����GQ�(� - m�������;n�23�a���fe?���{S&���oRI�$�$'���(��V)��V)��V)��V)��V)��V)��V)��V)��V)��V)��V�e;l
�$�3f������b��%Q�~�h��Yt��=�����k���w�}7&N�������m���>}�D��=�*E�����O</��B���k�h��
������;,~��_���k1�7�-[�������n�������e�]�7��M�z���J�j9!T^*I�$�!���������;V�ZU��'�|r��O�&M��@��>���8��#c����Z�������(**��d�y`�]���o�?��|nnn�i�&v�q�X�zu��93����
�������j�h���'�����-��/,,�.]�DYYY��1#V�^��|�}���^{-


j4l��l�lk��i���?�g�}6/^�g����?>���(..��_=�������SO=�Fs�Y�&�9���������<%%%��G��)Sb��yq�%�DN���:���;q���h>�\�$I�l�����o�(..�����q��'F�
6�~�������<�������^{-\#����8�����f���[o�=z�X��Gy$N:���8///>������{����������>C��z��Uz���kc������?=w��'��?\��V�Z��u���g������8���7���?�i<��C5���,������q�����-Z��E�U�=O?�t><=���S|���J�6�o��i��{����u~~~,\�0����=ce,Y�$�x����}��Q�~��d���\�2f���80�6m��<yY��A������a���z��O>�1>���6Y~��k�8p`�=:""V�^�=�\�p�	�����x��8����r7��O��G���s�v3l��5kVa������{�}����AT��C��?��3��	��,��9s�T�k��E��1���7o^z\�~����w�����~�	&TW4�y���7�|3c��c��W�^��1i���q�n��tG�=2�S�N�5k�D^^��uo��}���'��n���z�����S����J�����m
��
��������Z�wL�<9c\�o-[�����X�bEDD�Z�*�O���w����U�~��q�n��g�����L����6XPI�=�\�3&c��SO��{,X�1�i���|F��m��/��83X��[�uD$5{G�$Q�liDR����� �5�n��NTBIII�}��sGuT������Z�lY��Q�FU>c�=���9,X.����S�n���
�F<���%����R��6.����ct�sP�cl�`�&����O~���������������[j��u��


�|F�
6z����_�#G���s`[0�/�U~���l���\�?�|��w�������V�X�1�W�^���_�~����l�2��f��l'��Ml�-����2�.���8���j��������U��|���+7z&dS^�����G�_��Ws��zj������{3�+V���eee=ss���?�c�9�J{�N�Gu��
�v�E��_��N��/�~97=����D�������P��O�#l�`�z<��3q�)�D�$����Gq��wG*�����-������|��{���U�V��U�->�E
�F4nY���kV���I�FQ�G����29�[��_=�9��X�fMzn�������Fnnn���n������*�1w�����*��$�v��`�w����1|��X�bEzn�}���<���W+v�e����Y���������]�t��lP`�����3�
��-K����^��s�E�F�j-�����1�6mZ�Z����'M��1���k���UK6�
� "&O�C������v�m�x������V��n�:Z�n��\�2��_��o��v�x�=���h��Je;�1
�����93<��X�`Az�s�����/G��-���������������#�8�Z2@uQ��v��/��8 �������k���j�k�.k���1����"I�M��6mZ����q~~~z������M��
��n������Cc��i���-[��/��;w�b���>8v�i��x��q�}�mr��~�������>:���j$#l��l�lX�tir�!��'����6m/��R���n�z��3*jM�>=:u���=����K.�$�=�����#b����=z�w�#�<=�Pz���#G������$I���<�$�v�K�R����T*�Qj�,�K���q��e�����h��x��W�tV�>}�Y�f�/""~��������.�Z�xq0 n���8��#/����%%%q�M7��W_��������w���s�vi���!�v'I�X�bE,]�4�.]�V��v$`;R�^�h��q4n�8


��B,Xl�F�]a���.���^��4h��Z��������������D�7eW��rJ�����]�FYYYL�>=V�^�����q�
7T{&��h���1w��
�e��UQ\\������m����
f;V���v`�v�m�x����c�����-��>�(�L�R�8x�����/F�
j3*�)I�Pk�/_�f�R~l5V�^�f�����g;J�R�[�^�z��_|q4k�l���w�w�uW���K��i�������*IT![�$I�|	V^�@6�����������q�����c�������������8rss�M�6��w��c�=�)1@��$I��;�B/D~~~4i�$
#???R�T���$Ib����l��(--���Wg<�;wnt���N~/R���������c����v�����l�V�X�Q4��q�h��]�,��^�����a�h��e��3'�.]�~�z��X�red1a���v�������o
h�_��J��]�v����1_ZZ��D5K�+�vj��XM�4Q~d]*��&M�d������P�lW�$�U�Ve�f)
@�u��Z�*���5�+��+��������������
s�����S����v�S�$�R)���:��T��Z���m�,XG�<!lU`P�`P�`P�`�&���X��$��nS�@�R�@�R����v�[`P�`�:�l�:NP�����H�R�����?���E
��U
�`R�l'��E�J�+�v��`P����e�����?�<���999��k�<xpmt��+�����I�&���K�Y�f������"/o����-[�|�I|��gQ\\eeeQTT;��C���;v�y��:���.]~�aL�<9�,Y+W���
F�f��S�N��G��q����-1k��x���c����x��(**���[�~���[������]c���3f��_~k����={���^���5
�`SR�d����c�������_����b�����?�9n�������+�k��a����+��"


2�-]�4���������������-[�5�\?���*�q��)�����/����~�Y�f�k[�n��{n�����f��U��o}��q�UW���>�V������;�a���{n���#=?c������z��v�iq�i�m�����G�N�6�|��Uq�m���w��~��z��R����O\z��1|�����o��w���#G�����z4(JJJ��k���z(������W�^
�6AT��_?�����_���������_c���_|14h��M�a����4�[.�3�8#&N�7�t�F�<��3q�GT:��y����/�;��3�����_�������K.�$���+�~���q���FQQQ\u�U�����}��8��b���]�$I����q��G�G�>�h4j����M�0!;���;w��F���d;lu�l�VI�����Q~��m����o���#rss3�����q�y�ED��b��!���T*]�t�~��E�.]*�u��7��?��<+V��0��A��y���O�>��o����s��d�
��3'
�&M��{���{���/�P~��q��c�=b����^�zE���#�Jm������O����+�_��W/v�e�����������Wa��!C��k�1�g���>8���]�v��O��y�����`���v$o�K���|0f��'�pB\z����n����e�]��_�sw�}w�����.� f��q�������[�N��<yr�u�Y1f�����#��c�����
f����C9$�C��.]�T(�Z�ti<��Sq�W��)S""b���q��'�|�����+W��^�1w��G��_�{���o���1n��x�������p^�����a/��R\���g\pAt�A|������'�|�w\��������o���(�Z�ti�5*.����?~DD���{�_��_q�m�m��u]p��`��������:+�?�����[�yYYY�����>o{�*����n�!~��_Wx��E�����eeeq�}�EDD�$q�q���I����0�{��0`@�����K<�����o��4iRDD��7/�}��8������O�>1m������Fs7n�8N:��8����������{.""&L�/��B6l��^}��())I�O>��x��6z��!Cb��!q��W�������q��FDTx��G����X�fM���W#G��K/�t��^�7�3�<3=��<xp|���q����Yg�{��W���?~������>?���+<o��A����JlJ��K��K��cmqq�c�Y�-ZD*''�16����[o��w]u�U��DyyyDD�����z�����a����K��OL�=���,����s���_������K|��Wq�}�m�k��)��������^�z��K�*�����1q���������.�l����k����{��g����o��z��w�1b��WT�,XG�����nk����V������`A��l����J���+�����m�F��}����K�u��1N?��M�=��#"''']����n~��h��y6,F�������eee����j��%n������
�5�\S��{��Gy������GD��O>k������M�m��a\|��U�K�����2����b��w����w�=c����RK�����S��x��YU�X�;wN��3gN,\�p����m�1~����=��(..�(;����Y�fU:���J�^�lY���;��h��I�����l�mE�>}*��E����{Wi�_|������d�������x������>�/��2JKKc������h��h��e��!C�Dnnn�]�6""n���X�bE�1"�t�R��S��z��H�$=���o�����C�x��I�:���U���r���+����
V�������������/���[�g���|���1o��J�_E|S��>�����O?=c���n��]�F��}���.���{.JJJ*uOu�4iR���/�T*U���;,�������;W�����e;l�R�vQ����m�"�/X��uVn����AY��!�-�!C����E��\�r��n����7o^<��������������^�T*z����
��N:)z���Ey6����������*��I�&�~��H@�rr"�e�l��8��c*�_�o�>=z���v�)
�A�����^����_���J�QPPO>�d�5*�����0aB�5I���	b��	q�5��a�7�|st��m����,Y����,//������j�{{��AO=�T�=:=n��q�v�mq�	'd�]�����Z��R�T�p�	q�	'���~/��r�=:�z��X�hQ���>�l�3&�}��0`@�����
f���_�a��Egv��e��S5
�`4j����w�'�pB�����l��=z��=z�y��I��g�}/��R������z+�n������8�M�����}������6m���X�wP�6^�D�����c��_�h�"�=��J����O�%C*���v�-�;��x��7c��1�T,������r�wu��9c<u��j�����A���O����[���Vj_iii�?�F2
0 ~���g����[�]���Y��$I��<xp����^��^�
�`U��%@�|�0j��U��w�����+j"RDD���~�E��w]�F�2���/�������w�==�6mZ<���UHI�)��mP�����?���X�d�&���3'F�Y��*^5k�l���7o�1�>}z�����2�����������d�,��������V���/�x��.\�~x����u����C=k�����$I��o������z����3c��SO����+����N�8c��)1l���;wn��X�zu<��q���Vz�ClB*���|����o�=N9���9sf����K��{���}�{1a�����m��*u��?��O�]�vq����/���������[o�tP<�����
��'����[�j�z�J�?����g�}���c<��3��+�d|�X�"cnnn����o���y���}�����/�)S��������3�<g�}v�k�.N=���4iR�~=�>y�T�A�zh<��s��|0|�����K�l�2�,Y��O�U�V���x����{�9rd��Z�`A�~��q���GDD�6mb�v�F���_��O�e��U�w��7F�v�6x�����"����������v�����S���]v�%��8���c����x�����+��+��v�!Z�n�5����X�hQ,\���������d;@�<���q���{���1��_�_|Qa�����w_\}��[t��_~_~���7h� n���8���7z�O���8qb\���$��C�����q���N�q��e<[�hQ,Z�h��S�T�o�~��f��d;�y�6mc���K/�4���6��g����#����>������w�uW�{��q��G��;������7�s�9'&M�����o]{��1a��1bD������U�(((�t����]��{��O=�T2d��1777��g����+b���q��WV�>�\*���3�M���Ob��wO�'N�={��b"�����X����c���O����N;��9s���/��\��a��5����g�u��=��������+��w��I�&�����^�z��m����_�����r����c���1s������b��UQXX-[��=��#z���U�]Z�|y�;6f�����QVV�����;�.�����[4j�(�1����Gmm}0��S[�T�lZAAA<8\cwt��9:w�\c�W��
��!C�����v�/
�`I��P�)��V)��V)��MHe;�1
��U
��U
��U
�`SR�u�,j�,XG�d;�m
��U
��U
�`R�l'��E�J�+�v��`P�`P�`�����X�*X��$��nS�@�R�@�R�@�R�@�R��H�l'��M�J�JlB*��u��3"�J��N=��lG��)��lI�l'��P�@�R�����GG*�J��w��v$�c
�`SR�uOm]���Z���$�Nu�,j�,jU^���.��v`k�f��;vlL�81JJJ�I�&��}�4hPm��K�,��'����c����j��h��i�j�*���;v��w���,Y���N|����h��(//��M�F��]�W�^��U�-�c����������s#777Z�j�����v����Ml����c�������_����b�����?�!n���X�pa�}�������q�
7D�v�*u��~�F���^z)>���H�d�k�t���w^�y����A�����@����#c����������A�6����<�����-�������k�n�����+N:��8����Y�f����^z).���x�����|��v�k��6�8��*�Kv�d;lu6��R�X�dI<8.�����_ED�\�2F�=z����~�g�z����w�����b��	-������/������}����S7�}l��>�,��s�8��c���,���H�$>���������t��^|���""&M����+���Jg�]y������8��c����N��h�":t�+V�������+��JKK�G?�Q<��s1x��
���=�j��q�m�6���b��5�p���={v��O?�4}�Q�j������������(�,YR�Y��-�M�6Q�^�())�3fDyy�f�s�E���_�7n�8:t�
4��3gV(�����g�����h���v)��Jz��c�����w����c����J�""b��e��#��o~��tA��+��O�I�&E��M7xv�����#���?<:t�����8������W^s�����y����g�O>��z�}���#"���>�#F�������'���<�z��07c��8���3����������~z���#c��e���w������#�l��u�3&�O�������+����G^�7�II��o���{n|��g�}������O�c��w*����C=4�x������x^XXg�uV<8���X�`AD|SRu�%��������;l��8����U�V��E�q�9��q�C�����GD�SO=�~�i����<0"�B)T�.]��*��O�����m���^x!��c���/,,��C����C��k��Y�fU��o��N=������#777�y*��A���1cb�=�L����3'�}��8��#����}
��()�(�*�)��E��l���6m���Q�*�_}W������C9$=w�}���W_EEE�����J�5k�>�h����Q^^��\w�uU:�*^z��x��w�����o��j]��7����W���}���w�Y����Z�l�^zi�{������^�6@�#I����]�W���u��OG4l������67n��u|p2$^{����(++�G}4�9��j���{�����;6""�����Z����o�9c|��V��js\q�-�����Q����X&��V�q[����8���+���SN��=�Z�t��9���?����k���������?�y��WTT|p��6o�<:t����=��bQ���������y���^?h����{����=����������c��?���X�`A�����+6�o���QVV
4�t��z������,=�k���u���~��z��999�^��U��5kVDD|��W5�j�6!��v`k����Wi}��I�&QZZ3g��$I"��8,Z�(.���x��c�����o��%5R�5m���q��}����j��U��7j�(���E]l�`TQ���s��v���AQ�lX�-���y�������(--����79m��4hP��_���|+W����RRR�1�jAUU���d�,�*J�D4l��dC��
���Q�F�e��e`�Z�*=��
�W��w���.������F�E�
"�J��\����K/U9SU-]�4c\XXX�wR�)��JZ�|y��|����u��n����2eJz���;�����r�&����{��gs4n�8c�l��Z���KT��E������$�:'''�4i��|��Q��<��g�*�]��7o�1^�`A��K������Ke;���8qb����93JKK���;F*��6�����q���=�����W�|�I��l����g����Z���K�#I���Z}���QRRR��o��F��������X�fMz��.�T��)S���9s*�>''�r(��Az��
6L�?����7o^����`@%�^�:F�U��<�@�x����uK�V�ZU������TzmDD�F�2���/������8����5k�T�~�.XPW]uU,]�t��^|��x�����
�	'����E������;6��Y���'L�P�����g��O�^����w^�������?��Jg��`�&�R�NlM����8���c���\3u��8���3�N9��h��i�\nnn|����8��o���S�N�#�<r���O�����0=~��Wc�����������+W�!�R������0aB���nS����c���x���b�}��7�x#�$I?����������������;��c\}���=s����/�8F���?"b��Eq��7F��}c��Y�J�b�]v�t����8����%K���{��^{m<�����+�d|�����������s�������\�}�Y��_�u����q�YgE����'��t^���l��N��%�����O��c���/�����A�E�-�c���b���>}z���e��_�~<��C��Y���y�i��m��&L���$I��o��n�)�w�M�6�����>}z�]�6����/�9s�����+����������J�vM�2%.�����}���c��As:t��{,�:��X�dIDD�X�"n�������U�V��M��W�^��3�������~�d;l+rrr���{��������������O?�P~��q���?�x������'�|2�w��1_^^�'O�w�}7�N��Q~u����UW]U���?������_���=������v�����G}����/��B������(^{�����kb�vX��z������~�i~���<�C�1n�������(((������;^|�����#�JmV�_���1i������b��!��m�h��a�����G|���q�=��^{��������������������Y��{������_���z+-Z��5�>}��������v4������uX~~~\t�E1b��x��w���?���G�&Mb��v���G��M�tfQQQ��O�k��&�|���:uj|��W��A�h��}������C��=�����U���k�9rd��}Wnnn�~��q���������w�����Gqqq���E�f��{�����{n���S�N�$�fg=z�f�%;`�Is���_|1=>����]�v\���������8qb�gm������;9���
P����b��1`��j;���0�
Vm���w�1�:��l�`��M���[������o�?��
�]�`A80����n�K����
�$��s����������?���l�$��n��v�~O>�d����N��
np��#b��y�Y|��2�5k�����%%%5��)�b��,Y�'ON�Y~��\;s��x��G"�JE�$QPP���o�����������_�t�����������l]�����'�|�.�J�R����np��?�����?�pu�Q���sL���~1~��H�$z�����kj4?@uHe;�19���m�����m������
�}��g"����^�ze�_ED��W/�����x���1e���
l�`�Q�-��oJ�v�a�
�[�lY�����J}��w�q�]w��FAAAz�����T�$���S��F-_�<��Q�F\��{���5k"I����!���uyyy��K��x��y���V�e;[����)++���7�|3��I�&��W�
�m��I����K�0!@�4hP$I��P��d;[������H�$f����u���jDD�R��w�}7z�w��rss�!%@
Ke;�-
���n���_�������+��?~����_�R��w��A=���8��I�&��:%�u�,6�w������.����[*����[���<�����p�<o���1g���y:t�����L��Y�2dH$II�����W\qE,\�0�,Y��zk\{���B�n��E���7x�|�>+"�{����>���,6�7��MDD�R�H�$F��[��-Z�y��k���$I"�J��������y�����M�*����,6���_�������$I�_������q�gl�����J�"�J�~��W���E*��nQ�E���O�K.�$���"I��gI����C��������
���3����3���
V��6�:����%/��v\y��q�����O>S�L����h��m:4��g�M����W�^�����k2.�W*��0�()�������}k[��*i��m�{������[o��4Pu999�V�^���YH�i��5���}k[W��T�T��]�}K�RQ�^���e��e)
@�u���W/Ru��F
���N���3�����$I��|#I�(--��[��U]�����u���2�W��9s�(��&I��3gN�^�:c�I�&YJT�����D~~~F����Kc��i��I�(,,��������bJ��+//�5k���e�����B�U~~~��_?K�j�,6K�$1y���5kV���FYY�f�W�|��5�6.�JE��mc��Y��W�����(..�b:��J�R��R#`Q%�>�l�s�=��K/EYY����li��at���B	@��R����C4l�0�Qj�,*e�������$^y����-�/�T*I���V9���`��;7V�^��8���m�����W
������8p`L�<9]\�m����v	l�|

`���a����k�\�2JKKc����j��l��#������G�&M�~���J����)�b�F��}�YF�UQQQt�A��{D�-�|Su[*�����(((�V�ZE�$Q^^I�&�9�T*rrr����u)�b�JJJ���k��*�J���_]tQ��_?�����9s�����w�}7�{��x���c�����;v�3f�Z�A��o��������8��S�/�v$�JEnnn�c�Y
����^{-��]�T*R�T��w��K/�4�����o�7�xc����1w��l��R�T�@�����={vDD$I
4�#Fd9Q�7n\<������Xl��U�"""�JE����A�YNT{
c��e������/Wi}��=k(	l�l��M���;�_����?.�7�>}�D�~������_��>}z<8���<��lG�jQw��������$Ib���YNS��8��8���b�]w�����g��O�R*��r6���Y��=�G��h��x������zu��5z��Q��
 C*��n���&�92����.�b���$�Nu�,6�����3�8#�$�_|1F���H�6L�r�w�Yg�I��M7��
���Gg;�
��v�
�T*n���<xp���W����q�D�f�b�����-[FAAA�����{j(q���W_���3c��%QXX-Z���v�)rss�
��T*�	�nQ�E�-Y�$��+V��$I""���$^{��*��$��*�k������g���g��~��G}t�|��Q�~�,%��Q�E��;6~������#""��+�u&LX���e���_�_|1.������[��c����,X.����S�V{�I�@���M������C��������*I��vk4o��8��cc��q���W����_b����z&�'Xl�/~��(--�T*I��!�����w�=Z�h
6�r����� ���
�=��3�u�M�6��+W����w��G}4�{���R�n�!Z�h]tQ���)�b��L����z�R�H�$�7o�=�X��?�v�:��������/Z�hQ�Y~~~F�.]���N���z+�?���3gNz�����1l�����Wm��MR�U��$�T*������oG��s�~����j����+�v������G�>���-��o~�~�����O?]-y~����1�S�=S�N���:�Z���P�U�:t�?������O�:d;�&��??��i��q��Gg1
��[��������NK�=��sQRR��7���[�j�Z���s '��7s���+��2�t���
��<��]��X��q���H�R��K�H�RYN���|����e�����<^y��,&��`eIyyy���K���8v�i�����c�����U�N;��~�j��,&�2rrrb��As�'O�N�X�,???�$�T*I����������]v�%��F��j���������$I��1#��Y��HlB���3�.�R�;��G��j�����;7�����e�]"I����2�7�x#N:��h��m�������f3n�m�6���-���>�y�������������OV-k��E�����O?�4��?��O��� �$�(�*))�?�����{�~��>�`���e%�e�]���q����e������7o^��e��YJ��$�v��`e����<�@��;7���?E�^�"�?�n���c���N��m������	j5��{���rKDDL�2%;���?~�f���z���q������O�V���(~��_�|����3�<3
�eX�a}��Wq�m�E�>}�_�~q�]w��e�j%�����F��&M��[o�={���.�,���f�$��x���6mZ����4�~y�@�>}��w�7�tS�5*����;vlDD�R����k���q�9������|�q�����F2u��%�:�JE�$QRR�������������y�(((����T�BY�������������c�=2~�����v�[`m�6l��~z�~��������w�=�P�����$I_�u�{��q���F��=��������'��i�j�2c��t�U*��(���X�jU��7���~{��`��������A�6���������7��m�J��h��8�������g����#��j��m@�=���o����.{���������_�PD5q��8������.�O<1�;�����g��X��iK
����5x���������G}�1^�bE���+�=�m����G�j�t�-��w���
������~�E�N�*��={v�5*���?T(!;�����?�a�e������'��`mCV�Z�����W_e���*I�X�|y�s�=q������7�xc�i�f�������]m�N:���9s�&���??���g��rJ�����k�����O�O<M�4�6m�DQQQ�^�:���s��]���#�<R�y��(������q�]w�������_�.�J�o�)�&M����K3���������x�������n��3f���w@u(--����������#F�UW]������&'�X�%K�������������o�w�}�l��t�U�$�$I��?��~8.\��y\t�E��U�H�$R�T$IK�,������Y������;��3�?��h��}���n�:�;���<yr\{�����������l �o�w�uW<��c�r��t�U*����6m�4N>��8���c�]wM�w��%�������+�����K/�4,XI���e���C�|������z3f���;��}��3�<3�<����(..�I�&���3c������_Gnnn4k�,v�a��k���K�.5�KU�8�`m.\���}��1u�������$I"I��{���������;.


6x^^^^�q�q�G�^{�����$I��_���C�j��E��������g;
TXY��K/�]w�O?�t�^�:�����������O~g�}v|�{����;��c�����K.�$""f��Y����`���s�������{o�����WI�D�$��w�8��s��N�F�m�}���{����+�,<�v*��v�[`��:�K�"�)�����a��q����9��}�����6l��`k������g�^%I{��G�}������$�4iR#�&I��%X��~z5��F*��{���F��lI-^���e�Q��I�DAAAs�1q�9��>��Scwp�Q^^�Eg����]��!�r)�����Z��.���g���rJ4k�,�qj���Au�i�X�l��I���Y�-���oK��$�����o?�u��Z4f����������??���������Wy����c���1n���������~�R����[�s�=��C�H
l`��q���O<�������?�y*�c����o��v�����_�:{��8��3c��iq�	'�+�����k5'�rI��v '��'k��M����C4i�$�ij��~��x����� ����zh���f;�
�jQ�6m"""�JE�f��������/F�3g���/�<���lP�U�v�i����f1I��s�9�$I�u�]QVV��D��Je;�-
�j�~��M�6�$Ib������_f;R�k��Mt��9""���b��1YN�6X��^�zq�1���w�qG�dO��-��?���,&X�$���S�U�.���(**������>�y��,'�}��-K�^�|y������k�.����G�
���,9���������,Y�$�L��T*""�6m��@@���v����Y�b��w��z(�=���?~�}�������q�q�E����s����I�������:t���������5k�DDD*����;g9@%���X��S�N�J��'��T*�$��3g���_����R�t������<�������k���~��1p��lG��$�Nu��,I�$]���&[�OE���Y����b���������?�g�N��T*?����A���(������j]�
J�tm��_%I]�v�+���:��X���SN�v�����]�T*]|�$I���^��c�E�f��9!�-P�U�����lG�,�[~���{��W�y��q��gFnnnuE�q�T�@���M������'�JEAAA4i�$:v��{��w���T�$���S��&mN���d;�X���l ����c��Y�x��X�ti4n�8�5k;v��v�)����������w�yg�������_np]�6mb���q��g��A�j/ �v$�v��d;��l�����O�8�����b����$������F��8 ����|�I��@��e;�����s�9'V�ZI�D*��T*IR���������}���;��#N>���:f��;�?�A��
l�`e���?g�qF�]�6]|�m�U����W�^��;D�F������E��G}�g����a�\�2~���EQQQy��5�w��A\�%�J��5k��\��V�����ZV\\��vZ��*I�h��A�w�yq���G�n�6�w��iq�=��-��eee�J�b���q������S�E�5����.�-�����+��"JKK��W{��G|���q��Wo��*"�k��q��W�'�|{��G�����4��������W�T*�`��y�� /��'I����>�.����C�3&����tN��c�����^{��Y�"I�x������n����_~y��,_�<.\����O>�$"�)����[�t�I���(��E���^,Z�("�)�����\~���M��
7��sLDD�{��������������8qb\r�%���O��i�b���q�}�E^�?~�=��v������~]XXGy��7|��h��qz<e��-:���������O�%�\I��#�<��vZ�cT^*��nQ�U�,X�T*:u�yyy[t^~~~t�����[�+��2>��t	���>��H@(��Ek��M������3�{Nyyy��Y�.�����H�$�`��d;�}
�jQ�V�"�����3gF�l�OA�=�[-[����j��{���7���i����~��D@mS�U�:w��~�d��x��W���W_}5/^����f:tH�������X�h�}����G*��$Ib���z���:k���q����������VW�����?v,�b��I����X�(???������p+�z��g�a3����yDsJ�YA5�)��R����49�QO�9��d���[�9TjY�Q�PHr@,E�y�����@Vnd�{/������}�u?�����X{���)�2EQ��g�����9s����y�������3�<�$)�"Gydjkk�"v�Z�xq^y����u��UL�~eY���S����?���j�*IR�e����l��6���k3o���^;o��\w�u���O�����|e@�V�r���6y��p��wf������o^�0@U�V;���W�^����s����(��e�	&�K_�RN<�����7;��C6�t��k�.s�����S��3����{�����,+�WEQ��K.I�^����V��/��������$���O�S�MV�|���:uj����W�������s����������F��@����nN<���	�
-Z���{.��������,s���x�������{�#�LV�����m��2d��L�4�R������$���_�e���;��k���>��&���[��u����>}z,X�$���$i��E~��4ZF`����;�����+��o~�_���y��'�h����[Z���E����.��������i��M��|��W+�[��(���-Z��k��{���)����*k��M��!C�d���y��'2v��L�>=s���l��;�g���u�]��]��e-�b��YZ�������[~����o����
X{(�Z��k�.����v������J�_E���[g��6J��=���;��C���o�D)���,>����Z��UT;�[`5�a��U�;��c��o���f���g�y���o��V+@sP��������XR�����5X�YO<�D<��$IQY�pa�dX����z3Xs(����,+%X�1`mRS����*�X)�ZG(�h:��+\~W��������s+�6m�4�}~���h�������Wi�}��W�Q[[��#G6rR`m�k-���/V�:th�����HY�)�2}�������Js����)�2�/�5�\��IAY���S����9sf~��_%I��H�>}��>�/������(�E�����5��NH�$��������ej�`]t�y�������>?��
�-�2�����1c����-3f�����>��l�����f���I��Vz���5��C��'���,3i���=:[o�ucD�
�������E�����L���7�Y�{�eY�G��-s�	'����5jTe��C�l���5o�-�L�*�]�?��,`���_VAM��j����`���?L�����>'N���[�n�2�#�He=a��F�	�=j�`]U�e��Y�
6� p@N9�����~�<����7��n��]��|��9s�4�L������ XM�����������RE����.�.����skjj��]�l������geNSj��}e=u��F�9m����m���2X{(�j���[�s;���
����6�,����q�����>m��Y�y������c+�]K����jX�e��,�c�������?~������7t����?�����r�������	`����-^���0`@��|�v�!�:uJQ)�2���j����R��/�:t�n���1OY���S���:��#S�K�����������JsN=��<��SI��(r��GV�����,>�w����j�*EQ�,�\~��9��2k���~��Y9���s���Wf�l�2g�uV'�D
�������g��}��7�l�M��k�|����SO=�,����{�<���eY)������G��x������3e���L�2%w�}wN<�����37�tS����8�����w�f��Yj�`}������+����>��|��]��[o�5��[o��$���<W]uUN?��\p�M���s��s�=��n��R�5k��\y����SE��m�y���,���K�K�;��cs���6yf`�TS������:7�pCn���<����-�9rd���/����A��R�-�E]���;��s'��7���N:�R��4KY�)�2�/��9s�x���s��|�i���nh�����vX(�jfC���?���-���'�����W����J-},}��.���?���S[[���������������������X���O����\v�ei��E�g�\
����������W��r�2��1"���I���;��{o���3n��|�����`-Z�(�]vY��_����#�<��<��~<��l�����CZ�h�:d�-�������9rd�
�8��2k��jX������uMMMv�i�e������$eY�E������m��6I��[�\~���4iR~���'I���?��k�I��-��
�G��}��o�f�@�E�������'���j��(����#uuu�<;t����<�R~�ng�yfe=g��<�����	(�jF�f���;v���s�&M����S�������?���;��:T��?�|�X����>X���������[��G}4IR�K����X��^�zU�S�N]��MOV3j��Me=k��e�{��+��]�6(�z���[W����[���@V3���c��,�����)����s�=I��(��~�-w����+����FJ
@E�������'�n�me=o��><���O�3�=�\F���X������_����'W�K����3����6�<�H�z��L�2%3f�����WjNQY�pa��T
����;��v��e��yI�s�=7��_�9����$eY�(�x����7q�������}���� ������9��3r�5������`]�����)�jF�[��QG�n�!EQ�������3d���l�27�xcn���E�$�g�}��g�e�{��������d��|��p�y���+�\K�{��������,@V3;��sr�-�d���)�2��w_����g�L�u�Y��u���W���wO�.]�"r-Z���>:�=�\�%�VeY�K�.���W}����;��C��m�i��e��1Y�`A��$���wz���$9��CM��o��r�\}��I�]
U�e��l���!C2p��e���������E��(��_�&�|��7������W�^���{3a��>�A���Gy��G���/f���:th?�����8qb���/���������d��;�B4XUp�������N�>}*�P��"�
7�0��������|�3������9�r��>��&�������C�y��2`����u��8p`n����y�����C���3d�����?m��������W���?�Q�F���^J}}}�v���w�=uuuz���s�I'U����'�$��I������x��	�8��t��}��r�!������_�����9�����>�d��wn�����vX�)���m��&�l��J_w��'6A��{����$eY�(�|�_X���\������n9���r��f�����w������Q�k��j`�6q����K�.����r����[�}��_�j��HY���_��)S�4JN`�����6mZ��(�t�����j������_��n���W�^I��,��#�4NP`������������>��Fm��,�$�������l��*�1c��fB`m������Ce=k��<����V�����>t���s?p
�j�`]1l���=��~������A�[][n�e��,�L�8��l��vy���$=��r���=;�G�NQI�
7���kX�����R�$)�".��s�eY�[]�m�]e=}��L�4)�;wnp�o�����[S�e���d����e�]>p��W^Y�YEz�����]��Z��j�`]S�e������6�l�l�����#�<��3�{l��HQ)�2����3v�������[���}�R��E����~M�Xs�V;��dEK������80�G�N�����_�:������3�vX���?�(����K�v�ms��g�������������{��E���;.:th���\k����ZIV#9��s�����c��W\��,s�-���?�q6�`�g~�������Y�RE���s���W^w�UY����s.����|�BV#Y����g��v�iy����$���?������=zd���9��C2m��E������,���|$�����K��y�E+���.��3���[^z��\p������_�����u�	'��o}�[���cSEhtEQ��nQ�E��x�����(?���2n��L�4)eYf��7O����X(���t��]���)��^�y3Xs�T;�X4��j��,X��3g���>eY���=z�h�T�;��/~�����?���;7�=�hEs���n�����O��n�!w�uW�|�������<�(�,\�����s�=�o��9��32p��|��_�G�V�Z5���u��*��O~��~���7o^��,�*'�p.��w�����;����g?���p�	�s�=�
�����k��jX���WN;����;�R|UE�S-_Y���eYf��������>�d�����^��^{��)��Am��o~��_����N����,��e��;f���O�N���]�*�lh��1�������7y�����A�?���|�����g��~����_�b�>���m�����5��fv��g'�w���;���/�8LMMM��}��={������g��Gy$�]w]n�����1#I�"�x <�@���������	'�������o`5���5�qi��SOe��q)�%����^{��G�A���_��^{�����:o��F~�����C�d_������9sr������Dz�����>;�����XC��K����~:����$���+��M�*&Zuuuu9��cs��wf��	��~��������]���k�����~��z��������k2s��j��HV3z��7+��]�f��v�^�F��S��z��y������O���ON�N�>��������K�.4hP5cU��--�*�"��u�r����;�G?�Q���;��3�{l���*eXeY�,����[���[���X��G����9s�����h�"�rH~�����7��/~�����^I�]���kQ��`5��PeY��W_�������y�o�>�{�N���SWWW�8�U��N�>X��{������$����������i�5*g�yf�w���:(7�t�zS�,��fv���E�I��|�;y������qM�:5W\qE�������.�^zi&L���]_y�t����W+&PE
��Y��}���0eYf��Q9���3{��j�Z-.����y�����[N:���9�RtUE�%�W��u��g��_|1�<�H5c��w~M
h$���>:��SWW��N:)w�}wv�a��y��9��c��c�j�[a#F�������w�������A�UY�)�2m����?��<8�b�'X�d��+}�f�m�	&d�����W���}�k���W:u����[����(����m�3��q���7��M~������^J���ji�U����~<xp�9��l��M�
�Q���>X���HQ+}��k��LY�y��W2f����Q��*�{E��;7��zk����<�����I����,��[��N�	'��^�z5Y&`��k
��V��s�����O��WKK�6�h�s�1<xp��g�jF�
���r�u��y�*]K�����'>��<8������u�*�hBE���EV#Y�xq�#4���^}��������/|!��u�r*`m�����g��A<xp���[�8M�,���}
��Po��FZ�lY��:B�z`��Q�����$EQ�����J]��
hL
�����z����E�$+]���{����FRS�4��,�@4PV;��`��`��`��`��j�XqeY��'���O?���''I:w��w�1;��s���rB�p
��&L��#����g��y��'2{����={�����Z�l,���_����'�0a����G>��O>9'�xbZ�l��	`�)�b�6|�����?���?��_��q>��q�r�G����Z������[��Vn�����OJ�n��)!���j�j�����?���kl�������������M�6���>�m��&�[�n����#����g��)��iEQ��nQ����T;B���/���_��[�n����'�2eJ�{������2eJ~��5(���?�������FdX��e������`M���f�]vI��}��n��o��3fL����e���{r�]wU�-[����C��~�58��]��r�)�y��3p��,X� Ir�w������{�����a��<0}��IMMM����S�TK|���m�?��3�W~�n��������.����Yg�����7YFX5~>����3~�����k�?~����-��2�n��������g���#*�v��������^�����i��]e��#�d��QM��+E���e�j�a�q�}���_�zv�a��j�*:tH��=��w�<���x���#3l��6,���?�9���O�S�����
7��C��p�
s�1�4x���oo�h��`�R{��|�����s�UW�������S�e��\����������g���O�~���[o5S���_����<p��8p`���w��(�`���_��,V���_�~��������������O<���h�"eYf��Y�����*�Z�,����h��^{��������
��<�����@sR��
���~�SN9%,�<��E�����9��cV�`�#�HP����n��k��c�f��y�}�v���G���g��i��me?w���7�Q3��P��)�b��{��W���}-EQT����3q��<������~����>��$IY������Jy�u�G�n�����J�x�5��	��U��,``�G��\���>����??eY�(��t�M���K������}�����>}z^~��U��.�<yr��G>������[����j��v������������������'2dH�=��U����i��m����$5jT��r�U��.�3gN�}�v�Vz�{�y��U1y������+u�������/�������������M�����\�p����Ee]��<7��cS[�o�{-�1��g��@�5|��JYUQ�����Z�jjj��K�����I�	����1�-�j���J�h���rg������������s�������gkZ�w�o��w������5���m��1�u�n���w�����C��z��Y�=o]��[
��U�V+=��������~�2@SX�Vc�_4���o�(6��6��Y��V[���g�}6w�uW�|���7.3g�L}}}��\�9EQ���_n�|o��fe~�.]}����}���u��
����_�o���rg��`��j'X1]��95�P�U������?����5��*9rd���od��
�_������h�X�SWWWY�J��:uje��&�4��u�������zk�g���/w�������c�9f�������#�<r��
��c��%�W���y��e���+��l��;�������F���G�����~����s�lx�Q)Z�l����BV���������,Z��Rx���jU��V�4kEt���r�	&���3f���^���������U��;w�g����(������_4���l�y���:��L��E�}�I�_���������
><_����h��E��(R�e��Lmmm:t��v��U;f�G?���z���y����O�U�7t��,^�8�����}��v�u�{K�����3�[V��
�5��f��o}�R~U�e��m�o~����g?����.��k���]w�5o�q�O��$���k���p����?����?�#]�tY���������~��q+=����Ni4����j��v�����c����W���u����z*]tQv�i�5��*Ijjjr�G�,��e�+��2O=��*�:���3r��$IQ9���3�:�g��i��Me?w���;v��;vl���W��k�.��wo���:`5�Gy$IR�e����W^�������>��g��V�Z�(���??|p���~��E9��3���}/EQ$I:t��o~��My�VEv�a��-���"��`��;T��`M��M�8�����C;��*�Yq={��Yg�U)�z��7��>������=����S�&YR��,)��2eJ{��\x���r�-s����,����/�<n�a5���S��T��_������g���g�$���
����o��$)�"[l�E���'��:���p�	��E����n�'?��t���r�,�|�����s��{�|����k��V�.IN9��|�_��[Y+~��
���rK��������=;��rK���8��F��KV3zwQ�����d���W��w����]eYV���>�>����%�_]tQ~��T�-�5v�a�������3gN.������K/���s+�=��#�n�m�d��U��NT��f����&YR5n��*�Yy5559��s3l��x��)����K���*�2����
��O?����Q�]VEx�������k�����3l��e���s�%�4x��.X����j�`}��;d�������3}�����O��}�k����^�������/�����C=�Q�Fe����1cF��m�M7�4�{�������>8;��s�c/����S__����y�����z+��{�����k��v�F�u�����=���$Y�`A:��\|��������m�&I����k��&g�yf,XP���C�����1(�jfg�}v>���'I�=���y��UN������>}���SN�v�����>c����s�&M���?��������k�d���_�=��3c��I������O��g��-��"eY��W^�[o����-���I�@�+�h5���9������}.eY��������[�H��:w�����?;��c�����������^x_��N;�����?�m�YsF��WV;P-
����k���A�R�e�;��}��y����5T��=3b��\r�%����2�u��5�^zi��t�������v�u�y���R�����-��"���Jn����~���~�������S�Ni���Jg8���W����?�!�vXZ�l�$����W_m�{���}uu�V������������#G��g������$�:u�N;���w�955:�X�)�j$����R�J_WE����G�}��U��TX���g��������	'���}�6�}�p555�������V�cW`-TS�,)�Z�XK������������c�=������K/��������=
�QY�Uy4�{|��s��g�g��9���r��7����j����y?��$�����������<8��v[����$)�"eYf��E���{s���f�
7�1��N8!���o�k2X��_�~���d����\y����������&��w_��LQI��,3k����W���~�����+�������{W9=����v�m������{��'c����^�>}��,�$iP�5f���{����G?�~����k���9s�X�(�b�u��-g�qF����1"_������`��?�/}�K�|��s������k��~R��j�u�]s�W���_����y�����MY�
�������n�)|pz���������Q����*���-X4��-[��#����������O�]v�%e��'��]�5a��\r�%�~������jX������[n����s�l��V+=���^�c�=V�w�qi��e�d\]o�q���o���F^|��\w�u����2~��EX��IV3����2d��$I�V���+����
6� C����$-[��q��h9K�>}r�����.�UW]��N;-o��v�ck�w�SX��T;������KY�I��|�3����*����k>��O�,��e�����S6��3g���������o|�����V;��d���y���R�����{�j�4hP~���&I�
�����i�f�s�����������_�;��#o��v����u��;��X)�jFO?�t-Z�dI�~���Z������(R�e������~:{��gcD]%O?�t�����|���<yr�4(�*�2eY�u��9��#3x���e�GV3z���*�=z�}���5�}�����{^{��$������k��I���r�������K������W{��w�c�=6m�Q���
����3�,)��t�Me�f�mV)��6mZ���0o��v���?���������E�-���g��9��r�	'd�-�l�|�Z��v�9(�jF�/���F��w�y���e��<��C����s�-�d���
�����
6� G}t����7i&`���m���I��FM�8�QfN�4�����c��|�s�9'7�pC^}��$
K��_%��2x��}��i��m�d�!���A�ZHV3���Se��o���^K�=Vy�k���	&�(���oL��~�����WeYf�������s����{��Mr`�RS����w��R �$7�x�j�����$e��k�����zW@Y��h��2d��><�G������(�V��f��S�l���I�I]z��y���Wi��	r�e�U����z�&-�����'?���������s�UWe�=�l����w>�q
����!CR�e�����3s��g���+5c��I9���3s����!C�4Q����.��q�����%�{l�����^��OV3�����=z$I���s�=����.�����`���^�`��\w�u�~����/�x���?����k_�Z�e>�������7�|`�R[����-[���o��2��E�)S��?��?��o;�����N�:e�
6��9s2y��<������2u���e��(R�eZ�n��o�9�Z���[Xc,�B!`���
��s�\{������T���L��[n�%��r�^W�e�T��������u��k����Zj�`}5h��<��C���G��LQ�o .��}�$�3eYf�-�����s�1�T�m��~�
�j�`}��o��=:�]w].����5j�g������o��N:)�|Z�l�Z�6l����o��V�\c����6XU��U�2$C���	��C���_��i�2{��l����x����V[e�}�M�.]�����OQ�}QY�p���k,���~x�{�����5H�n�2h��f�o��?U��������.�W���v�9�V;�s�9�4�9��k=������j��v�/����[�hQF��'�|2������3S__��\��:.�"���/�(%@�Q�U%s�������\w�u�<y�j�*�R�N(�j'���*x��gr���g���)���|�'�����f��k�e����2eJ�%�WKK��]��.:th~��L�2%;v�.���O}�S����v4`
��}D
�X����O��)SRE�%�W���{>���f��vJ�N���]�*�lh��	:the�A�[�n�<���3���g��s����.]��������>�I�k>X�h�����[SE��L�V���_�*�����m�����\z��I����g��A�<;y�����/�&MJ���5������_����?�����>����5NM��O|��,Z�(��R��.�h�/�J�?��O�2���;.m��]��o}�[�8qb���W�.�Z�pa���/f��iM�X��4X�h��qI�B��������������1#�G���Y}�S�Z���c����nJQ)�2�[��Yg�����+���o��o�J����s�e�5�{�,���>�5kV��(�l��Vi��M�}����RZUE��k�e�����x����o�1Gyd��c�9&{��wF���,s�
7���.j��������':t��[�n]� +a��1�u�.]��}�e����;�,)��q��_%I�V�r���W����z^z���
��`5������~��7��d�M�2%��R�M7�t������'�x"EQ$I>���~��O|�
�����4bZ`mWT;�,`5����+o�q����	2f��jG�P�������k��s#F����S�e������s����b�-*��'6RR`m��������N��/���*�Y1����u}}�2�=��C��Fm�w�q�g7�h��z�����X�(�jf��~zv�q��e�����:th�#-W����$eYf��q�<����-IRE��k���|w�V�-!%�6*�j'�EV3k��U����d�����r�QG�g?�Y-ZT�h���he=m���=�}g&M��Gy$EQ$I������S�N��7�h��	
�5j�`}3l��$��_��N;-���JN>��\v�e���?�]w�5�:uJ���Wz�~����q���;���&�;_�����4W^ye�3W\qE/^�$)�"p�2���=;&L��e�����3k������������R��,)�*�2�����~��U�[E.\����c�{��7Ir�UW�s����W���-[��n�%�\Ry��G���;/s��O>Y)�*�"[m�U�g�l5���ZZ�,)�ZZ�U��*?�����^�Y�e�=��l����d�Mr�I'e���)�2EQ��SO]��;��������,X)����eU�Yb�:8��|��_��\%
�/}n�=�����������[+�_{��w�g�`k�G�@3��v���9��S���g?�Y:t��K/�4,h�ZY�8p`n����h�b�3�����;6IRE>��O6if`������XIr�����_�j���?���^J}}}�v���f�=������������������q��PQT;�`�R�v���~���t�W\��i��QM��~Q�@U�e����fU[�,Q�e�z���5*��M���3�x���p�	���W���������+���?�)S��c���e�]��������?^�x����v�9(���g�y&?����?�)s��y������`]z��y���$=z������&�������+����>��|��]��[o�5��[o��dI�WQy���s�UW���O�\�dy�5��*�?~N9��\u�UI��D�WQ,���7�|��q�)�"EQ��_��e5����:7�pC���[l�����#G�_�B����$�|K-Z�(]tQZ�j���>�I�d9���WS���y���_�~����V��j��}�s�l��R�e����7��Q�$C�mp��9���3��J���|KK��������7Yf`-���K����*8�������W�EQ���������y��X��^���9���*�����I��?>���ze�!�,���#2|��J�W���s������>����7���J	��E�r�e�5If`�����q����;*%Q[m�U�~���v�m��W�R)�Z���v�aI��,3b�����7z�_|������N;����7�tS%OMMM���?g�����K�n�r�����c�MY�)�2���`��F���V��R`������I��Du��9<�@��n�U���o��z��E5jT�d|�W_}5��B�=z���n�g�Z9{��f�m�}��3�<���3gN�}���
��`5�I�&e���)�"EQ����O�.]Vy^�N���f�U��G�n��
��5������2�M�4)�G�N���1�����s;��c:t�P�?����Xk(�jF��OY�)�2���4h�j��t�M+�)S��������������y��GM��e�$9���y�W�^����SW3!��Q���&N��$)�"��G��]�����FU�s��Y�y���M��z��Y�<���V�]�vmPr�^�[�������z���/��
�����3+�wW���s�V��.�j,;vL��e�W_}5�2~h��{�I���k���[����gW�uuu��X[(�jFK����eX�c�����&�l�(3�m�m�������������s�=�Q�F�(�$I����;s�������L����f��s�$IY�3fL����Z����f��)�}���Wk��q���]�J�������3��~�%�+I<��e��8qb�|����w���X���#�R���v�u��z�������Vk��7�XY�j�*{���j�� �[��QGU)�����2p���r�-����s�1���[nIQ)�"���Oz����y�=�X�}�>}=3�fS����w��m��6EQ$I.���U���o�g?�Y�����[7V��9�����%I���}���A�����������Ir�Yg-w����^Yw��=]�ti�������S�u��f��/�R5l��|���_��g��g>��L�>�2���On��
l���������R�U�e��K�2dH��9�������T)����_�e�\
����������+�����>;_���3s���~����m����c�U������C=�	S'�|��������R|�,yn�a������?��rg\{���9sf��O}�SM�X3�V;���e������3`�����[)�2W]uU����v�a�e�]�,)�*�"��_���O�_��W��������������o��o��Y�80�?�|F���^z)������kv�}����}��.�I'�T����l�������#��IV������o�A�����J���;7���������r�,���'?i�OR)�j��}n�������Y�o��6�f�mV��O<�	�k��jX_v�a1bD��v��e��(*�EQy�e���j�s����������UzM���#��OV}�c��O?��n�)���[�T
��]|���?�������u�y�����G�����jX��h�"�
��A�2m��<���5jT�N��3f�m���t�M��w��������k�#�Xk��7�8�~x?��jG�P�f����C��Ce��Q�6mZf����,s�
7d�=��vD`
W��NT�,V����s�y��W��U�������,SE���?��A���[nI����#c��i�������X{<��#�i������4�g�N��_���o;eY�,����k�����DI��VQ�@sP��
y��'r��f���
�/�"�n��
�a���.�y��+�[o���sk��j`���G����#2f����1#s���l�:�w���m����_�l�����m��99���3o��E��,��{��3����m����&E��_�|��G��'�LY����{�!=��Q�Ue��v[~����Gm�|Y��uQy��r���&I��c��r�)��g>�,/���L�8�Rp��o~3?���SSS���>��O�;��N���W_�������7j^`���
F4��'��C����G}4eY���j�c��g}��|����!���_��������0`@.���U*�J�v�!-Z���_x��F��=`U���c��>�������^--�ZZr�A�����HY�:th��w��;���>����<yr����w�j�����G>���~��1�5X�~X�V;�������A�W^y%I*eVm�Q�>�����?�m�]6�d��k�.s�����S�������m���Y�fU�3fL:��<��3���k��/��Be��c������=�C�����3g��<`�RS�����;//��R��HQ����g��	&����e�?��|��O�=��&��G����?�N8!���/3a���~�����IQ,������9����$�����,)����g��l��ue���o7�L`���-\�0���/RE��L�-����>^xa��k�B3��k��.�(����+%XeY���E-Z����=�E��2s����u�e&��)�j'�EV36lX�M��$)�"��zj�:��U�u�QG��SOM��O�O�>=<�@cE����S��,�L�4i����??c����7�t���	�C�j���f��+�$YR&USS��O>y���r�)���IQ
�7�n��U��������Wk�������oW����Vk��Q����|��$IQ���W6�|�������g�-�HY�I�)S��v���{��SWWW)����Wk�W\QYw��)�n��j��>
��Q�v�*��7��Qfv����7�6m�d���OY�)�2�\rI�N��J������~��)�"EQ��#�l���ZAV3�j��*��'6��I�&}������|'IRE�|��~���1c�J�������/|!IR�ejkks���7vT`mRV;P-
�����������e�������^Z�y/��R^{��$I]]]��w����>{��w>����,����c�=����.���/3g��e^�h��<��#9���r���g���)�2EQ��OL�^��$/��*�j'���f���������;����w���&I������
6�`��-�u�]��w��R�����g��!�d�M����'I���N:)�m�]:t��}��7�����h�����z���s�%�4YV`����]x���|��S�en���\|���4���/��7���(��k�\x�������m�����J���S�e��HY�Y�`A������,��/��^���s+�XK�r�!�������&���k&-D�l�M7���C��k��e��|�;9��#3z�����_�G��|�;I��]�f����d�M�2v�d��6�����\t�E���c���(<��\���}������r�wd��6j����������
[��?���r���g������;r�wd�]vI�����v�e�M6I��m3o��L�2%�=�\|���92��R�^�z��K.��)S2l�����~M��(�"��~zN<��\�������><��M{��6m�d������/}�K������	�jQ��H�����(V���(R��S�O<�D����������(2v��4��_�p�J�U�i�&_��W���|%I2i��L�:53f�H��m����f��7Om��b�JX��]���v�FV��W/-�zoq��(���V�~�b���1bDe��;�W�^�;��s�t���I��X�he��V�|S]-����|������}�����
��9��S�Mb�����.]�d�m��r"`m�����X�l�I��(�t����i�uAM��f���ke=w��*&�E��B���.����&eYf����?~�#k9X,W��]���$I}}}����T7��S���:��S*�3�<3����b`]Q�k�0��)��Cz��������,���3�zh&O�\�X�ZJ+�g?�Y�8��E�a��e�m�������������K�j�Cm��oZ�h�����o�����g���u�]���{��Cm�{
0���d�M���of��i9���s���g�
7L��=��F�e��+<�(���ok����CV3+��Q�-\�0S�N���S3f��<����~���;���FN?���.�z��R��������e��Yy��g��0eY��y`�QS�����I-��"����,3q��|����{�����7��XV�����Ej�`}��~�U��^~���?>EQ�,��dwmmmz���:���.�f��o��)S�$I�b����+����3gN�M���c�f����������#s��������n�����hJ�{�5���y��r�������I�REjkk��/9>�`f����^z)#F��C=�g�y&�'O��q�r�Wd���KY�)�2�g��5�\�����y���3}�������R�e�,�����g����/^�$�E�5�+�Q�U��vZ�:��,\�0�l�M������E��w����}�5��u�����<��S����$�>�l��g���_�J�l���9��#r�����?�y��HQ)�2���/3~��f{�������������e���������[o��������3����^��,3y��|���MY�
�}�+_�9��Sy~���������
X�����J�E�������*�9��S��v�%I�~��,������t��9EQ$Ix��U
��?��`5�^x!�=�\��]�v9��#VyVQ4hPe�����}g���r�G�,��e�^xa���,�j���f��O$YR^��W��l�r������}��k��v���N��Z�h
���o�QY������V�Z%I�����?��f�mVY��5k��	��j�`}R[����,����k�=��3Z�l��{&�.�ZY��w�*]�,���i��}��o��={f��wN�v����KV3���ke=e���1"����*����;*�.]�|��i��U����_��|�{�KQ�t��������o������r���g��6j�{k���v�Zj�`}��o�$��I�~���<������<������ ��   �Ph���*(���Vd�V�2m�Z����:.��.Sk�m:c�v�Vm��K�DT�B��V��l"I a������yY"!���x��s>��}/�������>O<�D$II�l�Hk����;������}"M������O��6m�Y�f�������<�����	����y�&DV���?�?M�:5�<����qc���1cF�3&�$�J�|��[]��/���c�#���>)�J>�/��Ut�����������4�+V�?��?�/~���
4m-���\}��q�1��
�~�����3��+����?>�������w���o�9n�����aC�8j���q�q�m�~���1m��\����Cw(�s�=��-�/�0���i�FQQQ�1"���;F���c��5�d���5kV<�������GDDQQQ�s�9q�I'EEEE�Z�*^��x��gb��YyY\pA80�9���4]
�
������c��-���+�z������O�v����!Cb���QZZ���QQQK�,��3g���s#����O�v��9n�����u�m�EMMMD|\>u��G�P�C=4f����~z,Z�(�4��N;-����-��c�Z�����<��~,\�0n���(..�n�!o���??�����{$I555q�(���!X����"M����[#I��������"���x�������iDD$I�+����[<�����{o��5k��g�=z���={�P�U�V�QG�/�$I��[n�s�9g���I'�#G��#�<2������~�����k\t�E�u�rH��1#�
�g������g�c�=�{������4W7�|s���������[m�����4��N;-�|���o������n�;��#��������v8�%�\�+������.����v�-����())�4M���/�����5���K��w��4MsO=����&X=zt��7/~�����G����\m����7n\���[q�]wE�N�=ceee������/���>���1f������qc����k�vX�=���;|�4��:@sW\\��zj�z����i�����x��X�zuTWWGiiit��);v,x���>���"I����W���^�:�������w��SO����Xs������>i����K�u��(�jB�$����������=���[�z���k���H�4�y�������_�y��U��hZ��@�VQQ�{�����}��5kr����[]SZZ�{��qc����4�l"�$�XMTyyy,]�4���3���K���H�4����W���y���J��s��[]�v���s�v��u�L%���)k�u>.����{c���1c��(++������EEE��O������zh|����]v�� ����I�����7��M��'?���***��{������'gon����;�u��Cw�����3f��E�����c�]w����C���$�L�y�+Ck���K.�$����X�n]DD�i���M�6�{������?��1n��8��3��������F�8|�����CTTTD��q������#��_�r��;vl,]�4">.�:�������W_�=���o����I�&��~��x�����z�����3���.�,�t���YF�S�L���w�qG�y��
HQ���)S������[n��k�����$��O��Yk���[o�5
�=�\��l��u�~����i$Iq�a������l�K�.���G��w��{m����O?}��555������_��W��&�Cuuu�v�i1z��m�_EDTTT�M7��
��S�$|nm��@@3�+�?�x{���t��\�T���Vi�F��O�>1h�����Ot��!�Z��%Yi����K����f���n��W]uUt��=w�G}g�qF�����o��o1y��������*jjjb��5��[o������zj|�_�����_�=$I�_~y���s���z�����r&#F�h���q���'�w�}w�|�-�o��1x��(--�{m���q�1���/��������_�@��47K�,�SN9%��[�W|u�a��g�#F��^�zm�o��1e����o�>�lnoUUU|������gG�=%�.�������#���+W�
�f���^z�g������}����c���[]{��W��t��%=��}/[s�u��C=�7w�9����^��3�����z(�;��X�`ADD�]�6N:�������EAVcx�����~�}�i�$P?
�
l����f��\T��]�����#�<��}�{���~�����~7�x��8��3b���Q^^����{����r����1e��8���b���y�]��t�Uqqq\z��q�%�ls�o���sIII5����+W�UW]�7w��W��^�7WTT�G���}�kq������#"b��E��_�"����F���o|����Bh�v!��Y�&|��\!����/���g�_m�����i��E��sg=����f��FJ�����3��o����oQ~�I��'�X�+�:��Sb�����_ED���'���[�Fy�v���Fyyyn<|���0a�6����3����;o��n��+W6ZF��i�u��d���Q]]�E]s�5��_�:�������<�>����X�~}<��s1j����5-Z���������^z)�M����J,^�8V�^���QZZ�:u�A������8��#�s����kG����w��7w����xm����rH<���Q^^��w_���?l���y��w����Z�pa����$�������SO=5�;��������E�����:����,��
i����|���x����#Fl���}�{����I�&)������j�����4'k�����$I�o����m�z���m����o���������y��G��GqD$�����#�8"o<y�����l�l�y���:u��{.))i�3?}����� g6�f��:t�����#��s��x���1{��J�o
�
h�}����4Mc��
rfYYY��K_�R���\��3'o<h��:��|���5��>�(^���:uj���kQVV�6mj�{�!��:@sr���n����/��+W���?�r��7u��X�re$I]�t��:��~��[�n��^�z�����������U�/������GMMM�|���c��aq��'�����[�n�P_
�
�E�����$.�����7n\������E�:��q��7n\n<n��(**j����yQT}�l�2JKK�]�v
zn]�X�"�4��[�j]�v��={��/[��A�m��Y��:_QQO<�D<���������_�*����Y�1$Y
FV��7.~���>}z����1z�����{�TUYY��rJ����1l���2�����{F�4�?5/**���{�W���6lX�z����s��gk***��m����{�����gf������N:)���]w]���l��X�|y����;�A3�����Z�l�>�h�3&�~��x��G��_�b\z��q��'G����w�������>&N�K�.���#�<2����h��E�gO��A���iS��7/���<�@L�0!�������_���K�������JJJ�|F�6mj=�!����G�sL<8���;v����X�lY����q����c�=����������;��^�`Yn������+�<hP
��L�q)�*�+��2"":��x��w���,�,Yc���s�=7��o��w�}�s����m�X�vm�X�"�����o�6l�����q���
7��������k��C�$[�m^���5��K�4������o�'�|2y���w�}��u[��������u>�u��y�u���+��~�����a��s��[���U�h��}���^q�����i���SN�����\|��q�1����������`���_�W�������+�������>]���������~V��w����O��9u���7o^$I����g�8p`t��1Z�nk���%K���o��+�J�$�$�Q�FEiiiTTT��U���7��+V���i,�o~����K/����^������$o�~��:�Q]]]���u���o���>8&O�tP��3M���O?�p�����������&���X;��gI�t�����;c��
���(���;v�����i���z����M�6�O<7�tS<������/�<tPn����7�xc�y����E���q���{������}��y�O���b��u��Yh�������.�:����c�=�V��N�:����c���1c��g���q�	'��n����Z��(��@�~��w�������#I�>|x<����s�Z��h�"�=��8��c����}�u�Y������G�>�lp���~�����c�����G����#M��������/���������eUk���sIXeee�gf���O�.� �/_555���O�I'�T���v�]�v��9����{���#��o~������""b�}���<Z�n]�3N9�������N;-*++����v��=;���sk�>����/?��#I�����|0&L����'"�K�.�$I��l��
�l������v��x���qS(�***�#F������{���3L[R�U`�zh��l����$I\��u.���w���������_�y����w�g�uV����q�������#"b����R���M����w�����,XP�����`���W�^y����g���(�4m���j�����4�8��z�w��'�����?m�zQQQ|�[��4M#M�x��w�u_m6/��={v����3������U����
2J�!�&I61��S�E�f��I�D�>}"���8����gon��!��U�V����<8o<}�����t��\1X���S�
j�d�������w�m�����)��V��/�=�����g�i�w��u��9�\^^^�;������?������6V�{��'��#G�����7X���6mZ��W�^%��S�E���iV���mwA������������\�=kv���C�K�.��{���'O�����~{�x��Q
m�M�2%��8"����(
l�,j��G��������g���y��s�={����+V��w�u�z�W����8��3�������,�z��g������;t�'�tRcD���������7��/})��k����)��V��
�$I"I�H�4�����������?����s�|��[]��oDDD�$���{�h��2a��h��}n<e�����k��~������?o��s��.]��z�'������'����s��%K�|��_+V����?>^����+��b�������i�LRP�E�z���+�J�$�x��8���b���u:���3�<3W����|g�k�N��{�w�}w,�v���K\|��ys]tQ�;6�����&&M�C�������{�����k�\����b������G��w��w��-\�0���������>�l�k'�pB�=���@}��:M���_tP�ii��3�<{��w\p���o;z����}555��3���7�?�p��*I�8�����C�b�{�����J$��_�<l���{c�k��	1}��x��Grs��zk�����>}�Diii��7o���6m��}��;vl�\���1i���4iRDD���.����Giiil��!>������O;��C��{�i�\P_
��Lp@L�81.���\1��+b��	1a�����W80JKK���8***b��%����-��[i�F�$��i���7n�����u��7���l�2�>��FEEEq����Yg�����s��6m���{o�{:w�<�@A
�>�f��X�fM�k���b���1q��h��U��@�(�b�\x����E��������&Wf�`��X�pa��O^��H�$�~��A����������{z���]vYDDt��=:w��H�(_III�{�������1q���5k�V��k�.�8�������k��������u<�����/l�g�5��w��O>9~��E���-4Xl���??F���sN��93">.���O��4�4M�M�61n����O�������.h��up��'��'�s����_~9/^�����;���c��aQRRR�s?]�=~���~����X�re��3'���b���QYY-Z��]w�5�t�_���c����s&����E��o��#X�����jL�>=�����6mZ���[QSS���]w�5���������vZ���f�x����?����u������s|��q��g�,v���Cc���QYY���~�^�:������4:u����{�)��H���]����_�1��DQ�h��F<;I�p��`�4���fC���j�uvNo��VL�>=f��+V����WGuuu��H�$�y��FJ4U
����z(~�����3�uN���$I�vFi�u +
��.�6m���>;������/�J?����Vj�Y�DD�_'@����r�y��o~����-��>]j�n�+�?�u�y)�:M��)S���o�$I"I�(..�������[oEUUU^���O?UUU�d��x������.��]���4(f��555�i�����!X|����:""�4�-Z��?W^ye����Q\\���������{~��q�UWEYYY�?>""�����������h:`Q����x��g"I�H�$����?��o|�Ng���^��rK�i���1z�����)5�SH��I�M��`Q��^z)6m�i���<?��sv����>;��~�a\z��
���(��Veee������w�}k]_]]]���\rIDD�iw�}wTUU�?$�SQ�E�V�ZI�D������e�����*��o���[�n����Oo����B���qc��]�v[]��C�H�4""�-[��g�������~��	���,jUZZ�{�������;�����>����������w8�s�����!X��w����i�Z�j�k�{~���k=o��M��;�D�$��u�J
�,`Q�}��'��d������b����#����i����%K�y��>���W9����
h�`Q�=��3�w�����+[�9��"""I���qc���?��7n������s�=7�$��
6��CM�,>�a��{~����x���/}�K��#�<_��W�?��?��'��Gy$.���2dH������i$I�����{�=MG������?�C�s�=q����5�\I�������b����i���q�y������*"�U�Vq�5�4zv`����!�&M,����@���o~3��
���������Xs�!��-��I�D�$��i����4M�U�V��_�:�����}MC�����n�:^y���\w��g��{�����Y�f���I	�A�_}t�A��	(��A�92^{��x��w���^�>� �4�������C�_�~YG2��F��/|!���/dh���@����M$��2���R�@A)���`PP
��F�?L�lb����R�@A)���`��4�:�X�,
J����$�:PX4	:���P�@A)���`PP
�((Xd#�l�d���,
J���R�@A)� i��D�I 
�((X�,
JMB�d�(Xd#�:�X�,
J���R�@&���Q�@A)���`��K��u��&!I�N�,��f��,
J���R�@&�t��$�@`PP
�((X�,
J�H��I�M��`PP
���I�$�@-`PP
�((Xd"�:�X�,
J��&!I�N�,��f��,
J���R�@��d(Xd#�:�X�,
J���!�:P(
��D�f���,
J���R�@��d(Xd#�:�X�,
JMC�u�P`��4�@f`PP
����i�u�`PP
�h�$�@�(� i���(���`PP
�((X4
I��BQ�@&��O�i@S���R�@A)���`�$$Y
F�H�dE���R�@A)��iH��,2�f��,
J��&!I�N�,
J�H�dE���R�@��d(X�,2��Y'��2������1c��X�hQ�_�>v�u�0`@:4JJJ2���i���k1k��X�lYDDt��-���2dH$I�Y6�^
��S&M�?������^�������3�<3.������K�rm��!n�����/�/���=��#�;������Z�*X6����@SP]]��vZ�=z��Wq�M7��A�b�����p���������6��""-Z�����:��u�T%Y
F�^MMM�|��q��w���h�"�����������/_�sL������m��e1r���9sf�|�6mb�}���FIII�k���j�92V�X�������YQ�E�w�u��C=�7w�9���������3g��U��O�S���;�f���q�I'�G}�h��<��x��ws������/+V�����o1{��X�bE����+�z��w�����-��,���+W�UW]�7w��W����=z�������c������{��-Z���/%��O>���s�V�Z�O<��{n�m�67��]�����x����U�V���~8�{��F����f��k������x���1a��m����g���w��
7�+W�l�l�^zi���/����os����E�����
��K�VMMM�q�ys�_~y$IR���?<9������<�������o��3r�v���������.���h��]n<}���3gN�f�FS�����X4[��O������{��W�1b��~�{��O�4��E<��Cy��N:):t����:t�c����k�lP_
�h�}����GI�}_)}�G��'O��������#�����g{��G$4X4[�f��:t�����#��s��x���1{�����i����;�m��ay�������i�d����fk��9y�A��i���7?oG������ks�v��E����{�>}�m���qeee,\��A�@�J��,��u������z��U�36_���o�;����k���i�l�Zf��b��H�47n��Ut���Ng���3o�l�����9{��G�����g^�UCe���w��X3oM�1��eK:E���qMyy�y��:k���
�
(X4Ky��m�F�$u:�]�v����6?g�{�Gcd[�lY,_��N{���[�{��_W��uf����xq,���:P
�h�6/�*))��m������T��r�-q�W�����������U�u�BUUU������g�n�:o�n��ze�DS������;���_m�����2������������|Fuuu�g�������]����|^�1������o�_�D��{����U�hw���'?i�l@cP�E���}��qUUU��X�n]�g����m���1f��:��;wn�p�	���P���aYGh��E���C��fi�B��k�F���$�v�QYYY��
�m�{�Gcd���kt�����@Q� ]�t�+���aC,[��Ng,^�8o�P�P���h��:��X��!��:d�M�6��w�(++��-X� �u���g,X� o<`�����/~1o�p��:������VW���y��s�f������e�~�BS�E�5`������g���������y
�O�>��M�X�n]DDTVVFYYY���g��������ks�v��E�^�$[]m^�u�	'd��|.�!C�dvQf7C��7�>}�v�]�ti��??7n��U4�Ar%I����g{�������_$I� ��!(���:�����O?�t�i�]{�|������#�}������������������ ���$��6���LMMMt��-V�X��{��gc�����w���������7�|s�;������������������K�~f�Vyyy����QYY��{��7c��A
��.V�^S�L��{���[��$���;wn�p�	���I�������E�,�,d�g K>�Y�9���"@�|���HDuuu,\�07>��C�c����i��������8��3������]q�1b��H�d���y�����:�I'������o�8���/�KDDTTT���^W^ye���������<0������;��Q�2���������O�1�f�g K>�Y�Y���"@V|����%�E�,5��"C��:BNQ� K&L������S�L�k��f��/^�������=�����K��$I��3y�����y������:u�6�o-���?�(4X4k]�t��/�8o���.��c���%Krs5551i��:th��??7��G�7n\�d;�����#���7l�GuT�x���v���|eee�������>:6l���?��c���o�lP
�h�&L��w\������{��~����!C�s��1z��X�`AnM�6m������;6Z����+����WUU�y��]�t�}��7��g����K����KTUU�����/����F����f���(����8��S��7m����^��93V�^��Z�������a��5j�n���s�=������u���7����g�_ED<8�{���m��5�(X%%%q����<����v�����cc���1b���d���O��1#��������6����#����x����W�^�;�e��)9����O��s���/��/����G��c���1l��())���i��+Wqqq\p�1~��x��W���k,[�,""�v���!C�DQ�N;�>X��������gcEEEq���u�aEY�yQ�@A)���`PP-��T���nq�e���
�g K>�Y�Y���"@V|����%�E�,�,��$i��Y���(�:��,
J���R�@A)���`PP
�((X�,
J���R�@A)���`PP
�((X�,
J���R�@A)���`PP
�((X�,
J�2�����������[o�~�a�{�_���c����:lXP�/�3f��/�3f��W^y%���s����'���_�{�/_W\qE�y��QYY��5_��W��K/�Q�F��>hLI��i�!`g��/�������/�K�,�umC`M�<9��+V������~z���W��^h,-�;����/�����i�������������c���7>���X�pal��)��]w���D�$�	uQ�u�<i��}�������'��W~��O��4iR�Z�*^{���7o^��??�>���������nh�,��`����C�1"�?������c������7���]w],Y�$7���oL�>=F�I�����c�������������W��~�`y��$i��Y����������1`��(*����<yr�927���O��?��w,_�<��k������=���q���osO��1b���:ujn���/����2������_������>��j�����_ED$I�]vY�����71q��H�����f���1e����W�^��u�L�4g����p�����C��;f�G4A=�P��{���v�9rd���7������~���Kq�A5x��1e��8��2��m�4iR�5*���2�������:uj���G�]{�$�o|�ys�<�H�e�����7�|36l�����7�w�����
�7�5kVCE��2�@�9s���
T�������B���W�x��I�����4_s���N8!7����`A���o��������������*JJJ����Z�n�7������>�@���a
�(���-,[�,o��{�i�n��e�������&V�\� �>j6E�x/b��Y'i�Z~���***��������$I�M�6Q^^��3w��e�b���u�3w��z���6m�x���E�"Z���o��d���Q�M��eU%%%u>�1
�n������+�}@����q�UDDuE�3��8�2��,e�WUU�7...���[���[��^�>/��`�x��Lb4{
���)))��_���gTWW�z&d�e��|����WUU���u���z��;vl�3�N{���'�pB����E41��UUVV�i���R���k����k������6/�Z�hQ�����q������(�t�� ��!(��&��_�b�x��u����>}�DIII�s@CQ�M�����g����9s��zdM41���O�j�*7�?~,]�t�����y���7T4h
������C><o�������i���O?�7��o}���@CP�M����7�����k�s�=������u�_���4��,h�N9��h��]n<u��x��gk���i\q�ysg�uV��9MK��[���k��G?�k��&7���?�M�=z�������:�N�����������Y��4M���&�4�:
�9�$IE�$YG�))����/��u�����_��7������~z�g���#
��;.�����o���~DD��7/������[��V�te��E1q����������\rIt���N�kg�i�������������M�6e	h&����C���C�())Q���`�8��S����3�}��q�Gl��3�8#����m����S�����:*���""���,F�;v��}�����c��[>�5*����oh'�i��X�ti���gh���_+W���+WF�V��G���m��c4yEY�m�������F�N���W�^3g��y��mQ~���|'���?D�$��Zp6l���2�W@��a��X�`A�]�6�(M�,h�;���={v���?��m�ns��������w�}w�n���	���:������YG����,���2��3�?~A����[�r�-�����1}���3gN�^�:����g�����=���_�LY���b���ysI�D��m�C���M�h��E$I�QB��.M���aCTTT��5kb��
y�-Y�$�����!�mP�;�6m�����~x�Q2�a�������+..�^�zEqqqF����U�V��m��m��b���Q^^�{m��
Q]]%%%&h���P}�Q����(�����
�L�$��g�h��U���5k2J��)�v*�`���.��e���|,I��e�]�����3J��)�vi�������6/��J���������4M3J��)�v555[��j�*�$[j���s[�{X�N$M�-����54
[��hko��S�@A)���`PP
�((X�,
J���R�@A)���`ur��wF�$��;��3�H�d`PP
�((X�,
J�2������/��;��������(���#G�����Z�UUU��i�b��9Q^^���k0 9��h�r������"�|��x���b����n��(--�.]���!Cb�����s?���<f��o��v�^�:����m��������{��
�n������X�`A���+����~�����{�6lXt���A���iS���K1��X�til��)��g�8�����������'���#s��.�,.�����iS�|��q�M7�;������m������7����())�{���<&N���v[�Y�f�����[\}�����}o�2����{��7�?��<\�����9�MAAQP Q��4�-���%�L����i�4'���65�5�,sIK���"����K �&�~�������v�����^�u�>���������������92K�.]����;��3��w���l���
:�C�?�|.����������W��{��9��#s�g�O�>����z+��w_�����������3'L��w�q��/^�k��6�_}^{���)
�{��s�������*��C?���r�����>�h�����3g���.�m�����'���c�=`l���b�L�����6m�hXl6����/}�Ky���W���>��~��6,�����e�$��o���?|��Y�6mZ���o��W^�UW]��,���:��g�<yr~��������w��}���A�����+?��R__���&L��~���o�>�^zi����g�}6���	V��X,f���������:*w�ygZ�n����5*Gyd&M�������2$������>�z�J�_L���O.�
OM�@%����e�W]�tI��}��O�4i��l��O>���:+I2u��8�T~U(��G����>����rw]}������W�g������l�2�z���{���}��{����)��z������F���o����������m�f��w��?������~��S(V{^c����2`������5k���{�_�~��'>������
8p����������C-+����k��{����+-���6J�N���,|�od��7W7� 
��,�z�������$��k����'f��y��W3e���y��e{~������_�I'��w�y'-Z��E]�I�&��7��������o���_��X���s���%KV��I�&9��#����&c����y�2f���92#F�����3{���v�m���Wi�|�N8!�bq�g/Z�(��~���G��#Gf��9y�����3�d��Qy��w2g��:4��sN��f������s~��<���9������w�y�w+�����r�����9����`��������?s�������g�}6�G����3s�����>|x��_�e���w�y�e���i��I�8���;6���?2r���3&3g��W\�Fg��y��{�h��j�Jx����$W\qE�9����w��1�����`���t�MI�b����;.�G�N�6m����Xno�������o��=zt�d�����_��/~��+����{��7��;����m���W���}��9�����$IF�����o9���W�o����9sfi|�I'��[nY�=�������$���?���h�"|p�,��O�>�w
�t����e�W_|q.���
�f��7��#�8"���c�$�]w]���o�S��T���2eJjkks��w��c�Y�}��-��;X{
���J��>�f��v�MV��S���v��:���VX~�Q�^zin������'I�������WX~��V�Z��/�	'�P�{��WZ���{�5���E�����O�=2g��$�M7����7�x�l|��g6��f���G�k�oM�u�]y��WJ��O?=]t�j�u��5������{������+s�m�5��s�=w��WT�,`��l�������16Y=�NM��[W;�

�\r�%�]��K����7��/����9��SW�����JMMM����^X��+��C�~��2dH�����^�����6m��Y���W_]zn��U.�����}����/|!w�}w���{���e���I���m��U�����q^_M�@%|���L�^��v��v+�K_jPF��dIDAT�R�6m���;������el������'N��i���p]�.]����v[�gY3f�(+���>�-��r����g?[z�7o^����<���k�n��`���v�������k;v�X6�k���h�����$s��m����g�O�S�z������y���2w��|����;}��l�����80M�4��e��$W]uU.\�s�=7=z�h��4���z*�b�4�������[������tN�~���.���j�JXQI���j��Q�.X�`�k������??�;w�7����|��y��2y���_%�W��"�o�}N=����k��6;��S����.� <�@f����{��������~
���y��eg4��w��h�����v�Jj��czN�Z���&;V;�J�h��*{Wf���8p`^~��u:g��E+}��_�"�'O�}��W6��s��������_�B��=��#�~x����f�]w]�<�3c��F?s��9
Z��]�F������jjR�����9��c�+��~��3`�����'�m�]��i��-[�������[o�������E��s�=2dH~���f��Q��)�5jTF���.�,Gyd����������}+3{��F?����A��6m��w�v`@��{��y���J��m���k��������Vd���ktW�P����3x�����ky�����c����������[����5O<�D������X���U�Ve���>;Gy�:���G�u�@�)��
2dH��7��M���3g�\�{����>}�����J�X������z(w�uW�z������?�sL�|���i�f��[�����l�������n�;���T;ln�
Vz���c����4x�����(
�Bv�e��u�Yy��'��O��SM�:5����������{�x��q�~>XPaS�L)=����i��I����;7�=��z�t���������z�����)���b���0�l\WW���l:`@�}�0j���
�w��7f����#R��3��L�x���+\��u���|��;�v���v��4~��7����AJ6
���:w�\z~��W3{�����8qb.�����j���-��r��:t�P6�0a��s�y����>����3g��`��*l���+=/^�8����W�~��i���>����]x�������t���/����+����{���u�]����{o�,Y��l_��W��x��7r���g��I
>c��%���[r���7xXPa'�tR�������'����~�l�����
7��O~��5jT�d�]vi�/��rN<��t��5g�qF����e��������SO=��~����_�R�o��UN8�����S��������c������?�y����<��#e?.,���I���OJ���Ks�<�Lv�m����?�o���{�L�����?��~z�v��SN9%�G�n����j���g?��q�y��Js��zkn������#[o�uf���	&d����5'�pBz����/���wM�:5�]w]����$���n����*�[�����3a����7o�}W^ye�v���s�9���"���{.�=��
�N�0!;��c�\���s��w������Y��$�f��%�\�K.�$[m�U:w����[g����>}z�M����`������o����������?>���_n�����n�)?��O�����{/����J��l�2W]uUN?��U�s��'��W^��~������2`���1"���#��M�>=��O_��B�����~����j�6G[l�E�x��\x��i���J��������;r��w�Y�f
>����mn���}���f�mV��C��������G����C�_~yF��s�=7���:u��-Z48c����N>|x����8p����I��������K2n�����?^���0��b��!�M������v��4~��W������yK�.���c��z�������>6.�3�<���Gg��Yi��Y�t��}��'�z�j�;&L��1c�������9s�x���i�&[o�uv�}����g�����d��ay��w3c��,X� m���V[m���{g�]vI����s��P���q��K��R6��������y�*Q*���`��F��-Zd��0`�z��{������z;���j�*�v`T�4~���WTGM��o/��������)�6yuWU;���R�@E)��
Z��{y������w�����`s�x������Y6cFj���O<���d�c@��T;l.�]xa����$��3'S�9����:`@�����)���*%��R�@E)���`PQ
��(XT�,*J���R�@E)���`PQ
��(XT�,*J���R�@E)���`PQ
�����[o�P(�~N9��jG`#���R�@E)��
�c�=�B�P����~T�H�N`PQ
��(XT�,*JU[�P
K�.��a���+�d���i��]��~����?���_�sg���W^y%c����Y��x��l�����S��g�������n���y��g��{�e�������[l��v�){��G:u���w�3&�>�l&M��&M��S�N���_v�e�F�6F
��$=��c0`@i���0?����d�����w����L�6m�}��7�����\q����k��z��2d��<��Cy��S,W��G�9�����o~3-[�\���Ba��_|q.�����{��G����������������EF��e�����O}�S��W������r�-W���z����?���#W�~�]v���_���:j��`�WS�P)�g���r����*I-Z�!C��O�>y��W{��~�����^��O�Q�F���*I�����:+}����q���;������=��3'�pB�
����$)�y���s�9���?���s�����C]i�U��=:�������x��`�W[�P	���9��c��������;�[�nY�pa&L�������;7_�����d��+=��{>��m�t��%������K3m������ek^{��p�y����S�F���{��G��/9�g�^���[o�m��6��5���3��[o���~����������4n��m�u���-[����^�|���.�����/��kuXln�������I����+W^ye:��
�$��y�r�w�����JQ.�	'����Gg�-�X����7����|�s��A�n��-�f����������4iR�d�����7��{��g��>���I�_|1��{ni��O�I'���<{���rso��V�>���������;��NN=������l��y���3������w����>��'���	�$��O�����0`@jk���r��<���9��3������}�{���?���:6mZ&�,|X~u�G�/�K�6mZ��M�6�����d������S��_I�~������^���~xN:��t��i��w��1����s�q���C�s�=�$���{��k�-W@�$|p�,W
��G����:��2k����K�.������w�}����i�C9$�rH.������;
�����SN9%������I����B!����O<�=���T6q���������5�.6N5������f��!��_}T��=s������t�M�3g�
������-���-��2w�ygjj��_�7�|s�����z(�<�Li��y�U�_}\����{6���}�����_������z�\x��es>�`��`�V[��T�O����F��}R�����?�#m��]��C=4L]]]�d�����;��o�Qr���3�����a��$O?�t���2W_}u�����op������KVY2���|�+9��3J���~�e`����,��\{T�Sl���/i�e�S�X��Ms���7x��'�\*�J��{��
���{����^x�����%K����+�kkks��g�����o�C=�Ak;t��n����w�I������-Xl>��O�C�
^��������W�g��)����a�����^���S3w��,\�p��>���,X� -[�lp��9rd,XP�S�J��������^���i��N�:�
������b��Q��fa��v[����uK�v�2w��$��o��b��B����������������e���U���g���7�|�l��o�F���:u��F�[�n]z�hQ�6Xl:v���{:t�P*�������s��}��5o��f��������o��E��ef��Y6^���5��E��z>�X�f�e������b������TK�V��xO��������++�Z�xq�8�����z����:(�{�N��]��u��l�2�B���g?�Yz��5�������q�6m����:
���J�&i�e�SP
|����?~����Q�]w]�x���x�m���7���;l�g�p�
k�gm�m��l<o�������������x���3K�555i��]��!C�����������k|����C�����S+r/�JM�@%���+k��������sK�v�!�B�4�����#J�=�����WI�����Q����g�����#+r/��,6/��rf������?�x��_�~e�3fd����q���|�o���'6x}MM�_��b��{��k��j��4~��2y���������5�h�����=ztf����]�v���S��k�����)
��	�%K�d��!9��3���[n)t�Ae���P-^���Y�����M���[��?����m��i
����/I�t��\s�5���K�(4&X��x���r�UW������E�V��k��9���r�Yg�C�L�K/�4'�xb��m��u���SWWW�l�2�.[��c����f���I�a��e�����]�_��F�Z����^�0a��?���JXI����4�{lv�}�5:KM��V__�.� �����������$�8qb.������'���*�6���^�?��,Y�d�k����N:�l���O�[lQ6��I���?�S��W^y�*�7n\���/����a���M��x����5kV��4(p@i�h��v�ay�������5jT����Q���O?=�_~y�����[�j��w�=����N;��B�P�~��)����|��qa���;$Ix������y���S,K������������_�N�Z��f�m����d�g~�(����~�=����I2}��\y�����o�y��
�������kjj2h���x������?��/�<��sOy�����c�v�m���Ci<i�����/��w^^������???�p���oe�v�_��������v`�������w�+����O~�������ljk��o�i����k����f���I������O��1c���[V4;lhN:��6,?�p�{�����?;v�;���f��	Y�`A��������n[���������k3j��$I�X��W^����*={��[l�3fd��	Y�lYi�����L�81c��ip�������[*�z��7r��p���>������u��-�����/~1�g�N�,\�0W\qE����t��)�n�m�5k�3f����Z�xKM�+w�������������#�(+�J����:]tQ|������������
YMMM���?f���/���1#�?�|^{�������m����+|�J�l��i��������l���>c�����>�q����_����k.���5��A��?�y�6m��{?z�����f�]vY����S���/f��?~��+�+X��?~|^y����k��&�[�^������N+�����=l���o����\v�e�j��V��Y�f��W���^{-����V{f�n�2b��|�;�I�-V�����t������+�L�PX�����w3z��\t�E8p`�t��V�Z��y}����/��n�!����V��I�&�o����_�:��s�Ze���v`���S6�n����>�4h��G����7���q�5l��6m�.� ��{n�y�������5kV��k����.�[l�Fg�o�>���/s�e���'���q�2g���l�2�o�}>��O�[�ne{n����|��k���v��_���>�I�&9��Ss���f��)y��g2e����1#����r�-��g���������q�S,�:�c�=��{�x)��
���3���o�}��~�hg����	6)���9��r�4��m������h�U�6�l�/~�����f����k��}�x��
����[m�U�d���6P{��g�x����?~��>�l��_����Ll���n����~���E���_�b��-Z�����l���Nk�x��`����/OM���mz�E��[nY����g��c�����KsGuT�:�����Dm�+�����W��U����9�b1K�.�)���_����������{�e���>}z�}���q��9sfi�!��;����_�S��3�8#�{����������I�#Fd��+���G������7�����F�1u��L�6m���7�Q�`��6��#r�E������e�V��[�n9��ss�	'4Z�U�\s�5�����<�
���I��N�yi�v`�������N;��+�Xe�U����;9��3���;��o�PB�����?�b���������@-�]��X�[�dI�9���q�y����$:t�E]����g��YY�xq&M��{��7_���R(�$3g��i�����;������v`��8����O*�����{��'�;w.[���������QG�{��7�w\.\�$���+��O�|��__�,g�yf�=��5�3n��|��_\�{��(��
�c�=�n��4���S����l��������>����s�i����;����i���Z����S:u�����C5���/~�����g������r�)���Wi<c�����n�|��`��X,����l����j�����y��esO<�D�d�u�6@�f���9s���w��Fg||����94X�Z�h�rs���ktF��M����-[�L�X`��c����M�4i���8qb�x���^�L�X`��Y�f�v�m���������C���w�i�u�Um�Ba�����*$X���<Z��[(��
��A���W_}u�.]����?�x�y��U��1��Y���%K�T!	��V�g����@l�������_y���y�����_��q����N(����g��w�F�Xi�B!��5+��;wn����7o^��Y�f)
UJ�aS��C=4(���o��:(C����K����1#W^ye����I�&����O~�&M�������}�����s�����b��\!_��m��`�W[����q��o��2a����SO=��>8m��I�����e���1#���O�X\��s�9'�sL%c�W�����i�J���������~����Y�*&6W�b1'N��%K����kW�D>X����s���t�Iy�������7//���J�6m�4?���s���������i��n�:���/�-^�8���O�V���M��j�*M�4I�P�bR`SV__��K�f��y�;w�r�WM�6M�����`��6p�o�}��?��O���k��O���~����o�N8!g�uVz��]�����6���w����KKs�b1���/+���B��.]�(�XX��������c�=6���~F�����g���Y�pa��k��;����d�������jG^��7o�w�1���n-ZT�8%�B!��uK�V��`��62m����2`��jG���M�f�v�{�������q��i�t��E�@(�6ZM�4�v�m�e��e����7o^����e��U;��h��Y��m�v���y��)
���QP�l��4i�v���]�vI�b�������*'6U�B!555
���,`�S(��I�j�`%j����,*J���R�@E)���`PQ
��(XT�,*J���R�@E)���`PQ
��(XT�,*J���R�@E)���`PQ
��(XT�,*J���R�@E)���`PQ
��(XT�,*J�E�=��G����Ny��g�����~��<`�V[�l��z��$I�P�������l�j��M��*`E`PQ
���-Y�����i�*&�,6x���^��m��UL4Xl�����$I�PH�n���XW������w�i��)S�4xm���|���0aB�����}���w{����6,
�Xk;��c
��J���$�����F��+_�J��T�,���EWk�~U
�B
�B��b9��r�!k}�a��vX�b������z��������MP��j'���V;��O>y��n���
�$�!��m���������u�����Cv�u����?[o��:��q{r���N�yQ��Z����V���[n)=���8p`%"�{�^X�VS�l���b�#��j`�t�M7��w�u�*&64
�X/N>��jG6P5���E�����v6.��zj��P(��nX���������,���7��B��$)�+-����������GM��y��v6>�b�Q��X��	&4�:`���5��;4�:`�SS�l^`PQ
��(XT�,*�������1#��O�����h��5�����T@�(��"�������n��O?��'��9�B!K�.m�d@�)�b�3fLN8���5*IR,��:X�7#G������X,�P(��}����X}�����M�������/})���/Z�k�.�~x�w���.�,���]�x�����kf���W_}5�=�\.\X���O�{��U��q)�b���/��'�J��8��������[n�$����J�N>��8�������
7��K.�$�g��������o��oLm��������4]{��)
)����W���?���V�m��9������/g�=�H�X�����SN9e��*B�n����<yr��P(���.J�f�����]����J���S,s��w��Cc�*L�����O�����������*��������[o��������^�8!��Q�E��>}z��P(d�vH���W�~���|�q��Y�f)�y��W3n��F�
T�,��9sJ�;v\��V�Z�X,&I��������i������#F�h��@�(����l����a����k������c�gn����I�&�}8��`��:v�Xz~���W�f�m�-=���k�=s��i�����C:��`��>��O$I��b�}����c�=Jk}��U���;�d���)
I�-�������F�������6I�`���?~�5������w���!CVz�E]������d�]vi��@�)����n�:}��-�����[s��G�y��)
)������?�����$�;wn����9��zk
�B��}���w�}��GTH������`�^v�a�����o������w�����
���;7��6�l����/}���6�l����.IJ������Y�f���m�T;T�,����'����|0����rk~��e��v+�[��L�>=�>�l���,Z���.I���������m��OV;T\m��i���g����,\�0IR__���V�Z��G�1���<IJeW�c�XL�X�G��o�=M�6����,��#�<r�k:v��G}4��w_��a��e��))����s��o��t�I9��C*��Xl�:��u�Q��T@M��yQ�@E)���`�^������3n��jG60������C���?&I��n�8����k�*��I�U�X�����[o�5��zk��g���2��c��UN	T�,��b��$)
e�7�x#c���o~��
������B��:(m���Zf`�S��z1}��<���������C��o��}��X,��_�K/�����:M�4I��}K�X���g��y�j}�(�b����C�>��}��I�I�&������������~�k���y��g�������.K��������
�����&M�T����������K�����k_�Z�d��q���K]]]}��L�6m�=�b1.�c�=��{,]tQ��m���gW8=��`Q;��sv�y�|�[�J�����:th�����Od���I�B��b�X�����W%/�xj��d��w��g��{��73g��#�<����?�b1�B!�B���FR[��$K�.�3�<����:4����%K_�&HU����g�������SO=�>����X,�P(�X,����o��:�Q7Xc����/���������e�l��6���W��c�4o���`9
����_=uuu:th����5����EWj��E��o�4(L��}SSSS�����?���/����.&LX��f���_�~9��cr�YgU0!��,��w�}7C�M]]]�����{���������6���O�A�e���K�f�*y�w������F�L�����/�SO=��c�*�`�����g��?~|i����B���w�=�
��A�r���M�6���Q����r�9�,�k��E�t��%[m�U,X���{/��O�RJ��%o�Y�@(�b�xs%����w�9�
���3`��l��VN�q��������es�~x����e��i��y��I�&���.��_2|��JF��Z<vl�#
����P(��?��O��K/�a�V�D�q���;��Ni��i��r�-<x�J�t��%_������}-�f��DLh��j`���/��#�L�.]���~57�xc�~��j��(|�[����K��o�}��W���[��X��`�^����I�b�X�3y��2$���7��G�����9����?��?�6mZ�Sox����<��������c�=���`��V;��_|1��O���>��C����.���K��X�0aB~����w��]�d��v��A�2h��t�Ai��MU�o(��������*%�����f�������c�=6I����T�UWW��'��a%�+���W^y%?�����I�����T���~��Y�f�����8qb������{��gv�u�*&��QS�l>��n��|�����[�������_�5�\���>:;vL�������K�����'?�I
�-��2���g�������-��-+�P�4�xj���W�^���W�|���N��5*uuu����O<�y���X,��/X� C��V��1bD�x�=�(=�������������w���E���S����3�zh��]�V:24HM�����s�����k����2$�����P(�P(T9]�}��G��7o^N;�����^��/��^z)�g������o��G�y����={������d��*�����vX�lY�}��:4uuu6lX/^�$�e�����W6������^xa�{,X��.�,#F�������m�v}��5���x��3t��:4O>�d���_zW,������I��V[U6h��������/�����W*�*
���>�#�8"�m�]����^x!����3i����Gy$��rJ���?�s��S�f��ik���%^�(��B����C����.�>�hf��Yz�������m�6x`��f�=��h�j�3gNY�W�<���I��;�����P�����������O�w�Q������[o�5'�t�:e���kr�����(�b=�8qb���J�W'N,�[U�U�-��~��
���g�4i����7���[�|�&M����5��O����m������L�>==�Pi�'?�IN<���~��`�^l���������+�*
)�)�����>��S*��o����y�j��`�h�b�����7VZ~�����\{�����g����$c�����?����7vTXc
�X�>,���{�Q*�:����M�*��0�������f�����#|pz�����`�y��9��c�h��q���/~q��`����������{�
��:T9���e��i��I�-[V�k��m>��O5���:��k������S�N����:��,��SN9�Tz��K�j��(u��)���^i���;������{��]6�:uj�e�u�����o�v���.��RV���]�5�����f�j�\��j�X�>}���-Z�F�.\X6n���:g���6P{��W�x��)k����e��;�s&h
�`u��G������0aBf������=�\��w����
��,�@u��)���g�����?7h���Ks��w���������:��v6���z�~������>}zf���E����B!C�]O	7<��~z�|����g?�YN<��4o�|��~���f����q�v�r�������&`���s�=�����>|��)�)
��j�0x��\~��y����$o��FN?���x�����Y��g�}6��~���g���������+n��F�l��|�������><�b���X,�~Vdu�7555�������n���z��y�������3'������>8���+����+����^���:����������7��$���>Z���������4(�]vY.�����#�<��}��s���n��2������Y�xq���;����J��m+V����4=�������B��B��f���?��?����g���e�V�<�H.\�I�&��������t�����O�>y��R__�e��U����������_�"M�6-��<yrF����G/W~��w�<��3�}��+VK��e�]�$)�i��I����\r�%���W�5k���f���s��4hP��?�3o��v�=��$����s����'���7lh�������^�q��\�Gu��=?�����K/�g��L
S[�lz�����C��P($I���o���^�3�5k������i��r�g��������������f�m�G���'>��2$s����O?��c�f��9i��M��f����^���w�c�*)���
6,��-K�
�|���^��N?��������cf���/�0�_}cE�h�k�.�vX;��jG�5VS�lz�~���s�����n��r��E�V��?�A��X,���o����=$P5
�ht3g�L�
�t��m�kjkkK��+���'?�m��������n��@5(���-]�����u��i��m��b�d����=s���+=�3f���e�t�i���%X4�����������5[l�E�����^���������g�u6`����Of��7V;��`���u��$)��9s�
�|��(=?����<o��e;vl
�B��y�����XM=��jG��,����Zz�4iR������=��3���d=��S�4i�J�����3o����$���n�����R�E��q���s��x���������$)
Y�ti�8��,]�t�u����Yg��B�P���g>�����Jq��jGh4����*N����K�<��r���g��������������;���/��C�����\����+�'ON�XL�P���n��U��
���^�v�F�p��jG����v6M_���s�w$I���?���/O�P([��_�*���O�������9�����|X|�$M�6���_����WM��i:��#��^{�O�>i��M�~����p����k�$�B!�B!�b����|�XL��Ms����_�~����V;�����g����]w����W�^9��s2j���w�`�������+�������@�)������>c����a�2e����t��9���_v�i�jG�,6={�L��=�X�`���<yrz������N�b`e`��x��Ws�)��P($Q���j��V,�XXT�,*J���R�@E)���`PQ
��(XT�,*J���R�@E)���`���y�u�/�wuwLB���aD�!!^Y����ed�*�w~2��2�gq�QT�QdA�;a1�H�������Ig����#m�������uN�T}�[�zWN8z����`PW
��+X�:EQT�B�K�T�D
��u���:������:�����e�����	���Z��~���m(��K�r�-9�����7��n�2dH?���=`C�N�\u�6`�%�>�����'������1c����N�>}�������)��u����eV�\����w��W��1c�d��!7n\��������K{{{�����&U����l�����K�������$��A�r�a�e���3fL����W��3����CU�F]���������;��3.\�zY�Y�`An����t�MI��C�f����B�]w����*Q._^u�+Xt����?��?���-�����������L�4)�����/�2�f����^�k��6I2|��q��B�w����t�����566����g���o�=s��Msss�>��x��illLY�I��(��Z�U�e������?�I'��#F�o��or���W�:@'h�:��~����#��G�$Y�hQ����������9�<�H����c%��)S��SO��K/�kf�s)��R�1��c�9&I2g��L�0!���iii��)SRE��eX@��Pux�E�e��Y�pa,XPu�4U����Y��������477g����E�$)���9�s)���.\��'�J�{���_+�z��v�-c�����cs�G�+*@�Z���`s��.�l������Msss����������v}u�W���^�3&;��c=#]L]�k_�ZZZZ����.��-�����j�m��GQ+�9rd=�u��.q����(��^
80�F����c3f�����>�TF]�(�$�^{��������1cr����=����:��"�\Y�y��G��O�,^�8K�,�������W
��,�L��o(�"���y�������.J��}s��f���;vl8��466V������;=�����7����:*HY�~�-[�;��3��w^=��l���9��c����<yr���.�Tuz�}��'���O>���f���������������s�=Y�lY����_�pan����|��I��C�f���;vl���]v���W�zEQu�+Xt����|��9���s�9����5w�}wZZZ����x mmm
�f���k��6�^{m��MozS���1c��#�HU�tX�]���s��G��#�L�,X� w�qG��������{,eYv(�z���r�W��+�T�=\C�`�-����������f&O��3f��?�i=��$IQ)����@gi�:�����OKKK���3a��L�>]��B
����9s���R+�z���k���T~l�/��>��WXX�����s�w���9---y��GR�e��~M��(REm�(�����3fL��[Iv��X���
���S�E�Y�|y&M�����477�������+�����,�����3fL�g�������`�%���I�&������Z���
���#�8"c�����c3��1��?�
6
���������(:\+�2C�����k�W#G��()Po
��reYf��A9���j�W{��W����(��K���/�rH�����|g��t
�����O��}���#,�����u�Puz'�W��(���`PW
��+X�.EQu��+��@����R�@])���`PW
��+X��,�Ju���R�@])��K�����y����.��w���&��4iR�y@��Tuz��S�&I�����K7i���K;�z����{)�VGu��no����>}�T��
���^z�����A�*LtXt{7�xc��(��1��4��j�:=�s�=�^�^~�����$eYf��%y��gs��������]�w�}78'��(�b����oNQk�^�e���N��g~���Y@5`��^+����kSE��HY�7n\�����������6eY���)'�|r�����������\'�x�����?LQI�q��e���_��


0`@��z����=zt��v�M�l&��w�@����v�W�������Yg��1c��#�4T���,��#�PS���������{�Qa�n�,�N��,���'�Xu��j�:�XP+�M�:t
������T������x���3i��<��C�={v����e��m���(����E	{��������k;��S�N�ZM `��-�:t
��r�_}����������9eY�(�NJ�;�p�
��_@w��.����SO=5W\qE��VeY�����j]�I�����N;�����@�u�g�?�A�2��,kEX��������]���}�sy���$�8
�?Xt�;��#����k%V}���9����<���
�n������f���������/~1��
��y�����z(���ikk������'���.K�444�����8�?Xt�/�0IR�es�
7��.�n����}����o���n��2v��|�k_��i�r��g&I���?����]w�U�w���.]��}�c���������_q*X
��t�/Nsss��HQ��'>�#�<r�f���7]tQ.����e���}�{_^~��.J�s�{��y����$#F��W������Q�E����{�����,�$���'7z�������?>I2w���{����������o~����o��8p`u�`#(���M�6�v<x������k��l���^�����$)�2W_}uZ[[7=d�b���r�)ikkK���9��c+NN���W^I�E�#F�vOSSS�x]�V{��W���7��N�4����,^xay��$��!Cr��W�6�,:���+k�X��A��,�$���3�9s�����'�xb�<�����}�v>~��l��v&����N7x�����E�V�g��!��i���sf{{{�x��y��'joo�)������'IF����������N7b��$IY�y��WV���o}k���{�]�����L�2%EQ$I����II{��/�8��sO��o������W��������>{��G�x���Y�hQ�a�>����o�9eY����������;�v�u�]�E�%I�����o�u���g�}6��sN���_�b���z�9sff���A�<��S]���\����:(������o�v�m�3f$I�����=�����;.^xa�����+s�i����E��:��|��g��O:EQ�,�$�!�R���>��Od���I�����9���+�r�������������_uUqD�1V��g������Nc�������^������������o�1���_���o��[o��7��/|��w�}3c���e��(r�a�e��uy��]~�������$EQ�{��^���[q*�����(������N�������$I����<���OQ�\r�%=zt�W����G�g��a�k�WI��O��?���w/��R�<�����>���5��D�y`�%�9������Y�lY�d��I9��C:�5jT.����~������,k���HQ)�2}�������p��{�
}�S���y��$�m�].���j%9���s���o�=O=�T�;���	���.��_�r�1�.`�%���������N=�����n��g?�?����V�u�A�_��_s�AuE�n��?�y��������f��!���a��e��aU�������Z����������(�����q�y��3e���s�=y���S�e��n�|���e�]��XW����j��sL>��T�:�,���#Gf���U����y�j�7�t�F}[��i�V�����>�����`�5T���,�����N���I��(r���f��1=���9�~��k�V�\�)�����>+V���{~���y����7�������:��u�];%l*Xt��,���������{��:�����y���	:UC������:�
)���`��-_��v��_�
��A��s�=W;4hP�I����n��k�I�E��w���4��j�:=��w��^�~��45����,�d��<�����/~��'�������f`��F���(�x�,�$��g��i����?�i�z���G�~���S��&[W���3��`��N�A���������l�Rn�����f�\p����+��Y@}4U������[����??EQ$IN8�������=���!��[o�=��#�x�;����*�Z��h�*�z��'��1c��#�(����eYu`3TE�V�g��F]b��	�������$��f�K/U`��e�?�(��K~��UG6cm���q���ck�Pu�l�[Z���ES���~�������������V[e�������~��U
�$
��/��b~���������_�q�����)�?�����G]����o��.�,�y�{�$+P_
���\rI.���$������}h�{g����?</��r��L�E�$)�2��O�{��������������.�Puz�����Vf��8ox�����3���3�t,�z}���+s�I'��W^���@WS�E��7o^�x��Z���������M�O~��E��,����s�9�������8����k�����7�Q�w�t���4U�������VE��>x�{���������^}��9���j��?��r�!y��R�e����\x��]��Z
U��y��gk��o�}���7�xc�W����{��WI��o�|�+_��O�>=O>�d��J�n���I^-�:t��-Z�(����H�|��\��#�<2�����O�<�����N�d��������������+S�e��=�y�j�555e��w����1���UP�E�kjj�/]�t���������[n����{�{��r�����71!P%Xt���'I�����?��}���I��(r���u����;!%PXt�]w��v��+���'�Xe��/��I�&�(�$�����:s��9��-���s��P�E��w�}���P+�����W�s�%����=eY&I����y.��/�X�7b��.H
��,:�V[m�1c��,��e��~�����2k����7/�\rI��_+��u�]�����q��>X��$#G���{]C]����|��(��e���??�m�]��f�|������+S�e���g>�������k�C�Q�=�,����c��O}�Vr�$eY�~^[;�����}l������E��(r�!�tyv���e�	�.`�e���o�K_�R���R���t-�2�����������q�3n���L�6�v�QG������Tuz��|�+9���r�����'����K��;d��q9����y�-�������v�����+�u��.��;���N��{/���NNP���:t
U`����R�@]5U����)Sr�=��������s�p��4([m�Uv�i�x���u�]��	tX���3���|'�������/�s���o����9��S��v��!!P/
U��������#G��_�jf����,k?���������.�n������%��,���?���v�iY�xq��LQ)��v}ueX��)�2�-�'?��|���">���@�u�9����/O�Z�UY�>|x�8������:th���g���y���3q��<�������,s�����o|c����T�J@'P�E�x���2~��%Vo����o|#�������������:+�'O��g�?>�����{���.�Puz�s�=7mmm���~��y����w�{��WI��w�;>�`N<���e��(������;�+ct���:t
��t������[jEW�zh����466n�����\q�5jT��LY�����������:Q�E������������Fp�Em�������[[[s��wo�<�Z
��t�?�|�x�m������M�w��f��a���<
��t3g�L�E�7��M�2��sf���)3�j(�������v�d��N��t���q�~�:e&P
Xt�a��%I�����S7�k��%y��gW����e�	�.`������%I��Hkkk~���m�����gY�ti�|�=���y@�`����{����I��,���>/���F�z�����>EQ$Iv�a����^���?Xt��N:)eY�(���=;�zhx��
���Ce��Q�={vm�I'��5���Q�E�����m��6IRE�{��x��9��3q���\�r���\�2'N�I'��8 S�NMQI�a���_�B���MU�w8p`����u�QY�lY��H[[[����\u�U���O����f���0`@/^�9s���������$eY�(��e������k���*~3`S)���~����������y�RE�W���/_���'��^[MQ���!C�������Q���@�k�:��1����'��c�I�����
�^��k�������<��#9������JMU��>|xn���<�������s�w��C�/_����}���xG?���r�)9rd�������m��2~��$����3c����;7�-�����V[e���O�>}*N
t%XT�o��1bDF�Qu�����,�N��,�J�OQT�XX�US��YN>���EQ���/_������=�,6��W^��(�$eY������:����
U`��Tuz��,;u�sYl&`�A�}��N�l~`�Av�i�N�l~���Eu���R�@])���`PW
��}����Z(���`��E�	��P�@])��g)���Hu���R�@])���`PW
���(��@](���`PW
��+X��,�J=KYv��2
��+X�>EQu`-`PW
��+X��,�Ju���R�@])���`PW
��Y���]��w!l&`PW
��+X�>eYu`-`PWMU��,�L�:5�<�H^x����7/����V[m��#Gf���O�����	�EtSs����~���r�-iii�������O�>9��cr�g����cJ������Z4TX��>��l��v9���s�5����*IV�X�_��W=ztN<��,X��NI`�5UX�����������������>o|��b��L�6-������G?�Q��477g�����������
2$��~zn�����;7�?�|����<����3gN&L��Q�Fu������I'�TM`XX�M���o�e�]��������v�>��4�������=:&L�'>���~��_d��	���EtC��~�x���r�)�b�-�����1�^zi���wvX�����*"l4X�
s�1�����������:���o~�����B�"�F��p>g��,Y���4�E����&R���V[m������+Hk�z�_|q��m����$�f
������:����N���oEi`�`A/�������G]QX3X�K������w��a���N�&�ES��M��+���SO��v�q�����g��93�f���{�z��N{>l���:����l&`A����N8!/��Bmm�������;�9�^zi�?��N�	����������>��o�������MozSE�`�`Av�������;��u�Y��?XQ"�&����Z4U�8?��Or�gtX;�������K�w���������{�z��w�q]���K�@7�xcN<���eY[{�����.�,E}���a�2l��.�M���dI77��N;��^{U��`A3a����Y�remm��q��O����
������g�d�c�%

���?������c���Q�35TX��{o���������v������K��}+LFo7�'?y��*I��3�#�6��)��b���9����h����;���������*L��`���W�E`A��Od��q�;wnmm��w�o~��<��d��`A77m��y���9sfm�-oyKn���l���&������^z)c���/�P[�q�����w���dln���:��(��n��W^��q����O����v��v�my�[�Ra2�4
��Z�pa���������
2$��zkv�}�
���k�:����������a�3��Lf����o�}�f���~�j��:3����:��(��nh�����}��_��Y&L����7-t���@�+��k���j�:����Q�X|��Yz��p�Q�b�}���=�l������Yx�
yn���:��L=���>�H����d}>�Q]��h
�X�N�����|�/'+Vd�g?�����Mu��pa�����VQ�

��+X�[Ql��K$��tb��S�����F�v�w�K�N���������<s���,}��MT����Nf$�����K�[�'����y����<���)�,I��2���3���;',PW
U�(�
���;;�/��i^���^-�J��+���>�i��(��GX��_w8_��S%6�,�J�VU'zX��,z����=@e`PW
��+X�[QT��E`������`PW
�X��7��GYV��Bu���R���E�	�^D�V�U'zX�US�����kU._���^���������i�m��t���:��`������g��~�$Yp�����'Rt��.��5T��joK�Ur���%s�N�y{��*I�O��%�������=U�7���{����S�;)zH�`�bEVL���a��������(�>T'Z1mZ����!U-��k�WI2z����g&U�g}�-\���F���#�����u���#t���:�
�:�K�&���<vs�I�n��W���{�$+�O�����8Q�+}��5X����U�`�f��?w8_t�M�6[
��+X�>EQu`-`�E���i_���]�}���o��)�X��,��'>�'��:O��%w�Yu�.���aYp�5U�6
�V���3���O�����g�Qm�.V.Y��'�\u��S�U'�B�j������z��$�S.^���EQ� �3_�fB=�}@����R�@])�`��/[����U�L�Tu�Q�@MY�����������i��9��]�lm�{���N����Yt�m)�������b���������S;�����3��)�x�r�����W2�?���3�=7�=4����y����UYr�]UGz(X�3��s3��_���eY��o�6-������?���,{��N}�,�N��,���s�E�?��=��[i�7"+����~�[.���7���]EQu�Q�����f�����R�Gk��;�H������o��f�,z��?��N�m|��M����=���.���'O��i�W����'f����wC7l���l���I�����&���^y%s��_���C������yr�-3��+�>�������e{r�E����E3��|yQV.Y���W��r^���2��s��`A�k��|2���g�;��<���Y>e�:sw7��O��h��O%��~C����y�Tu��f������%����j��kZ����z����4
�aoY�y��#���G_�{�}rM��W�������f�������e��]�Q��2�?`�4�/������Y0#�g��Y������������H����g����%w�W���$�����Y[�y��V�I�6EQuz�;t��y��gf���f�k�I�����z1�[�\����[���yf�=����;�/{��Z�U�,����/^\;��-2}�?dY�������;�lt���>9����������gn��$�������gY���N_��7��$yf���x����pr�O:�_�f����g�}vV���Iy��,�NI�����������{����(��+K���y�����_&��L~��Y��
�1q�������a@�|�&�y`������I��M������f��m�.�}2w�}��7Sv�!/�vZ�[[�����a���~��X��ux�/����"w\�<K&?�eO>�$Y0#yz���������IZ�����=�D�=��j�}����_w\{r��%I�-��O~2���c�b����1c���d�������t�1z���t'3�:*���io|Cmmi�����.��O|`��,�b�Lye�����>[oR��~oJ��q����G��{���bEC&��a�$I���2�����w��CM����+��8��Y8���a������3u�3��6�K�&�_�4|�����a��g�g�fJC�r�*��/�0��>;I����Kr\��^ZuR{�������������;��5�������5l�7?~q����e������=NC�������C��kf=~���O�������?��z�k��Wm�??Sn]V+�J����U;�~�	����O��!����<3������Y�oD�z���=����$3?���mm����m�a���������N�d�o��IO��;-z�i��}���y�-��^��a����������{�hY�{��������������?���h��=I�Z�����f��O����?�V�;y�=��]w��C��y{C�<9��U��5���Z��p}�~S��8([-�mxtl�e�k�w�"/�������ox&��t��X���ES^��������������eSY��N��h�:I[[C~��s�Z���}�+�r��������+��oC���:x���}����#3y��s��X�z[��W�����4�����[�m���^���WSv�J�|����/���?:GQu����$/
�P��p�z�����������z����������\�}���>�GI�Y[�g���.K��e��
�����
�jt������)�D����;w���~��{���`���
:0/
��j�-���
��>��?����,��S���h����)��#5U�'�;��<�~Z�d�I����Z��	�?�%����1�c�2[/��K��KC�z�Gw�N�����Wf�����3����<�y`l��}�u��i�}r��.�b��^q����w(��.O�7y����Yu�����:[YUG������{l��T���5����E�,k��+_I�����|Cr��W�wer�O��[�/#�
U���2��J�����L��f��=n�����jZ1_+�J����?�c@�S�eYu`)����3dL���d=>���u�f��:@���^��o�f���)������,z�%&���O�:P���hP/�����`=����gE��U�`��H{���?�a�.�:�
�����]���O�1X��"������2�+�N�5X�J/o���s��y��W��@�V������.��{)��W���[g�c�U�
M����:E�f��7H������@�f^���#�W`��-����#�K�EQu�I�f��q@������_u�u`l������]ne��UG��*��#)��n�,��#@](�`���`A����C��)�`��l��,���c]EIuST�GR����,3�K_�:l���U�;xT~��A)MR$��|rR���.����VY���L��2y��W����L��e�1zX�g-�������@gSP��(��?kkxCf|��U�:CQT�����~u�)���Yz�]UG�^O��E��^8`�.���)��H�?��=�,�w+���W`PW
������8)�����-��{����T`����	F��&�5�K�F��k��Q��������������c��h���z>�����|��{�3���w>����������p����6��9�!`$�`���&#w�O��>�; ]L�YT~�e�����p�"[tD�����r�&���\������	���'2[���.��w(��2�pG`H��.4&��A,�c�u�D�p�	��= ��c���p�!pH#����G����uv���|2���}��w8��u,	w�	����oT��QA�G�]���i����
���w8�D�x�v`
w�|��Z��7m��-T����K������~J������P���
w8�D�$_�������n,�����W�Y����\�����a�;��2�����Z���X�Fm�9�,w:zK��~����OFk������O��xL2����c��������
))jy��p����Z��p���C,�/�.t�%��J�� ����p�,xE�^#y������U���cf�j��V��2Us�5
:��`���yG����Z_{-��V�t@�/�����8��;����X,PEE��^���_?�?^v�=��?��s�i�����2���1j��QQ�+�\mRC��\ E%�;��0|>���V��L�z�w8�G�RG��5H�D�;�#m�<k��>t�,�4�~(�[z�*����l���]xc�O�w�&����7N���p��$�x�����K�;<�����r/[&[�>���w8��o���s��w���2��S����
cd����%����((��� ���-��N�$����2GG+v���[>�T�V����2�
��p``a����1c����n-Y�d��cbb4u�T�q�JII9��?-���Q�����+Uq���$[��*�?_������P��������9�L��p�^��y���[)g����������_��8����{�m��/W�3��VX��k���b90���8[*["���
�
w4���RZ�v(y��$�-�}7#P��	r}��d�*��Ww�y��G���w�9k��O8!,�7��f�!�RF���$3gH��������bR����dm+���|�@�{��7"�8��+U6i�������`�\E���;���3�%����3~z	�MMj��~IR��/krr�#:��������L����a�T0oI��0�H����'_I��		��5K�#�wX�U^��?�yF��~\CZ��T�I�B(�??T��T�����\)����3s�I��	��V(�n��+�
wD�'#P�O�[T��+��}(o4p8���2�mj
w�K�K�
���~���%��?*^�������j���]�g8��WU���C��%�|�����i�0H�u�1�;������K.�Yg����W�����'�xB�W_}u#~z�s��%���V�]�V��>�����7Uu��j~�	��x�\~g��+������7��e����~�K�?"==Y�q�����W��j���������^%c����'T{�
j����]���R��st��c�����J��!�9z�V�tQ�#���Oz�*i�B���wD{����B��$��W����7���O>Q��)j~�IUL���O>9�1|��P�+)��g�!������#�zEPK���~Z���=/�olT�������������u�t���;W���=�c�|���m��R��g����C_�~��#���J��K��^�/
wD;�y���>_.��u�$����4d�6�����������nS��Q����P���~�b�����v���g������?h��e<�!���]����Z���+?�t5�w���Og���_�y��-)����N9�����f���C�\u��G��Y�Lmo�����@c��������;7K���[��Z�Z��]w���^-�����oR������KC�S����;:B����}_�^o��U^������Rs��~��U���
�����
]�^�Ahm
}���O�ar-^,��5t;h?�����w���JK��;w���CY�����
liQ�M7}����|SE�4h�\��I�<����h���s�����Ne����	��-��4��P���	=TB
%Jv~��--�u{����~�����b��������?�Xj��K���z�~�[��;?T[M�zw�G���%%����:���[���v������T�Bj���������6�4w�}:�X�L�~m�@S��s������\!U�	��,����^���mp?0�v���C���@q6���^���k�r��/�����^�F�a������i�����u�c��4o�`�{��(�MM*�2E23Us�����l
}>�f�����s��l� ��{����[�>�����/��l���V��0+��>�7����o�_�����z:$����4t�6�����z�?D}����xV��k��������������*3F�-cUW]cP��w(�$}�[�<�����Cqu������L��s��7O��k^p?r����8���nm�w�{�S}��f���;W����j7{j����e�e����:|1�O�!�}64V���~��K������
}.;��!�__������+��6��K���b���Cm���J�z(�7���b�-x%�O{��C���;[��������u��y�m��V��Ov��n��������������**B��-coOc�6��R�kw}���r���-���Z�^��B����?�?�0����g�I���X���e��H
�W����������5��)��.��9���c�R��{����u������G��n�\�SXS��C�c���eo�gt4��g�k�m�0Tz�1jz�!�<��V�gX�G{{o�>1H�u�1��i�`Pg�}��}��n��Eyyy���������CvTT�>��S�7�`������5h��G�Z�J[<{�G�;����|�<�Le���8�*���W�-7���H���_6_�
�����1v�
�&�����v�n�I7|J����KE�|�bN<q��n�j��<R��o��WQ��'��%9Y��]'��jz�a].%�p������/�#��e�u��M�w�g�����8�(��u�N�������#2��(��d���m�u���S�����9�9{�*N?]��E��o�=l��J�Sgt�a�l�F�/E�H#����?��������>R��?�c��B;�����}��Z��oy��W�/)�v��}���A-���"���x�52Y,����/V�IP���X�VZ���Zz�I{]�&G�4�������V����d��[	W]%��������+�����yy�]Z��o���R�h�`��������GK��������4�+d�JG>0R����! �74���j-�j����<�_�C��gh����]����3�w�vt����dx<r�'��_�>b��.�P��(���Tt��n�Q�X���#
67�.u�J��*�Oo?�k;����w����Z�]w���;��sf�T�i��^Wg�J�<R���e��V��������}T��x%�x��v�$���U�e=IJ����z�]���/n���_�R�����VI���>z
����S���%�J�|��l���tH�_��	6�V��4����j}�U��$359�][+K���kw�F�79��Z�3f�1z���?�@�u|���O>�k:�P�=�|�z��V5=���`P�������O�
47����d�X�4m�,q��w������W$�I��>����v�ux6lP����"

�w�Pr�%ou_~o���������6L��^������J��?�n�pC�wk+#P��O��y���B���~�WQ����ne������;���:�Eo�.�;�N�������������6��*?^�u�d��W���1�7����������������8W�I�y���~,���x�9`���**�����s����9r[����Wj�]9��U�����z�Z�}V��J���n���i���������?�,����t��������M���S���k>����O����x�U���-)��w���-7�"�������7��>�34�2{�t�����_����jz�a�""�t��]���:��R��/����;����p_Y���xB��4E\p���}���MWA�cJ��W�x���e=�W����5��
m,�K�FnD���~'H��z}K��?�l).}W[��0z�x���dIJR��Y�$$�����5;[I�^+SD�^������1>S:e��Z�\*�J��/�=����

ztJ�/MZ���~X������������V&��?cA�G�����d�<�=���O3��F�'E��\�0B�$��J&�t����S��_7K�]/��$e}�)j���n�����W^Q����K>�CZ�r�6=8]���VRt����R�������z�^w���xC�w���[n��g��l�Z_zI��p��?��/��7?�����������;Nqg������+�P���*`������2��n����?V�'�(j�D�~������5���6��{���C����*?^�+B�13g*z���z>i��kT�����xTI�2�v�}�x�=��8Bq\���g������u�1��2�{��}�����������&����>b�".��=Y+��MC��Q�k��������x�5
47o�n�s��o�����Z�Hm��������_t��~���m��"
?[�����o�R*�Y��������y�^�W_$�x�E�?U�a��_|�����4�p�\����!C���w��Y�V����EP�e^#Wd��j�V�{��������l�$�?AJ����{0Cm��*��%�;�<9�����C���GK9��-���j����s�`Om�=	��]}��]'sz���G�l��*�JI������N���RY�N����l���Y�F-�<j�^}�w�3����R{�Wyu��s��n�Q��+�1s�G��}r����uk�����w�P[k���%"��n��2E��%t�l;�+{��Q����VX��_������J���������2�:g����}*�\�����Jv�k��?����	oT��	�WW����j��
5��+���34����u}��yD&�]����t}�c�,UL�"���}������9�VF �������D
�oT}S�z%�����{�*�>��l}�(��+�>�>�����Z�^�>������{�f�>��}w�5��N�/uv|��*�>[��%��Q*�����o
�?tVV���7��)S���>#5�^��-��S��W��~{h�������I��q/_��_��_?%\q����[Z�FPms���c�2s�"���s�;������9�4E����������F&���+��������[�G3Uy��2�n���Q��_��}k��j~�	y+*�0�wjhNW�	�}�������f���>��y�j�}��L��.Q��qnh��]J�K���I�+]���n��F�h�s��?T���*���s��������z�t�
r��-��9�9�EO���\[M�����S�:?�\����|��v��wo~�jsU�4Y�����}���X�<��p�B���se�����O����N�����-���W����:�����:N���}"��1c4��&����Uv��RB���z���{����\k7h�����������/_UD~�yI�������r/_.kZ�c���/�����!�w�Z�������b��>����S
����<+W�q��Z��G-��z�Pe
�s_�w�������H����G�m�0�
_JU+�^GJ�����yB}����g8:y�z}����r�e���&-y3�G1�|)2Zj�1C���R�)�(������o�nJLO(QCg�>��K�?�w�m]�]�Dm����A�?u����j~�1�v���U�:i�'Rj/i��{��d��j|���~�b�;O�=&k�n:���n���o��8���i�E��(&e�������v�?*�2E��+Y,�����p�e����	��%i�/�������������q�T��dRPc���1N�%>~�^������]�F��^*����H�:�!�W(��/����2EF��{11�B����lV�G��5�M}o?m������T�$������1+��t������Bc�����,*jH�����c��������VW{z�f%\ye�kOuCJ���.��G|��pg�4��P���Y��s�I�������P{r�[����IQ;\~�Y'�~�E�����*%�v�}��%������)���))?�Y���n5���]�m
kO�@j�Ko�j�$�H>�-����c�(����y^���[�;>���ax�jz�1����t���������.U����1v��z��t�����v�{�"].��
�%������"U~V�����}�)]�#�3tN����]�b���{�Nv-^��W^Q�p��,*�a���%k���7��{�B��s���<�k�������:��(���w{�����gh�������q�t}����o�\}�*�������J���|�an��n�Q���NmHM������b-�!��I�'K��o�7Y����C��r��J������P�����x�G)������7��m��k�<���fh��%���~����O���os��]m\)t����%[t��i�j{�5�/V���*j�1�Me��wC��agu�����=�Kg�:Op�I����"9�B���j��i�;�$�����_�k�|EM����3T2_�.nWo�J��^�mWmYCC���f�v��_��?i����.���f���{�U�������V�SO�u����>������h����[oU��{����{H�N;���-��f����k+�;������O���k��p�|#�T�����l��_�}�t�G����
��^#��l���M�Je���#����-��j/FD�����?Q��+j��n���!�w�T�0��>������v}�=��s���R�qR�h����������Cm��F�&^.��V��+���)�w��^�����M����!�8�m�p��KoiQ�u��H��������P}>V����+/W�)�(���������/)m@��"M�1��E��-��NC�.SZs���>�x�'�����Jozo�m[����SK�j����>���g������\�~+���r/]*�9F%��$�M#�}��;�Bm����o�%�)��J~����}bCI�*��b:�N�����������p�����5�����$I>��\��%��7��C�A�����[T���/W��j���x�Q��Y�Z&�YI7�����r��u�N������:n��p���`j����{�Ho^������
]�����w�jUh_%�����%U.���h��&|�����m_�����W_�������S��A=z(�Edf�0�������is�U���q@�����x����\:�W;/�Y�Z-�=�������j�������&s�fi��������>�l�}9��B�'��������������~�� ��T&�xo��L�S��_�����������e5V#����?u�3��R��i{�j{����'����J����l={�T��7�n~�b�2
W���v�so�/;P:g�V���r/Y"��1J��j�
�X*������'I��i�u�*+���c�G�kS�u2��y�d��T2_*Y�W�u����>--*?Q�NVk����0N�SB�<{�/�� -x�\F�

;�SI����l{���y���*����*��%�{����W�.W��������SDVV����*����@��g����C&�
��d���>������/�|�d�7}:'o�2� ���w�����S�����p(r�PU^x���NE���sev8��=�Qgi�^9�Y���Z5yZ�
�
�a�Z_zI�+w�r����6�Ko\������8�.|�����/�u���}����Ez��jm�vl�:��x�����Rq��j��lV�QG�9g�<�DU���.=_G\`R�^������GU��A�����=;4�h��=�[9��&t6j�>��}���}����:9Q���m��sD�[~�!����Y�Lq^��Y0i�=�zg�z$-P��hI�N�}�p�4w��jo���i�J����WU����o���,��V2��n���}K�*&O}���e[�r�J}G7�����������>�}����
Cmo�)���=�,E����v�l��u��V]������p��������jR��(w�[�>e��~�0T~�����#�bQ���+��K�z�����i�R����?��uR������m}��e����e[�Z
�6�j+�wK�Y�4��P�������o���������O��f)�����k�WMO<����SP����,'_�agi�}��~����{��#�����w�M����mc�������5[�Td��w�&5?���YY]��;>�P+~����xA[����*��y���T��������m���G�����1����_����,W��Tc��;�����z�h���*�8Q%�����I&�z�.������>_����e��G�������^>O&I�������	���
�7���n���#�����=b�Z�v���87���|0$�q��w�n���neW_}����?)k�Ik0�����n�Aeee]����h��U���/������$���U���[?S�?����3���9[B=^����W����\���7��� ���2��jX����������B�.?����S5]p�I��C�y�����9>^�#�R�Z�J���9]�\����[������)�?��"J�:2U�z������c�����������e��?��b��J.���D�"{(>�M��6����������'��H��K�p�=2LV��J={���7�s�
-�@��AJv}������>_�'������l��R}
��j����oV�q�Z=�,��	�M>[����p��{����2=�L��#kn��X�}�4����������jU�7���}r;�2L6E�j�t���y���nX/��P���S��P�;65�uh��U��V��:���4��fU���am�i��+"3E��MJ������X�^��������k���f��o�V�qG������z+�w�����6?��"3��������S�	}�����C1�kd��W��*�,��oV[�@��L}�f��jR4��j}e@2�����?��}�Z�H�����\������>Se� ��m��kS���R��l9o��Ai�s�V���#�������V���2Zd
�����J�
����L����_�HAK�b���K�Yd�{/���i��6={Y�Nq^���rX�����e��R�����g��g�j9��Q����^�T����cW��s�51G�1����"����/7H��&�������UT�Nk��>oU[�M�^�Ay����v���p���;X���j�����>���-��)2RO?��!CTy�9�����^ ���)�����Ud��*���O��[���%7)��C����6���Y�hI��e�CW���JZ��K�m�^��>�t�Y���JM���-�z��q�`��LU}��@�%���'�����*�V���a�[����+T��e��9M�9���a�c���o��qu�{�I�1&%dK%G�@]���>�o*�����f��}A)����S����]3]�6g���\�^?����J����R���=yV�V�Yg)��_�kk*U{k��������Z���o>��
v���YT��s�ve�j���m��'�^�:i��^�Z�_�
_(����m�*�~^��lC�w�N���e�2+![jY]��/�+cT�������T�T2�]
�7�t���������:,M:�O~}�V��j��Y�_'gU�z���^?�Jm�P�i�Vk�4���f��� ��
=���]��^���&kV�r'�J������K��4�u.�I��o�Yq�\��rC
UqJ������*8�I�Z�kM����L�����L�e�����vy�b#�u����`QbR���k�I�(�b��1Yq�]���$���:!��_/������I������W�YW��#C�'�*u\��V����IY'���M��o��[C=��@�~�D���S�j�����������['���������e�/V����t����)� B��6���Sr�W�[�����e��4t�J
,\��?��#[)�������
��d���i�-9F�ccT�M�l�{��G�u��S�N��Q~�_��|�7@mQC��_�@�ZbF)�����$��}���OW�+���:X�g�\���hvo5,�Wb����y�!���e5J�����V�-7��(V��H����_�e�?���:*p��#��y�����%�h�H&��s��j���c�3Z�������w�����74��N���U�{�����	
�cdI��auh��W�����������#OV���0;��&*�s������oH
�����x��Y��oVG�3T8���������41�Rbj��#��ylO���>}����Z���7+� J�L6s�Z�S��S��
�����.P���=T�$�,v��Y�B�Is���T�s�R�%%i�<���5b�\��[�wr���C��&�m���Z��W����2%��*2-V�o�T��rE��;�Qj���������ZY�o5�����
8W��������~�s������+�����W��Z��Q5�u�B�*�a2��k���+�oR��S�q\/-�t��-�������'+~`�2�yF������6��#��L��G�)B�}-J��:m���:����
=�*KF�Zb�pf�a��&�W��n����/M�fv*��k�������Qj���)�������c�8�>5����ge�v���,�p�z�s�������?^��f}|�W^�Us�P�s���8m����-�5�gN
=/Jo\c��������������
��)�9U)7����^P��Z&���*�{����5KU_,OD������S��G��hS��I-�<����R{����������LE�6(gB�����1���m�f���N����_�:2�Qtn����T7s�<�x%'5�����|Yj8s���'�c�P�/NQb�G
�|VjoQ�;N^k��;�0�d2B���<g�fQ}�]�}K����V�%�d���i����B�~m��U��UY��7t���r6I�Q��j^���.S��N�],�����:��I����P��Q��&U����a(����|�m�����Y�Z��^)��*����S����R.���I2����1g7)w�[�>���fe�����"i����H�Y�+Pz\S�������_(&;Z��l��KTw�u�x�}9#d��E�4-����)��P�|���mI�o��$C��
J�mT���lmU�m�f�����`[���Mt�#������9�r$���`VK��=W��2���uO�Qq�C��4��7���[$I��^��;i���O��NT�c����4��,���������x9k:���c��f*���N��f-\t�JK������^������Y�J���mmr��'I�fd����*�U����&*��ZQ�RIR���i�u���2TY�Tg��q*����j�m�i���"��
5n�|�TGy��K��"wd��e&��c~V&��H�����)��XkN��|�x���+qh��/�L��}S����o�:_��[$�����rE�)�e��[?W��Y��}�f������r2[�:�W
���dy]���
��������x�*�;O�]�Q���&�o�U�-���lk����hw����Zu��P�A�&�����P�F�{Ej����v��yl��$��\�����$����*���J�%�����\)kf�d�h�-�����u[������YN������qu���
��PG����8CF ��K~���H�-1���!sk��e*����7�.����R��?�Y���yJ���,���6���������L�in���u,\���^��~�������y�r��V��c��M������p���xx�e�7v�-_9L.���*��_��1\����r�U^5)�3��5��lx0G)*�U��erGd�)��%{��+��_�S�R�F��YY����d����4V��l}�dA�8��Q��X���
b�]�'oW��yjiIP��^rU4���%���fuD
��[��_S}[�m��v���~��J������0;�;FAS���U�So����5g�����1�W����jhHQj�G�[{����T��T�$%gE�"�.��7T�|�"z�TU��
z�1a��O��i�%��+2_��5J�eW��i���k��L�x�fU�����8-����P�����u���d����J��KM3�VG�U�c����S��;z�"�����ok������j������@I�&%��.��(��r�8��4C���r�����'ke�3�r+��_��`E����N-�2_2[d�����PV~���������)Ii�����@���d��Q�onPb�M�
�8M��F-���2&[�
�j������:���^�
������)*Z��'�{/(��T�	�(���?q���������P���W+*;F���m`i��{d�Vh����������LW��uTye��W����Lfm{�3��Zc�P��W(a`�������
��:���X�����|>U����}V��4��Z��X5�����p���G_�=�;w�S�/v�5w���bd$e���gd^=[q����-I����5@�C��Ie��R��X�*9~�jG�j��a�l�E����~�����VK�Y���8��$��'�M+��y�]9������d�:�������O*��{�9e��V�n��[[���;��i�������:�D-{�CS��������
���dd��{�"9������2���vF���DQ�Mj���/�#z[����;������j��=�;�:9�?YQ�%�KR���6�PkUP��+1���K��{�BeQ[�0���K���E}v���9��!�{5c�
]���OlPSc�*Wn�?aI_9�=eR@�,J������eSK�O��VE����*F���T{ GO�F�������oK���V)�3X�W/��^��^JO�R�_����5�F���rwFh�E��F�����~>��^���5k���d�5�z�-���R�����v���������hQ�{�"��j�������w���MQ���z��M=+�����RS�Q��[��V[�pUfNUSLh��Mm��~Y������<#t~���B���\�����4��*�j��N��e��[�>-�(C�f�R�lnRmc�<���U~���?P|�b�E�9���^(�5^q�����kU��j�=R�M����fF��$[�����
%�F�9�T�����B���`��@m���!��d+)������o��}��#�j�������2/��U'�*��n����AK�V��oh`�nD���]����
�u.WJN�Rn�U������X�dOS�s����QQ����Eq�K0Gi���?�����'�5z�<��P=�E�����v����U��O��
���M��A��k��TUe�,1��9!O������]������2 F�+��W/��j\\���vU��V�J���_�^�k%���2<y�Z������6P4��IN��?��~{^���z%�5k��������i
��b���s���v�J�����v�"sU�}�j��Q|�Wz/U\l�LV�:��2�2s��pxU�����?UL�I&�G
��#�����GB��SMq����k�ms4|����e���L�_s�������=j�6
�_
q����i��J��PBp���������n�(���R�s���L�mY2~2k��U�
�}��Tm���lV�o�:l�*^�=����g��|��E�SG����M��?��"�?[�d}1�H�6��\��Y5I��~J��XO��u�.�9<%��]�`�2�x�]8OuI�*��y#Re�7�h�W�J�
nI�m4p�o����J���7��W�]vO����R�����(1;��_Dj���]�
��s��^E�7��a�v�_[���}c��Y�-�c_	=2�u�b;�k��#kV�b��D��t�,.V��/�\�Y��U2L�"�Z'�dS�s�
����--��['oj-~�\�n������V��������f��������7�*)�)�����(%�;e�t��&V��Hy�[������7)�]�u�*�7��w�oT��f9?���Q��8��7��'ST�U�|>�������Xue��u�����M��^�y���^:��2U�����3�������Z��[-+kU�����-S�%�P�
���7Y��Q
x}�Zp���<�����~�Ay���Jg�*��K�W���e�L:B���T��%CfuF�Wif�?�fnW��eZ_s���(��_
����9JJi��+���W�y��fI������&�[��i����X�J�E�+2W��:[Q=3T��BE*���L��B	�\���6��}�����1���1��
��r�{(�q�zU�M�����z��t���K�Zv�����V+��S���c���F�o�i������>�MT���Q����:�(��;e�M��T��8�*���E5�������o�?U(��'"]�����S�{|�
�(5����vO�]����W\�I��r~����z���)hv(�s���~��W��>Z�m���������-����Z��4+;q����%�5Q���
��G_U�����I2}��Re�?���g�t�)��������\y���,j����G��t}��x�G����W���ej����g�U���q���P���^V ks���Y��6�Z��ZU���sU�������Y6��wvo�d��91|�lQA����b�:��zy��Wzj�"Z7�~�8��A���[��;Q)����p���j����.~O>k�b����OVM������W=�����o�%���ST��4�A
W�9_v���^��m�yI9~M9�E�^s�V>����J�������o�UC�	*�
%��o_���G�����
u�{�%v�j�����7:nj��~3Sgh�frZ���QjR������LVT�:5E������4��e�R�
�+`�Q�s���H�GVS�����#��\E�j���x�v�d^����*o�Kvi���G���_Y
���E��}c|�b%��u$�V���J�4P��uh�?-j�u��g��!e��T�e�����ru���A��M���C_<����T]�i*��Z��������fky�W���W��R����c���4�������+[ao<q����t)hX�j�@���5[����zE���-+�����7*p�E���\�"���=���[����]2�&���ZcG�d�d�|��M���Q}�n�u�Pu����mWl�J���Y>O6�:�0�U1�5�LTf�&{�Mk&^"���k<C]�iZ���n1�9j�|���	j������}V��3�.VS����-�@��{��J�1�\�
��L����>�mYJ��^��R���Z�"4��,�V�i���������*�"y"2T��',���o�"R����m����G+�c�,�O���o��-t7Wl\�&���<9�k����D��7L�����6G������S����`M�����`�*�2�D)��drD��!Ik�lLi4�������#�E�h@���<����h�����vG�����>{��Ju�{�r��JNj�u�[r~���.�:�m�K:U��L�����Wu�y��(�i�"�-Jn�Bi�����H�F����W+�5Y����ffb�r�]��?9GQ�ZU=���TO��5���P�����B�+x@NG��\UP����_Su��Z������%�(����kg���������>��$�\I&e4����u���7����<�+}��DU�	��&�u���j*�(�c��������*K�R�����VB�<�~�Q5�i�����,oQDn���������Q}3|�n��SrnS}�E�[������'�;z�P
x�>�����������[!�-WK�L�O�{> �jW������5j�;Z��GY�N�I>y�����@u�|�Ne�>T��o�����b�j���r�U��U6o�>��XFh����~e�%Kn���@�S��UJ����<�,.%�xU\w�������7U��+oL��*S������!�q?S��(�<&)o�V�5Ks��$�|���E(H��Z���cJ/���AYJ�!W�E_�����1v��s���%�=B����6X~.��w������.����vT=���+���~I�)��a��{q��%��B��n�z�U�������4g��k�����^�/�������R�=/*y��0G+h�T��W���8�jW���[�=D6o�L
*j�5�����m�����?���{����N����:���nL�K�h�YR����*��W�_�Q�W���5r.Z![�r��P��J9>X�yA��\�E�'��y�b���U��������L���~��2����Du�y�}b�L1	jYR�u�Y��x[���a+�|Y���v�b��O���)�X��J�y�V:��L���~��Up����t���'[�E/yY�'*���k��MjL8�kGd���\��')Wd�"�M�M�����e	�t��*�IKw�m�Y��2�Vt��=)C3���}�����Nw�����d2)�m�,A�6����������<�z#5t�%��\������Qy��j����TX~���xX�qc��O��Y��R��zxe��j�(�5f��]_Hm��LA����?�&��9%�}��_�)[���=�ztO��z�W�o�U�k�J3�U��P�qG�#j�r�4*>�Y��n���;��������V}8�8���>O��m;�+��D�|5���f�Q^k�L�_=*P��*���T��ti�"���>R�2������W�^�-vG�B'&�^m�~#�-Cv_���f('�B��6���E��C�?P����?*M�N�*o��,A���jy�)���*#j�"����������
�#�r����"������3�2�����F�����0�k��:Y�������roRS��2��e�5��&�5I+{��)6o��n�X�z<���T��s��HQN��t��7"E���\��?A����-��#W�����/"E1�U�$��(!�S���������C7�ajRT�Wq��J�k�[o�'�7Rvw�l�A1�^����6��m1�+��SII�W����Y�������b:W�O����/��A�-��2�R�8W�-fxW[}{1	��*��j���L��Q+2Q]�d��6�O�MZ�p�N��Ib�W������gMTM�9�roT[���sjI2�
w�#��oQn���I>G^{����.UZ���I>[^[�b;�i����� t��Ik�g����Y�so.Q�]O��h��1.M���k�G���f*����_�%�)JkP����-G�O���g��.�%�.�5A��\��n�=�*82Bk�t���TR�����S������r��v�1���%S�Lm
J=�@�e&}r�Iw�|��xs�����1d�
�q(%�Q��,jy�~�����S\t�N�������^���P�%W�g�(��cd{�����^��?�DA�')1�I��*-��5���#K�N�hS��S����T��{�[�����Vq��
#�L����d�LP�19�.�%�Srg���5��h�����f�����W���_�l1�9J�.��������?�V��sT��%�����Kd0\��2�8��������l����$O�Q�����]e1��{U��7�i��m����Q������c���[�WtoG&��5��B5��N{ou:�l99�'o�V�t��x���+%�+�LZw�g����pj��Y]����b�Sp�2���*oD��sTxV�������ww����������2A����Zs�������h��ny�6�oR� �~�K.W�>�	����b�P��!r-^�U���5?�c�_�>O�^���j�*4V����Oz��.N�z�R��7�Y�����/-���*_a�������l��x�[��}���7Z�^�8�D��UW���aS��'4��cd������Um�d5$�,���;38�%E%Y���d��%*0����R���>�Buk���x}^�;��G)=�Y}N��������TZ�Lm��Y��d�������m|GVu�#~�-�0;4�l9�����^T��9��S�5HEywv�K����b��>�Fkz=�5=|���voTk��-��L�ro�IA��u�rG��(o���bA/�(��ie�(��<Y�u�r�9&I7�A���i����.���>/v�!2�����]&,.�����K�VG����$]Q������������S
U��
�V�U����|�Ny��t��3'�T��W))�V��8[������J�~F�]�N2��
EY�d��*>���G^��a���6uD�W|�"��#��7�oI���,�?n��� �iSU�&��Q;?�����U�,J�����kP�/_V���+�tkn��������w�r����6IK>M���k�P}�)j�"��L9u��-z�N�������%��X��Qc�Tmc�J�$�����'��y��U�L�R��|T���(W���+T��e�?V��Qm}f�8��������r������A9�T9s��_�.��E�_�QE_Te%�>�H����%�)ct�*�=S�������]�%'7j���r�6����iC��>*�c�������3r�<Ev��9�%�������=WC�����it��u�0yk����?�IAs�b���|�mZ�{��l���������k����ZSd�7(����w��iy�W�D+��}���_��<��w���fk��NU�o�H����9U������(��6>�\u-9*��)oGP#a���Z|�t����A�s�S������
�o�-#E��_���+h�+��Z���ka���,��)�U��\�����o4�w�L����e����m�i2:�����T��w?Qj��2M�F��O���]����}���y�
��d��W����
��)���|���hu��M��m�#����r�����k����
�[j#�����NRA��1M������O��Z����A�L��"<������(��������Z�����Y�c.m������R�:�V|�!��QZV�F�J�7����n�������yoR�9G=���U����c:W�@3}��JMo��q���b�*UUE�6�O�Lf�r��2��4y�Ij�?V&# ��R~K��r���:�V>egW���@�&�Cn[����j�fg�R�:>��n��nEeD�`@���_���G�{�e
��Xs�zH��=���R��P�I��<��_g�i�m�9����;��5n�Q*;�]Uw���3�B��+R��q���Tq�vU%�yI�"�����}��F��$����2��:['��L_�����vxW�#z�"���s���������5!�C}�8]As��x��c�i����z�����n�@�~%�����v��iS/�$4��E6�T�W�X����-���o�<���z�C��CeM�����2V����a��$)�����;g?�N�>r��jRTS��N���b�s���@�=�Q�+/+���jH8I������2�q�\��\��]}�i��%c��j��+Z�~n���1�|��{'���Om�C�9�&���V���{��Z�����>}7(!�V}���l�G�;Q�����7��@�VE���:��Z��{��9��$��g���vq�C�K}g����o�?Ik�<%kv��N��y��~n���g���$��T�e�������4e(1�S�j~)c��j�$�+y����Up�Y�P��z�\�[N#MY�P���w~Hp||�������o�kK�9�V��S�;e�*����N�dR|L��]���D%XJt$��������!�������\�V�)&�Yi���;2W����7B�,���zf@1�J���UzB�Zw���e�y����B�[�o�kt����p�H���������
=���������������^�=^�^+SQ�5r9z(`
%���qip��>��$�v��#���c.�Q��\%Km*-�W}���\��o����vZo���e��y�Sd1{5��v����T�V���+��(+���f���v����d��S���7k���jk��9z���Zm�UDn����t�:���������9��d(��5%��W��y*��M%�v��M�-WKG�<��=�f��(�z�4�T�)G+�����F�k�66g��	*��N�I���.��M��gMV�d��^�����5������l��&�������t[���QA����E��d6�r�E*2��O���.i[B����������Go[�� ��N�d����4���J������jk�k���PN{���2��u�P��Q�
Ui���b���\���R�� ���������RF��d2+�^��%^-��FU$l��I\���hU��I�N
,�Z��G�1n����n���?��&8�ql/��_�9�kC��]�N��;u����j��,�����k�6���{F�zf.�s����p�9�#Y����$5����?:A��xJP�Ym�~�Z�^U������PF�e
��t*�],����k�u
��QtV�""�����W�+\����;�0��<����Aq����n-��n�����Q�h�Y��:����\�5vO4xB�U������f^���)}R��S��j������z�[��7*�e�����.�LU�n;6��xt���j��-����s�����������m;��Q�.hWJ�H�,s*j@/Y���^-�4YM�&�t�RZ����{�J#&�����
��<�Bm���N��y'?��kNUi�w?L)��U�&����/������6�����t��u�?��hK��h%$4i������P�|{���JLj��1%29�e������U���22kTS���Wv��2~%�������
��e���q��f���JM:c�zN�������m��Q�oV��������:U��j�=��roVp�)��z�����*�~���~��7��Eu�-�/o�RN��v���|�:�����d]�x���'������Aa�]��/���R�Vg����]�~��-*����y
*[T�iXWEyw��|b���������N��X����Uu��Z����:���+SK�JE���W����,����O�n=2��E�4�X��l9j��
��������Q�p�H�I��$9�;�5�!���)�HY����J�o})����S���T��E���=Yf��Q��]<�h?#��!pkllT�=����Uv�����k���Ju�Q*))�*���������4������$���&"�,�e�;�I�_�v@k����
������%��=i���F��T���/�Ar��jL8�D`oY
Xb��] ���E
\������[��c�9F��r�n�����3�<�����Vcc��������J���J�+�	��?^[��J~%��W�!��W$�Q�`P�?�|��;��S&�i��w�q:����������[o�7MO<��'�X�!j������������&N��W�^~����g���#;|U~�!�!�O	��C�|�m��N��d��uO8��n�_~��:;;�[l��"���~H���-[�mz���{�nVV�


���^���Y��";|���;�I p�Z�vm�����;.�c}�����1��~����\.����������S;.�~����,�.]�a�:����R�
i�o$3{I�������Gj���� �0��#""����Oudggw�����/�����>�B?��X�!�����tTT�L&�>���:�U]]�����i�����M���X�!h�dUv�}��p8{�s_�����]w����@������nw�i����uDFFv�v�\?(&�`� ���m����s�g�u�O�ogX��3�<`u�����bbb�M���}���r���}u�5���s���u���4e���]�l�n��@�>�@U|�"p�1Y����a2�L{]Ggg���WiiiJKK�Au �8$����d2�0I���S]]����������n��H^��x�M�;��1?��F,��p8������������}J�UVV�m�_�~�-��U^^�mz��)=�����5b���m��-��V�Y�f��_�v�� \H���
�mz���{�nuu�JJJ��#""4`���?�5����O?]��w_����~*�0d2��s�O>�����I���c�.&L��3��sssy���[EEE�2eJ���3TXX���O
mN�E@8��D[��N�E@8��D[D�x<*//���0aB�!p�?~�RRR��� I��i����KM�4�;�}��g�MO�<����]�������Pw�'��'�" �h��p�-��v'�" �h��p���EF������]3���:uj�����K�a�q��>�L_�u�tll��;��"�	��C�-����������g�������������+��]��JII9`1��H��RRRt���w+����t�5������,j��?~�JJJ�����t�M7�p�+$�q��r�N?��neO=�������W/�1B���:���TVV������[o������1{F,�g6�����G\pA��@ �M�6i���jii�6/99Y~���<���){�X����n�������~[��
��r������k�f�M�8�������;{��s��9�����"��?_����z�JHHP���u��G�n��;L��X��Paa�
���9����X8�H������P����;����4��B[�mN�E@8��B;�mN�E@8�9���0�~:��?-$��AE,T$��AE,T$��AE,T$��AE,T$��AE,T$��AE,T$��AE,T$��AE,T$��AE,T$��AE,T$��AE,T$��AE,T�p��������gwM���*222��O���Qyyy���	����xH����={��L��0;�1c�&O������e�$��5�8|���v��1c�
�
�ti��)]�;��9�H�������6]XX���)�V;��9�H�~��`P��-�d2c����WR�@S�$����"���1H�~��\�w��`s�^��z��J����	���++S��O�_Y)#������@@��/�������4�/
�	�@7��
��/��x�0���A�0������W��W��eu1|�p���G,~�vJP����.	U���Tm_��������p����~�H���P������[���w(���i������d2I&S�p��&�,))2GF�7HH"�g�:5�w�|���a�

c�;��bY�0dtt��z�A|�_�m�If�Lf���g�GDH���2D�!C�����H���@[���xC���P���������r���~�E|�D�d2�N�L]?��e6���nZ&��2�Y��+��{dMN��B������s�\���n�|j����Y�����g�?z&�]I��)��
w(8�p���lo���Q�4{������'���#��F��*�O�L����$��;�m��e�N�&����2GF����0E,�~�xTu�Ej�>=��r�{,���dS[��B��v3o�����0@�1c��?$���8��9�������Y2�P�w�6�c~���@�}��]p��I���{�2�^,�����V���2��A,�joo��9s�a������p(??_���WVV�~������x�bUWW+(99Y�
��1cd��u8�����x�}�m��}���S]���w�L�t0��O>��Q|�~�Bl�|j�i���8m��Wi< [A�~������WYY�h���Z�`�-Z���������*))��:KJJ��G�����?��S��v���S���/~������y����������?�Yo����^�N�M&�&L�����K�s����0=��������a��].����_������[�������z�����o)0���[��=,������dL&E}����Y���
�}D���9s������������p���l6[�C��[o���.�LN�s����/��R'N��7��{��w�,�����E��w�f�����u�=����^�{������v7�a(�:)�&�If�y���M��Ry��v������i�CY��+���?�;,��v���l;����}����{�r�E����!���X?A.�;���0�JDD�N<��p�����]x��
���SSS������:UVVv5T��}��'����~x���r�t�I'i����m6�


�M�6����k��M�4i�$��;W���?�U��uvv���]���
�	�O��fSll�bcce��I�`������=����w�[�%�������]M���� "?_��=��z��M&�n�m��d2IV�"&Y�nH��nbbb�����������Y�������4o�����O?])))�T�+�������^�g��{�lqq�.���n�����~X�&M�*[�~�n��vM�>����G��G���>{��5m��n���f����?��oTbb�$������^��i����,I����y�����b���k�1
���V{{{�C���z������FEDD(++KQQQ�8����~�;5?���;��RR��w����S]�&�d���m���9�t����p`���	������#5j�(�=Z�F������%r�>�v��?��}^���U��-�V6u��}���#�TAA�>��7���?����kz��Q���O�m��}�������W_���_]�7�|��<�LY���n�:�����V��+���/�Vf��4u�T�5JGu�ZZZ$IK�.�K/���.����������ry<�p��B����2����?Y��"�N�&��u;�3c�+�E�o���^X��q��dS�'����ie�Zn�o[�^J�6M���2P$��	:��3t��'�_�~2����m��9LQIo�����e�LKK�����xv�z�j����]�6�M/���N���2�Lz��G��_h�������b=������+���;��C�@�k��K/�)����|PW\qEW�]w��K.�D{��~L<��������
tcI����6}�:?�X��J6�5�����.��k��������X�����5l��J���|e�z)���=z��`����+�!��/��m���/��z�|D�{�9����.�@�����:v�]��z�.�����g�yf�	����5}���i���;���;�����t��w���T�TZZ�O?�T��r�w��cS[[�S�+�����(�����p�b������a��|���P[[�|>_�yUUU����!���9����voK@e�Om_�T��e��|S�9s���)��xe<���/�$���O���]?i6l���~��l����	f7�{��n��'�����?_�]w�:;;%I.TUU����v��|�-������g�����l�e�]�-Y��3�X>������f�)77W6�-LQ�)���PTT�RSSUYY�����y>�O�Gv�=��`3C��J����
v*r/[������^2�^��'�L������{�2�^,gIL��J:8X�������/v�>|���hv�~�zuMGGGk���{���eg��%)�X���t��W�r�>�����'���q�p�	�`��9s����hmm�6m6����/+
Hab2�������b�|�����6`�����U~����X�P)���w�m�>����=O�Pf�Xd9R����" L����z�����M�:5<����e��M�=z�.y��]	�vU�������$i�������gK&���*���+55u��8���+..��W��d2)..N���]e���JKKcT�����G���/]�d����m|��@}����ry�[r�L�mI���{���]����S�y��s0���5a��������k:""B]t�����S%%%jjj���PRR�������[�vm�����;.�c}[�|>}�mEFF�W�^Z�fM�m.	������V�h�����n	��^���uj�_Y�Z^|Q���P�a�Q����y;��WU�����yA�I���]	���U�L���s�v?�*7��*���w���~Y��`!�^x��n�g�q�RRR�w}g�y���]+�����n�k��1:��3u��W*66v��\�~}�����}�i��w�o�M���������8~���B
��P�+M�B	�P�RTl�����ZVTDET,�VW�����*Ji�
�"=��^f��$f�I2	3��|?�5�<�s��;�����������Z�Zt���-k���>|x��h�G�����T�U�k�����j
@5��=+K;;u
t
�������k��		t9�0�P999���O��n������_�8^XX����k���z���4s�L��/�j�#G�����o_����k��OKK������rV�=3�<U���b	@%P���G��n�f����bb]F�w��N+V���e���Q�Z���V�����0���������|g�U�V3f���=v������Z�J�������������������y�������H���>=����{���#G������;}r6�i)���������7u�����
�F��,��
��_Fp����#5o�<���I�j��$((H#G��E]�A��G�j��������v�Z}������#���\�`��h�B���j��W�
�U}�����)���x:�WX����f���������Q��-n�_1pIDATU2��0��/��k�!V�/�Ea���e����,��]��r�J��n����L�4I3g�T���=^����:v��+��R>�����m���y}�������4v��*�(,,t��������AW�TPP��s<���4��4tJV����(��%���z�����T�~�j��y��We�UE}��������[7���zH�����s����������9���t
Z�kB�W�d�]�&�4�������p�
�rv||�^�u%%%9�~��Wm��I�����&**��_XXX�3

j���x:��9u1e�]}���Z�s�N]v�e>9��F�+>Fb��e��g����'���#G�����a�����~�uV^^^���8?((Haaa>?��_`%$$(!!�'{P-�t���I���4��7���%�(..�^k=z�[���U����o��Z���~�~��-�:�����Eh��1+`��X�w���������n���z��C�n����*���������Z��*������y]�tQPP��_PPPm]'r
V�,�0T��P�>��C���9��Z���1c�����`�~III�s+�Hm���Vg%''W��kM]�v��YEEE��{�Wg�h��I�,��y�������Z�{�r��l�������w��]�V6����V�ZU�~�]����>g���***r���i������ ��{�,N:`�^���G+V�p���R���+��:t�rn��=��kWg?//��`���<���O��a���K��_������:����c�z��a�l������]�:v����U�:z����){f�l���t���J_G��v��YY���gA�.M��o�-�%eu��A���o���s�N-_��ml��������K����;�o����^�Y���������<Xm���r�E]��� �l6I��e��{�nu����sL���y�����Wc}P[�����7������[3@��>{�2�xB���`��X�7�i��w�qD`��n����������8�s�9��������/8�,X�x@�z��rMaa��z�)���o���sbccu�e���?�T������V�����7���={��N�:��s��v
�i)��A��='����i��L���1��\�KRS�8v�����I�,��~�A�w�v�CBB4q����������u�)�x5???_��r�����J����T��o�����k���[�T\\���'����S���+�7MSw�u�v�������n�����1c�>��c9I�����1c�h��	�o��U��{����i�j�'@�U���*��Q��^6�:���f�-����#/O��=������]]�1���U�V�������M����������<���m[�����3�����;v�bcc�^�������SOi�������5b�u��M��m^ZZ�>��c=��3��k���!C�h��)^�7s�L}�������$�]�V���/���#G:����o�:u�>��c��O=�����k<�w�����[��k�9����Z%''����VLL�$���D����_��Weee9��z���<y�W�81��������)�x��$��]���6��|�E{��z���+�C%<�t��>FV5i�$�����y��y��������+�ZU%??_~����
7�����8-^�X�/�$EFF�m������i�JOO��^{���/��B���^���[7����8q����M�6)))I-[�T��u�������7e���]}��^����?�
6h��u��|���5{�l%&&*44T�w�Vnn�����x-\�PAA��������r�32]J�������)`��*���
C����s�I�����>�H999�~���u�������<�����y�'O�K/�����Z�?~�x����o�Y����4���y\s�����Z��FDD��o���W_�%K�8�����}�v�k:w��E���SN��Yp������w�`�z�n/4���$���u�b�mN�����z��h���K�d�!S���W;���a��X$�Ea������}[� �����v�O�4IAA'��g�}V_~��V�\�]�v�f�
111����u�w���u>w��	2d��M�����������������#�tNll�/^�7�xCO?��v��Y��[o�US�N�u����]�V;v�����e�X��kW%%%)::��u���Z�r�������������S��
������\m��E��mSFF�


���x
8�'�v999���_�}�veee���H���Q�����wo�j����9���Z�n�>��G�*::Z�[���g����[��,�����Wk��=:x���v�����K.���������{�]+��2���)�Cr8<�YY2KJd��9���s�����N�o�����������MU��0f�T�\���N;M1w�)Khh�o
4Q�YSb�Hdggk�����w�:���<��-Z(66V��z�z��Y�r��r�J���C999
S��u��g�]�v>=��_��
�A-qqq��������`���[�lQ��}����7�O�>u��f�i��nc��w�I�N>��-SRR��?}�t=������z�����K/U���$EDD���o�c�=���0�k999�9s��������Jk[�l�Y�f���o����~�M|������j��u��lU�m���n��6�q�����j�r6l���3���_�������������u�m��w����={�(11�V��KIIQ�����^\\�W_}U�����n��q�a4h��M��K/���s}�Q��1��_�t�F����L��5K����:�����N������"�F�:�4K��\��\�����RI�L��4������U�$)����pa`o&���\����V�?}�bn�%���F��y0'�D�4�7o��C�j����~�E]T/g���O��������Q^^�.��r-^���9���z��g�z�j}��7
�$���Kc����U.--M��r�6o������Z����;���:�������^�'�|��O?��uO=��z�!9��������^Rtt�f���u}u���?k��	JII�v�i�Z�n�����c���>Pddd����q�.��b8p��%�2fI���/�~�}9rs]N�u��j���� +��P���Q�h��4	�ij���n�Wm��U��m��������n�;�������;��k����#5j�RSS%�~�������8eddh���ng���<x�&M�Te=����������C5k�L�a(##C{��u����F��u���W�^���o���S�Vo���:w����H(33S���+MU�G������?����m<$$D������Vvv�v��)����n��QZ�|�����>������9r�9��];�n�Z999��}8�_���>�#'Gr8d:�iVj��mzj;2m6�n�i�)��o}['����2BC�B����0/(!A!�zj�%�M�;���={�H�&L��i���Hedd��G�+��������;��C��w�RSS����_��v�Z�n���}�v��O��+�c��{����WY��j��^�K/�T�F�R�.]d�X�����h��Ez�����o�I����5q�Dm����@���t�����]y���:u�Xi]NN���]����J���^��Z�n����o��3�8��w�}:�����O�_�r[�l�~5l�0��o�������rrr�`�M�6M��$�Y�Fw�}�^}��*��������#Gd�Z��?�I��_��[7�����Z�����Ga�
��-
��d�fi8��������1��Y6^�y�2�x"��a�+�cG�b�,e���a��%9�SP������om�J���Wp�6�3���0���
>�e��������y����S��l6�v���6��{w�����-[����J��>������*��t�Mz�����^�z)99YQQQ����4l�0�����5x�`%'';�>��]v�e�����b��S�N^�Oaa����J}��W�����Jc���8������_��_��z����:���X���S�.]<^�7o�n��Fg�����
7����R���h�����3fh��i�&����_IIIn_6l��x�����j��ncAAA���t�UWy]���M�YR"�n/�x��K��s��{�Y�gf��m4V�T�ki���CA		���~����pr�u��"�@�b:�gd����5.�4������Pm��$��9So����$9��{��*��$)""B��M����c_�u�X�����=,,L�����t��c��I*
��*���~s�O�2���BBB����?��-�����y����k�N}��������g��9z����>��{��K��i)��G���F�k������o*|�P�0$�EF���$K��2�V�j=����O����I�gdhGBB��8iu?rDA-[����c�=V���m�j���Z�f�s�S�N����j\;v�XY,g8�/��R��=�����1c�`�I��?�X�����~pp�Ok9/�����Y�fy��_�~7n�>��I�g�}&��.��Z����M�:���/Ga���OW���2�v�4�_,oW3fVq�h�&?V]?b�L)
�*�2�h�b)�F��� )8X��Z��Ze��+2)I!]������hN=�T�r�)^�����[���_�U�RTT�:w����wK�RSS�Vl5�����+--M-=���m�����{�i���>���222�~m/������j���?������_~�E��q��_������`@����3����L��t����*������S��'�cGe�Sn/�4����3�����PE�����ex��$�O`��A�y=7..��_�����8gVvv�Wk�����Gi�����i�<���l�����6==�c��Q�d�Ze��%I�?��
u����K�.^����\����Co��*����[?99��}�8��Z������YSTU1���2��k�}�5���?�nt�N?]-RP���.��M�����DDD�dmAAA�s���4c����WQQ��g�����8��C�t�Mz����c����^}�U
4H��{����C�*66�Ng�Err�[��������B{fffz5/11������QX(�l�aT^��K����.����{S
���?�$KD�d�/I2.m��6\�!!�����m��,M�5.N��	t'-k\\�K�RXXX@�V%==]�F�����zB�T�����]�����6�~�z�_�^�g��a:���4f�M�4I}��9�zj�����=�;��������lh�J��+�T����.�Ai9k�����U�6��k��U����DF��d��E�&��X��e��t��WW
����������wo�o�^QQQ
��bq�y��w����zuFXX�>��3-X�@O?��6n�Xi�i���q�6n��Y�f���/�/��n�����U%++��{:����l8QfI��}T�K��,))4]&�.M������~�����}�B{��UPUy��0f��Q��I
���_%�%��g�-��e���f����W_��	���<����ku�a�0a�&L���[�j���Z�l�V�\����J����K�X�B_~���
V���������t�����]�t9�����+��d������S�)�fi8U��e�y��X���+��f|(�wog��.���k�-s�mj~���*@A�l��n�����0a�Wk333�|n�����wo�y��2MS��m���~�?�P+W�t�����UW]�]�v)**���y��o����=�\����w�x���Ny���DU�Zuc�i*��Ot��w�Ur�c����-����/��X]�F�,���������8]s�5^���e�Oj0C�z�R�^�t��w��~�W\���tI��#G�������n��y���;w�����f�YT�2`�_�PUC?c�e����2=#4T�����E�0*�c5���2��}k1��g�v��u�&�������l�_��/5
6LO=��n������+=`Y*$��?$�FRR�[��%�����4M�M���^����r������X6U�pi��v�����>\��(�uF��50�����uo���
�Q�$����v����{���������v���o����y�$i��]����5f��ZV��2�v���
�.Z�RNHp��
?�IeU����J���X���|�x��vZ}�
X����[+%%E��e�eee�E������f�����*^���x���/�o�w�}�<y���]w����Rttt���8��?�5��/#"��7\�\�k+_gi�\�7����o�[���@=;�����Q����:u�^}��*������K.QVV��gL�6M=z�����T���ij��9nc�
�8�O�>n�E�i��Y
���I�&������-[$I�������?�Pm���j�������:t������y�@�P�fM��c��+��g;eJ�����g�_��������;W���z�����S'�xNN����������C�$I�z�Rrrr�g�����9s����]q�7n�N?�t�����s8���5c�}��w����M�8���			:����i�&I��;t��g����S��]�6��s�q�Z�����4d�;vL���O?�o�����;4i�$�r�)��=|����]��?�\�|�����4y��-4,��^i��������0�	�^�����Z�2~F������E]�����9��;���w�Q�.]��eKeee)%%E����9'NT���5c���:r�������s�J���i���xEFF*//O)))�����n��9j��]���s�=���������k��������s��nc=z��'�|�+��RG��$=zT�=��{�1����u�����Tvv���������}h��n�?�A�w��ZC0�|]p�Z�f�������{��J������zKO>��	�{��A<x������z�����?���}���:m��Y�<��L��S-IIIZ�v�&L���k��]KOOWzzz��
�P��t6���LRp�.*H�@@S��E�X�B��MSttt��������_|��BBB�����_��o��+��R�Z��q~ll�n��V%''�~Un�����q����^�s�9JHHPXX��5JR��]�f�-Z�H�F����V��<�L=��c��s���Z����%�L��2L��w��[�lQ��}����7�O�>u��f�i��nc��wWPPP�����B���OJNN���G��m����O�)����3RRR�}�v���W��Sqq������eK���O�{�n������z�j�������PAA�����=z�W�^���t��5
��������;�q?���`E�4�:�D��p233������L;vL�C\p�Z�j���HXX���������3������}%""B�F�
t\�sr���s*���t�4�z7�/\��m�0�R7�a#���9��^zI}���m�V�����=`���[����%Im���-����Z�t������U�e��p��Py���6]�iS���p��I"��y�=��#*..>�������sss�����0Y�V�;�cPN~��,o�~<|�O���\�8�>}�������+K�f�.`y�n������g�}&�4+]�Q���n��fM�6M������z���u��w��l4�i��V���,����tY
��ysE]zi��X^��������J:v5`��������n����������c5�|I�W_}E@V�m��|��~�U���b%�,�d���\����~X��R�1�j��j�["#u��
����44`�`���z�����\���k��y3f�s����~���j\v�e�?�L���U�T\\������T{�]�|������S���*��\3]���,�c��6d�,��S��FUC��0���b����*�O�U�GyDR����7������g�:�5d�g���H��oW�~�|R'@cP����o������p*���*ss>�TE���?��;KT��Ny�TE��=��o��O<�f����:|��j=zT?���3�����s��$�o�^111:z��$i��m`��4M������_4U�e:��+�9���
t��{}k
�����R�3]	���j�\�Rv�]�d�Zu�-����			��#G���~�fKOW�y��h��@��`����b�d�/IF�1/��!kB������-��j8p@R�]�tQ�-Nx�h�!rrrNx?�t���yD9���'��d�2M�l���ez/�o��������D^x�"G�:>PF�|�0fTs-�m[E]t�,�*�&��jdff:����>����������a3KJt���U�~��p�N���U�W����'�.���.����!���\UC��%<\���R����c����Ftt�������=�9�l����dO�;��v�p��v���������iJG����.k��{����@����XJ���^�K[�!Y,����k��P�+�T���2�x����O���eKI�i�{�������b��~����<���m���k�)s�,(�$� ������Z�~���#��_�w����r�:.[��6m]
8��U��N;�������U�4l��:��p�Bg�j�j���'TM���P&OV�GIv{��i0�{L�C�H�!�0$O/��k���p���%�j
����
X�8��S����={�H��{��:`egg����/��G�����f����T���>���������4e�������m��YR�������d������K*��=@w�-n�M��g �[0�K�����FX�"/�@a}��G�'��\���1c�$i��Ez���5y��Z�a��u���k����J?P�2e��k�D�����e��>L�pHv����xy�n�l6�6[i�n�i�Iv�
~�Q��}�N�������������y<x�0J��C�X*��\�4f
JHP��w*|��@�@@�U�{��W�������d��n��9rD��_e�Zk\�m�6������+�I���r�&N������=;[��G�p��@�� X��{��j9}z�K8)�U���H��_����_.��!���x@����&L��A�I�L��aZ�~�233�s�N-Y�DK�,�i�2MS������@m�����_VIJ�L�]��&�l2�v9rrT�s������pHe/���v���m�$��2��|W'��7�(�_�������+o����n����1L��/\r�%z���5e�I�aW{�����������x��Xy�Upp��z�-
0�~
4x��7�h����*�,4�Jm���O�q_[j��5�g�UH�^j��?�>{g���OY,2\�2�2��d���ZU�6BB>t������p�������'u��U�]w�:��r
�*��3���M�T�V��p�B�s�9�^;�a::w��v[����%&�4����l[�����������w�U

*}�Ze��P�(������@�DV-�=Z���z��W��K/�����C�\������u�]���;��y��,��e���.�����i��t��Rp�"�������������M���?(99Y���RDD����������$�q�

��P�=3�'��O�&��ZK���d��RP|�,��K��E*{��e�Hv��;u��VY����G�^����TG�E��]
�$�������a��[��0r�)j9s����L�@�@�f�\E��2����,�t@@��zE�UP�h�>�_~�E������VAA�L���>�<���h�����n���s��oh��M>��,@c�g�%&&:��'O��y�W��a��^���;v��+����[e���5�&��Y�u��L�g���������1b�>�\U�U1�#�w�q�:$�0d�L�T�=t����_�~���SDDD�����-[���$g���z��GWp���������;���������j����.
��"���-�i��$�0����~���g��#0u����8�QQQ����X
����j�e���a�[�n
pE�X�h�����p8X	��#(�4dC��$����{��4M�����]�vi��5��o������={����RXX���),,��?��m������
		Q���5d�u���g�H�wO@S`���z�jm��Y���j���:t���#G*::���feei�����}��=���b�h�B			:�����S'�������O?���*==]�C-Z�P��]u�i�)!!�����}�~��g8p@V�U			:��3��W/���i��y�
MX���������Y������5r��@��S�����5k���?k��5Z�n�rrr��;u��={��i�
KIIQ���k���O?���?�
6x��n�A��OW|||��KKK��34o�<���y�3h� M�6M�����9R��p2Y�l�����������GUII��{�9��3Giii��������/���>�v��yu�/�����o���M�dV��']�t��w��?���
�v������1C3f��r���K�����p���������k������U�?`�M�4I7�x�bbb����o��V=����[��z�^�4{�l�;�V���������'�t�L�:�����d��U���+��];�o�^W\q�f����K���_56EEE���ku���W%I���z�����wo�X��Ng-[�L�{���/�\e��$�_�^�]v�&O�����Z�S��4YYYJJJ�<�1�J*�}�`����[_�u�{���K8p��~�im�����+I��{����N
<X;w���}��m������8q�V�^]��k�ij��
���{���/������_\pA��W�����K/�T�?�x��@�GV
�����#��4M�Y�F�&MRaaa��:!k���'�|���q8���������[�V%&&������v�����1c����~��Y+W��E]���t��-Zh�������V���w�yG&L�1'P�4�CW_}�V�Z��������W/���������W\��K�V���?�5k�=z��3������C�Js�n��a�����#u���[�t��<�L�������l�R��z��.]��b��_x�=��3�~�f���O
<X-[��4��G��\�������`���


��?����_~���Su���W
 j���������}O=�T��3�VkZ�n���g�yF�}��������i���m���J�o>��3�u�]JMM�$�����k�������������������X�N����/��K/�a��}��i�����?�����������_���uO@S��;�h������j��91b���mnn���}��oSVV���p��'*99Y-Z��r���P�7N�\r�F���;V���������w:tH��+�^/�x�bI��M�t���:����:]��U�s�i�U��g����J��������E7�t�z���6?77W?���>��C����U�U��+���"I2d��q%%%)(����ij��������m�6���������^��@�a����4�t�[?���n��F���C�a�0%&&�e��
��^�a�����S��{��t��w�Y�f4h�N?�t�q�:���������$��N�:i��=u:�<TF�F��e���`��edd(11Q999��Y�f���8���:��s����G��3j<����Y�����D�\��HU��O>��z�����VJJ�bbb�=���-[��o_g������O����l��c��X���	��G��-s�zV���.���~���`��v���s�9GG�q�M�2E/�����[�lQ��-����U]G��y��������Q1���{�>}�}�Q��+w�Yg���~r���m��������_�k333�������W��g�%&&V������KV����iii����3L�>��S�7���i�������e��p�;.[��#XNV���9Q$2xi��]z���{�n�!�4e��v�����w�j/�4�������cu����g���X,n�RRRTU�=���nAQ�������*��k�N����t���:���y���������\������nc���z��W�4u�T}��7Z�b�$���cz��g��O4�{��6m�h��U�_I��E����.��B��[o��'�|R����������}�������$i��yz���k�Om|���n�W���^�_IRll�bcc�>o���z��������-[j��i�����c_�u����,5O�g�}������?��n�$��|56]�vU���+�_5F�Co�������>Z��.�G���a�������?��v�������>\�G��v�a�>}����o�)�4�\S����)�(/�LG�����?�f���8��.��Q�����}��>��{��:��3����g{{��/�����~��������6d��5�\����a��J@����W��k�QII���@����P�~��G���9�]�t���#�Z{��7��~p�?��S�v�mU�����*��FRR����"I:t��V�^�3�<�������������@Wq���s)"&�Ux����{=���Z�d���l�2�z��>�'11Q�W��$���/>�����-[���

��)S�v^tt�.��������c��JMM�$����~������DY]@Cw������D�aH�BBBt�������Rjj�����p8j���������_~��?�����[�����s�/[�Lyyy����j��nc���W���s�=�m��/��r~}����z������z~���5k���������?��I�&�_�~j������eF��|�\�������k��u����=`��n��/gI���e�x�����g���c�(	�F��g���.(�4d�6m�/��"�0d��:u��o��V��wti(�q�F��Yg�����m��s����g�$���X[�n����^i��-[TRR��'&&�*@��������^e��������o������cG5o�\������{��4M����������_���N����^�����k�[���>?��k��7"##�m��������l��5��<y���	�:A�����b�
����:x��	���������w��W�_q��>��������Z����u��3���]�4`����[u������:��Nff�[��U����pr
t
Yzz����eK�{����q���_��K���T���uk�1B7�p�.��B��,((Pjj��X�jUW����o�8������w�^V
���{j�����>t'���@WP����Z����t����*:��M���.��}���u��]#F�P�=��];EFF*<<\�a8�<��3���ok]Sm���������~&��i��.��+I2C�:u
p5�[ff�233=^;t�������������~[����q���t�w������P����k��?r���y���o_�sZ�j��� �l6I���PFFF������*�"E��
B~~~�������+�G��;W�������U+��7��0�7�x����E�f�������r.P���$T1���/�h��!z���u��WW;�b�KDD����y�����Y�x�u51C�������������:r�����j�f���>9�����Z�q
��X,j�������?���y����������@W�������j�u�Y
		Qqq�RRRTXX����@��������K.�����SO=U���W�f�������T���z����i�&����]{��j����^�������Mxxx�{����`���j��W^��3|��7o����{�*;;������[ ������k�����{~%I[�l�U=u��{w���u���\�:�@�������K/�$��?pE��{������������I���_?���(((H-Z�������o�]7n���s�\[\\��'������+^		�u��gJ��[�<�>�	hj~��Weffz=���n�3�8�����!������������7����������iz�v������p���:t����?�U��\������S���������4i��N�������������_/��r�k���������������=�����'��)))�������o��G����BU��������s%)22����������`�=����l�>�Q-~P6p2!�=z��������`���_�F���-[]�I��+��u�]�6����V9?**��_XXX�3

�������{��)S�h����z}���>9���3g*''��y�|���,Y�����k��	ns������^�Z6����7n�X����X�~JJJ���y��n���~Z���k��|�,/�7NK�,Q�������A�������E���~����=�����������{�[1�)??_f-�A^^^�{V5^q]ML��S�?�����O�Z��u����_9x��������*����S�_��������E�1���!C���=g��j���s���W���t����������G�z�~���6l��_TT�/������Lm������	0�@W��j`�Ze�Z5l�0���W�T\\�������/W������+(((�w�0���O			��i�����<�������anII��9R�������w=���}��������f�9��E�������=MM�N�$I_}���<�L-_��-`.//O�����8���w�Z���O>�q��AYS�N����[��mzz�������+55U�a�G�^�n�X4z�hg?++KC�������g�����s{y
�z�����8p@g�q����>m�������<-^�X�����S'}���^���/)L_~���M���?���5j�?��;�p�0��D�������������y���;:��$)55U�Z������T�~��==��TSq]m��������*���{�����^�W������~�z�9Rqqq����
�������5���z����q�o�Q����6n�(����9s�����W�����Eedd(%%Ev���n�������o��u�w�}�-Z������~�<�q���K5r�H���;���?�e�]���,IRaa��}�Y=���JHHP�6m������G����@��������[:\���QL��R��������e�gHxx��>�lSo��i�>	�*�Uv����T9�g��naQ[�n������Y�������W[�n�����S~�>�	hj,�.\�K.�D+W��$edd(##���f����������[���������t���j���q��Qe��_��W��9S7�xc��1b�^|�E�s�=�~]�i�U�V����������#n����n�RVK��%�!�*}�YZe����c�sT6�4%�]2��c[����N��zK��_��V������;*44��������0�@���:t����e�*����_�|s����?����'{u����g�g?88X�{��8�O�>
v�����GT�6m�:k��U���J}��EGGk��%�3g��������JsBBBt�e�i��9j��}�{v��Qk����?���_*,,�8o����1c��?��:��w���.�;����+Wj��m���RAA�����{��������~[/���6n�X�Z���!C�h��I�����\7��g
\�~�PYP�+g|�Y����/KE����j^F5�����
��Y3Qo�-[���}��i���nc:t�r�%�\���g;��}��L��*���o�u�'%%)**���f��i��������c�/���__�9�i����s;vl�������*88X<�����^���O���_u��Q5o�\���WRR�Z�hQ�=������C�f��?���;w���c
W�4t�Pu���m��y�4o��Z���kW��1���\Y�V�t�M����t��a���O:|��222���u��]�������s��^�oy����GI���R�9U1x�CU���l�X��}�%@��%�s�����C��qNRo���[�C����{���:�,���+==]��{�n-[�LIII�>k��q�����K���x�
���.]���g�U�V2dH�������,((H��
��a�|�gTT�������C�V�t�e��NZ��L}�u���-92�nw�yy�.4�"�n�{�Ty�|��k�KB�v�(-���j��xi����!�m����)k���j���:����k�������?��I$99Ys��q�)��b���n���>��1c�F�)�0�\������~p��5k�k��������|Pye(�X�BK�,��Q��\c��f���6v��7�b�4�{p�i���V�9>&�d�nm�V:^�*�W�2=������
�����/�K��L{��i8z�'���*���FY���6��-V���-1J���'%-�
�_�,�&M��3z�������G���q��.]�?�������z��q������<P�����o�;w�rss%I��/�����\��~�r�-ncw�y�����='!!A��_4{��h�[n�E+W�T��m=��5k�V�X��GGG����k0��T�����_�"��������g����oK��BI.9�9�*�;���u��Rn�i���a����T��=\s��^�N��^/�F��\40~	���|P����<����5j�.��r�ZZ�j�


*�o����_XX������m��U���+�gee�����x�	]q�����u���W
c2MS�7o������^{MEEEn�g��Ue�����x=���z���cS�NUjj�~�a��C�-��w����T�����{j<G����~����:t��$)%%Eg�u�����k���2������O3g��?��O��=��bcc�=M��p(��g���Wr�4e�l*����()�o_����2h�LS��P��D*)����j��.��9������PU@���k�cHm�J������}�h:���!�7n��^�#G�(88X��w�x�EE�h�;w���{Oh���'k��y���-[����J��Z�R||��5k���\���_G����=���g�}��Z����/���m�j��S�N���VJJ���������k���:����>k�����TXX�6��E%&&*++K������n����O>�������_�l���}�:��7oV�>}����f��;���w��� �e�����h���z��GWNz|���0MS��e�l��&�f�Y\\���i�����^Szx� ���%�E��*Y,�vP�6jv�5
��t������/I������TH�����!9'u���;I�t�.�.���J��:�D�-�a����g�}V��w�>�Y�f��_��_�3�8C���j������k������Q2�����:|�p�s�7o�W^yE�&M����E.��7��8��v�v���qM\\�>���ZE
>\_~�����jeff:�����K?�a���z��7��������"���u��;T�s�d�KG�����T���aH�q����~��!����Y���K�����M��|]!��C�T�����J��������C����;�� ���UwM����B�y�4~�9r�[��a2MSyyyZ�p�.\X�}
���f;��n���J����5�����;���O�g����K�f��������S7�t�n����������0}������4s�Lm�������HM�<Y��OWBBB��5j��n��3f����V~~��y��?�+���N���=�d��(}�L�/[&��g�j���d:*\��GV-������s��V��qq����'�CQ��s��u�l�t7+�Ua��9�iC��bNZ�-�q�<K�Ty�K���x)2���
�a��}BXw��zex��Z�c
���n?������R����|���NF{����;�����G����@aaa���Q�6m4d��������;w�������U\\�-Z�W�^:�����s


���?*99YYYY
		Q�v�4d�u���g�H�wO��e��������y����S��l6�v���6��{w�-����e������O�>]�>�h�
�I��Q+GA���������h���U�]��
�����~��w"��}���O��]�t�������se�r��}����e�Q,U|;�q��[t�!-}�����<,Y��v�v�bU��U��Y���G����y0'����X�)c�D�N���S�z?�[�n>��$<<\�G������~V}�p29r$�N*fI�
���=3��X��v����j����J��|Yj�f�����������(=��9�O��W�1����LU�hVj���bZi��:LjjY�5��b��QM���RJ"���F��������kk��6���((�#'��O�*U����sMfa�RG�R��=>���>l����+��Ze����$��t�a�(R�0d�����~s��T�[�q�v�b&t������n�Y�'��m��g{��VU1��b�U�����R��>)@#�d�RRR|:L�C���SG��O��$��4(q=���+_������t���#dX,>�P�J
��������J�T\c/�>�G����*O������s���w��XyPUU�WP[~�j�:u���y������������t�K���Zy�d�nWY����Nr
�r}�S�e��p���I�����4t�o�M�tH��%m�Nr�ZV���o�9�����<���U�����i�&��qp����+��(9��S����^�)NIQ��?��x?
����Q�I���j��$&��SO)|�@V	h������,e�-0����Ly�xrj� g���������*�}�5D�<T�'�B
�&�/}|�4M�����nu�s�<��������F-�wou��3�t��R
��m��oJ)�}OU���*�sM��@*��u���\��:���@���������&���Fh��� �f����G��y���WY����s�{L9��m4xm�{O�\���Q��[�KU\�Ze���Ae��v�wi���AUNf�n��'�s�%R�.��wR
��_!���J���,�4��/�(99Y���:v������zu��������j�T�����~�Q�F�y����^���s?�����������x9�t)
F��Q������*Ry
�r�X6h�����a���PpL�����[���O��	������5�C�����7&I?*���i�o�+~^q������P���~VoX�6m��9s��g�)77���s�9�c��O?�m��I�:v��G}����3����~8y�6����o���9
].xz���k��}\i����.�b9��k�w�0����n2,���1c��x�O�.�]+�meU}[lzl�w���~~��e6zc������)���9a���X_W	hl��U\\����[s����9��O?p��uk=��2C�a��n���O����x���p8P	T����hZr��B��.��@R�s4���T��iN�'���-�\����y|������v3<\��A�S�*�wo�h@r���7H�������v,��������U�2<4��]���V�u)8��������|�=Zk���i��B ����j����������&I�?�z�!�����X,��JJJ�j���f�4���������t�3��-tJ�M�g^<�+��������k?U������W�����0!��������r]��$���8����Q�9.}�U�0Pj��'�P/��5a�������+�0t�e�����W�t�%��\`P�.��r���k�������`�

%��-�0��{);;[��?	$7������J����4e;p@f~��/�W��d�����n�*��Yo���o�k>~����Fi�0�?Mk���X�wm��Y�/m[�p���4x��aS�Q�v~'ls�U�|K��q���W}T@�����?�\������������>R��}��y�����c��k��4M�Y�F
�K������l7k�,���Wtt��������l�l�RAA~���j�����l�1��81��L����5k]J����3
���x�T���?����Bz�$�
��d�m]��J����5<6�;��6,�AU}�Hk����[b���?.�4�u��Z�l���iS��N?�tg�n�+99Y�I���?����� ���K����X�C{��U���4U�ij���*))qo��y�*�y�}���3e;xP2M��Yz�4K_�������K�v�`=��o��v��.����Y�����F
s�����/Vh��|'�?[�{?2Nj����1�3&Iq�����_�>����;����?^��+IJHHP��-��7��o�i��+���i�&y�Kf����������>�H��-s^s
�����`EFF*//�9V\\���w+""BQQQ�����j������!�����\eggW
�
Vhhh���^�?(��O���w���nVw�����Q���G�~~����S*o��w����,jv��jq���*����BV�1��[S��`�Z������?~�	���JOO?��\�9�����{���{}v��	|����j�J�����l�1�4������`���mKh���I{��$�=����a���
c��5��J�~�%!!��Tb/q�[�����_�:$�4�[�n���<�=�7o�l�����~�8*I�W�5��k���g�Y����.44T�;w��������@�N�a�c�����t)���F~em�J�W�Rp����!We�l�L8y����������/X��s�]��ND^^����=]�H�����������������,�)V�N�t��A����Ppp���mK������u���T�o�d��_�d���ATs��]/sdg�x�v������y�4��<��BX��x`��k����p�
$KX��k
��BVPH`�������g�5�D:t����������O�^��3f8����k�U�.]���b�(22R��������� ���M��jU���e��������\�������)$$D��5S����O
�	2�v���l��^9t��e:����.��c6��uW��C�_�R�p
�ry7��hz��j>~���*'+{�{�J'%��1�j�JR�OIIIQqq�BB����;v(==������	�����r�'O��Q�|z6�g�Z��ys5o�\R����Q�����a�b�x�I�R�U��\�vdg;����W�?��:��w��;vtnl��}kp`�������;����Z�d�.���:�7�|g;$$DC�=��j��q1CV~Z%����
7�p��6�3��t8������!�{�a��@�d/q����_~	�����z�����dI������u��A����a��s�9Gaaa>��&K�.u�O;��z;���4Me������e�������\����n�*��C��4����;A���K��|�?g�:&�1����k���)b����hrn���$��,��e���%����[	�����,I�������[�ah��z��'��C�j���]u�U:z��$�0�u�]~��j#F����h,L�C%����V>�p�>��p��������*II��fe��2f�R����;����}K��,����W�x�ce��}����������@p����m)mG��*��]��SL�sLI�M:�������z�0�-k��)z���w�^���GyD��O>�������7������o�9*������/��_%/n���/�X�]J��������"G�t)�	0Mi�)�'�V\>(�����YE`U��*�t���y�@W��oX������4j�(�4M��;W�������A�I*��,�a��/���
�s�N-Y�D�v�r^3MS�������U.'�����������V��5�gf*�K�4e:�O7:��!��]��v�|��!{ZZ�o��t�����a��X$�(}Y,�?��e�y����%2�m?K���*m����,��C@�*�+Sy���{)���
n`z] �w
t��4��������������P���������)/�����'�|����Q��e������o��Y}��	`E@�f�`�:9�;<U1|����.�f��v�4U�i�����@�Z�E����TF�3��!���]��*��Ka*�];E]t��-Z��@�S�+�n�lEe.i��T�����o��~��z�s�$u\�v�7*7�c�����2N~
-&���;Vk�������e�����B�\������>�H��r��K����)�l�aU��YY�;l�Jv�
pe>T@e���X�m��p�,,��ukYcc�?cP������R�q�{�A����3��MSn!T���+S.�=�;����������8H�}ai�aT��8f���|�#I�Uj�O���[����{�$���G7n������/j��5�������������O�&M��b��2��i���=[Y�����I�)��(}Z�������o���#����d�\Y,n?4@�>ez�*�{
�r���9i�w����k%K�J���]��
�r��Te����Z��v�C��%IV�U������������+W*99Y���RDD����������$�m���J���w�P���~��d����=��n/���^��������e�������eK��q��ii
?���*���w����Q~�b�a������	��l�TZ���{$��4��H!�e�����+FU�]����I�.��%��\���,W������Ku����zmZZ�Z�l����T�w��w�*
����O��UE��9���uh����?���s�T}�+#8X�ZK��!#$D�����{�-�Pf�i�RN�$��Z���1U�^�/o�^�9����-"F��-��r	�r
�2y�r/_�V<^J�����`��������|�gFF�F�����>�P?L�Mr8�����L�qe<�D��jpBz�P���W!�;���d��~]T.�:ezT�\�2��&���c���8>eT�K.aV.AVF�~t[����n��o�M���n��V�m�V^x�O�;v���;�<m���'�j�`�Z��.��Y�ufa���~�*�b��W5��2�b)}R�0d���+�!!nO\��
j�NF�htv)u�tp�d�e��V���������V�/m��57:���L��'$kp��@]�-�f�������e�4h���+;;[���6n��?��l�+��'U�c���L���y�|sb�X�[n��VVk�w�*�������aRp�"G�T��!��)Pg���R���c�}DR�Z���H9�}Q����H��e���\?����l���I�Q�y�5�`IR^^�.��b�������K�������v�ZW
C��u�_�TfII�����.m��qO��3�Qj����IAA����T�ns*\7�����V�='Kxx=���]:�M*�?>�1����*�|�bJ��M2���dq����e�*y3\�*|<#�t(8\j�W��5������h�Xd���9�/�P�V�R��-k�GAA�3@�0���=z��b��������b�~��2�y&�%5Fh�Z���Z�|s�Ku���T��YSP�K�0WZp�/*;���/u�E�K��[8U���p)q����?���[����w��/�a��s�.��-]�T^�/**��q��b�
g�U�n���w���d����;�g�0�
t)'����v|�������v�o/�j�87�];Y��}X%�Jq~Y�K��[0���Y�\[����R�.�����2��Q1���p��}�4C
����:���b�z���)S�h��}z���d���[�k��F�-��b�vmqq����
}��w�����;����W��m�U2T+�����x�����Ox���,{7=���?�>J�$�����XUpU�]���%��	9��@ �'}��t��@W�����y��#���T���m�[:�Z)"��'�`I��O>�}�������a������?�Qo��F�kl6����}�������������W��Y.��D���+����*�sHUum��W�]��?_�����Zw��(E�u�II�'&
��'=\��ILT�]w)�M��$7]��)i�&�����'Up������w��j�����U������2"u.
��d���:��k�$����:t�����;I��y���];=��c����vM�8Q�-r�_�i�F����]*�zf:*��[fQ���Y�Q��5������O�*�^X[���Y3���f�M��t��\i������6�*���j<D�IgL�^�J����������k�����i�L��O<�����O.��l��&O��?��~�������N��w�y]7�t����
�0��o� �JRS�w�h����R���P��u
��+���$�K�uJ�������)�@*g����m��������z+k�4�*iX���*2�=f��f.�F��X�����Jg�y�RSSe��n��v�i�Fc���$�|��z�����WqqqZ�x�z��r������d�&XhT2_zIO?-{z��A�O�z�����lj���9G�C��v\�������W��^��DF*j�8��������o��l��W�x�t�����.��3|��cti���E��:���y�!���J'�z	�����[�����9����G��n�k��	Z�x��~�mg �i�j�������������������B�j;8Qk���K/����9���w�Ue��;w�����,���
�2��S�Rx�K�����'OV��	�*����&m�B��SE`U���R��z+�Q�}�4�*����-�T�AL)8�D+����,I����-Z���;O���������#e+��M�i�y������5p�@���)��&�V�i��Gm��i�ge)���e;r��iOO�T�c�f�1���:����y���'5��n��R���j���2�V?jk�s���
��K�����SE����wi�w���}W#4��%Ig�u�������*�.))q^����_|�!C�������Z�ONN��)S�w�^�����]t�E9r�������8EFF*//O������������Rqq��Pbb�^y�����Ow���;N�����{v�rpw��i��" �A��i�Q�b�X�E#&��*6����D#E�Q�vG��vw~�����^�-w���xl��f�3�3�v�=���v����T�l+��s}A��r���=���oe��w) �v.w����4�n>}?s��48OjpA�y��0M�o�C��7��]w�%�0d��bbb�h�"���/��j���������!�45a�=��s�W������T=��#�5k��P||�������;���u�Vu������e�:u���(?�4%���1c�>o^���Tj�u���-�}���o�{��c�R��"����T��J�3����RM�G{K�5��q?c��HmzJ�gVTE�-&"\'��_��C�����SLL�>���J~��~�x��JOO�az���5a��r�_�~}��9S��w�������4
2D����Z�h���-is����O�v��d��+�Gr�M?c^�����u
�����%��X���b�ub�����*>��)"��}b������W <*�e�Z^D^^�����r�5C6�-�5����r�_�~��
��4a����Oz��������zH���p���#+K��^y�7�t8���aT>c��1��-5U������$��k����B�|���U~�V�b.�Lu��GFdd(/��
r����������)���w��Rd)X����Xf��jU��|��'O��������ogu��~Xo���L���t��I��S�l�
GN����N���%���YV���c�'���1j���r6J�z�}��b.�L�g�Td�f�.��LSJ��T�������z�b�(?KZ4����FJ�g�/���p����=P�U�=N �Y^�W���n�aj���Z�lyV�k���Z�n���$��v�^�Z7�xc���2{z��))����K��U��y����}��~�D�J�r,��j�p����
w)�P�+�.}M�Go�<�[��a�>��T���"��w~8��R��>}��u����w��]�^���^�zJJJ*v|�3����:������R*��#T��{�OPz~$w��3�5�9n�(�ukQQ�� Pi��d�+�������7��2�-��U���J��%��N�Z�bE���rss%9�`v�������[����JY	���%K����*HN.z����Y��=55�e]�i�d���R�l+q�����/Vl���p������e)�p�+�\upn}#�m�X���^ue����X��F������Wrr��5kv��KNNVRR��&�
�u��jp�����A�.��������E���3��G4j�:�'+��K�Q.��/�K�>��O�L�I��q_f	k�����:C-�n�1�U�]����!��K�$]48�U�+�J��];I�.L��K/��3f����O��~�a�����4M���>����z��p���/�HM��U�E��P��[/����u�5`P����k�LW6����5}r_HJ��k��&����&��	�,
��%k��]��������c���8UP���SM�4��#Gd������{��9rd�����������;L�q�����W�g+?)I���G�l� ��OSV~�����v���'=�x,����	Io��HI�K�|%My6=��R�<�i��c;_kUV��t��R|�pW@�%��o�����%9o���gO0Nt�a��{��C=$�0�p84j�(�����:u��<�������O���^��|�[�q��1
t��P���2��
?�d�2=��9��reH�o���l�S�JU�6�cGE4h��@s���o�d�s�MS��@ez�T����z��)�Z)�H
~�U�����I��A��3^�Z���T#1�uPY%+33�y3���M��e���8MH�w�}�����a�w����/��9S������o_u��Yu��U�5�������k��-Z�r�-Z���\w��$]v�e�����|e�V������Q���B�w��Y�vmMW���.3/OFl��@�U)��s}T��'T����]�$L�td��u�'��7��������ScG�I��������8�����RUl��b���'Y#U!���`��__��mcM�4	�)B�b���o���A��i�&�!�4����O?�T�~�i����w�%������d�XBQ>g���*}�+��2>�\Go�=��Ri�t����&��p�2R���>��������vH��'��R^��c����6I�wU�1�g\���5�fT@e�,������`�"�j���+V�����3%9����+�p_I��	���/�V�Z�/�3P����������l��=�Y��Zm�(#*�y���OE���hE������`�I9�LW>�������)��-�5����]:�S��B.�*�P�1��2|�='
):N:����4���"(X=z�Pdd�


�o�>eee)...�
��5k��7���q�4c�}�����+=J�4MEEE���o�=���=z��Z�� o�v�������!��L���������ii���MQ���w�{�g�����p_�Y�3y����NI��S9��H�h�@q�\#+/���Y���~����J*��IQq���<���Vr�{�W��$6�.�Q�o��@���:u���k��W_}���|}��'3fL0Nr��w�|���4�[�N���WRR�N�>���L���)11Qm��Q�n���gO%$$��l@���d�����o��f�YPP�/�z��RR���oJy��
��������L��:���X��T�m���	LGZ�"�4)z"�cQ��j�y�byY%U�����yRF�$���-���m����9!)=���t5�PyVyl�
�5��H�n�wR�g�0��_���u���W/IR������?�~���8����Lm��U����N�8���\%&&�A�������U�p�x�222�v�Z���S������U��-��gO5i�$����u�~��'9rDv�]u��U�����{wED%���l��U�;wv��l��N�:��" �L�]�&O��w�����r����V�I��`�t�Oa�J/u����R�1����*��	�����2SBw
�������bs����X�� ��_J?���ly0AK����+���������#G��}��G���C�N�3p��!�_�^?�����_��7*##�=��eK���������?���?���K��O?��p���e�����;t����v��:���c������j��'�|RS�N��~IIIz��'��G)??���a����4m�4������3MS�g��/���;w�]S�n]��/��?����3>p����C�|"�����0�4e��r8��b�"[���w}�m���~����������d�YS�X�O]Z,��*W[����.7<���3��d���eP���K;WJ�G�������RB��[�Rn��sY�����FJ����{\��IM��-��Vy���������'k������K4b��1B�_~�������k����/���Q���7o��[n�E{��-�>�����)S����j������k^W }��G7n����K\c��V�X��}�������?_���>}Z��
����K]w��	=��3z�����_�5U�f���	g@������G*u�~����\��
�����c�u���[�wag!a����Sm��G�����"��/j����������"��
�ePm��tt�3��7��s����j�������������)�|�������+�����7���0$K�3g.hXm��):I��4����;w����+I�Y�����Y�����={���s��
��g������%�_%$$�Q�FJHH������������������~���{O#F�Z�g���?���#�p8���������+%%E�r_�i�z������W^y�������5�\����{�GEE�U�V������{�������w��������^��w�Y\%P��������/r�������X$��f��:23%IQ:(n� 5x�EY���\(���&�����-�+����9T,��5f����R�� [�
|@Jh�� *�`*WU��g�7�J�+�i�v�J!hX����a2MS�a8�'y�edd(##�B�5�-SP��YS�����G�������_?u���k.55U3g����>���lI�������u���K.��������
�{�gX[Y����q��y�_u��E����������c�y�-X��=6c����[�����u�����+��b���G����U�vmI�P���_��w�N�:%��g:l�0m��AV����C��]Jy�1���������T��i���d;x0�v����
�a�:��<�2"#%����X��W  ��%���.3��c����/
rqUL��R��E�R^!T�aU���3���Uw)6!���
ZV!����	�2�~s~'N�����u��i���Ux�>}�����U���v��n�����/W�n������t�,�n��V=������S������GyD7�p������'OJ�


t���j���>��W^�V�Z�i��z��������w��MK�,Q||���.�@�|������������zHC�QDD�?z����f���56o�<�9�k,**Jc��U�n���W/�>}Z����?k��97n��\&�A��\����w�*De��R�i����������?�I2g��z2�b���'{J�b�w�,���*��k�a����Rl���n�.���9'����cR��pW��:e)
�*X�He�q���#��Kj\�cc@�-�E�gvUY}����={����{:t���c�l6[++�������V���e�y3`RR�Y�]�v����Wj����.�H�g���7��[�j�v�����;��k
��[���?t���������X�U!�0����j�����k�$i��=�={�&N�X���|�I��vw��Q���<u��I/���&L���6m�n��6EFF���P�������I��t�A����?4|�A����6h �j��������-K\\��`:��[���~���v�������nk��)��*P%����G?"Z:��t�����I������C���;t���j����T���*�m��A=~�3|;��!C��cGm���=��7�h��I�*�����;r8���#��C�R������?������������u��)-X���7CS�N-��q����������%I�����%Kt�u���/�6��������~�5���E�;�T���r����G*q�0)2�Z����� OJ�%9
�#oz�u���9f����Q���OH����nX�C��~�`xm�w|���Q����H��=�T>�:�6n��~��);;[�iz�����
���!�*�f�J�����8�j�}��^}�P��>\��_���%I��a�>�&M��]�h�"�l6w�o��j��M���X,7n�WX���N@5c;zT��~Z�;w��I�^�4�U�_��s��P�V�:�1������#�
� *���Nx�{T���S�=Nu��w?��B�VC��G�������#��O���7����,�
R���������uk=�����aW�F�R��Mu��Im��U?���rss��u��QC�
��T�k��������o;v���������8����\��]�x�$g��E�4q�D��-Z�������]��A�������r������E�+V���w>�Y����m����3~���BR{���J�$P9;%��R�D�m���eMHI���L�3�J�	��h��M���N���?�~��:+�������c^������D�u�Xe�����C��o�����5w�\wP���?��3f������7##C�f��SO=���Ok�����g��y�ED�G���C���u��
S%�6o�������+����W^���w���U��-I����������'I:|��RSSU�~�r�\d:����(�J*sk�1��x�R}4���(�Ig����2�Q�[���/*�{� Vm�bi�kR��pWR�4�@�GVw�����Iu[��*Xez��7d�L��\�(**�\���UK��{���n�A�����{�=9��7/��W=�ij��5^c���;�ceeei��}:y��bccU�N5m�T���gt����{�;v�X��}���PAA�v��}�����V��m�m�6�s�P���$0@II�.%0""���o��2?Py�$�~[:u@�O���]�����L�^��C#*N�X$���B���g�w���r�k��������t@��_�eff*##C�j�R��5�]��]�v����2C�a��'�(w����M�����S�.]t��Q}��2d��
����+V(��&B�0t���V�8C�����e����cbb��{w
2D'NT�Z��}�;vx��7o^��|������{�����U�z�*|.��;v�O�>:@e�����;�T�7�H����/]s5����3MSfVV�J��3f8�!#2R5��J�|�(� WZ;S:�����L����*6��#e���j�^i�R���]	�PiVFF���}�Z�J?���<(�����V�U-Z�P�=t�UWi���a
���i�$�MnV�UC�)u���(q�~��z���5q�DI�3�<C����)S�x�]{��j��Q�������������+�r�J=��Sz��g4i��r3%����f��U���M�z�SSS�u����\������W��_���sT$������\�0��V�5�H���H������G*q�0E�j���������xE���&���+���}�����V��y�������I7O�b�=
�5�O���iKH�pP��������z�������GY��%��~;,�l6���WIII�����h���z����R�?~\��&��-[*..���999��>\w�u�����u�V���[��w^����^z�%�������b���>������������k5w�\ED��������/��_��

�����������>��<S)))%w�d���97{Z�2��Z��T�aT����/��h����\����,�������%���Zj�R��q����E�p2M)i���3��4U,�������Pln����*l�kR|Cy�My�Z��3�9mx��D�_@=��_~���C�g��MpF�[Ka��222��+���/��G}�.]��\/iii�v��u���Q�����eF�AC5k�T����c�I��
���z�j=���^c��{�.���r#""B}�����_��]���.Pbb��RSS�a�-X�@}��l��Wy��?_���z��7J=���111��M������2�*z�
T�����i���X���O����q�}8�I2��s�q����yy���Wx.�����M-�,�5�':���]�����V������o�F:�����~�H
�9��!��T�aT^��1gH��n+���h��`���C��'$9�����$��UKu��U\\����t��	edd��/\�k�.
4Hk���������x	��~�����lIRrr���OLLt�>|vV{�����{�P��/�X�=�\����?�Q�<���5k�w�E�j���n��=��#6l��m�����7u���k���%�#77��U��$�������������T-�i���I:��~�"=w5�=[Qm�=���P�m����fMEu� ������a�o�rN;��)w��W[��������ci��bb���{�������$Y"�f]���sU��


4d��8q�}��i��������?i��j��u������l�2���;Z�n�{����k��!���_��.��u�����\�7n��G�J�W�RIRSS��������j;~�����:?~�=��aC-X��o`TI
T���:u���+u�Wh�����G}T7�p����bbb����.//��c�<����< x�?�P��^�c�����m}��R�:��CPy��
���=+PU��TU����m0� h�K��}}����}]��^ }��@TV�\u��AT����H�!��zm�aU��<���������^��]�d�L�T||��~�m
6���Z�n����k������O4q�D��n���s�^{�5�s�=�*�K���%9o.<x���5]�t��?�,�4�|��R�w������}S^���[p�������N;w�t�%$$��o���H������3��_?������_~�E_|��}j���������9srr�<f ���\��s&���N
:�B����[7�tS@�@�$'+������Q�4e:R���o�����{��v�6��S��c�����a���W�����>wUY[�1K\��G�T��7�b/?[���,+����*�!-|TJ�������H�E������U��g����������j�d@-���_w�_��QC��-���^Z�c���y���^�z)''G�i�4�S�N�����fSNN�����6m�x������}�]I���5�|�1����x�	I�@-�0��C���_Y���j��!��q�{�F�Z�h��t������K/�T�6mr�}��w�������t��#""����'PX
4P�
r,*�`�~���kQ �i�tm�~��M�������s��*��;���1��V�b�uS�w�Ud����q�W�>mI�gH�~)9����2jy�d-|
�(>�V���w�n+����Z�S�j
J��]��{�n���M�V���B_|��N���zH��g����K��~ K�+..N�]v�~��I��e��`�r�-�������/�4u�w�b�h����7_���k��)�3g�;,!!AW\qE����)((��a��b�
�XTT�,X�+��2��0�+k��%��
~JNN���:���_��74�����L�Eh�*0�v9����\O��������GY��a��_��5�x[>ij{�����6gXU�n9���
�*l��xuW��$��kT��
?sr����.�M���8
����Y��&���(�?���7a�=���*((�$m��9$X�t��������KM�0�k>!!Aw�}�^z�%����t�9R�&M�y�����|m��U�����&�a�������Br
�����������_���V���}]s�5!��y��^�����^p�^�T�\����o�w]�6m!��&I���Qjjj��Ygs.*��s���=��q�t�K	����V]����O�zn}C�J��^F�����j��z���������>>�T�o@�����!�.e�P�aS�.+�����XL-���cQ�����I��Z�n�����:^bb���i�;vH��;v�%����#5u�T������Z,�4u�T}��7��e���i�:~��N�8�~�$����_�G}4d�P���?����?�{�0��?��-����"##���k���Hm���B���}{�����m�����u�UW��<yyy��wo��@��v���}W�?�,���}*�m��)��wCWd)j�y�d�8�(�Xd��.\c��FDD��P
C1�^����.
���;�?i�g�`)�_�}C���r���/�e��**"Z�x�4���C�������Y��D|||@�Y����YYY9fy������/���+Ir8����QC��/����\�RR�[9��������^���^����n����5k���?��O�;6<I:z��W�~��%�������6l��fSDD�~���][��|�<�����r`���O���s�7n�
�k_���������>�0]�'W��V�l=�Iy�A�SS�Y�$���QD���*�p>-��q�N�6�
����5���e�];��N�i��R�.��y<"#E:�kx���w�nz^���
�*��]"�9K�d
��<T=A��y�z�$9op<t�P@�y���KIu��
�1��w��]�k���������/�������?���c2MS�5R��=5z�h
4(W.�?��^}�U����{N�&M
SENk����7o�������W��m�g�I�����^}��)�<YYYZ�n��o�n�����p�
�������k��)e��p�����k?@�e�lrx�,�3����3g��6������2�����Q�GQ��w)T9�)������pWWM��_����S�v)�2�������>��9'(XM�4q��9�-[��s��g|��[�z`y��<x0�C�O��g�y�kl��)�t
���wk���^c(u�!C���W^q�g��U��?�P�����e�]V�?��_�"""d��$I+V����{��M�R�c���}�]��o��������[��>*Gzz�K	��+�T�O>)�x*��� KLL��r��s���R�q��+���m�����7)����F����;���"5� E�\� 4��u��W*""Bv�]�4u�T}�ycbM�:�����P�^���D��[o���z�kl��Iz����T���n�]w������u��������'��1��v�������V�J�'77W�������_�y�����n���3c���N��9s����;���}����-[����K���l�N���
d����MM�'O]��q������)��H��Q���U�iV��G;����8~�,5j��B�+�������]�T�AU>aU�����
��G�W��K� �n^�w�����0��6*Vj���*P$(X			�����/_.I������SO��'�����}�Y}���2\�����G�����������;��7n�����<�>�����v���k}vv�&L�������q���J��s��6l�>��CIR~~����%K���g�4M�{����k�{�M�6����Tf���M���p8$Is���u�]��#G�]�m�6=��^c�?�x���������a��
��
��
�2K��;����������}o�J��2��oD�F���C���O0� `�����I��Uy�%�F�5��I��Qm�t%�V������~����3�V�Z��}��0��)�04x�`����j��m�����W<��.\(I�c�X�B�{�F����k�*''���/������aC��7��1�4i��;_�d����:�l6�X���5c�Y��
�Y�vmu�����V�Z����0`������J��w�,�����T-X�@��O��={���w���+W*::��zv���.]�(;;�=��K��1C}��u����SS�L��������4t��2�#I��~��~�mw�b���G����U�vmIRAA��{�=�w�}:u��{�E]��~�IA��+��[��s�����-[��S�0V�*1MS���%�]���B�p��s�cz�O����f�
��U�
����w�U�.�r����k�#������P���Y��~�|��+#k�t��R�����Re��	Z�$�=Z����
�2C�z�R���u�E�^�z���SVV�N�8�_~�E��-��5kd�nB-|K�m��������*��:tH'O�TZZ���t�����p�U�V�Zi���gu�1c���w�-6>u�TM�6���]������+J��wqqqj���d���?^���o�^�W�V�z��]����u�����G�~��j���RRR���\l�����?���r�';;[W]u�6n��5���[+::Z{��Uff��|�z��v�Z�k����
���/<UG�/������<�R*�:���:�������p���������/��%SJ^�t�')�����P�b�T~���X�y[��
n�U��W��x���������o$E���<P�T�<��`|��Y:r���.]�����ph���Z�zu��zf���A�iV%xk~~�����O?�T��������/^�����o��E:q��$�A����kCR��(++K�v�*s��1c���[5k����G�!�45~�x�����SSS����w�x@/��b��S�F
}���:t��-[������;����U+}���"�
��������<��u�$�M2M���p�M��w8�/����<)�n�%&�h�4e;t(��vV���,�O���c�}��s~��;wV����b���t� GE�T��iJ����tx��k��>�����p]M���"��?xU��
�2�6^���R�%kP���~��E�i��)�1c�;�Jr\��3��b��������>����~+��'�����VJJ����P���6o��'�xB��#G�(!!!x��#^z�%-Z�Hk����={J��J�j����o�Yw�}�.���3>���#��{w=�������UPP�w]�>}��SO����:����SG�/��Y����/j���%����;4e��
z8w8����v�ii�0*�C����\m3?_��d��O�z�Yy|R{, ��r�����E�m[b�T��Q�����~}�������P�aU�������*���U<|���������s���j��O��9�0�J
��7����,X����2�GEE���&O���]�����M�<Y���?�K�]�m�0�x�b�������N�R�f����#�0��o���sH���KOO��m���~=zTYYY2C����S��.��"�o�����3=��5k�k�.edd(&&F-Z���W^��M��\����6m��#G��n��n�������w�������+�n����;��[�lQ'n��,�r�R�C�\c����������=��W�]a ���P���0Q���<����yg���\LSZ���c����
�r�*@�L�v��$��9�vu��Z��0�D��7�/�[�&��v�$k��=��U�<��P����.�������4�[�N?�������S�N)33S5k�T�����eK���C=z�PBBB��+��O?�W_}URQ�U�����_?�h�B��O/��k����^��>�L���W_�`����vB}����>$����u����\��4M�>����yG�����%1����7�����
�2|B��c��oK]AU���i�>�������d���-�uSL���H�Q<�@e��*i�qG���RL|H�@�,�PBB����Z]{���>����_5m�4�
�111z���4q�DED8���O�^�ho��f}��g2MS+W���n��j
j���%��ot��g�]������h��LeX,E!U�whUa_�#'G
�Y�����)����� ��NJ���N�;t��;��'������� [��Q;�g������7����.�zP��<��y����p�97**J�|��z��}F����������]�v�}����iJ6����'?_f^����q�G��r��J���X�t�k�^c����}����)��J��6�V)"BFDDQ`�a8�<C�\c��u�8q�b/�<d��y����CEc��T~���%9l���Vb�p���I�V[�����
���Rdee��o�q�m��8��+Ij���j�����I����	��*�t8����:=s��������.S����I�KT3�td���)���\Be����=���2���~:�WQ5}U�XU,�J��*m��.���(����*p.Z�o��V���V�^���|I�a�4i�Y�Q�F���G����e+8|X�_|!��S��.�n/�:��������V������g�,(P���*�yse-Y������W�>�a�H������-����'����0\O����(Y�^7�rs�������������P~���_���������Xy�P���c�q��q����I�/���U\�������7n�~��i������Z�l��Err�$g�U�V���Q��>f��M����g}<@���rdg{�\����A�z����z��4��+E�k��*����i/��%�T��5����g���%�����+��*���7/C�YW�`�T�~���������������H�Z�j������4h������������f����% ��s���1��z�n��R��XdDDH2""dDEIV�d2������0��W��S	��sX�a�����{�]I����s�<��.HU�k�������R�pA
�*d�^����w�yG����$�C��@��}�*!!!��[\\������cz�j��[7 ��s���_{�U��^S�!CdDF�����fMg�/Gx�8_Z?O�9�JB#��sk���0\[��������QR��R����_��*/hXw�}��-[��[�����p
��m��������^��b��_������bcc�U^�4h�@�������RRRt��A��C�F�����`��
�����KV��U�XdX�2MSfn�"5r�Y,������"3'G�����-eDE�F�������\�JH?&%�,9����[�%I����W��5����g��)���..]:�l�P�-��W_��}Z�l���w�^��@,����~�I�6m�K/����H]~���@�+��BA+��:�������i�.���3>�_|!�y��E��w?�e�X$�U��h���WM��_Y��	wU�01M)e������'<y�/6&���7J�>
t���H����G�+p.
z�T�
4b��1B�t��-]�TK�.����u���Z�@���|�]�Vk����O?���X]y��0`�z��`�-I������qc=zT����[�������@/����/��B��[7`�����~5x��bqO�zr���L�1��Yd�1���/}8��1���&I��su|��[�o���Z�����gB$�X�Z�h�q��i��q���~�MK�.��e��b�
�:u������9;;[�/��%KB�%I����3$Is����#t��WW�8w�}�v��)��5a��@�	�`X�2��p����)�g�������i���A)���>Jj?��u	M�������,_���W���u�]w�4M����Z�l��.]�5k�(;;���,�uLA��#�h��Y���������{��=[C�-���N��]w��?�P�a�4M5n�X'Nr�p	�����gI?/�r��]I�Q�|�Z����(��^R���a	]]P��=��a����N�>�S�N)%%E?����[M����?��M�8Q�a(;;[#F��������G�k�����\�a(99Y7n�����l�2��?_YYY��.�����g+***l��sO�.i��R��R��/�g.���V~qu��^�-�i{����)��nk���R�v�����`9m��AK�.���K�n�:��������0��w�����o��}�Y�!�4�n�:�[��k�i�7n\�1�0��M�>]�
e��B�K��I��K^S�[kv)e���U�D����$��#����+,X�����-[��K�j��U���p������S���5`�
0 ���=���j������neggK*���x��g���W5j���Y�4|����"��q X�OK�|^BP����C�L����g]Z������'}������b
���B��-� |B��w�^-]�TK�.��+������x�=zh�������w�����duy7n�����^xAs��UNN�$� ���������5J�=��Z�n���:���3xJ�EJ�A�����*a��U�5�3�
E����7��h�A�{�Te������)�&�P@��T���{O��-��e�t�������-�.��R���_P�^����J������o������+�z�jm��]'N�����U�F
��WO�[�V�~�4p�@5h� �eT	i��}�����w�z���u;j)�U��I���������t���r�s�!U����cjI
/��Y�8G-k��Q2����v��AP�����o_%&&����]��n��f�|���. �LS:�O��9����V���]r8�������������*�fK���~%�X��%R|��*���,O�a�E��������Q������U�4c�w����S�^��W@x�P�m;���)����D� '�EW2QqR���c~C�J
���[��WM:�f@U�,���{ff�����������*��a�}���2C���z��w�]�<x:�$�����=k$[n�W������(W�����F�����bx�cX�AU��q�@�5�4Mw���'������O?�$5m�Tp7n�R���n����-Z(>>>��2��'�P��]'�4_�<^|����-����@T>�:HQqE}�P*�6�Y��%4�.��T�Y�k��h���Z�l��o�^l>99Ys����9s$I���s�a���O����*��
C��P����\
�����~�+e��[[�������@��uMW������Z=���?�>����T�>Jj�9�W�)hX7�t�n��&I���G�l�2�g��}�$��ud;w����;��o�b����/V���5`����[����*�D����+555���SF�T��l��$GQ��iJ2���<��;�Qe���K��,u�)����&hX�5j�[o�U��z�$)))IK�.��e��|�r;v�+�n�k��M��i�^z�%EFF�G�0`�����+��2e��+�Tbb�N�>�������#j��qH�
�}���������#)?K�d�t|O�*
��-��=!���s��i����9^b�"Y#��8���Q@u�[Z�n�	&h��	���[�j��eZ�t�V�Z���O{b���k���Z�z��M�&���:���4t�P��9S���[oi���!97�,>��s��&}���k�d�w5w�]R��wv�����o,58���*�J���N�:�S�N�����p8�i�&-]�T.�?� �u�������x��'��G)==]��O�5�\�+��"�uJ���8�6H��2��L��G����y��4L��X��5�p��0�*2Vj�]����B�R`*((�����K�j��e������W���iS}�����������k��V/���&L������_>���:��)��)�>c�3���:!�:�%�jeEmK���R��G���p^a
�2MS7n��e��t�R�]�V����,���]�v�7o��������c��������j���������uk���+22�B�n��E����r������#���h��|&���������r�$�U��G��?�@�B��m�6-]�T��-���+�����3]w���?L������D]u�U0`@H�m�������L�����5}��3>�a��l�(PE����_��,W�����2��2���L�G�5�9o/����������n�*��v@��_X�Q���~l�U#�e�S���o�>-[��z������
���Q��z������k�����K��%�4����#��o���2��LS�:�
�r�y�C��m?s���;�s������z�.�i�1�/�����_���j �k��E�l��5q�D-[�L���s��x������z�������sU�Wp�9�WZ��t:9��T.-�:?^�SFQ��g�{���\W�62Vju�W7D��
Z���Y�d�W�Ua�4MY�V]r�%���^�z)666X���1c���@9�I?} �,�v�4%���ux��!�mR�I���d���\#S2%���vI��yU��_����gMD������� 
�sF��|���N�:�����*%$$���gl����.��������S��M��������mI����$��)�p��R�X����|D�t^���Y�����[����������t8��@��"%o�6g�t��+��,>.�#��g�a�6~��+�"���V��z�R\]��[����< ����o�>�h�"X���;a�sW�1WP��c��"��?��k~[,�����AJtW�$��PQ��W�\N���`~�g������
w%����]AUaT����Fm�UVUl��5,R��RdL/�F�����I?�wg.������~aU�@�}�
�48_js��XB{�I[I���izLz������RN�tr0������WH�+t�PQ�=��k�G�)��\j��O��j�,@���B��,e���,�N$�L�MQ�Ox���,y�SwI��T���/Y�e�O����Z�~�6���I	MU!�sX���i�
)uOjJ?}������R���]��,!qb�t`�d/(�f�KV�vV%U+�E��W��x����7{U�Q���0}']���-_��j��X)6Q2��^�����)����T�M�� !��6)u�d+�,�N�'�����f�ni��W�DDK����*D�HU�52��x����Z
�P0T`�<�'��0�V@x�)'��.�W�����T������JN
p��@��w,�Uj~��~�G�  ��h�������pWR�4�X�F���<�S�Uj~�t�0��QP%p� ������N��;�L�c����=^����f})*�'���c%����vs��h���-P���*��Ni��RA����>6g��-���8�6�t��8$���=f�
����p_����sn�B�|�X����L�r����@U@�U�i��g�tH��]!U�?���-O�:%�r]aVv��&i��a)�R��+��S�xM�+���T?��
���C���H�G�]IhX��M/H
�{�k��_WF�F	�|�#���
@��U�9s����\s�6lx��:z�����;w���gU@e��i�j� �5`J���}��*[�������2���
�s�!�n.Y�[IA�Z�`�����`�"$��+�u'�����*k���^�#�����N����OK�+"��5}�������J����i����*���1��v�V>?��v.��2�_{�~RL-��JQ��%R�FJ�d�p�Y��a����#��mRBc�v���
��,hX��T�N�9R�G�V�n��u��3M�ZU�����U��-2
\i8������J�sdg+m���S��U���J��I���iJ2���c��{�������U�+��.�gK��H?}���uK�����R\])"�fe�p�V%4������R��Z�$�:uJ����^�u]p�;v�n��65i�$��
8���H��-:���������ET����������yRAN�+	�������*@�5��i�����4e�=�����������o�Y111�(�R0�b,B��#/O)>��%Kd��K��Y���c�}����9�������9�-<TN-Z(~��p��T��e��~�5���&��t�y���6)����)9��i�2+o�\����d��C���	�����Z\��@�-k��1���O���)��d���v��,Y�%K��V�Z:t�F����{��J���B�����X	��&�����xq��*��G�,i����w�
l��=^j�����o��z�������5������A�]���XBZ+�6�!�*�q��9<��
��9�6?�NU`U����6}��	���H��%�E2,�3����o-�Q����h�7�:�j��%�J.hX�g��k���O?�Ts����e�d����d9o�NOO�;���w�yG�Z���1c4j�(�n�:Xe�����?w�vm��������������<�eTy���������`�t������*kd�;����7p�j���Z�C���K�q� ���N*
�rv<�|���=�>X�8�b+��(����F8�QRd�s>��t�H�Y���	���`IR�54j�(�5J����s5w�\m��]�������4m�4M�6M�z����c5t�P��Y3�%�LRR��~�m�5w��1��G^�l�{���S|,g�F92H�UM5��W����%66����+���/%ow%�GL������Z�
��<s�,������a+�KP�<5m�T?��~�am��Q����>��C�8qB�w��5k�f��}������5z�h
80ho�����T�u��O��y��}\�4������$m��Yv�]�i�0����L�pN����w�!3''���M�3����c��ax&���$������/#2�����V���].���k�u�H�G�2�LS�g�gL��iz��y�9BS{�4� ��L^AU��T*�1��DH5�9C���b�,V)����<W�@d�����FAA�-Z�9s�h��E*((�
������4i�Q�Fi��Q���C@��X,%�����s�7m{^�i��U��v����
�����b���������e�u��)��sI��_�����~��L�]y�7���r���U�W\��xSr�
���Z���-���1�U�*:uP���t�����TL����_l�G?��t*9t�
�9�����T��\��h����(��#��Gj�3WP�����5����'����k��9��q�$�
�2C6�-��v���bbb4o�<����?�cUU���������o����S���R�f���{w�i�&����g���_���d����v��j���z���������:^S�T����� 9Y�| [j�s��+L�7����i��>���?B��Ew��l�I@��>�Z��0f�n�-��*��I��K���N�VU�|A���'���0���3��"����HW?,Y#�U@�T�<�Js�f�:u4i�$M�4I�����}�]����JNN.��9����j��]�v����u��w����?����C��~�z����Z�~�6n�����|��-�o���>Ojj��M��w�}WYYY~�t��U�?��n����:������~Z�6m�;_�fM�;VO>�����w�����P��P���'[J�k��0*�P*���,92H���[oU�7���rP��gK��'9l��*I2��S�YU�s�`i�}�
�*l�s������0�`�J�%�4���o����W^^�L��a���=����K<�6m�\���S��=�}\�����8���+"��d�i���z������?������
D��+4t�P?~�\�G���3g***�B����������{��k}�����'��O�>:�T=�)*[���4�AS�aT>�T��1�M������Y�K��1c������t�����9g���Z�X!�E)���"�r�]I`
|@�����d����	�2\[����qu��CT<@5R��`*O*����4}����3g���[���l��\�6lX�����
��g���\k�����_�������D�n�Z�N�����B�������L}��'����ph���Z�p����jU�-������$�����RSSu�u�i��%���+��k���W^�������/�8D���=��d�l�Z�W\!�b	wY���,�{G:�,�7c���(>����=4�$���l�Sy�}B����-��\����@�Qi�����k��3G_~������o���-Z�p�?666lu�J��5����c�:uJ���
�j���^}�U
2�������g�yFo���{����+�����+���O�^,(��;����?�&M�Hr�3�p�B�{��:p��$);;[��
��-[���pN^{Z��O���_��p8M�DW�����4M��/���!���K=�(A��g�m�w��b�wW���^��iJ�?;��6g U�� G���~���!�Q�wo]s��9��)��M��{�;��'����oH��hmD���gQ�
a���y�����>�@)))��|e�n�����M7��1c����}����|�T�V-u��U��u���_�n��)))I������O�������[���5k��M��5k�7�|S-Z����>����4n�8��]����8qB�>������?��~�k�b����o���_�^�z���MNN�?��M�6���&P6�4���7����\I8*T%?!UeY���>���h��'UG�m��(e���X�����_��[7�U�*����n���+�RaS�?V��[4&�q���_J�����'�&��X#��=���,a��8;�i�o�
�c��i��y�3g��l�"�;�����Wj��16l����C]j��g�����}������z��^X-[�<����T�i�F�����%K�h��%�c������U�V��y��bAP�������_t�����+Vx?H�c���8p��_�V-%%%�n)ST�k
��[��s�����-[��S���87�O�V��mI7�n�������SO){��@�Y�E4n�f*�[�p��J(������H�	��U���[���B����*��C�ld�+@uR��`B�N���<}��g�3g��,Y"���ze�L��i�j���F����G�m���*����|EEE���/��A�~��������������SjP������'��Z��;���g�)1���ph���^cS�N-5(J����{k�������}��G��_�rN]��i��i*���th�P�W��:>�������r�m����\/����X�����i����N�w%����F�$C�
���}�c���I5�S3*A�Z�z������?�X��|UzU�fM�r�-3f��������{������t����xv�]�<��^~�e�l���2Z�p�W|�Ce����Z�n���$I���G��?��+�������Wjj����M�r��3~�xwX�$}�����EU�k�29��[:�����������>}w�U5�j������Ne�X���bQ���*�K�P��*��i�LgP�iJ2��
�J/i�-?�Q�k$�E2,�5R��s�
�ck����XY#��������*��
Z��O>�y��i��}��C�
��$���3f�n����Q#X���_~�E]�v�k���Q�F�������#F��,z�������U�������r�k���3g��������-Z��4hP��l
��_�b����Wlmu�&�����/���M�$�C��)o��p�Un��{����7���+)��c<�qc���.E�i��@e�vD��C�D��y��7�P�������VbX��-Y"%CrN����J�T*���������:-Bt$1����v]y�^�����?_c����Q���y�`�0���;v��,Y�7�x����>��c�~��JKKB�����[UPP���n�Z�5*��W^y�WX����K\�;��g�r��I�&j���;�-??_��mS�n������@y<��%K���r�f���7=��s��Sy$d�[�
�N�}���O?�qc�{�	����U]N���W������fQ�P�n;�KQ]���Lp������j!hX�L�TBB���1c���+��i�0�k��yZ�~�����.]��k���\�����Y��a`����j�v�WFw���B����=^��UUx<aQ�������1923�� *��`�b�>s�;v�������g�s��j����T"�|)i�����w�MyRy����4�
�����������mw��G�\��s~�Q��P55�b�������1ct��7*:::���{��W3f�pW���C=z�����5i��R���m���m�����L�T�N����������c�W�y����w��������������8p ��������pM�������!C��re�K	��1cT�������}��O�qI
�Z�N��M�)i�P���J*��GI-��~t��)�hL��2Js���\��M����`M�>]����Q�`�"$������7n�N�8!�0����{��GK�.�������Xl���zK��w�rss���&N��W_}�X�Qu�����o��Y��o���"""d��$I�C'N�P��M��?~��6z���H5h��B��=�o�%�W�k��i�:��kJ��923%�,�����Sl���=g�y�BUS��'e����V�^v�j����f�)�g��&�6��}����>��C�q'��@W���3�b�K�s�-R��RB�@U�����?X��n�A�7o�������W������]|��z�����gOIRzz�������$)>>^o�����K	���L�~\\�^�l�bcc���Q�1����Q���]^���;����pM�������
��{�����%o�6e,\XT%��5��/�f~����-��U�~���:��am�k��.�aC��4I1]��@%��Gi�KR��pWRq�H�R���V����!��Tj~I�
�J"hX�M��M�|�rM�6M�>��{��������N���}����n������W�i�{���?�Z�l�+������
�L����<�3���L�TQ�����M��c@0�RSeKNvQ~������g��]d���o:z�����*!����7���3g����h�����V�&��,+������Y|�a��+�T���(m�#u�_H����k�!Y,R�K���H�%��@�CVX,M�6M����m������0�l6=����<�����C��g���j
G�a����������1�����999a;O(��k��$��'t����]F�aIHP�5ku��2J��l��~P��������(}���*?!U���])/�:]/
�_��.{- 8�:}������5f�}���2�|U�n�������A�������������W�yyy�3��	��ByM�����S������C��������r8���/l�����l����?r�j,FQX��G*u�s���Q�e��R�fx/gl������_�	��
����Y�U-�$H}�"]xC�+�<+//O[�l����u���ba=�1z�� TV1����_��W-]�T�7���)�0�������W�T�������
#''��c��<�<W(������N
:�B����[7�tS@��j�����?���<�R�J���:��T>c%n]m�0dDG+���T�w�A��I��u��#��+w�'��+��w����JJ����!�I��K2����Z�q?��kIV^�BHn�������s5{�l������������p8��c���_t�i��a2MS#F���i�4e��0U>��KYYY��4�3
����v���om�
���TQ
4P�
r,��i�+g�Z�'%9S{LSr8��w��M�v������P�������h��)��)�s%����y�uj�����@`��K6I����x|���U��q?AVG�J�~�*���n��^���`�bs,V�^[)"* �*��`�\�R��v�>,I����0X�"A@�p��A�9R���s�c����i���<:tH�a�f��������5w�\5l�0�u��oHRrrr��?v��WH��bQ�z����W����_�


���R�?�C�y�K
x�����09���B�<>�����������+�}i�&����?�1����eI��=J
�2�6��?�,-y)p5V��J�u��}���/�k9w��Ejz��(`%�A
����o4x�`9\o����l��b��\�������5~�x�:u�+�j��a�9s�


4f�-Z��=�d�u��Es����W_�K�.������
����e�����)�.66V-Z��������HX�����o�w]u�&�C���:v���?�R*�R�����+�b�,�0���X�}?m�1�m��Z�V��gc�'����������5���	��P����m��u�Zuw���`9rD#G���nwZ�i�FC�U���u�����|�A�m�V'O����[�r�J%''��;v�����OV�5X�����@���^{�5� �����1C'Nt����/��+�h��)*((�$��������}�����>l�*��K��m�����o/�x�s�aQ��mS�n�~��xMB�t8t��7��f�L�M2M���������<���]+377��vF������eDE���Y~���=���e���Zt��j�:�S�B���b�M��n��F*��`����JKKs�EM�0A����"#��������k��������7MS.�<��{�j����7o�>��s����d�v������k�����+�4��C}��G���S�}&O��>}�h����g�������/��U�Vi���j��UH�#�:u����Hw��}�t��5n\�'4��]������K\{����o�u����{�3�\�9r�������GFF�c��~�V�kP2Gn���l�YP���i�t8�m9��o�fs�W8f��t8t���_�p��$���$�E2��C�X�������5�c���v�T�����A�/	g��!i����m���T������Unqu�u�S�g��3�gm|c��H�!���B��e��f�����������o�{�0t�M7i��A�����d��\�R��r�/^��Kt���*++�+��O�����)66����v����Yw�q���}������%�\���zK��
���N�Z���O-]��=�x�b�=��}M���%K��\��n�A/�����d��We���������S��5��������M�t`�@9N�
w)�BD�fj��;�9hP�KA%�"�4_J?V|�+�����'��s��N$�����r5��RIeS��Oh$�+������	J��-[t��`�az��G��8qqqZ�p��t����wk��ez��7u�w��Reff���j���7�|S#G�,��5k���y�4`��}������$���i����6K���5k��r�E-_�\IIEO�4l�P��w/q}��=U�^=?~\��w�^�X�B���+�\�f����x�������Te�i��[o)k�r�yy�����;���RD�F2�n�w�t8$W���'����$&:��u�.�*�>\
�Ow&y|�~��-g;&�\�8s���_�pU��aT�w��/c>��tdKp�
�1s�zm�]��`����E'���5�\S�z��^�\ll��{�9
6L�ij���!
���Q]z�������m�
�?n�8]q�>|���Mu6b�=��#����$�Z�J��-S���K��4MM�6�kl��q�X,%�c�X4v�X���K��i���o���>��t�R�^����U�V��d����pr������>��z�U�v�lG��0�2m6�:���������m������tE���j���B�C��.����y�����
����tH7K�u�%W�g�G0�gH�g@��xA��yA�K�2:^#]�x�����'NH��P���Ul��8999�o����Q������o�>�������[t)����������<�c�o�^����������o����A��4i�^x����	�f�5i���>�?��V�Z��'$$��,�\������o*33S��r�J���z�����?t��&L��5v�=��^�z��5�d���+��N���R���p�Tn��Dg���"Y,�*��������""dX��u��,Y��Q���E��	�eUk���-AU�|L���B?}(����N�K��+{]yr�j5����TCA	����p�k���wM\\�233e����K=^tt�Z�j�m��I�6o����j���9Vtt�^�u
8P'N�1����k�����/^���\-Y���1�4i��;�x��zH���u��QIRRR�z������<x�;-99Y�<���z�-��}�Q��S��k�W��y�=��#��)S����z�����T�C_|�����8p��:����2�S]�	6������u���e�����
���:5��s~^���p���<��J�*1��,���RZ?7�EV]GH��zQyR�
�2|��)Cj�Q�o�R�9�0��%9s����&O�,�0t�%�h�����4m�TG��az��g4e��R���G�_�^�a����|��@�RP�-�v�V�Zi���gu�1c���w�-u��U�t�5�(������D�n�Z�O������}GGU�o������������^ED�^��a���^�{�`��UD��HS��@HO&����c�!=�d&�������g�w������!EN�����.�Hs���JU��r���.�7�|Sj�j��]�vj����o�����R����4o�<
0��s��g��
6())�s�~�zu��-��:�k�*c�L9��$���r�������69���56�=_��[��^z���J���)Y�r����n�d�l2�V�b�,�
�����7/w��������c�iJ������(}���,�����'K���hU��J�J����[������O
�F�������i��M=����
k��m�}��I���[W������5F���O����~��.�Liii����t�Y���5����;���uP�$Y,}��g�8q�>��c����Trrr�k���5k��E�����e�+o�
OP��%��6��'���w�����
��T�0$�U��"Y�2��$I�]������ 6��qq���E���Q������������?NR40���JO��q�Qv�dxU�8(T:a����{h(��u��'Kr�j��]r�\�X,�jz���_~�E�ij���r8��*ng��M��k�'<(>>�m�O�
��7j��i�9s�rss+�;��S��#���K.��9���������G��'����k+�����5�\�)S�(11�Vg���1+
�*�nVq���+/O;V�����z�b�Lwx��"�j�,�������4i����%W��Qa}/��,f���.���e����h�T�/�
���M��h~�����cj�0��K�;�������v�����{B��}��';v��	�����u������4M]x��������]�l�������������s������M����������>�@���Xo
]^^��-[�M�6)==]���j�������N�:����[���_~��={TPP����|��0`�BCC}v���L��a�%%%y���_�n���#��e��=����O�+==��4��|S�#FH�![�f2*��P;��K�J�l�u�5�*Ze�UV����=�dXT*p�T�T�y�����N���%%��������O������Z�p�$i��y��F����(egg�4M�w�}����M7��&M�H����OM�4I����d�L�T���u�i����j9rD�=���y�egg��g���P^^^�k���
}��g���m�j���~��!
�Yg����:��gu����T9�	�xT�o�M�,��M�o��?*�?������ke���l�����d����,E�U];��d���%<\�ZeX,�{AA
��_�;���C��_?I�Y�k�d0�Y~�,\Ur��z�Z)�`�>�OD�K#����NP_��%I���'��/��w�Q�~XX�z�!=���2Cz������i��*((��#G<��S���,������e�4v�X������5��/_����O�~��$)%%E������$�XU�s�2?�T����%B����T^��^|�O�������!T�?�,e�K�K\%�m6���O<!Khh�>H�tH{~��YEAT.UJU��g�r�U�>}�����=R@\������{���Q�?�@�-��+���I�d��.\�M�6���O.Us�=���~�O?�$�0d���N������1�>xe��.���rAZ����~�9������R��a(>>^�������wo���K�W��$��5�,�\v���OW����������
��-��4�S%�U��U>���=��t�UA����~��}_���G��T���(;g�`��%kP}v	���oX�Z����kUPP IJHH(���o��V��r��{�=��Q�	�4e��,�n�������j�R���5j�rss=A\�����>���:K����X,���r���j���2MS?��C=tV��]�o�x4q�4%��W����ej�^s����@<N�5}�qE���0�R��a�����Sk�����W?�<�����5���%{v��i8�"�D}���2��V��R�l>�����-�8��,I���{�5���z��w���C�~��V�X��4M5o�\g�q����.]����J��������= �������/�b��x��������$���C���W���}�/�+�B��^��y�u�>�@������?��QI�T�@*�Ea}�*�kWv�x�J-�o�������r9%�U�2+~W�k����tIi;�Tu����RG������kK����K
��:�)E���)���X5��G���#�m�����{>�6l�0���K����SN��j����$m���,\��5�;a��6H��d�F(z����S��m���o��Y3?uz|��/�9:�]�M\{w��'��D0U����O��`#��Hj�+P�	�j�V�^��J���c�=V��BBB��uk���S��}��:����3=]��MS�
�*V����`>o��[oZ����\{m��+�L�]*��d}����d�*�/��v�t�3�\N�i�����}�������h���@w�����=���X�����{���x�222���4���w��*��x�Th�Y���q���O=U�O�{��HYbc���*�0�����2�����1C�6m�t�T�����9���4�yi��$gA�����0i���5��K�r�]F�9�p�[��a-s�8����U��Jr��]�v>�344�3���>���q��
�o/P��zO�2E������
U�'�P�=���c��PZ���c��*,��f�W5W�^���{����%[paU%��,����#$k�����e���,���t:=c����=�9�������	��q:����e����*nu���T�qc ��W�-�f�\�0dFQ�P�����d����R"�x��)m�^J�Z4Q2x���yt]�\�u���\��c����M����8����*$&&Jr����u����@;w��\'$$�yO���+7W��.�f�p���*
���~��-J9��z|�K|�y6���)���Q���U+E�}�qV�rJ��I�[�Ry��T"��� ����s+f���a���$��=�X%��=gH�k/�� 5��FXUh���g�{�n<x��UK�.��n�\w���N�\���3v�����D�P�>d�,M������<!T%���+���l��[oUp���
S�!)uk�E�/�R_)e���]������]6~�m��^��A%�
w�U���w������U�($$D��?�Pw�uW��{��W<���Du����=4$y�V��s���g�{�4=/�����2kd��o����%*�=(RU������N����.���a�)e��V�WZ7'��4<#���2,E7�
����HFq]�8,F��p�K|��*�����3����/Iz��gu��W+>>��{}������/d}J���/�e�5���Q�W_��{w��TR���s������J{���<��������� �*�����'��S�7���Ii)��4���K�f������X�����T�_je���R�%���I�I��z}�����������aJMM��Q�����*&&��=���;�?^�d�����t�����cp<r��/��CUU�x�4H����
�E�#G��G��ng��r�hU�/��������$S�<_�������v���2��Ry����,V���R�H��Og���U5���Gk��Y2C+V�PRR��M���/�\����s:����_���/k��Yr:��$�0t�w�}������r��)�������h���u4���T����z����������!�D�P���?����a�
�%4����*����"��U2�������%���UU0����H�{JC�.�T�#@@�i��n����������z�j�!�4e�l6�:w��
6Hr��k��2MS;w�Tnn�$y�M���g��y���b����z�a�%%%y���_�n���#�/�4���Or:�T��}U4o��*~��s�����~�Zk���G�����J�����	�2��>`��qq|�������!m[*9���|E_:��oG%k����s������)����<��@����`l;�	�w�}��/�\.��Yz��$��\7n����bF�8M����#��G~�1(��5J����J�D�Y:�J*DeT2��Wf>�{w��y�,aa�y�"?SZ=K:�gQ�T���R!Tf�*jSV���ze
�`�����iE5�\/u9�W]�X^j���������{N���?���&IG?�YB��i�2MS111����5i��
�@�q��*������/2�Nw��iJ.�;����Y����i�099��vTq�vEVe^!�����o+�Db;J����r:�	�*H�2s%j������6��'�����h`��a����u�w��������?-]���URXX��#F����Wttt:�q+��My+W�,(��E/�,(p�+�*\%y�?�T`��"�9�h���r4��jUX�����^AA�n�����V&��(O��$��5`-\���w���$IE�������kC2,RXL��%��qIDATj!,,L7�t�n��&I��t��a���+<<\			j���l6~y���p���;�J��g}���yg;��P���n����wz����.�n���J���k��'��T�q��rue��~������g�~�H:JUr\��Q��th�!5i�~�/$4�@�f���Y�@�@��.[����eJ.�d�2].���r�M�������>�#%%���\h��j;o����
���
�<����\i�j� �h�L���cUP��{�������m���*
��D�T����V��+9�n)�?M����Q�A�����������(EFF��k�Y�HTVe:�r>,9�2����y7e���#/���k-����5!�h���u`UE�lM�*�O�����F�3������2T��~�{V����~h4��.(JUmhU�|��R�3%k��;�q��Obfee���>�����b�
���KN��s�j��m���������c�<��������j�o���{m��]�����z���ui
�1].�>����yG��w���u4��l�QC���OwKY��w���^MPUE����\w�B�w����iJ2�����lX�y4�Jf��K��������a��\z�I+�C_���8����O������G�[o����IRU��!I����
7���\aaa�n�B�����y�4l��Z�5�|�}����J���
6())�s�~�zu��-���YX�����<rD��)9�2�N�-Y"��}�����*z�e�L���p����������oW�������xe����RZ������.��o�O��+��H��������g�8zmT1�2I�<L���k�_C������u�����.��m�<�W�aT��U�4����_|Q_��>��S������V��/?`����gV�v$��u�n�V���SH��2,��e������{����x��M�z����dd������G>g���S��U�<c��y�G��q��7S��}~l��l�Rl+�����C�����gRT���2�9�4J~������5|�p>|X�����iz��������������������/���e��>�l-]�T'�x�?[�aU���rr����*��M��)�\2�N��(��/d��q�����rI�)�����r���\���0�ju�SY,���)��;�}��,����V��\�@w�e���Ro��/F&J�������.@#�����B�5J��H���~����k��Yg��:�[�}�v-X�@�����/_�Y{��!�5J���l6��v������-K;����!n��	��5r�\%���r���_s5���'y������a��Rj�)KT���xU����MSZ���i�d�)�t���Q��3m��/~+3�X��.]���N���oIR�����l�"�0d�������oh��1U��������:]w�u�5k�n��effJ����/�������;���_eddx���?���R�#��p�6wx�i�{��)�\2n�*#4TFH��~UAW����;t�f�+'G�]�s�M2l��aU�;����arffJN��;wV���
��'`�SS�WH��I�l
�*�*PU6��8��D�U��=��_����Y�:Bj��}]2��0$���B��Xvp���^{�5O�Uxx�,X�^�z�h���G�S�N8p����d�f��Z�j�g����N�as��� 9Yr8d:2�N��P���2l6OP�\.w���%9�G�%����t:u���j����/3?�O���v��v�<�xb@���=H;~�EeB����V�7J�6�Q)>e���f^Eyf������{%��~��_~����-[�u�V�!�04m���_�����N��I�&I��m��-[���F��������_�a�?�������aJ{���Nw�U#�d�DV�d�J�\���<�<u�(����bd��_e���-AA
���}�����Ui���=��|�g��P���1�H�1���a�K��5k$I�i*88X�]w]������������P��v�Z�`
6���{��G���^�k��rss�c�:t�3g��=��Z�

�YP���?W�_I.�L�Kr�������������W��+7WAm�JN���3.�^P �����F��	�
��I��OWX���n�+�����+��H2K���f���k�EaVf���GR��|n������"����(R����*Q_b�"5iY�n~	�:x��$�0u��A111u�/&&F;v����%I�k��,\�PF�F5�>������xo��'���HLL��q�j��7�4e���-92���3#C{��R�?��j����-?���LT�2J��_��.kB�,���jl�[+�U�z���-m����,��t��.��*lU"��a��ZX/��E�+��&��J]�UUUSt/�;�X�������l�8::�'{FEEy�999>��>�^��)�4����O?�TM�4	pg����C�=��y�����Y�rs�HI�%&Fr�d:���%9�2��U"�7P��w��&�f�35UfA���,�T�2�����2M9SS����O<Q�w�![B��{5]���R���aTR%Vr�U4o��/������*Z%
�*T'�|��6������P�!b�4�g����w�^�8>>�'{�dz��nojJ2C���S�n�t�9�����Vlllm�p�s����v�;���t�R9���k����DEI���2Mw�����*s}����<x��3����k(a�5�:5�mxe����w����"]��d���/�������1�q�/X-[����������+))���m���TV��}��rUz�b��(�t��y�4l�0��
��7j���r����Z�=ZFP�d29RRy����"���
���}�j�a�HK�cWV��M�*�cG�k��>3�K�?�m�d�����W4��^a��������4X�x��k��d
�*{��Q��p[��V>�
(����f���tJ��N��Y�f�z��S�z�6�M�k�5b��'$wXU��?���-��=�_�FAm��t8d:ref*o�r�t�*����N����tJN�L�S��{e����Xd�\r9��������l�tE�w���>�KJY%9�\E9T.UFUn���x,Sr9�����z�tA�`*�Rt�LU��UE/k���������@��%�I�&4h�~��'I��9s��c�i���5���'�����	�<x����}�oU�9;66���������LK��Ne���Ry�\M������W��r_3?�g=z+�������U��d����� Kh�d�HV�����y�DD��a����l2BCK����\wX��t����)�ULU"��t����V�X��E�������3�Rx\��*���\5��!YlR�����Kk����_�$i��)����d�L���i��z�j=���:���]����{��W_~��g�0j�U.�����i������;���O��{e_�^��8�,X 37WFh�r~�A�]����"Wv���`�������@���)Y�2ss%�M��M��U�!�b��e����FG���W+���|�c^������GC��w��*���.���oX�������x����k}��78p��
�SN9E			���PNN�>�u��i��Z�d��C�E�W�ah���4h��Zp�1�N�����k��`���{(�*������e�������Y(9��#�iJ9�����r9��yRan��Cr9����������z�^�~�;#LE/�8z]r\�=�p�g
���*�5	������$������}�4�|E�v�\�������?W��d��i�:������o��]�T���r��/WF�r,�%2Ro���-[��|#,L��G�`���r�l��K6��M��,Yccem�T�ZeX����t�
�%:Z�XdX,�DG+���dX,>��0_Z0]J^��jlZ��l�rNI2,:>U6����)�����"�;]:q���*���XAAA���o���j����P+�pU���W�Ew�}��|�I�l~m@���U���ref*o�r�7n�\.���+KL�\��������L���O<�����8�L���~�R^�;����\���P�Is��N)/Sr�����K�2�GC�CR�0�*�)��4�z�E�������(���^c���/����g�����5�i*88X�G��]w����{��M�9�N�Z�J�W���]��������*�*b��~�m?u	4>����<��m���j��vU����W��(���������7lP�
7��g�Bz���E��P�I'I���6md���	�%,�NgW%����c)u���-��K��hU���c}�����%���eu��$�`����>��#eddh������_�s�N9rD������Tll���k�~���_�~j��I}�W���l=����1c�<X��L�$(b�\������z���j���
>�D��5�%"���U�4����@��t�K���R~�����!�-��J� �Zb&��H�����&�FI���AW	�V=�P�z�*��I�1B#F����km��u5j�v��-�4=��a�+��p���t:�3w�
�nU�7�(�J�Z��c��$*�CY$IM&LP���
n���g�h�U~�td�d��rI�G�W9���V����#�.��Qc�-�������c�AVP_�=��III��g��C�Ir�^�`�� 9��W����]�H���g����W^_��+[�6r�����n�+'G�C�(�];w���-��~�e�>�Q�>X���c�J���5H���m��9��}�~�Z&Im�HV�E @��s5���~:tH�aHr�^���W�_~�z�����DEDD�K�~�����j�)):��S�5k��E�|zF���������.�5&F��;�
���q:��<)/C:�,�H{�K�B�0_�N�rI���KD�4�Vw��aH!�Rp�;�*"��n�H�������U���t��5K�a�4M��w���q��0i����{���?�����^�o�![��>����w���
R���-��]r9���R�a�]�a����_�E
����%k�����4�p+����h�"9�N�!�0���O~������.[��m�t��;}�o��Qr��*��{e��PH��
j��g��d���>���I������RTSw�UD�;�*,F���,A���(�\d�{����X)))����m�U��Tt�?���K�d��BCCu��7���@ ����-[���Ky���#��&37W����mh�JN�bo�M��xE^x��Z��%:Z��p�6_�iJy����v��!��-���#eX��'II�K���s�XQ������(��n�0�p8����������L��'�x������\�>8�����az�9v�R��Eu�/��K>t��:tP��������5�tH;��K[K�d�������AR������RX)"^j�B
��Zv����x���H7M��u
QLL�g�F(��U~(��J���}�g��_V�m��d��LS�:��J^&��I���c�"�|���\�� YlR�.RTSw�ULk)8\
���Y�:`���<�}�����L�K��S�?�$W~�
�m���Fh��L�����Vp�N>���iJk>��,�v����U�sF<,�:E���l!�@-@��q�5�\������3�P\\�����g�m��]:tt[@�L�C�������ik�fr8���V�)�(l� �h��.K;�E:�]Z���g���O�(E�KMO��]#�D����j��������!��l���;5e�I�K/������)����#o�����������$(H��>��.]1b����MJr���JY�5�K�KJ�]�}�������=��P�m)(L
���g|��X�����_�g���u����[��w��=��@����33S������J}��Z�a��U��1
;�5;V�Z}x��U��Q�Nu�])/���V)��;��,u*�FI1m$+���F���W#88X�~���:�,m��Y���������[o��j
t{8N�,\��w�Q��m�[��V{4�u��
;�4��|��z+��v���3�u_H����������}����h���e��i����$�0�m��:��x�bI�3�<�{��G�����?��������K��O%&&*44��{<������LOW���������_u�/�������ek�����.i�L���R��m+Ij�Ij�E�w),��{�c*+//O;v�������C����0�����w���_����a��p��E��A��|��U���lY����������+��a���C��Ti�Zi�������+%t���$��)%t�����K@CwL`��i�� ���X�i�%4 6l��U��o�>9�N���+))I}������?fYYYZ�t����/eff*,,L����g���-[��P�R{L��L����N�s�5���"��6���oR�2�JY�5���6K.g��ju�d�JI�KMZJ�'JAa>i������+��jf��	�9s�O�j���v��Q��;v�C�u��6���i��w����>���������x�r�-z��Q���o����'��O?UAAA���ah��!�6m�\�s@�(��W����p�.�>�p��G����=>t��N;�'=9���~�Z:�������#���b[K]�u�]���I��cX��2eJ�[�����@�PJzz����y��UYw��a=��������W_�[�n5>��O?������[i�i�Z�p���I�&�����a5>�OaJ��^zI��)�����l��i�>h��;u�a�����,)�7��vi�;�Iu�{����T),����`U�����.tyyy:��s������V������d���x�%''��3���e���S'������4v�X�\�R�M�6U�6mt��A���G��N�0MS�>���v�^|��:<%�+Wv��YY:8i��k���a��k��QX���=Za�{��{���L����yPJ�Q���W��H-���7J!��p� ~3i�$�?����l��[o�����	�^�9�������������K�_Y,=�������+I*((�G}����[G��$���j��1Z�r��Vk��l��M'N,~��G����:��3=s�7o�C=���g{��O��A���K.�����.���!���k��W�z����S���)���|PJYU�}����R����x�u������7]�vU��]k�n����O=�T�r�)^�o����^�s������7�,5��h��������5a��v�i8p����%Ik���{����'V{���>�����i����Q������t��Y�f���o�o����4i�F�%��?����r)�������J}��Z�>d�"/�@qw�%����*{2%�S�<_J^�~����R��R���aW��8hP\.����Rs&LL3�2e��N������*~UR�n����K�_�gn��i?~����*]�a�}��'����`��9�\�U1�0��K/���~��-[$I��m�����n�������=[�_}���3k������=��s�UX��u��tI���2�K|#����{D%J	���J������:�@��B����?j������� �7.�u����=�sm��N�Z���'������;%I;w���?����;��5����\.����+���'�\�9���z��t�u�y��z�-��������{�Z�5BC���7���BO=�N}������?����n�3����H�N��c��5FV���k���JII��#G������(����]�v����BCC�f�2s��R�\p��Mi�~����z������c��,�&N�X*,��/��2����*u]2��*�_~�������H�V�\��{��e��^���.�����}�z��������+z�8��w�,M��]�>�J�����4)�p���k/]��^�V�	�j�n����>�o��U�V��tVZk����O�x��;v��������'33Ss��)57a���4S�o�����9�������>�T�7�|Si�����u�V�uDD��8���)��7o�$�4M}��������H�k�(��_����k�.b�H��q��'M�T��]N)�7��V���z��KMZI�JAau���"��������N������Jaa�V�X�+V��G�;�����>�>Zm�>��S���y�5r��vT���kK]{J%I�{�VHH��v�$i���JMMU��M�=���O�����x�*�T,��/��d�2�_��^=v��V����6iR���2���K{�K;~��6j�I�k'�q�+�F�~/��,/=����:u�'��0�Qe�a��AY{����#��c��������3f�����+k�T��]���~���+..N���Ny���P[�n-5��kW�������N���=s�6m���M�6���������]�T�����w������z�l�����.��$}����^�=�^%�;Mj��N�Po���k���)S�H*j�>}��G�JHHPDD�rrrt��!�[�N�������J��<y����u��7�y��[�j�����&N�X��~���l�R���+w�}��:t�n��F�����=����p8<�aaaJHH�Q_m��)��y�f
<�\��������9U���.{�\y���Y#��=5Z���"G�T�s��
�uy����������5[k�N�T��W�m+E��[������{���T�U���5u�T�;VQQQ������G}�i��i��}2C�i�������#��m��z�o�����{�������j��������C3f���34l�0����^�><x��u�V�j�W�5e��l�u��u:'55�F�8����]w)����������$�
���=&[
0K:�,��PJK��o����gJ'�+uX��hP������e��=X��
����]����H�x��;v�F��y���0��vM�:U������oL��{��Wjn��	~?w��:��S5g�
<����2A5>����{�����������
		��>e<x��aZ[�n�����YX�����/�T���5Zy�E
��Y1&(�k�Z���*���~xN��+����z���d��)�:���*8��3G�a�4M%%%����SPPP������7�|���{k��
2MS�g���o�)������(%%�s�q���x���[��/��a�����-Z(""B��}�~��'��?�Qrr�gMZZ�.��"-_�\'�tR�{�
�


�qaaaU������S�g]�^{�5M�6�N{P
w���W^��g�����>}����u�%
j��Vgg�RVIs���r�B�N����HQ�������*,[�LYYY�$�0�����8��XPP���y�{������,-[�L�
�Y�����3K]_p�����z}�&M��W_������b)w?>>^����������n=���z����r�$I���?~�V�\)�0*<#??��upp���+@������*
���,���e�����1c���"/�PQ]��3�P��'����UR�ri�j��_5_�F:a��t���V-���U����{�111>|x��>|�bccu��IRrr�q�������g���0aB�������^�U��j���S�����U�Vi������K+\Z�����F=J��n�rO_�U���������{�-[�C�?��k\��������QP���:w�Fi�li���Z���Iq�������������*<xP�d���o/�0���aj���'+55��=6v�}��rrr<���5�y����s���N��3G�-�������`EFF��������yyyU������S�Y5q������.����[����/�����=w�r/��W_�+#��u-��_�����.]j�}�����O������N�J��OJ�(Y��:�c�1��!C��l?��h2Aaa�O�t:����b������3J]_y���������{�)��`�9�
�/ U2��[e�x�U�����l6����h��$&&*11���P;v(������Kr��S��-�{O����:����v�.�SZ�������N%�4�V�pL�[����^�O�4I'�tR����i����J����o�]a]�^���O?������~L����;UXX����Z�WXX�;v���x����������	���a���0��)I�����}���M�r�e���0x��5�������{w��i��i���P���f�V��e:��K5Z5f��F�R�+�����y��eR�ni�����~��ZJ)����h�~��1c���$�?�NX{��-�_eX�v��'z��������u�%��z����ZYYY�<z���<�S�;��{���v~DD�bcc�����KMM�0�c����lr8����<����(\*%%��ue&�t�R�:_�@Ce��O������V�u���)|���}�,��5>�4�mK�]����z���8�e����R�c8.�-K�L���V5���s���+>>^iii2MS��s�����������{��W�a�4M������O�C���i�z���J�M�8���

*u]XXXi�	'����7{�6n��!C�xu��nWrrr�������o����3�m����shH
�������]�H�}����A����b&NTh��:{�i�w��/j��������:���_��3������_��^{M�ah���:��3��W_�U�V^��w�^]t�E��c�g��c�6�_��X�h��o�����q����������k��i��={�,��l�2��V�Z%����n���+=���+W��p�f������K����&�������k�&��[������o����BZ;G�����Y��'�z����Z���$K��������Vk��=e�EEEIrW�Y�F'�t��L�R*��";v����Su�I'i��������(M�<���7d3g�,u}��*..�^{X�b����f��y����_p��������Yek/���JkO:�$�p�	����-[���srrr�|�r��a�������;m2����F�V���u������Z����=���H��f�+%/�>���0i���=K���&�
����o���y�����zv��M���oj��q2MS�a(''GO<���x�	�k�N��r����>|X������;%���4MY�V���[JHH���hHrrr4k��Rs&L��>�~��R����Wxxx��#G���f��f-\�P������c�����3f�������\3j�(�����z<xp�k$��O>Qvv���O�>j��e���/y+V(u�d���S�]��_`�*f�D�O���O��y.��`���g)�p����Tj�t����(��-[&I2C��5���������v�mr8�0+I��c�'������<�AAAz��W5z��z��!����K�45o�\#F���.\�������_\����8]|����.�45u�T���{U�{��w�c��u�v�4|��*�\{���>}������?�<��O>��5���z��gJ�]w�uU�@}p��:4u�r-R���^����BE_~��\ye��4Mi�li�������b�U�� )(�VG/4����}���z���d�$��SN	H/7�p�z���	&h�������"��L��i�:��S������SO��~�3f�����+e���Kq��y��{����*��X�`�F�-����k���n���j�N�6M�g�����$����:���4v��
�7n��{�������>����*�IJJ��1c��'�H�


t�5���Tttt�z�4���C[�l��u��Q�^{m�����.^��w�UF�������{��U~�U��v�����~���(�n���KMZJm�H!5>�B��:v��U��������i*77W��HI�P���?�V��B�^�������~��o���������7k�LC����_�����c�
���;�p��Rs&L��~{�����^�G}T�]v�F��^�z�I�&���N�~��7���k���<V�d�X����*<<����v�����^o���gn�����i����.���J�
�������Vzz����SN�5�\���=���������+IZ�r�����k��������K>��f��]j�3�<��� ���W��6)������o��7��u1�_����.�b�������I��}���:Z�4Xj�]���%��0���j�b��0�a����S'����5
����;wj���:r��������X�k�N���t{
���?���'{�{����~������1C'N,7��U+���)""B���JIIQvvv�:�0��K/���o�����\
2�\��������BBB���\����-]�T�;w����?�X���+�g�i��j���<���w�����������>�_6l����$�������[�v���T������gy�e��w���O>���$�t�R�3s�H����.����nM�S�A�H�����@����`l���0�rs%y*����=L�T�.]����7��+I]����3K]O�0�/����G{�����E��9s��>�����s����.��<���ys�k��o�����F�W�t�W�4M]w�u��������*55��5��{��{���@m8��W����w��redx���3�(��
T���3����%K�W�^o�%E7���?u
�j��m��;w���KLL�Qp��bQDD������[7�s�9���d�Z��.l��%��m��:88X��������
��i���O?i��U������b��g�����u�UW)<<�V����i��yz�����s�i������|��z��Y������}���G�g�}����
���{LC���9x�t:e��Q�+Wj�u�y��������OQ�\���-kt��%����/j��I��f'I����k�W>��4M�[,O��y�4l�0x���m��i�����k��������������M�6:����������^�Z������T||������o_�����L-Y�D[�lQVV�BCC��m[
0@�Z���9��a�%%%y���_�n���#@]8����U�}��k����
�����Fg�%m�NZ3K*��~]��R��������jt$����c����izB�3C�:uR�N��������{��~?'::Z#G���9�T�����<��7���>�oS������vV���d�s�^�&mY�}�qR���������~�`]s�5�q���7� 99Y�_�������j���%K4y�dI����3g�u��>���r,P��eJ}�Q��#G�R���*�O���rJ�~ -�._K�d�N�Dj�Gjz��
����}�]m]�����h���2Cm��U�~�j�O�~��m�6���[���[oi���>���(������+��o���&$(z�5{�%��}k��K�7I�������KmzI���F���oX��Y�fy�W]u��Vk����l������SOI�>��S�@����P�W_i��W{���C�d����Y.��������Q}}�^��C���KaMj|h���Brr�v�����������%�\�	���y������-[�iO��0��8Q�~(��Wk�|��"G���9���
��o�����;K�K�K����(��U����{�������g������BCC���/I����	���~��q�r�����SNQ��*���e�����I�����yW��Yr�����G�F�������f�:tH������5�c���~����;wJ��P�v�d�X����jU������J��o�^�����Q����o����>�jM�i�)��P�q��>'s������?�}����$[�t�3R�>^�z	���g�^y���1C��~������7i��'{��'33�'{T���r�Y{�����	Q��7����2j��JJ^.�����Z��FN�"$�nY���{�|���������i����!I���!�4=u�!<<�3�UXU�P-����=*���P��5J9�L�����;E&#8��z{��m���7�����aX�+^���/p��k���3u���V\U��4�r�W���M�6���g��:p�\.����s���P��rfei�e�)g�\�����G���%kll���K��AJ�-}���}�����\�EW��x�{���m�6�|����(�45h� ]y��j���F��	��������$���i��
Z�`��/_.����kW=��3����W�j���g���������3���~+V�PVV���u��u��$gz�2>�Pn�����{�Up�N�7NV/�������R�K����6R�+�6��X��E����3��n�{�{�1=��#����S��
�\?���Z�v�n��V�X�B�6m�<�~�A-[��W�����W�������$���u
�z��<���`
0��=832d��w�<����/T�#�(����>#����di����.�:��N"���	��8�N}���2C�a��s��4��2={���%Kt�UW�4Mm��I���
��r����4l�0��)�45g�}�������O>����=�&C�UXX��;�������e����C#F�sf��|����W���o�I������SGK?��}@�|&�W�b6l�z�j���H���}��W�},��}�]m��Q�V��������_z��}�n�|�A}��72C�i��k�Qvv����Z��x���u�m�y�0�^�[�ii�w���]�H���j��-^���=e���j�����E��_��T_�����,������������qHH��Re}aaa��,��x�	I�i�����?����F���]r�%��*���n�Ag�y��������
����j���:t�n��F��vI�@�Q�Fi���������j���~����W��9��_E_y�N<p@��y~��"��-�9ZZ�r��W=.��Z(�{��+P36l�V�`�:t� ��|��a�q~~~��
>\�����������o����N�m�U�1c����Om��Q�a�4M-^�X�/��bQ�.]������Hegg������y�\.�$y��L�TRR��{��z�4~��)g�|���&���V��[!]�V[k�Rv���������s� �������_�rrr<�&M�TX���,�����*��Z�j������I�����5+22Rs���%�\��+Wz��L��������i�&O�i���a���~��i��Y������@�v��t��{���8����AA^���f�%J���^c��gHmN���2~	�*�d��+����VVV�$i��]���<x���\�V��d�M�<Y����'��8���Y�i***Jw�y�&O�,��/���b��Q�n�A�����������Y
��U�'�T��&em�+�������^b[K��I�FJ�:{�=@������ys�8##����;j��=��U�VU�gJJ�g�M��?������I���[o��~��+<aX%EFF���1b����Z5i�$��$w�re��?��W�M�yF��G+����M�*��BJY%�>{T-�K=.����U+5����]�J�L�TJJ�
T��G�����e��.\���\���W������x������bccu�}������������������,EEE)..N��7��j
h��qp��+k�����jk�qq���5{�eY����5]�����������U��iRd`���8�`u��E�����������
��g�R5��s�^y�����L=���z�����e��u��wJrj����{���Z�Z�j���Z�j�V@#t��Gu���$�����I�����^��{D�����B���5F|�d
������e��4h� }��w���s���1b����*�4��SO�������[��Kh��%z��G�j�*�!�4��cG����m����~��~�$����v?���v����W{o�+�}JrU���y@j�G�n���>a���\p�g<g��r�m6��|�I���	�z�����gO����I�&:���K�_���S���e�s��)�������
�Jx�Qu��K�V~�(�V}*�������j�Gv�t��R����������;��CN�S����~��W�~���j���:-\�P~����$��Y��x^�n��&]y���j��=��RzH*��NIFp�"/�X-�}W���j������K^���U��4\�|�t���v�[~����Wjj��N�$)""�����{O�:u�s�=����r�M�TTT�}�Q�{���j�/
�nU��)������Qem��iJx�aVk�������>�{�=�;M:�N)���M����$)&&���04e��r�-���/�b�
8p@�i�y��:��3����Mqqq�l��
SR��|��\q�W��/V���2��:����"����=
�4�u��I^�Po��U������t�
7��:�]�D)g�-3?��:#$D����3f�Ue�����7�����a�R�~R\[o��?
&��K{��=��
w���6��{�������0_�<_��IZ�E�������RTS�z�������Y���t�2?����o�����6p`�5.�t�/��'������D:�R��kk�9@��-k��a����?�SO=��{�^�Z��{�$�0��?�����YP�����������R5}�I�t�Re]���������p�t��-����`-\�P�aH��9R���9��J�gO�@�o���W]������
��W�~�Q���*��,����R�T~����K-�J��M4 ~��$�4	����M���[���jk��U�W^Q��'��X*�qJ��������O-�9U:a �W�q�k�W�Xa��A�O?]fnn�uQ�G+�o_���2l���{D�}�t`s�g�8T:�N)�i
�h����+��3�U$�K�i*�_�R����o�Pe�%*J���JC�VYwd�����������bi�����X4�4���T�8222������r)�Jy�ue��n����M!II���TZ�e���7�����?�v��!Rt��t
�x4��H��P�V��
8���������T[���+��W��'Wx?/S��DJY%m�[���'J'��u�i��K�`�Q�5yyy��}�f�����{��G�=|�����N���o����?��
��Q�-RP���w9��;������6�����B"j�5@�T�,��Z�}�4%I����1�}������:�P�YP�������#����*k�.�T	�'+�[7�|�m�4�)/���O%
�M
�E��X�����|UW�0d�L�T�^�t�E�z/_8|��~��G�Y�F)))���T^^^���0��?�O]o���S;�����*�B�wW�������������4�us�-���U��{�8��0)��d�����S�$O8���=l�0�����Z�~;�*��o��I����_����N{��)����a���zKi��W[w�=j��Ux���v��~�@����s����FJmz��_�cM��\i���E�<��w����X���X,���P\\��u����>[={��K�u2g��?^����@.�h|�YYr8����jk�\w�b&NT�g��g��L�����UU�c������G���:`-\���{��3~��4l���0K�.���_.��!�|e��'4|��t���R�.XPm��U+��t�y������KK��2�W��I'�#Y������q�iV���z��r8�����`]s�5������{w���+,,,�m�
8�����:p�=r��VYk��R��k��c�{�)m�Y�����:�o�N(���m��6�`M�2�3�XA�Dc����?���_�m�Vs��U�.]���i�J>\���Zmm�'�P���V~U�'��HZ�n�gv&��\j��6?�%��Z�r�$w��az���	����]�T�S�(w��jk���W�/�T�)�����_�f��oc�g6?Y��%)8�6��u,8x��g������:+������v��];����{�)b�YdF�{���M��_�����'I�O�����k��S������/���C�)66V={�Tbbb@z			�$���m��P��_~Q������Qe]���*j�h5���R��)e�Ji;�YwU�iWJ�I-���5���oXv�]{���\7o�\����������{��[o����B���b��Q����j������P��=����z=T�`�6e������Wmm��_W��7��w9�/���V^D�t�R��������������0
������J���>�l-[�L�i���t:��_h��eZ�d�N8��\���e���p8�}�v���),,����+��W;N?]���*�Z��������s���L�����J.G�g��!�?��e���sX�����.�4e��F��V�ZUZ���Oj����$�0J�3C�i��������t:��r9�������&I����5kV��
*���'�9d���jUe�UH��j�j��/��T��iJi)��+��>�:�*��t���%���	���?6���Z�j�'����.��6##C/���'�J�����C�5k�233e��6m���_]��z�?���3�<����^���z���t�9��Y�f�v>p3���O�s�U���m�l�}��)}r�txG�g�FK=.��T��P)�?6��a�


<�Vg�yf���f�RVV�$�0=��#Z�x��~�i����Z�f��5k�	�z��7��r�:t���>�HAAA��w���M�6�k�2���_qq�u��U���r��-ZT*��4�?���x@zmd��WAa�u�H��W������d�8&&F�Z���v����$�4��eKM�2�����������i������o���������s�*11Q6lP�^�4a�}�����g�


����i*w�y�u������+�5BB�n�"�x�5�����/���|.����mI��
�M��)��o[�#6lZPe�Z�lYi�����?�,�0$I�����j-W7f��|��r:����k��E�~��rC���u�t��gj��Mz��������z?�0�p8|�!���O=��G���	Q�>PX�~
j����3���J.g����*�xD�k[���5�`���x�QQQ���]�V������P#G���.**J�����m�$I;v��]�^����u�}�i���2C�i�{2?�LYs�(�����.�W/���s�o��3Mi�i�"��U����t�KRQ'��_�J�CVZ�t�R�8((H�����6>>�������.�7i�$=�����2CF�����a�@����N{������w��%"���_?���^�IH�K�~(~	����������u?���$w(T�>}Ri������3@j������%I��+�4e�X��}{���+<<����X���GJ}�a��Qi�51Qg����.~��_��c��
���t�l�R�q���}�8j�/X�[���������T5m��TM^^�~��GO���!C�����#�qdd�������C=$�~e���u��G}T���"J�o��1MS����o���W^YemX�~j�l���I���v����R�Yg�'u;_���;����w��U�6�gO&=!HBB(		E��PB�*�D����HS�pD,��R�KSP�:��$JH#���f��Cf��))�}]\g������7R�_,�:��������J�n���|�{��4s�m�e������w����-Z��c��J/:w�\����3�d��	�{��~8��5���`M6��33����q��u��w�Ui���T*�Z0;���d�����w@�s�d�+���S'X��w��[n���z+�b1]tQ��v�����I�7�|3\pA� �}��0`@��
2$.L�����7��.b/����J���
�\{����`%�}���~���-�j�������)_w����q�3H����;
����$[X��uuR��$��~zN;��
���=;���{z�����g��aY�dI�X���ONyy�Q{�����M�f��7������3��{�
7���nZ/�R;������>���N�M��&M�d�
6��;���6��V������K/e���Y�pa��k���{����Z�V��Pf�rK��pB�3e�[g��^J�M7M��,IR,&�&&7��,�S���pS���I������VgX��rJn���<���)
)�y���K��B��s��9���k<��{�)��n����q���]����_��S�N�r�����/�%�\���
�o�q��L�<9�\rIn���J%f�������/�!����������e�]��^{����Z���'���.�(;v\�{�������#�������_��i��c������]�&�lRZ�91��{���5�������$�6�������:�P(���{���/�X,VZO�b����[/<�@��m[�9o��F^y������U��t����{����v/+n����|����������$y��Ws���f��AY�p�r��`��w�q9����-�J���g�w��]6�|�<����}OR�PW�1Tc�U����'���O������<����_����U���O�D�����.o��m�~���}�����{����f��y���K��N;-������+��"IJ%Z�rH]F�d�]vI���3u���1"�'ON�N���~����>����?�������m����3��M��1c�d�����o�9�g��=��S*Y�<9��#��TZo��Q�w��6m���?��3J�&O�����/�?�xv�i�U�������������w��q��������WZ�jr�w���Rr��I�m��mV.+��N�>q������_���\sM~���������������N������\{��������5�W\����j���t��Ls��M��GY�(�G�����r��������������P����{s��W��3�\��~��_.U~u�i���/,�����<��~��=zt�d���9��#2d��e���>�	�6/���+�8����m�����F��SZ{wp������k��c���_u���y��b�Xl���3fd�����Q���y�<����y��:�j���/�%�\Rz~��'3`��Z��?�A.����s��=����V[�����4\pA��M�6�����]���2eJz���Y�f��.������U���G������#G��~��U�3i�o�KC�M�~�J�C�I��},P�f=�P�{l*f��q��M7������c����	������iI���nO�����k�U����n�������Q�4j�(����rf�6m��#��G��7o^��o�������U��������������j�������~v�u����3r�W|�]���/*�_����9��������k����JkW^ye�L�R�=��M�a������{��5�_��n�
_z)mO8!�;&I��*������:n�lLr��_�	j�%jR��TO?�t���+��9����#G���N�O��v�a�v�m��S�4k�l���tY+��;�����K����k��s��
�\t�E�����?��?�q
�B�{***r�
7TZ���������{��]v�%�<�L�d��Y������o~���	�6�����;������w���w���[o�F�['I>|!�d2�����d���'�U��X�
�j��*�
����5*W]u�
�[(�x������{��*=�|����o��wO��=���&I&L��_|1;��S���?�|&O�\z�h��2`��e����O.`%����_cV}}��X4n\��q�_�\�-�����&�z��^�k���5��}�d�3�N��_�i�:���X,�~
�R)V�X\��Xy�g���O?]im���^���B!{��W��������?��C��X��&��<x����3�����&��`�����7��=���M�L�F��O���?&�����f�$}�I�<Yw����[X���X��U)�Z�:4�-*=���3����2��y��+=�����~�]������.]�d�
7,=/\�0��
�r�>�	`y-�:5S�����;��W;�l�m���G��}�$�����%��"�V����������/L7����2�:�����.j�k�d���2eJ7n�:�K�.i���r����oWz�|���k�g�?{^m�5r��J�m���urOM���b��Q{����^�LY�6�d���5k�$�X�������k>{�]�^_J��_��XU)��
�j�g��#Fd������������f��������N�:-�y������[������Q�Fe���i���[>1o���=�V��l����������c3���2�_�������������f�R,&�_I^�'�\��owL�����U�,���a��\_�xq�������w~��������E]�F��x��I�*=o����g���Kyyy/^�$�����)S��k�Js�q��b��q��Yw�u������������7,�b���{���o�]�\�GM��K�O�.y������W���&���FRV'
�X���7/�]vY�y����oK�V����={v���-[.�]�B!��7��Y��=���-Z�P(,�]��V�=U���7-�I�&e���������_�{�����w3��Sk,�j{�)iu�!i5p`����G���M�\��e��>�${�����}`Q�
�Bv�i�p��a���O��o�>eee�2eJ^{������M7�������
<8GuTx��4jTuC�g���5k���V�kE�������������\r�%+}�z(�s�YTC�]��|'������wK�����=��I�m��&����,���{��c�9&�n�i���t��.]������u�Qy���J�z��\}������U��Of%I�&�����i�J����k�{��.�������x�Y���s).\X�L�/L�~���+_����S�K>x.�5��s7�!�|�d���(8�X�����/��l��<{��G^x��������|��i���R{�5kV�ya5e-5Y�`A�g��=�}�����=��,���jg:�{n:]zi�d�����7������H�;����S��*�Y�f������O�,^�8I2i��<���9��C��o��U�����/�������������Z��~z?��������W���jY2}z��pBf��o5�u����c�$���%/��+���l�����F����ZB��h��Q��[(JOT����������[Z[��9s�,�]�bq�
�����b��B���w}6��`��7-�u�]7����J��Z�f�|n�U���$-��3��$�=��������O�����5���Q,:�Zi�=��T�5|��*�>[�4v����g�����������c���:v��B�P��a��E�4iR�[o�e����>��\]�T}}�v+����d��������mp��i��o�l�q�y<y���XQ���I�l�t�Y�Xc(�Z�.>Z���(�Zv��u��<y��*�6�l�J��G�^�{>;��G�4k�l������{��5jT���S����z��]�\}}��*���������U?TV�������C�����G�Wn�~�q�d��-����y`}�]w���B����;7�'O���#��_!V�n���F�v�5R���+=/Z������H
6l��y���k<���>]�5l��l����~W}~������{��Y2aB�3/�0��<3����kw%O���3w9-�����Q-�`���s<x��N�2%w�qG~��_d��1�4iR~����SN���k�	�)f���S�s}��M���KY#G�������s�e����������[W;���[��G)=?���4h�2�3~��R!Z�����7������&`�Q,�d��|t����_
i}�a�p��V��G��#U�&I�
�MwO�=J�������:t��3�8#o��V��{�,X� ��vZ~���5t�U���>[��[�nU��n�:���k���{l��(�y���+�t�A��x��������e���G�������U�VU���7k�y/����w�{�:e���U�4�v�l:mZ6��_3mB�������6�99��d�o$��i��`��u�Y'��{o����b���}�{y��W:�*k�����_�Zim�=��v�������?�i��y��'������[o����������?;v,=�1"�^��>���C�q���	X�-�5+�
���c��i��g:����2�M��vr��I����^�$_:59��:
�ZAV=i��E.���$IEEE�9��N��:���3}���s�&M��~�U;�QG�e������~:O<�D�w��\r�%��N:����U��DYYYN<��Jk�\rI��b�w��_��3�<Szn��u�8�����7k���s3����n�6Y��;��m������R������d�k��������';��4iQ�Xk�Q�8]�t��A�2h���p�	
g)p@�7o�b����~:�F�j�Hu�g?�Y^}��e�_�xq�:����O��~�i��s����[w�u�?��?������g��q���������O����i�L�d��w^Z�jUz~�����������>�(_���+�}�;�I��k��>�	X�T���)W\���[RMI_�E����_d�������\�g2kb��������d��04k�5��O�>���J�j�6m��={�����LS����f�����;�����*C��������1cFn���l������~U�]�^�����s�:��s������?������?>�`��*;vlN;��\p���_p�i�������c���?�����?��~z�r����������F�YZ���K�:�����>�	X�L��o�n�v���������W���iit�9��;��I���a����>{'��k=.k)U��e����c��i�$�����/�}5m�4l�A��i�F�e��)9rd***���������G:t���w�o�>w�yg��g���??I2j��r�!i��mz������g���Y�dI���rH�>��e����;/�?�|����������\w�u���G��i�?�0��O���y��������m�e��>�	X�U����������v�3�f������������d����<�����'���rX�ze
`m3n����B���I�������^��/��#FTY~������7��&�l��g����y�����}�J���O�����?�p���c�9&w�y�r�oQVV����;GuT��%K�d��y����*����C~�������|O}~�z�v�5��]>����i��og�)�����r�Y5�_�h�w}�����uV���Q�Z��I�&���S6�x�����9������.U��*{��7��G���:v������\��N;-}��M�F�>w�U�V9�����SO���������w���6lX���o�E���}�_�_�����/I�������Y��~�����{���[W;��e��~��6lX���$��M���X,f����p����E����s�t���������)��#��k�Ar���7�O��]7� I
�b�X���Y�V�@*I�[o�����O�;��e*Yj(�����{��^x!����W_��<iM2w��6,#G�����3{��TTT�m��i��]6�|�l�������y���������������I�t��5;��c6�x�Z�'I��������G}���m�����Ov�y�4k������o�
C�M�~�J�C�I��}0�9��1����U;�h���s����<#�O�����:m����C�:@�[��`���P(���?]Z�Y�b�s���s�>{�m��}���
6�`e����{,��w^�|��$����G�|���
�����/<XST��������w�Q�L��=������m@F�T�Ye��7�KZ�����2V�>���:x�]w-�U}��;vl�B����l���i��m�6m��3gf���������_�U�PH���S^^���gg���5jT***J���b^}��p�y��g��u�Z���}�k+�o��y�8qb����d��i���O����^ZkX;,�4)c����{��jg�o������7�f�����j�>����_P���k���I��/�<_|q
�B���s��'�����;���M�.����>�<�?��y����$�f��=����7�����O����m�x��R���!Cr�������}�}��7�X*�Z�~}��SN9%��Jg`�Q\�$��'5�_u����c��[�<������I��k7#,���<�������,^�8}���������.��Re�U�t��5��~z^�����?M����[�������?I��u�r�!y���s�5��P(�J����?e���u�Y�����b�������+��5�\���X]��|����v�2�7��v��-��x���:�����n����������Uy]�����+�L�t��=�<�L��k������r����q��9��s2i��y��y��WJ�RI��o|#�&M�E]�$Y�hQ�����;��N�}K�X\���:u�6�l����?�{l��o_k�X�-|��L����
��s���������^�}/H��W�`�+��T�-��2C�I�P��w���~��+tN�X�V[mU�Y,��n�I�&%I>���w�}+�
I2j����S(��Y����:i��Y�������C��_����!C��o�L���C�d�	'd���W;��/�������kwUV�/&�H��|�C�����S^�6,C�I��l�2�r�
�U(r�QG��?�a�TY���i�r�!����J���=z��Y��&�~z��W-��7��rF�:�y�,�����'����J(��C_y��$�-��p�
��q��:�w��K��Y;��C���)SV�>h������������y�<S�L��=�}�����?����/��h�d���.�������������~7m�t��k��I��X,f��	U�t����{���+}'��	��V������/[g�t���<��N�r��l�Cr���  ��:)�*/����b1�G�^��>}F���k�3���,XL��������{��jg:��H��g^��Q�������lq`��ZT'X]�t)�������K/e�vX�������~w������S��~�i�f����4��G3��3j�Y�����{g�K��4n��9iS�&`�RV�n���I�B��$9���V��'�|2�<�H
�B
�B�EZ��
+���G������#3��32f�}�����+2�'���7�X~��)���+�`�Q^�n����z�����o�X,������'�����>���~�K/���?<�B!�b1�B!Gyd���=�\�w�>}V�>���}�����B��?��Our6��b��1������S�L��v�����~^sW��s�-���P���+I.������~���[n�%/��R.���|��i��I�{�{�������5�\�E��P(�P(���9����?~|�}��
�$I���k�;n��������2/Xk����3��3��g�-�*k�&�_<���*ck(����d�>�[�QX�CuV���>����O��W_]*�z��wr��G�e���f�m��O��i�&M�4����3n������y�����_QT�XL��-����kSQQ�$)++����[W�����b���.�`�1��#2���~�q��{����_����
</��������
���w��]��b����R�S�X������3���g�Yj�'�Q�B�T~��z���G���nZ�=3g���A��$]�tI��]k�;>[b��>��+{������?\c�U�_�W'��/k[��V�%[���I��zT�XI����>{��W���'���O��PU�tYT�w�q�������W���+�����}�����g����<yr^~���y��y��WR(����O�S�w�^IX����2z�}�����iu�!y}�7������c�d�3��
��B����:�p���}�����[��/d��YU��EQ|pN9��l�����N�{��9��S2}��t��9�?�xz�������
:4���+=2$}��m�DP��b��N���_�U�L����7������f���*gZ�K�$��e���k+XS�j}0�V���I�{��9��cS,3|��|��G�>}z,X�6m��}�����O��m[_�������t��-��q�������7��:���������3��C2�����i���y��g�?�?��:��M:lX��!�[��
����;�{�n�����o���>;�]vYF���.�(W^yeC��������?�-�*&�t�-���L������']�%���MNhHe
`mr�i�%�o9������7��P��<�T���5c:���&~%�N:.�F4�vf���^;+�`���u��9={�L���7/O?�t'�6M��w�x��*�-��[�~yh�����?����w&�QW	`���X�f�����3k����R/:u�T���;�4`j��I�����fD�~Y���U��<������5q�j����d�]��]�*)�:����Y�f���o������K/e��Q���(�/++K�=��;d��v��G�u�Y�>#����g�~��;��P���}��U���d����������Y���_Lv>5Yw�:���z)��9sf.����p�
�7o^��X,.5�d���1"~�a�����u�Y9������$m�����uj���y��wS(�$m��m�@��9�?����Sm�U�;��L�*�V��u:'�_�4k]7`UU�XO=�T�9��L�0�TzU(J%P�)��;wn�����w�}���[�����u�:��_�"�/N��?��={6p"V��^��}�I**�zWL2���3q�32ud�j�8��I�m�_�v*������f�������S,K�W�b1�b1�[�N�=�����G�i��u�]����b��������?�����[g***����,?���KM�6�n�����X�����?�1c�)�J�i����]���6���Br�����f��]VX���������QG�y��U*��c�=2h��0 ��u[j������SO���n�O<Q�;��}��6lX�t�RW�����O���y��e���y���s�}�e��1���N>��4o��6�P�����6K�L����vdJ��2���V{�����}�N�UJX=�Y��g���3g�P(�X,f�u���7�������}��w������?>�<�H
���''If�����>;��v[]�^��J%\+���W�b1�z����^Z���'M��������m�������3��lyP]���O�`��93��w_���]�vy�����W��:g�}����>�w�1��OO�X�}����3gf�u��������jy
���C�X�����{��i��]-'�.|���f�T�nay���tl�m��j���;���I�~u�V?euq�����`����
����?_���Ol������~V*�Z�pa�|������V������_]}��y�����G�ZL@]��7/_zi���)�K�_����}�d��_�g����c��)�n��Y�9���:��c��w�����??I2v���:oy\t�E���P(�Y�fYg�u��G�l��6Yo��� ue�c�e�!���`�R�&��;��63'W]h��g�o�d�}��Fu�V?uR�5s��$�-����gZ�h�R��h�"={���a�R(J���)�`�V������Oq����}���y���&�����Mr�uI��uVcuR���}���f������>�]�v�r&|��I�2���3���d��J�����
��]������ly��+�<uR���_�$I�X����k��Q�F�~o���r&|�GG���/����zyv�W��i�j�������u� euq����t��)I2e��<��3+u��O?�)S��P(�c���i��j#&$I���?���_VY~5��Fy���-���C������8$�A���Q�F9��3K�g�uV�,Y�Bg-^�8g�uV�����$6k�9���m���s�]����/�S�~�I�r��}���*�w@R(�uRXs����g�uV��������������;,��~{Z�l��g��3'GuT^}��$��;�\��>��7/w�}w�y��v�&�l�������y��K�G}t7n\+X~���,���L�������z?�Y�����j���+����Lk�:+�*//�C=��?<�?�xz��l��f���s��G�m�����>}z�������?�����${��w����4j���"W���n�����$i��IF��B��j�*��zj-Z�$i��q�>��Z�	��[4~|F��g���R�*�(���;;V��c�����.����
�.���$�N;����{/�F���q�r����;��N��r����/:tH�-2w��|���2dH�z��,Z�(�b1I�����_�b����e��G?�Q�|��7��b��B���~������
���K�|��_�w�Q:W@����?VY~�$������v$[��
VV��I�T-+++K�PXj������e�d�����3f�c�����H����9���V��|0�zh��i���:uj�7o��9aU5t�������<d����������������d��O/�nZ��2�����r�*���?��u�����SV�
��_+����f��o��%K����u�]W���v���].�o���XFKf������������n����s�����8 �E���X,��_���w�-����{��i�R��i�&��u+=>|���������_3���S\�����������}>���W����1H�Y�>������~��'���z3}��$I�PH��k��N�:e���I��S����To���g�T�n���d��?KfW�w�>I���0����k��v����MEEE�w�X��3?}��j�L�V\�8?� �/�x�wS��-�����]���������0$����kM��c�$�-��0aB��9q����v�����T6���3f���d����}�f��������� ���.��MV
�]w������g�������
�7z��|��G)
K�@������*��(4��6���>V[~���d��$�mZ)`�UuI�w�1�B�TX����e�����[�$�b1I�����\@*�q�-�������UZ/&y����r�GRQ����m:'�Q~�AV
�]w�l��I�[Z��_�"���[��>�������,�im��f���[�eX��{���;���<��������|�n�*�����tRr��IYy=`}�SO=5�b1�B!3f������I�&-�'N�����3f��:��S�(1���X,f�+�d��������/��;~�77�K�{��$�nN�����T�I�O(����rJ�w��$)
2dH�����n�)�-�q��E�r��7f�-���a�R(�$l�AN?��:��6�t�9������s��4^/l��j�m�Cr�/��m�:!�Y�
`U��q��~���c�=�p��
�|��������s�9'{��G��n�����i��Uf���I�&��W^�O<�)S��X,�P(�X,�Y�f������I���4��^q��L���+�-h�n��������j������'�q8�Z
���N;��n�!'�xb-ZT*�����s��w�����r_�XL��|��Ms�M7����`�3��W3������_^��;=~Vm�U�&��;&_�j]'j�ku�Q���W�8���5*�B������O+
��b��^�z��;��6�lSo��T��?>�~�����;��uO�G��T��~$�|�>������N��~�><�^{mz���b�Xe�U���~��������a��_���/���?��R�Ws�m��{2c�?��}��&�Y�eR��V7M�4�����SO=5}�Q�y��|���:ujf�����[�}���d�M��.��s��
`�0���3z�}������6�k��I��q�������VI���X
�VB��]s�QG5t�5^q��L������>n�g^�����T�o�I���! �\`�J�|�������8o^����Zex��VY~Uh�<'��w}���,VYG���]Ti��dH��2f���BY����C�^�z����C��,������}�Y�����3f�S�,�j�"��G��`UW��X;���92o��V�������i��i��]6�d�l���i��YC�\aC���������g��%���C����w�1�������Y���s���w����3��y����#���O�.]j�hh��??S�������{��.������rOy�����X�)�ZA,��!C���g���Y�`�r�q�	'�A�U��i�r�������g�x��|�����6n�8p@����f��v[�{F���={�T�b��B{n������?����[�L���o~3��~Z�l���>�����G?�]w���.��P(d��v�%�\�]w�u����V,S1mZ�_}�����+}��bY�*�5i����+X]�+�����;wnn����p�
y����x���:o��%��l�s�g����������p�	��o�u�Yg���k���9��#��c�-��Fm�|0}��]�lw�uWN:����;�sg�B�=��\~��)
�}Wm:th���Wz2d�
��v����d�a�e����������_�)m��r���$_�FR��>R��iU��)o��W3O=�T�;���7.��&}�P(�X,��Du����w��W�5J�����z�e��E5jTf��Qi���o�;�����_i��U}E^f����>����^z��z�&M����i��1bD���Sz7b������y������/�]w�}w�>��TTTTZ���S�u��I�&���>*��X,����<,��W^�_	�o�~�T��]���
Q��������
V7
���?���t�A���X�����?[�����b����Y���m���c���]v�%�[�.�[�dI�y����G?�3�<SZ���r��'��{�Y����{��s�9���*g�yf������\p������v��%I.\��n�-g�yf�M��$�<yr�8������i����z>����t�I�����j�\y���}��Kk���~���{����_����e�]��/y������^��{���������y��vQ�{5I�� ��M��]}�jS��662-����g��7��3R(R,��W�~�����g���o����>�����+S�N���C��SOe�����}����g�Y*?4hP�}W]�n��2e�����?�1������8�d���~������*�?������2r�������<h���x��+��&���N����%K���n���}��U�:4_���2}���������t�I�{�1���o�����������:����l�X�i��V���W�^y��wR^�p=wC�M�~�J�C�I��},����������/�-.k��7�#��X����l�k}$�5���S�`7�&����T~�$_���3l�����?�)��Riv�}��������??��rKF��{��7={�L�X��o��[o�5�v�]~�$�\rI���O>�s����Q�F������v�UZ�����*�
����*�_����_%I��}s�WTZ���K�h���:th�����s�&Mr�M7UY~�$�B!W]uU6�d���|�n���{���y��J�WI2v�A��_m�u�������C8��(��A�X�
7�P*��a�r�u��q�����P(��C��o�����+�b1O=�T�����e�U��&M�,��F���s�����#��f��2m���{����B���/��s��t�I���G�y��Qy���k���?�9����:*}���qO�f�r���WZ[�
� ���['��Gy�s�L��wK�S��[����^��r_�^���K�:4���ZVS
�j0d��L�6-�b1I���`��i��ex��l���)�y��'r����f�5�.��R�y��)�;wn���������K��Fm������r�I'UZ����k����Vz>����)��G��-[��_~���7n��B}���S�����d���������}���O�rO�6������@]S�U���z�����<���O��K�,��]�������4IR,��_��vB�a��k����3 ��z��J�{���2�8p`��������><���~��e������2����b��Tnh(����y��L��w�o-���=3l���B�*��uv������SP��)����)S�$�B!={�L�&M��)
���������:(-Z�H��9�R����G-���C�H��7�x�����R%���n��M��������'/�=;��C�������w������L��w3z�=��?�)�
�qyo7"���R�{ZuL6�7)��XM)����Y�J���kW�L��-S,�$3g�����M�f�
7,=+&Z�3�<S��G�U�-�1c����_�3�<��C�V[8�,-Z��������o����6m�^�zUZ{����������S�|u�@}*.Z���c������a����o�<����1�%���GB�>�7t�UY��-K�-ZT�L���3{��$�-\�<�Z�*��0a�J&\����������/��>�h�t�����/�n�
7��r���f��vZ�3G�������7o��;.W�n��e��a�����g�]w]jn���K�[�{j:���?�������^Jq��$��F��v�_g�z_�v���&�zU�X��5t�UY�N�J�g��Y�L���K��|���=���LK�,Y�tk��~8O?�t��O<q��?~|��WI2r���x�������s��=z���4iR���]�.w��������o��+u�����k?��q��Y����c�����vq��Wm7Hv���+X��7t�UY�>}�$�b1c��IEEE��*w�m��V�����b����g���)/���������1cR(�$:t��X�L�:5���7*�z���a����'�x"_��r�}�e�]w�qv�����[�l���}v�g����>;�h��,X� M�6]�s>k��I�]�����������K�d���f��/��f��2S����]��r�&��\O����o�y�6m�d���>|x�����{����$����s�5��[���Rg���s�9���B![n�e��j���"�w\��[Zk��M~���,�9l�A:��������_:w���-[f��������O��k���#J{�N��C9$/��Bz��]���-�j���reK�����xfm���{>9se�����\r�%+uk�Ec�d���g���&��7�n��U�g�q�d�#�+!���:���i���i��J��=��R3|pZ�n�B�P*���/~�3f�f�y��r�!y���S(�$���~��~������9����������?�[�n���M�6y��3j��\}����W����{�M�6)//O���v���s�������.�(ee�������s�q��X,V{����+=7i�d9���>[@5o��:���������0��T~UL!�;�^m���K�~W�u��J44X���(�~���z��y���?H�XL�P������?;vL�.]��c����7=�P����;��J%Lk����7���~Ui��s���G��g�k�.t�2�y6j�(_|�Rw�������{����Y�J�.\�|�X�`A�g��]������6-3&�����������~I�qz&�?��=�{$[9i���R������;���r����X,f���y�����O�J3g�uV}��<���)
)�Y�dI&L�P�)
�wx`���o����rn���|�����v��'�g?�Y�����|'��w_�z����-����|�+U��j����������y���xfm���{j�ky�~��9����k�����C=t��f�W\�0#���,=��6���y�����/o���;����P�����B�����k�x��,\�0I��c��f�����C����fn����z���������������f�����	�
�����A��X,�����/����/������:�R�O<�����|�,>[ 5g������{��ky���|yyy�5k�\gTe�u���������f������������G��
�_�lY��������gB`U�kl���;��Y��p�
��w�����+/��b&N��b����_?����q���6�����|��~��Y�xqim���������Q�z���{�P(�J�f�������[�nK�~�����>Z��>���2����;v������r���1���2�����w�$K
M���/f^��U����_W~k;X�l����V[m��1VY����s��g������������K�&M�5K��-��]�L�:��6y��*�6�h�����J�������'/W�����+=���������}v_m�+k��Y�����E��$�$;Vm�U�/%�]�4mY�!�URYC`�����'���_f��]Z�����~8-[6L#N���+=/��E>U��������a����d�����+�������$o���2�+c���K/-�_Mk�S��nL����j�lw��+��`Q/���f��i��>}���GI�6m$����3e��Jk�:u�v~���������/�]���j,XPz���s�]w�e����_���������{���`e����|����z����{�*��nP�|��/�2�`��J��`}��^{��#��F�����+�&M*����3�=�X��Su��_�T,U^^���_���<���c�=��w}v����v�w�����W�y��9�\�5g�������B��TnXY�~����"I2���y�������U��zz�����;�gB`U��sl��v�r�-������0aBC�Y��?>{��g��[Z���k����k��
�,����T�y��vJ�-�����S^^^z<xpF�������x����9���|��5f���w����g����n�t��e�������e��'f��O'If�����z%�nxy�����lQ}��S����s�=7��u��������+,h�X���S�f������Jk�:u�c�=��={6`���W�r�-��=����o���L�X��_��w������#K�=z��^{�U���}�k)
��;��#o��v�{�������g��N>�����b�[oe�>�d�M7���u<:��W9����M�������D�2*�Y�dIy��}��Y��s�i�����o�h��Y�fe�}����CKkm�����>�>}���=�=�Xn���,^�x��<�������%K���:w���N;�s�^r�%)+��ln����~����6,g�}v��/�0M�4���~����#�(=/\�0�
���3��/���w����{����F�k_�Z�����������gf\����vc�A����l���:��X���b��C��v�}�<���)�)
I�[6�����W�4(�|�w��`YW%���{\i��K/�N;���gm���i��]��n����t�I���k?��|���f�m��M�JsK�,�+������:��zk***J����r�=����[�<���7r�u�U���{��^)��E�����%g�yf�M�V��r�-��������s�y�����V[e��������*����3`��������������{+�����r���/�7���C��_�~��!C��o��
���Q,3���3��kS����7j�m?!K��r�N'%��4n^�I������(�Z�G��M7��[o�5���^�TY�U(������O�W����lYuA����?�����OV*|��O
�>�k��i��}Z�l��3gf����={v�9����|�[�Z�<s���n���W^y��z�&M��g�4m�4#F�X���;�������n��w�q�9��c��L;u�����g��I;v�R����o�7���2�SWV���|�<�TF���*
�3��A������xd��G]�t���lU��)k��W#��w��^�������������6m�T*�*�����SO=��N:)���~N<��<��
�~���G������/��a��UY~��s�<��#�U~�$-Z��#�<�=�������3|����?�Y��
7�0O<��r�_%�QG����/i��y����'��W_��1c�*�:���s�UW-�=�Y�������������������j�=�.��|�X�i��v���^�	&��;���F�%�oV�����3'��rK�=z��/�{������H{��G.���0 �[�������l��6���k����g���+to�����c�������o\��~�����[�b�-V����>:C��1����W;����f�����/Y�{V��_�*�w��Yw��$Y��S&t�j���:&��?9����v��*��bC�X�M�<9��zkn������I*�a}�y�w��'��#�<2m��i��k�b��>� ���~������g���i��e��k�n��e�v�:��S�w���[y���2~��,Y�$:tH�~����;�XZ��f���g�}6���^f���f���{���y����k�Z���:4���+=2$}��m�D|�bEE���1��eQ�6�����tt���;���z��U�FV-2dHn����v�m�0aB��eX��n��i����`9�>�j���f���������O�������YU���b�}�d�#�BY}�V����������/W\qE����~8GqD�6mZ���X,f��
����y��|��6�|��)&��z�j��6�|��d���_+FuI)++�����;��#&L�W\��M�6t,�*���_�E��$�{�,/l�|�sMZ$�U���5QyCX���<��c����s���g��
	��y���i��]f�pC����8#;�����N6�3i��>k"Xu`��a��������%���O��2�B��������33z��S1sf�)��.�����HE��K��^7�����Q�8
�j����n�-7�|s^��$�-�J�B��B�Pz����A�5XV�$������93I2f�S�N�_U9��K��_W~�X+a��Ey��s��7����g/^\e�U�XL�n�r���g��A�d�M89�6��������2��W�$��Zf���T9�^�����g:`m�k��������s��wf���IR������-Z�+_�J
��w�=�B�S$Kf����~5Y�(I2l����.�N�P���r}��
������s�-����o������r��'�WI��n�e��A��W��V�Z5Xf�O+����S���Y�7���gV9��.��%���gB`m��s�p�
������3��X,VYzU,��W��p�	9����G�N
P���_�����Q����e&�?0v�����(xn��]=��
�>��'�\*�JR��j�u��G�A�e��wn����t��Y4jT�)������w�r�I�d��+����e�I�U�P���3h��v�ai��YCG���)S���72��G�$3Zm[m��f{&�_���/P���,�b��>}�d��A9�����K������<�x�p@�fqY���������j�7�S�P?T�|�3�8#�
�v�m��Q���_�2���$�6�u����*�6��l�k�����X�)�����o:�rY���u�}����)&Y��M�u<����M�:�^�(�X�,3&n�}*�M������>�en�M��-o��;��D�e�#��b��$��=~\m��ng$����Z���K�`��)�v�U������Q�Li�{&v8���u�O�=*)�9$���`
��W����gay�<�����l�*���J����+�a)�X�U�����'I&v8����nJ:l��5��hU*k�����<�1���E����
~��6����N'7R~��:+f���s�����y���2��U�m�{��iI�P���`55��������]��W{��l}X=�e
�����3��C3���3z�����V9��E�k�z��:�g�q�e���gV��3d�?V9���d�=����s8�e�`53������yF���*���>���z�`���n&�zj��V��9,����T�5[j�Q�d�c  �rP���p�)����)&yg�+�,���39���e����<`����?��v�L[g��o����OP~�`���f�i�e�_���m����/�r��(��_�������`����tSf�pC�d�f�U9��C����B���$X����%���gb�����ga��������+`��`3��k3������6y������`�������7@mP��
Y2cF&���$K�db�C��i�!9�w���6)�XE��,1"�[��w�_��w�rn�}�9@-S��
�y���x���?nZ^�aB�4j��L����l�{�E
�X��w��Y<�������*I�IY����pu@@[<fLF�=5���y�eM����}�y�zPG`4��'��c����/g���-�:��d���BY=�#
����(3����}-eM�����d�����)�h ��&�l?6K����['�U���CYCX���L������C���_��W:L�������E�	P�`��y/��I?�"�l���rf�}:�q���P��:��d���������[V�~�=�O��P�L@=�v���z��5e���}b�3'��0m�7��`
�������N��qv�|�Y���I�3�����@��v(o�k�9�����|!�[nQ��;$�~3)�$�
������3�������d���rf���f�mP���,�:2��A���&����lt��+`�����6j�����U��`�d�}�
���H�X�l�]we�ft��W�~���g�+7��T�����&�������.�������6U��>Q��v+o�k�Q�
��[�����K������;�E6����B`��y��wf=�@�yr�TtY���Y����) �*F�J���������j�����*g6�o��_$Q������b���r�4jU���''����S���:���XQ�y�����hTm��'�N'%�M�9�*�����F�f�y�"�m��*�7i�8�y=�X�)�X��O��o����W���~��Z�&-�9�j@�r*����{���.U��s����{�s*���,X
}��y���2v��,\�0���K������4k��������7�8�4�f�v����d��v��\�X�����s�e����^��}�V�r��'���.J���9����������S��-N�<�i����L����|������a�Vm�U���=;���������������k��}����
��s��6��@�!X�������G����/��5j��={f���N�6m*��<yr��o�����u�U1{v�w~��wv��mU���_�R��V_
�`��_�2<�@���N;-�G���#����g������{��{�����ss�Gd���y���w��C#.�km�X�]�V3����lw��
�`��VaS�L�O~��Jk�_~y����t����VVV��;,�?�|6�p�����c��_�������
��bY�*�}��7��/R(�s(���,X������Y�J����k�;��j��v���������W^�)S��Y�5��������M&w���:� �����S��`�*���"7�pC���/�8�B��}{��gv�e����Y�r�]w�I�5��Q�r����C�]��^[~����=��5��d�?X��z���3y����Fm�,���O>������_������~�����w��@��c�o���S�`�*�����<p��
�e�;p��J����9sj-���X,f���d���U�o�hB�;x�zN�fQ���7�x��s����yo�.]�����.\�a���R�5W���yd�_��������^�}��cr�E�t��
����w��e�>�{Of�I#�����&�(�$A�HUA,@=�����p;X�"
((�w�^�J !H'�g�����c�N�I&�S�k�Y����r���n�
�`55r����������������r^���,����g���9��>�����`-�VCs�����c�������3]��k��t����W�/��..l�$k7X��<yr��bi\SS����7����{��'N��$��f�X����������7s��Wu���9sf��M�6)
�:�m���<��&N��I�&5j��Q�V������
��]<�C��>m:nY�@k)X�Z�������g�n�z�g6��~��6l��X�u)��)��J���i�q�
&X;UU:���s���[�l��3Z�jU6�3g�JeZ��Y��A�>�[P�0k��JW[[[6���k����[��,���s������P����0�;����J
�`5��]�����s}��9s�yfc�p�	9��C�g��Q9��W������~���	
�`5�hY����S,S(|��Y��yfcu��=��w_�3 Q����]��P(�X,&I�����'�G�
>c��qe�J�W��7�l<j��f����/���47X�j��u������~�47v��F`�;�l��O}���5�;��S6>���=�{��w���[W�����,���U#F�h���#G.�<�X���r�-���?�x������3fLi\SS��6Q2X9��,�����.��4����R,S(����{�)2$���k����������n*�����V�Z5{��5jT<������n��o\�@�:�w��|*�w��|*����|*�w��|I����w�y�4�u�]+�F��v�i�t��5�'ON����[y���2d����������p�*��<;v���Ma��7��A�*XG�.T��"@%�.T��"@��T��"@%�.T���]d����t���J����*���7���
�b���}��}����}��9��CWEDX!
�`5���(���+�~��\p�K]?n��|���.�;����k�U�K���v�����es��~zN8�����{������t�M�i��2f���|�^�r�I'5W\hX�����~�}���l��K/M��}��Fe���N�.]r�Ae����5�[������t������)���\UUU������/�_�pa�z������6mZ�g]�t�w���w���@�(��5@mmm�����p�
�r�-���m��9��2b��<���@cTW:�p|p>���5*O=�T������t��1�o�yv�y����V:&,�,Xm����x��+VHU��nQ�@�R�@���t��E�n�r�Yg�����"@%�.T��"@%�.T��!@%�.T��"@%�.��)��b�C����t�-
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV
�hV�����M���~�4���OZ�jU�D��y����w�)�w�u�t���by`���?�<��1X�M7��8�b�WU�f�I
�hV�������S6�������W(
��k��Q9��K�E�a��,`�i��U�x��7��A�*���-���`@-�:5�^y%)+`�Q��_j���t�u�,���7��q��,\X�(��n������V����J�u����S~�:IT����+*�����T�k�B����������t�u�,XMlp�Mi��n���\U��nQ�@�R�@�R�@�R�@�R�@�R�@�R�@���t��M�XL}}}��b��k�B�����
�JGiv
��u^�X���s3c����1#uuu���CZ�l�����}�����]'
�`����g��������+XG���e��)�2eJjjj��W��i����V��J����gg�����������3v����=��QV)X�:����b�X�(e���Z_�U]���X,����[�����&���^��k����
�
%��b1������33}����?�����{/m��Z��H���;wnY�L��o�>�{�^+�f��WMMM��i�n��e��q�1cF�����g��y����`�U�����'f��
h�_�T(��w������O�>�B�V-X�:g����[O�Pq�B!���^������
��uJ�XL]]]�\�v�*���������R,+�f�Q��S��������@��UWW/6���[k:X�:�X,.6W(*�`qUU�WC-����N�J�J�J�J�J�JTJ�X�P
�hV
�hV
�hV
�hV
��fw��W�P(�~����JG�)���E�P��,`��`��`��`���+�d�<�L�x���7.UUU�h��2d��t��a�������{,#G���3��S�|�S��.�������9sf^y�������2eJ����:�k���z����������4c�����y���2m����7/m��I�N���_�80=z�X�{V���c����f��	�����C����3;��sz����w-\�0O>�d�����?.��A�����6�=kX�=�P�R�u�Y9����p�������o~�������k��M������s�Immm�g3f��y����.�,��O_lo�n�r����[��V�2�������ks�]w��g������g��9������?�:uj��{���s�y����oO]]�2����?���O�?��8�4?f������{�9��s�1K=s�������R?������^�?��1b��
�l��69��3����/�>v��gg��a���>���g���9���s�5�d���e{>���*�ZX��f��A�{��w�kf���/�0O>�d�����n�:I���of���^bi��&M��o��y���s�%�,3�m��������������:+�����+�m�]������_~�������A�G�����7���C�;���[QO=�T�8���=z����b�}��p��o��r����m����o����g�}��{��h�u^U����X,���/+����W��v�80-Z�([������OL�L�81C�-�_
�0 �m�]��]���/����u�y�����\�������f�m����n��������nh��q<xpF���w����s���/V~��}�l���q����~6}��I�PX�yM��[o��!C+�j��e6�l�l������>������
:t�����;���_�bY�U�����6�d�M7Mmm����:�z�K�$����3f��$�G�3�8#�o�y��)S���3���~��������|����)����c����6��zj�?����������^����Gy�4w��'��CMMM�R3�h�"{��W���:4X��j�����[r�9����_O���=;Gyd����W��7/��zj�����O?=[o��b�f���g�y&w�qG���������g�<��{���^X���SN��{���������^y��v�a�3gNin�]v��~�����neeT3f��u�]�3�8#&LH�<������K/�t��.��SN�����E�{�������l������������
>o]������.�('�t�b�w��%���o3g��\q�I�b���;,#G�L�v�r�wd�]vYl�f�m�;��3�n�mF��$?~|n���x��K���6���7���n�������W���|��9���s�w$I�����+{��������:uji|�QG����Z�=C����C�����y��w�>��������$�}6p���g
�`��~��e�W��
�g���B�����;��N���/e��!y��7�$�]vY�=��l��V
�w��	������^��|�+�}��u�F���J@#���p��J�Xk���%���J�X��;l��W�t�y�����J}}}��
�~���/���cm���g��#�<�4w��w.������^[[����/0`@>���$�W\����_�l|�	'4���-[f�����7�pC^~��������r��g.w_���s��7f�-�,��\|�����k|��'����+N@#-�2%ot�^�k�M&NLu�n���D�B!��s�r����+�n�m�~�����n�o~������~�����T���/�x�%���s��{�\w�uI��|�k���S6���i�,+���E��M�69����w�-�����_I��o�9.L�-���M�69�����r�o��f>���d�M7m��O��e��:�AK���K�~�J��c�6*cC�����<n��L�4i��z��U6���k�<���2eJY������N�:5��=����<s������>Yo��u���tXSl��6
^��K����[o���o��V�d���
�3m���x��y������/��������3{�����<yr�u������C��E�,\�0Ir�%�d���9���3`���OS{���R,K�m����g����l<r�������7�.WU���XRI���i��I���3g�kg���SO=5={������\y��y��2~���_%�g-I�>}��o~�l��K/�Fm�m��6��vZ����L�:�A�4��#G��O=��
�F����>eg4�����d��.��t�5M�.]��������j��K�#,UmmmE�.����3t�����K+u��y�����~���?>��zk��s�=���{.\pA
�B>���f����W���4h��,��)S���?��A��[o�&�{]���
UU�����1 �r�b�W}����!C2p��l��i��]Z�n���������:��_tGmmmn���\w�u���~����/��X,f���>|x�?�����>��/~��7�x��oi�M���g���7h]MMM���.R�k�[n�%=�Pi��}�\z��9��#��������o�]�B!GqD�8���1"��{oz��<��c�<y�b�o���<��#������.�4���h��M��?�A��g��:s��+���Q�k�����l����>GqD��N�:u��8p`�O<1�b1���j�����p�
y���J�f����|�+y��7��]��oI�v�Z6^������7��Z��hVKO>�d��K�.9��C���W^i��B!�o�yN<��<���y��G���&N�����/Mr�'����l<j��&��UK��&L�Pz�x����E���>}z�{��U�i�]v�������=��cK\[UU^�T,|��!C��<�@���zP�k�OF���5x�������;wUDJ�����e���'/q]��m���g�n��{���?�����7���w����T�,��O�G����g���+���i��-w��q�2l��U�j���N�:-q]������G�n�=��rJ��?�A>���F�A�(�ZC�7./��R{��<��#�!X����N������~���\?i������
*���g��k��&,h��b���/��ln�m�Y��A���o�����?�������������g����{����3�������*\pA���4`�������?�9���O:u���}�f�-������!C�����[���o�=W_}u�����u�]����r�QG��/���}��y�����g����/�<���g2|��$���o��;^z��|��_O���s���������)S[W__��{,{��gn����|�6mr��G.���������li��o�s��\~��_���n�}��W�3w����-Z���7��:���x��|����Yg���_}��N�0!��v[����+�{��7����9�A4��J`q7�pC����g���I>j���B��������g��$i��U����8X;���������;���4w��W��������[�L�6-�G�N]]]i��G�M6�$��
k�]'N�e�]��.�,I�����k��i��mf�����Gg�����������w���{�I'�y=��sy�����v������_��f�m���_9�����$I>����s�99��s��k����3m������3y��L�4�����SU������;,&LhT���N8������X,f��y����WUT*���k��~����z��<��Sy������?��\q�+}������^z)O>�d^z�����Z�n��.�,�w�2������SO=�A�:K3d��<��3�n���l���y�����SOe���K,�*
����
���Q��9��s��_�2�b��c�n�r�a���SNY�kI:u������4����VY^*�c��y��Gr�g�C�K]7h����o���^��-[6��?���������>8=z�X����;�������#�_��_
���.����s��'����|�w�����gL��6�(O?�tn���:t����E�|�s��9���Q�F��s�m�}��B�!�J�r/��R��j�R�Ummm.���|�;�Iuuu�����T�u���f���K<��k��QG�$i��}�N��-Z4�[@�W^y%����K��_~9�
�`"X����GN�X�����]�;@�Y�`A�x����M6����k��s���'����#���e�����W��n�l���Mr������k�������~�����k�.��u�[l����,��=;O>�d�y��L�2%s��I�v���k�l��f�|����m�J�\�U�;ju�����KH��q����O��l�2w�uWv�e�:k��v*=��93o��F>��O5INVO���2dH�������������o*m���PE����J �5kV����
�
��|��+\~�$H���K��#G6EL�&�k5�������.�b1I���}o�����g�y���+}@SQ��x��w�$�B!���++�ZQ;v,=O�>}���
�N�B�j`��������7��,(=WU�kV��Vm��-=��5�I��d�V�.]��L���k5��{�$I�X�;�����M�81���N
�B��g��+}&@SQ���|��K���O���?�R��r�-I>*�*
�a�V�<���k5���|&���~
�B��7���
�5��\t�E)
)
�b�-��K���
��`�&;������\}�����{V�����y���S,�$�����2&�JS�����������P(���>_���������?���y������B��$Y�����|gUEX!
�V]�v������
���=;�~x>�����C�{��$I�XL�����y��gs�u���c���n����>�b1�b1-Z��W\��-[V��S]��������3&?��OS(R,��O��'�([W,s�1�,6W(J�.��������A�*�r��{n.����n��4W,�
�>.���'Ii�u�����k����Bo�l
�VC�sL^z��{�����-�/Zx���-Z��v�a�����+�%���.������y�������f����2eJ�M��6m��k��������w�=��w�t�����s������W_�|��-[f�
6�;��4�]o��f�~���������K�N���O}*;��SY���j�w�UE�j�S�N9���r�AU:�
9���3l�����G��+�l��I�&e��a���+3k��%��f�mr�g��X�lIr�M7��s����?�����k�o|�9�����k���9�	V��J����Ce�����o����$y���r������N]]]���7o^�������Zj�U���93���o2p��<��#��'i�w������c�=�/}�K�<yr�|����V[�_�~i��E�gW_}u�8�����S__��;,��_��[�h����g�-�L��>�4iR��{�<����;@s��t�-]tQ>���6x}�^����>�a��9s���6�p����������B��$y��ws�y�����}i�?���\r�%������u�����o.�;���r�g��������o�~���;6I2{��z��y���+���;@sR�E��f�m2x��&?��/�{��W���?�=��bZl�A.������7?��OJ���sN�9��t��i��L�2%?��O���?���v�iesUUU9�����������|�����������6l�j�N��`����b^{���;6��O��9sR,}�QG�
��>&M��_���es��+����O?=w�}wy��$��~��.�h�r�E��g?��3J�/|����~����{������������K.�$�����.]����M�j���o���_�{��'s��Y��������.3g�,����/d��v[��B����:�l������w�y)
K�S__�+���l����^������n�e�]����&If�������9���+�NP	U��L�4)_���������o����S,W�'I��v7�|s��[��V��
2$���/����'�|r����L�4�40`@����t�M7-s}s�Pa���R����:ujv�u��w�}���B�����+�W3g��#�<R6���{6ho�P����^6w�m�-u����^6�c�=�w��{��z����5k�k�����+���|��y��WS(R(R,��C������b�-��K��i���1W;���J���_���?={�l���w�9��K����/u������N
��W�^���_���$�����#��v�-��9�	*A�j`�����_�R*�*
9���r�i��U�V����������z+S�LIMMM�t��^�z�P����#��l��E�/z^S��q���-��9�	*A�j�����S(R(r��g��3��t�U����n�z����;�l���:�l�M��{��p�	���[��{�����}��iT�E������;wnjkk�������c�6�]�f_���z'���J y��w�$�b1���9���+�h�1b�b�WI�`��<��S9��������3�����{�����l�A�����#����������)S[7y��������&��wo�]�{�./�}i����Vc��I�P(�|���t$V���/aU���K�
�l��&i��u�U��9sr�����G�����v��-u���3��m��m�]�B!�[���3�z�����i�B�������{�4�����&N��I�&5j��Q�V�^�>
�V=z�(=WW�}%�B!������>�d������o���;���*S�L���?��n�-W]uU���[���C�����7��-Z,��E��jkk�oE
�V��e���w5u��~��6l����J �n���$�b1���N��4�=��3���j�����?�qv�}����;�[�N�V���W�����������od��w.�����w���R��daV��l���[�jU6�3gN��i���u�C=�B�P�9���+�u�����A�2p��$��������V8Q��i������6h�l����/�������;����={�{jkk��uuu��8o��e����4�]P	���G�
�C9$Ir��g��;��p�������W_��7�<,H�L�81��sO<�����k��l<w��F�9g��e����4�]�q�	'��?�P�F�Z���6X���>8������?�)w�}wN>��\t�E��Uo�q�������,�5�k��Y���X,�P����S,S(|���Z�������w�������9PU������{��)����K2x��<��C��U���[����^[��E��}��F�3a��,X��4���J��][��k�������g�����k��qe���I5�;@�TW:�Q(r�e�e��!���G}4���[:u�����*��uKmmm������WQ�U�O�>e�I�&-q�f�mV6;vl��Yt��n��?���[�o��y��������c�����>��u��N�j�P�th
�V3��M�s�=��s��X,&I�N��x��g��5�����l<��%�[�Dj����g����<o��>Y�5b��l��vM~Ws��r,X�'�|2/��r�N����[/}��������C�>w��iy�����k���>H]]]:v�����g�����n��o���M��'�x"���~&O�����t��1m�Q>����{��+}�k�����z*���^Z�h����g������o�o@sS��y��'��/9&LH�����������u���u�
JMMM� k��1y�������7�����e�-��r�k��r��}������?���>�A�����3fLi\SS��.qms��l=�P�R�u�Y9���3�����?��_�I�&-��U�V9���r�E�w��
���^�u�]�{��'/��b���R�0 '�xb�����u���<wi]6��
��a�����������y}}}������W��3�<��.�����*_��Ws�1��S�N����{��'?��O����.���7�<\pA��o�F�KeUU:y��W��^{e����_:�bq�~�d�=�X��O�>K\��}�|�_(����{tG�X�}��W6��_`���o�����k���=��S62dH��k�����N@�M�6-C��i������$�7o^����80w�y�r���o~����:?���2|���v����[9������f��Q+�+��W_��[n�#�<2O>��R����zQ����t�I��/��{N=��|��_\j�U��92����=��F�MeUW:��w����������b��k��������?�.]��M�6N�<�M��o��ln��v[�����?��i|�������Z�=>�`F�]���#;���R����N���k&O����,���4�_~y���X���z'�q���s�!�����wi�K�.���o������Gg������O��/�����;��U��=k��}z���:d���4iR�y���5#F��.���_|1��wo�7\�|0_���3m���>���[�_��l�2S�N��1cR__�B��v�i���K�����o��i��u�~������<��4(_���W�>���������|0�B!�b1�;w�?���|�_�t��8����~��l�2{���R�~������Y�f%Iy��<��:t�R���6�l��c�IUU�R�TUU���F.������a�2x��Rq�����y��GK������C]���|'�q��������I����:_|qv�u�R���3����-?���J=*s����G��#G�c��K=�U�V9������f�]wM��}[3e������������{/I2~��|�;���7���s����$��/���O>�4���=Gu�R�|���]ln��19����:bZ�j��}�{��7������9sf�x���p�
���������#�d���I�v�!��{n�����j���b~����y��WK�����;���i�/�8�������b
�B.�������������s�5x��r�I'���//�?�������/u_������}�l����v�������y��GJ�:��SNYn���Gi��]i�����.X��q������v���'���]�.���|'��>.������'�|2�.�_%I�v�r�������N���K�����O~�������{g����������}��WI��K�w�qy�����6���o����1b�{v�}�����e��d��������S���:��#�����z��3�<��.�h�����<��c�������o��<p���q��7��������{�QVjU(2x��<��#���Wi~��q����t��k50a���s��s��W0M���������f��w�/������Y�`�b�>���\{���n����������6�(g�y�r�:��S��g��x����i��r�-��X,���}��w�q����'?�I:w���{�v�����es��~zN8���r�����t�M�i��2f���|�^�r�I'-���|'�q�_�\w�u���Y��M6�$W_}u��W\�?�p��
TV��<�:u���^�����]y��
��"����<���q�V�r�]we�-�h����;g�-�l�}�n�m���?�E�K]��[��q�esw�yg���r����U�}��I>j�0`@Y���������?���_Xl�A:t��-Zd��)3fL������g��y������r����s����|��_���s�|��x��c������M���c�f���e{8���|��
~���Gy���s�m���.�������n�:d����6mZ����[���{:v���{���h�b}2g�=F4���B���U�������,_��3t��<��I�9s���k��q��$96�d�l���y��'���������(�z��
.�Z��s�2K�>v�������/����U����k5�������*�d��7o^�|���������+���Q��_��r�����C���SK���M�/���=Gyd���?7�t���*���?r�1�����+�/\�0o����t��%7�pCv�y���4�;�8s>L.���)�^�����T�KVSS��?����>��RV�<��CMV��$���/`-���)��??=�Pi\]]�N8a����C�|��_l����;�o��;vl���w�Ye�h:�q���c���K�-R,3f��,X������O~��w�q4hPZ�h�������!���~8��~{���>6t���1"�|��i��u[m�Un������M�V�}Ommm�����p�
�r�-���m��9��2b��<���$��N��}�3�I����~�����~z�{&L��_�����W��-��"=z�H���S(����kK�f���9s�48[c<���ego��V����*�+I��z�TU5�"��}5~����D��t�^�ze�=��]w���3g��;��~�����{��G��c�$�b1bD�����?3g�L}}}:v��N�:e����b�-T��<=z���~��\|��y���3r��L�6--[�L�����;d��7^�{�������Q�F������q�RWW��;f��7��;��������9�	X�O���Z��o����z�>}z�����N�XL�PXl����s����������W(��i���u���,o��f�x�m�m�;>���V
��m����*�i)�ZM�y�����{S__�SO=5C�I�v�*���i�&�n��*���I�[��n����v�m�����7KUs���.]�4zO���KX����>}z:t�P���7����������T�y�������:uj���U�U[[�J���`�&v�q���W�����������g�}����==z��t4`�;$��Z�k�����R��i��=m��-��9�����._���+��d�M����f��6K�����m��n�:�B����/�=����L�5c���q�v�V����`�F�?��t��5�{l{��4('�pB����d�-�(��TN�*i���)����g7z��Y�����G]v�ey���K�=z��+��^{����/���F�Y���/��9�Y�e��k51`���s�PH�X���S����4?��OSSS���;����Q�
�����M`�4y��F��:uj����*���^���]w]��_��W>���5��U�s��e��'6����`�&��S*�*
)
I�b��$�������}�������2`����/7j��o�������n�aY/L}}}�y���x�-�lp�U����+����6�d�����>�,�����t�-ZX�q�����^z��L�:���~������o_6�2eJ,XPo��f
>���_��q������r���r����:m��)�_x���?���aQ���G�����
`57��\w�u9�������*����e�EK�����V�RIDAT��w��]��&I��m���g�n��������n���[�$,��~���s�9��S���3fL�#���w^�����}���\w��w��(�[�n�#�8�lM�.]R]]�$I�|��,X� ����>|x��:w�\6=zt���x����$���~�C9$[l�E���$��tX�����9���3����5jT�:������>:;v,�k��Ev�a���/���e�?j��p���I6�p��k��4������4x�n���]v��4�7o^��k����K
�?u��>����vS�
���&I����|�s���?�b�X�|��Y�������>'N,����#������3-�:���s��'��O���'���/���n��c��P(d��6kp�������n���i����;��.��7�������gI�X�\sM:w�\���{�~��s�)���W_]l��Y�r�����c���n��n���yY�UW:������s�g��]tQ�Z�D���:��<������{��s�e������K6�p���;7�G���9s���j�*�\sM:u���3�9��\z��>|x��X,���/�%�\�M6�$;v��)S2z��,\������O��q���k�58����r�-����_=��v��>���<xp�\��}���3x`�M��$�;wn.���\t�E���{�_��l�2S�L��1cR__��|�;�*`e���+>|x���^{-;��s�#�����?���|���/�M�2%�?�|F��X�U���s�
7d��w_��555������&���������^�SO=�Q�F��_����O�;��F��u�]��_�2555����3���g��7_���'��_�3�<���zK�K�F`�h�"IR(��o��j����X�u��!<�@�?��t��u�kZ�l�C=4#F�������3����g�y&����R[[��u;��c����\|��)
+�����~F��3�<3C�M�^���M�F�7p�����K������V[-so�-��N;����mN:��������V����_zn��}��.����i����O>9O<�D^z��|��Yo����d��!���c�����C~��_�������>�Q�F��?L�����O��������o��+��2W^ye��o��F6lX��}R�-��o~3���73a��<���0aB�L�����t��)�l�I��r���Y���/�bq��<��C+���X�����Wz?~|��,�9������g���uMeI��������.�d�]vi�3��k�������k=z���X��A���w�1={�����3n�����[0`@�c�9���S(���TH��uME�:��t��QUU��~����%�\R�4�W,���b�.�J����Y��S,����>����*i1�b�AeT�k���Qu���N�:���o�^{���'����)����N;-����t�<���M�`M��`=��#I��.�(��rJ&L����??���/��>�d���O�����z�����Qg�_X�|���k��X���X�N�P(��B��bf�������?��B�
�,X���b��}������_���b�X*��d!V�X�T$�`�(����J�Mi����m`X���:��JGhH�
�\s�5���>��g=�������V:��7�l��MA�jb��1I>*��3g�J�5g����V'U��(��
�hV
��B���/=���T0	��`������s���+�`q���������9rd�N��?�0���9�����_�J�[�n���$I�PH��}+���ZW����/���/��7���3g.���?��%`��g?�����$���o�>��&�6v����0aB��&�}��=;�G��
7����_����z�F�X����������?�e�]���R�E
������gN;��
�
�|��XbQ������23|��k_�Z��y���6�Y�6XR���J*���~��eu���*�)��=;���k.���F_}��#�L�n�R,S,����uUDM����Y��
�I���{��G��c�U��&��Z�ve���H��,6���[k�����8��<��S�q�P�A�K/�4��v[�����s�A��w�y�*�����TWW����fn���J���N�PH��-��f��Y�4��}��e�
�
�Yu�+`e�z�����[K9�l�In���|���.[�������/��R,���Og��9i��u�e=������UW]U���{d���o��UUUi��m:w��A�e�������J�`++�`���}�L�2�4�>}z�u��V��k�b��������o��BiV�5���s�M��_Z��=��C5�<����n�����3r��l���M�3I�����~v�UW��O=��:����-Z�5���7.�{�V�TD�X��q�2������[�B�V�5�k��	y���J��8��sW��*I�w��n��e��II��^{�I���X,��4�����������1#o��f�[o��k�.�������`J`mW__�d����>}�b�W555i��U���Zkt�������$�%~��+}f��]KX�'O^����+�(=4����uQ�PH�^�2v��R�I���??S�L��)S*��?��
�B���kt�����|������m��+}�z��Wz�9s�J��PG}t��$m��I��}+���B���}��M�6����TU:�����K��,�Z�f�*=�n��I�VO�`���T:
@����f�/�J��JX�:u*=�ke�?����K�&9X}�i�&m�Q�������g������t,`��e��o�>���^Z�j�B�P�H��]���G�$I�X����SWW��-[��yo��F&O�\���g�3��B���������{��)����O�X�t4`-V(RUU�N^-j�.��v�mK�uuuy����^{��y��_K�-[���;��R��5S�PH�-*`�UU�+�O�>8p`����.X���������N�PH�P��?�����6UT�ktV�|�;�I�XL�<��#��O��3f����|�+���Jg��?h�������N8!���K����y����w��?��A�����l���y��'S(R(��v�e�}�Y���]����jjjr���f����;wn��b.���\}���o����6�$���P(���o���?�Q�F����o�Y��X,�s�����k+�Vk�5�+Iv�a�\w�u9���3w��$��Y�r�������/�+���/~Q6NR*����Cn�������Y��K�*�����~y���3p����
��g�B��S,���>�4hP�z��<�Bo�nXk
��d��A>|x����e���O�R��'��>9?h��\u�Uy������V*:�:����Z�-r���������S��c�e����2eJ�M��6m��k�������^�zU:2�:e�+�����;g�����������&MJ�n�VA*�u[U���?���M~��)S��n�5���X�w\����&;��?�{��W^y�����(
���b�/�Z�`A9��<��s+}�������{f���+�	�5*^xa���l��&���K���S]]�x`�{����;6c����I��91��UW:@S�5kV��g�<���0`�
���/})�<�L�k���z+'�tRn�����$)�o�����>;����$��u��q���E�U��*`eUUU�P(d����k��2i��F�1g��R����R�m�YSGm�o�1[o�un�������}������t�II>*��4iRn���U�`E��X����R,S(2j�������={v����7/p@y��
���l�������Va�%���;r���g�����b��=zd���K�X\��n�iv�y�������*�
�����N8!��vZ���g�������������������w�}���~������O�^��!�L�4)GqD.\X�r�!���_�{�����z*IR(�{�������Jy,�_��$������}�k)�I�;��3���w��g��9��Cs��w�
�6�`�������Os�.s���f�����~��\���b�-}��!CJ�������c�$#@SX+
�����sv�}�����\y��9��3��v���9��#s�-�����_�������3'O���s�5��P(�P(�+_�JN>��>o���i��ei<r����	�$������������[nY*���O�?��e���b�>���p�
�u��w�}���M6��"��|��L�6-�b1I�����[�������w��x���+u@SZk
���]�v���;��o�R��w����z���5����������y�.]r���f��7�X�7�x����{�l��+}f��K�~��J��T���$���g����t��)�B!.�G�'�x"�w\����R�U��s��w7I����4iR��P(d�
6h�3���K�,h�3hb�b�@ET/���S��Tn�������;wnf����������b�[o��y���z��+�6���OY}}}��9u���s�N���L��P��%k��v�)��_S(R(2����&��m����n�;�P�����[�����������=;o��v
�B������+I<������N�X,�A�����[n��?��
���~���������~{��{���`��R���[n�R�4���+I�?�����?N�XLmmmn���2��������i��]����+�\��.����s��}3`���:�)UW:���h�����7o^��{��-
Y�`A�gX�������^����$?���s��G�_�~�>�O�Sx��R������QVZU�,M�Xl������9�u�Y���J�P��3��/~1c��i��������}/�B!�b1�[���'��j����+I���)4���)�l�A�����?��<\��P��6d�@4�KQ�a�t���I���=�1K3K��2N�������3�����<�p�QE�d6�������ao���\�{�����<��_��J��j����W^�G>��|�����/����%9�|��\w�u���s�gd���5��7�����R���"p@�����������+�����JQ�={v~���G?�Q��k�$�r�c�=6s�����s+�/yV�e�=��|�[���QVh�-�9rd�#4�-Z��[o�����k���RV�ef��U)�*�2S�Li����~�+_����f��:j�����i�?���������N;�,�$�WpU�2���������������6���m���%i=u�q�������w�����o������/d����9������g>��q�9���SS��X�m�X���J����W��rHv�e�*&jz�~x?���x��9�>}z��m���;W/�Z�������;g�yf��(��=������m��m������j��1f����,S�e��j�������X��jh��7�<IRE��j�*�i�/}�K����>;�{�^��^x��\r�%I���\y�����T6����^��1��I��C��H��t�I�*��8qb��`���jh��}��e��)�2���������Q��\��h
t���n��?<I�`���t�MUN�8EQT;�:�A`%����[)�:������oW9Q����W�[�hQ�$���v���o�����8���w2i�������n��;�\�hU3u���u������z�����z(/��b�M��V�Ze�m����������I�=zt{������Y�`A�t����{g���O����l��<�K|V��}�����s�<��<��s�s�=s��������>���M7�����C=�$)�"[l�E����	'��?���
����3���[���~��2$��2{�����{�����?Gu����������� O=��r��o�>_��r��k��k�Os�	��_���v�U�kk�;��r�5���k�I�^Q����e��^�(��=�i��c�g���7��+��"EQ$Iv�m�*�Z��o�}����5r��s�1y��wV:��'���G��O>9������U�5�g���9��S��?�i��f������7��_���n�)p���4���9m�X���KQ)�2EQT�������9sff���F�.Y�)���keN:���n�z��-�2s����)SR�e��EQ����Zem3f��W���&Y����?����;�����;�W�^�6mZ^{�����W�]}���5kVn������/^���;.��
kp�E����G:u���c�f���go��v��_�%��sO��o���L�z���������e?K�������7.�����q���$��W���������������og����"�$�~��s������4��������I�v����:��M�q���(�g������2u��<��S;vl����|�+
����[��_�r�����K�)�:���3a���3&O?�t�N��[n�%=z����3gN�=���X������V;@c���c��V���[��J���%k�e��v�)7�|sZ�n�v!���#G��+�H������.��g��Vk]r�%�8qbe��W�<���j����f�m��������G�;����/�0_����K���3e��\t�E
����?�w����jjj��O:���O���_)8{�����_�"C�Yo����`-)����k����g��u[�������k�.�n�i�����;,���'��E�&�������SO=�R����}-����j���~;���������LQ���{�����;s�}�%If������g��[-��?�if��Yp�9��sV8����W\�C9�r����e����g��6[/����`mHVV�USSS���������fHT����3z��$������?�O<�Vk�����Y�*�8 \�;EQ��.h0��������-^�8C�mpo���+�����3`�����I��3g��n�W�����	��f�Sh.eYV;�:���������+�K/�4���_���
�`|�)���{|pz��U����y��GV8�����o�]o��v9���Vk��3�v�m+��\g�jQ���4hP
��O>9[m�U���.�)������$�1��O~��k���Y�r�}�5�w�a����EQ��Cip����
��q�
��zh��X��=����#Gf�������g�jQ���:th���w�j�Y'~������g��s�������F���s�e����q�^���{��~�_�~
��<��
�.�l���_�}��j�l����������/wns�	���,���S�5k��L�4)�f��v����>]tQe|���Q������
�������������^�y&���jXf������.��w_y�����k����<o��Ez����}����	'�����W1��m���9��S�`��$��r�i�5z��^z���C���������g��yi��u��s����	�t�������:TSM�4�9s�����f��z��q�������c�f��E)���Y�hQ������>��~z��z�|�[����s�}�������GI��j�*�_~y��h���'On0�f�m���-��"�����x��L�2e�y���N����[�l�n����^[o�u����Wt]�	��v�S6�>�l�9���=�RVT�*�������3��_�2��~{n�������M�����^���'��Z�����k.c����������s�M����d�Y�f5�k�n��/�"m�����3W�����m�v������}�w]�imL�<9o��������6��l\6���^z)�rH�L������,+EX:t�f�m�v��e����2eJ���%�_y��z��y����;4I�/|���%-��jy��J5����/g���I���{����n���t�S����x��)�Z�}V�fS��.
�.���2�I������k���9��#3e��EQ)����o.����=:3f���1c���3c����32z�������~����,+����;9��#�h��&����kUs������KW^ye����$���]~��i��U��?o����Y{�M6i0�;wn��i���Z6��K/�4���J���C�������z(��zjz�����z���SN9%>�`n���t�������_���^�d�_J��yM�g5M�4)����*�SO=5h�=Z�n�`�`��5^c���+]�9�i���Zj���.���J�U��m3b�����^k���>��|��N���3w���e�K/�4���7�o���M:oC����������$��w�O��&��}��
����[�5�����5�s���kM�q�9��c���W_}5G}t����c�.�z��W�����(�E�!C��q��{��G���>;I2z�����+�a��q��AM:oCp��7��[o����_�s��M����N�g�^����\��9s��,�E��{-�mu�����F�n���[�&Y���jh���~:�{�?-[��)�����N=���l��2~��g���������'>��{���d����^��5z������E�*����t��u�y]�vmPv�p��L�<y��z��7�WT$�\g�j�����E�^�z�s���Z�s���n��*���z�Q�}PM�>�r}�w�(�U~>��k�?~�9K����N
�&LX��K����gZ�n���6m��G�M�W����;�����A`��5�r��c�&Y�C�����g7���r�}��3��L���4����K����5z��^X�z���9���A`u��5IR�e�x��&Ys������6��I�\��<��v[�
����o�m���e�
]�>}��e��x��q�4i�j����6���+�����zh���4iR��W�l�2����r�6���Zj��1��j����I�2j������k��s�=������K���I�+����G:v��,��+��
������g�}6����*�-��"�^{m�9����;t��8 ��������s��'�r��,s�=�4���O}j��?��O���/�������e��(V��]w��`|���}������g�j����������J�����s�M7��z��\���������Z��r�$IQ���K���.x��k�Nmm�_��[��!�����<��eQW^y�j�E�{��;vle��[d�}�]�����?]�v�;���$3fLF���>x�{]y��
�Gu�J�7���Zj��1:u���,��e�[o�5^x�Z�u�E���oNQ)�"p@:v�����o�m��\������������O�v�*����/#F�X�;eYf��!
�}��_LM����PSS�/|�
�
2$eY�t����������;t��c�=v��4���Z6�v�.� IRE���������W��1c��3��L�?���Ir������K���_:w���,3~��L�4�����u��-������������'����������*�N�:�����*�:��s��}�����G.������7r���6���o|#]�v]�>�y&��
����I'���,+V��~{v�i�t�A���s�m�����O?�x ��
��^��:(;��c�
V)�*�"'�tR�lgh��U�9����w��]���18�����{��x�������_��_��5I^���~��9�����y�e�M7]�>]�v�w�����=���q�
��/^��n�-�����W���V[����Z���P��o��@-\�0���3|��E�$�B�Uy���,s�����;�Hmm�:���7�x#���k�}���n�:��sO��o�f�PM#G���\����Ay���w�}9���3o���;w��^�ze����0aB���<?���r���������r���:*��_�o��Ez���N�:e����>}z��m����w��~���wgZ��{���������Q���O�*&���K�n����U�=��/m�b"6V�[LM�vnB-[��w��3�<3���V+�$IQ��g�uVn���f/�J����:7�xc��i��s���#��W\��96Tp@����l���
�O�>=O?�t���LQ��'�����/kTUSS�o�1�|�����3fL�~��e��6�l���o[����<4���+IZ�j�����y��Gs����e�����)�2-[���'��G}4�\rIZ�j�L��0aBv�q�\{���b�-2s��|�+_I�^����|'��rK�~���=:&LX��E]]]���|��_M��mW8o�=���7��?��O�d�M�x���[�����M7��=��c����k�3�8#�?�|:��5�'i�3@s*�U�Dm�f����~8�>�h���i��e��Yi��}�t���={�o�����o:u�T�����IQ
�-�j���&����E��mC4w��<��Cy��2}���j�*[o�u��w�|��n��^}��<���y��7�`��t��9;��s������[7�>�y����s�e�]w��G��>}�T1�_^�t�,�6�2�y�}i;`@��Z��`6��
����,WX��6��H}}}c��ZY����X4�����j;�B:��������A���Yl�X/��bz��]��6t��jG�����	�Y�T;@c���.�z��s�I'e���?~|�#�����|��\�������$�n�m���2p������[�nUN�E�eY&I������*W]uU�d��w�bt�A���S5c�{�����MM�4��������.���$)�"�{�XeY�������^��|�3���k>�����s��]w���s�V+:�Rm�4��~��$����3b���g��1�9�/������O>���z*?�����e����>��������~�����,}�����s�����i��u�ghEY�e�C�&L����3|���{���4iR�����?N�6m��_�~8p`�>��f�[SSS���U����7uuu���K��}��E�f�M��������Z�5*}���b"X����KO�^��������z��h�o}0m��^|��><#F����#3m����/�"�������
��W���]�����R���^{5[.h���x��Q�@sY��`j��s3���wz�������_����O?�#Fd���y��2g����jt�u��9���R�?��Y�r��w��;�L�t��%x`�k��wn��k�S��~EQ�O�>�>}z�M����'����NQU�4e��<��S+,�Z�,�L�:5��v[n���$I���s��W
���v��
�>0X�/���?����g���y���3����%�WeYV%_Q�{�����{����v-Z�Gy$����#��#�d�����W�e&M�����>�_}�d�m���a���e�-�h����F]����3#F�����s�}�e����g�+�j��]��f����u����������.� s������_9��O?���'Y��k�������r�UW�(�,Z��j�X�FU�5f��><�����#���oW�-���U�V���o����������]?$m���a���;,I2}���92#F���#����'Y�`}�~�=��?��O��	&T�/����&{��W���2p�����?m��i��M�s��9���s��G'I����|�{��<��(R�,`���`}���_i���;������.tP:w������'f�������_=IRE����_��~EQ�G�������t��������i�r���VJ�^~��������'l���e�)�*�"I2k�������9sff����`��3'��w_F�������g�mPt����^�z����R��[����Z6���,+XS�N��7���o�9I���[g������[nY��+�h��<���>|xF���{,.�<_^��[l����J����n�����_�u�-�TJ�^x��e���������s��W'Iv�q�J�����;7s�����s���[/���S�N9��+�w�e����$6����>:G}t���7���#*�q��%iX&���/���_�o�����d�=�H]]]��M�6U8E2g��E� k�6m��_�80uuu�{��SSSS�|Me�/�z������O��'��$;vl��#F��{��[o���`���>O=�T�z����g?K��-��o�J�T�~��r��(���{�����a��v��U%��P��o���=��s1bD�����/��O_fNQ��\�hQ�e������~�����G?��f��������e�f����s�e�]w��G��>}�T1�_^��%���g�z����_�@l���>����\}��������v�my��w��c���?�q����������Ls��}�S�J��+{/�,\�0�<�H.�������K�.9���s����'�h���U[���p��<��C>|xF��'�|�R~U-��
�������OVr=����;wn���9s���{��=���$���S:��80uuu�y���u����(�*�2O<�DF���������y��k555���>��}�c��w�������~����p���X��O��a�2l��$I���SWW��f������>T��,�F[�����g���1bD���d���gK
���h0N���;������7�r�j�*x`<��2$�g�����_9�3�<��,��4iR����\w�uI����>/��r������k��q1bD�j����gK^��~��m������e����k������h��]�8��q�I�i��e�����{3|�����K)��A!�����`�6���N;-#F���q�*�VVx��U���������}���v��1t��%���g���{f��w�5�\�x�r��a�/6�������+SE���%��,��E������������M�6UN�8o��V�����g���0aB����_��
�kieY�O�>���<0�:u�v�F�1cFF�Y)�z��+��%�W~��^MMM��s��
�
EV�^�*�Wuuu�|����Q�������?����#���Og���I�-�*��r�,������s8�����K���`E6��q���G����h>�`F�������G�������g��������t���*�V�_��1�_%��RE��+�Z^��[lQ)����K�^����F��??V���6v|���,�t��9tP��j�]v�v,�FQ��)�2m����*�W{��W
���FD�zb������K��}S[�k6^�����~�#4��j��E�J�J�J�J�J�J�J�J�j�/����[�p��j�`5m�X�������[�k_�Z��j�`6��$�6mZ.������7���K~���f������rlXK�e�_|1��{nz����?<�_}���W�h���jh�A����o��Y��$EQ�,������{��=���:��c���'��T9��]}�����?<[l��Z����o������O>��FehJEY�e�C4��9sr��7��k���#�x��E�$Yr�%�m��6�
��?������j��VSSS�x��w���n��>|x=���z���M���s�=�]w��25jT���S�D�~y�s�,�1�2���i��_��Z��`j��sj��m>��������������(�{�^���,��;6C���?��x��:thf��U��M�E�t��������z�|�;��s�=��{,g�qF6�t���a=��9��S��{�|�����w�]���%�6f]��}���o~��L�81��rK�>������,�EXs���u�]�#�8"=z��w������UN���_��TX�l�XK�l�2G}tn���L�4)��������R��2�7�x#_|q>���T3r���5�r��]�*&X����6�t�����k{��<���9������[�,�E��(R�e�kC�?��?��.]�T1	��>pX���w���'?����s���f�M6�v�F;vl.���J��.��R�H
�V;@5��1#��_r��W���^��}�K_Z�y�\rI�����^�,���3'c���3�<�����e��(r���m\�u�W��x�������W_��o�=���OY�I��(�����V���w�u�Z���9��o��O>y��XW>0X�<�L����\���<yr���QeY�,��n�:G}t
T��keI���s:4[l�E�S4�Q`���[���ks��Wg��QI�^����_�~4hP�=��t��q�eZ�c�,O�-���;����g��v�a����}������,�?��QX�������]0��?8|���������V60���������w���{��(���v����k������[s��W��{�I}}�
K�z����O>9'�|r��~�u�m�����_�e��n�E�$���k�������555i��]:v������+X��#Gf�!�$��������-������W_�o�13g�L��WKJ���o��~��4hP:��f���g�����[��\�wo�A��Q(6����Yl�X\pA�����7.I���%�WIRWW�A�����l��m[��+��G�E�$i��M��lX������j?����}�j��f��`��?�]����,����4hP>����C�P�����/��N;��{T;M��2)6`�����q��{���7
��q��{�8�7|�����q��{���7
�����v�-���SR�lY�(�,6���+�2�:u�q��A�e����v$����Gf�����1��(
�jjjr�a�e��A9�����&�T;�[�`AZ�j����}��9��C�|]��US��u�%����^�w��c�=v�,�J�}��7���J��W__�s�9'��/��dk4�
�����J�������}���������k��������\r�%)��	�4�
�kc2k��|�_��A�2g���Z��o��{���{���4
X���(R�e��������y��gW��y����_�r�?��L�>�r�M�6� )��S��������e��(�$/��R�������7�|������>��\y���5��L�>}��c����k��������g��Qy��w2}����?��8����A����/~����|��_��)SRE����o|�>|x����;/���~��|�����y��_�v�i���~���[7�V�FU�5g��\s�5:th�~��,Z��Q�5gV�|����3�<�O<1�����������{���������$y��ws�)���[n�_%I��s�����c�i��������?������N9��3����g���)�r�?I*�Y
[o�u����|���OQ�b�	&�����~��<��C�c�=�_�e�}��7�<���+`��Q`���w9��L�8q���%%RK��V�l��j�_-QSS�!C���{���[nY)�Z�hQ����g��7n\��g�}vx��������V���k��I9��R___)��n��r�1��W�^��W�R���o;�o�}�N����{.���?����W����.��7��-ZT�<�w�A��g���A�����=EQTJ��\w��-�\sM=��*�X=|������1�Rbu�����K/M��-�$_��W*s?�����U�eYf��a�����1c���^���^��n�-;vl���@��]���=�����+�,�2EQ���.S~lP6���,3t��J)�>����/�|��/�"G}t=��|����=�������g?����{]�^m�/��������?MY�
�E��,s���g��!9��s��r�,X� /��b���7�x#3g������c�l��f�m�����;�E�M���E�����f��Q�2eJZ�h�-��2{��w����${,��o�������3w��t��1;��c�������7�>�y&X�6��Q�Fe��iI�+���w��V��k�.��
�����W_}5#F�������Oo��k���^�	'���~8eYV
���n���??o��F����E����}/��{o����l��U����n�)��sO|������Y�h�J�w��)'�pB���o�w��k���Y�����$���o3u�����i��r�9��_�B�<mm�������3r���>o��U�;��\x���v�m�z��<4��jh���������~��+�___��gm����~��$IY����K�&�Z6lX��s�e���=��<���y��g��O|���{��'���{������^������w��]F�����$�1cF��?�3���[��,�h�����m��r�E��(*I^z��|�K_�����d��k�G������>;t�
���d�����k�������o^�}��;4�
�k��)I��(��W��j�j�9EQT�������>��O�m��I�q��5(�j.�����|�3�iPv��u���w������t��!�n�in������?O��-SE���������<g�}�J����u���q����},{��wz����;J��92$��z�j���K/���.c��mp�}���m����;�e��
��y��������7o�����}����(��}({��W�v�������s�q���[o]�}��L��6���3gV��t���9���KY�I�w�}w��m��&�v�m+�g�y��W������}���K/MY�)�"eYf��w�c�=��N;m�w�<��<����n��*�,^�8?�����_��7�����V[m��N;-�\sM^}����=;/��R{��<��7n\�L���/�<�l�M�w����:t�{,Z�(�sL�y����M7�4��3u��<���y������o����KM�������s��g��yn�����7�ip����l^z��L�0!O>�d�~���s�=�m��*s���3h����N��L��6��v��U�.\��9:t�\���k�\�}����7�|����^{��g�y�A������<������
��{�����O��Ol��c�=�=��37�pC��ai����������/�I'������AQ�]�t�i��������^{����y������t����*���?�w������ON��-+�7�t����?�5�\�������y��WVy���s�ip���O��7��v����������G?�����3g��.X�>�y&��
�k��7�\��������G�����>��5'M�T����oD�53k���u�����?�)W\qE��i��w��o�k��6W^ye��i��(REf���N8a]�^��v�-EQ���.]���k�m���I���������?�a�{?�����.����O<1'�tRe�h��<x�������7�2�a���_�r�g���S���?�U�V�{������/�t��<T�]����;'I���k�����/3g��w��9rd-Z���^x�����k�B��6�l�^��,��^{����Z���/~��y��'�����,�u�p��y�����{7���/�p��w���^{�2�v�m��/~q��<�Aq��7��3f���+������s�M���W��.�����;�2������CW�Ns�	�a�.��e�]��&�$I,X��^zi�9|p������o����U�e���oW��d��vk��+��o|#?�p��~��^�w��y���r���7a������y���6lX�����%P+�����.\����o+�������������o�c�=v��$�)�����Kk�3@�l�X�l�I��o������^f��G�:�(�J��O����1�2��_�QG����o�������c���?��6lX~��_�e���^k�M6�e�]��n�)�;wn|�f6o�������;�h0>���V{�C=������j���_��k�n�����_��m[���Ky��WV{�uu&��
�+I>��OT��
���6m�����n��LQY�`A�=��t��5[m�U�v��>}�TJ���;��sRS�|?�O}�SM��g>��<���M���T�e�����{���}������oV��l�I��k����_�~
��<��
�.�l���_�}jkk��>���^�y&��
�����OQ)�2#G��/������:+|p���,������7����SS�e��(�$�'?��|��_o�s�+=z��v�5r�UWe����q����)�Zb�����pZ�j��{���.
����j-Z�Z{-������_����.����`m���y��g�������K��]��S[[�;��#�
jp�(�J���r�3�8#7�tS�d��?���9��3*������7��|GK{����?����~�o�yZ�n]/X� c��]'{-=���j�59TKm�4��|�#����u�:4��o��n�!�<�H�z���e����g����I'���v����w�}7w�yg��������:ujf����,s���f����v�5���/g��	����3m���5*��
���?_y��U�\~��8p�
��<yr��6�l�����j��3���;���2��~��F����[7/�}E�����Z6��5����g��w�v���6mZ.���\u�U�5kV�geY�(���;w��������$=z����c�y��u�e��W���J�E�#�8"?���W�=-��i���gZ����L��s�����Q{��>������6&O��L������M�7�\������	'���_=eY&y�ju}����
7��$�0aB��������1������UR�t�S����x�6m��t��[��Vg���_WgZ�]vY��$k��VS���'�x"�vX^�����H��]+�X+���{g�����o���&��.�p�
���8������+�;o���V�Z��~�l�I����sW�����:�,o�uu&�&X��Y�f��#���9s�$eY�o��6lX�}�����[I�+�Z��~���5����uz
����{���|�����^{-��_s�)��M�6����>�����'�X�z�[�n0^�`�g�?�J�\��5�ku�Y��uu&��,�
���[����x�%�\�7�|������������ejj�����C�y���$7n\�|��t���I�6�6m�d�m��6�l�O|���w��c�9&�<�L�d���9���3j��t��y����o�`<o��5�0w������{���[�b���gy������g��c�9f��y��Ws��G7��l<`�'~���U�������_�j���m����E����'I�����ki���s��wg����k���$y��7r�%����.Zf���N�g�^�=�~gyeQm��i��\���J�������3��n���[�nM�l5�@��SOe���)�2Ir��6j�M6�$�l�Me<v��F����v��!C�4���?�a�s�.cz����x��'�t�%6�|�F���o��>�y&�X�����r��K����~�^�s����3f4z����O:EQT�'N��������N;5O�0a���<yr���W�j�*�m��r�6v������{���&g�jQ���<yr��(�����I�l��u�z���M�fs���s6�t���|��e�-]"5z��,X�`��y�����~����.w��{���lm�ZQVs�	�E�z����r��E�&Ys��i����;7�����e�e�u��=��w������'�|r��|�����c��]��C=���,Z�(�=��j���g�jQ�����[��,����[�^o��?~|e��k�F���f����S�6���[,w�'>������{��Yz��>���]z��z(�g�^�}|����3�2�q����;��^��LP-
��[o�u����_�������>����W�}��i�z���;�HY�����o�-��r�s�<����C�6xwEF�����q��-���|��?��e�=���g���n�a��$��W^�`|�QG�t~s�	�E�z�_�~�d�MRE��O�S����o~S����[v�e�F�������.����O~����Y�/��?<�l�Me<n��:t��<�A��g?��t��i���r�)
�?��O2o������/�/�Ke\SS�/|�+}�9���k=��M�|��)�2eY���/��)S�j��o�=��v[��HQ9����6�j:���������;S�N��G��_~�r�E�9��3W��&�l���;���o}�[y���W��u�]�k����C�Ye��N;-=z���_~���y��
J����w���'��T��x���,$k�3@5(�ZO,)<*�"o��v�<��L�>}��������N:)IR�ejkks�9�4u��r�]we�}������_��y��g�p��e��e�_|1?����N;��{�i���3��G>����u�)��O�>���i�2`��\}��Y�hQ����S���?��������|%;���*���U���'?ip�?��?s�����W^ip��0`@�x���������/\�>�y&���,���!x�����n�)EQ$I��r�2$�w\��o���������;uuu������>�_�������R__���"�o~�����K�r�=��#�>�l�{�Z���[o���;�U�V�9sf^{����9s�k4(W]uUjjV����/����:uj��������o��s�f�����p���>9rd��i��g;��3��������(��}(�o�y���w�y��������/��>�����9���<��s�u�]+�Q�F5(���2���3��k*���>;�.����`������Vmg���?�!c���SO=��(2q��|��_�g��w�1IR�e���7����e����g��9
��e��:(�g��{��;v�*�u��1?��Or���W
�Ve��w��#r�QGe������f�Z��k�C9$7�x�E��7�I�����_��r�,�L�0!&LXf~��m3t��5*�J��L��j�����5+�&M��Y��e���m�����9����Y-\�0�=�\e^Y�y�������g���)�2I*�?�����[oMMM������>_|q9��t��q�����n���K.�$���j�����v�����{�����s�M�.]V8o�v�����u�]������$555��/~�#Fd��+���U������Q�F��c�]�}��;4��\����9sf�����w�}y��G��k�������E����G����<0'�pB��o_��
�e��������K2u��$Yi����s��9��sr��g�qy���x�����+y��W3a������Y�pa:t��N�:e�m��^{��ZEY�k���y��G3j��L�2%-Z���[n����+��G�l�$y�����Ce��	�7o^:t��v�!����`��T�{���������Q���O�*&`c5���3��k*���>;�.����`�����lTXs�������\q��={v��+�Z�%%Q����i�����i��M�d]s����W_����oy��+eX���M����/GqDN=��&-\��Z�����K����S[������>�c�9&�G���^EQ)�Z��,3s�����������n�!���{sD^�6m��+_�J����$I�z��L�2%��OO��m��k�t��=����|l�I/��R9��L�2%�{�WeYV��:t���6�,�������3e����9��������J=��<����a��r���b�-��[T;@��T;@c-\�0Gyd�L���(*eV}�����_���Gg��3fL���f��1�1cFF�������o��R�e��w�y'Gyd-ZT��l�j���.������+����;���/������z���SN9%��rJn����v�iy��w�$/��r.���|��h�#$I.������'��m��v��;vl���������oL4�&��`]v�e����m�f���k���h��}�s���?����g���)������(�$���oT��1c��X��T;@c���+y��W�$EQd��!k\~��{�����,�$������+�4Y���d��u=���A`=���I�+zj��eN9��F�w����e����3�<����TQ��@5l�X�'ON�^qT�^���s�F���s�l��v��[o�����e�������
�+6Bt;��Y�*�;vl�5;t�P��={v����f��Q�n��]�,k�.����k��,����M����+��m�Y�����|��������b�.��j��*��&M��Q���s�=�����o(������w�KQ)�"���k�#4P[����_�������>I2x���t�Mk�����+�������c#6PWW�Z��:��t��e��-�2s����q���;�T�E��?|���+tV�N�2`���{��I�[o�5^xa�?��5^���.��7���(�$p@:v���yG�YYy��L����������$�=�u��O<q��X�j���.���$��>�e�!C���������W��1c��3��L�?���I��D�����_�e��]���nH�N����
V���W[��u����N���^[)���������5���O]]]v�m�t��5�������3e��<���1bDx���e��,+%R'�tR�N�.)�j���+�"������n�>}������'��.]��mL�uf�/�J�+��2�&M����S�����x���������W�����������+��r��\�x�
����T��}�����['�����B��-s�w��3�L��VK�W�IR)�*�"g�uVn�����V�lI&���
��4=��Z������p�	��/~�[n�%,X�;eY�U�V���>�3�<3{��w3�]�P)����K�r�kM���Gs�u�e��y�������f����6mZf�������K�.���g�����}��S�N����#GV;@���
�����S�8��q������T;,
�hV���������'��SO=��^{-3f����sS���SE����u�`�)�Z���5+]tQ���?d����Z�,KX�zg�-��0a�2�z���Z�����[��}��y��y���S�e�~Q��`]Zo���v��OEQd��E���TV���2a��z��y��w*�/)�z��n�-�Zbu��6���s�9'���N���,�����9�����{�[�ni��]�S4�z_��A0}���t�M)�"eY�U�V����r��'V;@�[o�
����g���?R__��(RE~��+�6Z�m���C�t�����^K��e���[���O�r"�u���H�}��$IQ�a���M�*'Xw`�:w�\�n��u��4Xk����v�m����.�o�}���u�]+��&Mj�z���j���;7���K�E������l����:uj�x���;6�z�j�����j ����7�����W��U��[
����sNv�}��e��������;�	`�P���h��U�������NY�pa>��O����u����
�I�V;������$?��Or�Yge��1����\r�%��g>��~�����[Z�n��kp�M`�)�ZOt�A)��2.�"eY���_�����^�(�,Z��)"4	X���,+EX�/�*��Z��������+eW��L�z��.�v�f�k=��	E�+QS�|�(��Y)��Y)��Y�V;�6o��<����0aB�M���3g�C����Kz����~��i��u�c�X������������_�'�|2���+�[[[��~�������N8!�Z�j��k���X��w�����>��zj{��,Z�(eY���p��<��#��������>w�}w�������	�5�k=��� ���3q��������X�;K��e�7�x#GqD.���u�`m�V;����.�\��a�U�6m���~4���{�v��v��e���y��w������'����s�s���g��6����^��,�����	r�Yg5(����{�N8!:tX���f��u�]�!C�d��I)�"eY����f>����G��u�U��v�
Q�.]r������$k����?~e\WW�_|1_���WZ~�$������������9��CS�e������3x��&��Tj������/U��>�����{��z��r�%�$I����W^��y{��W������gi�-������(R�ev�u����O��-�h�:���k��{�<��s)�2��rK~����E�M��16��?��)�"Ir�I'5�k���
�[QVS{���2s��$�o���?_���%Z�l�����9����$3g��C=�4Y^����v��P��z����;�r��s�r�!�Z��CI�.]*�1c�4j=���Q`EQ��2y��$��c�m�m�y��H��=+���~�Q�4��������W�[�h�l����6���?KM��XhFz��S�V���o�l�v��-IR�e������f��q���>P��>=�P��(�l�����;�P��5kVn���F�w���g����]��`%�={v����\q�)�"I��n�5�����O6�l�E��,s�Yg��w�]���}��|�[���c�M7�>����q���V�v�m�Z�N:���n�z��-�2s����)SR�e��L�E�O|�k�umE���;.�]vY������s����������[��:'N�QG�q��U�=��*eX��
�k��q)��RP��%��|��F��d����>�{l��ZS\pA������5+EQ����N�����o~3_����W��;n�����/~����=�r�:����o�S��Q��DQ��{)�����%k�e��v�)7�|sZ�n�v!����o�����9��S�e���������0?����g����n���k��k���gg��)y��g3~��J�%�W-Z��W\��]�6�9Ve�(�����
����_y��[�5*����I�v������O�>9�����O~2-Z�h��k��c���3�����Y�hQ��*I��W)�z�����L��-s����s��\�eX]D��q�V�����r��?�)uuu��h�9������{�_�BF��$+,�z���,S�ev�m�:4{��g��XS5�?{�egY�
��g&��$�B�H
 TAiJ"���� �"�����J��(BH��$B*����>y�?8���L��LfO�u�5��y�����l f��~����+���#4�v�!�=�\����~�����W9�jy?�z��G����y��g�_-ZM�h�a����{��]�I������}��7I2~���?>3g����s��c�t��-���K�~�*<)��[������J��,]���J���,��,�=�R�'V����)c����O?���z+�f�����������l����/~����w�������
�����.�J������F5����N`M�<9���/s�UWe�������X�^zi��R���}�����j����?�W_}5�&MJ�\~����w����4NU�h*�^{m��j�\|��y��7S�r�����_�\n�����q�������SSS���;�|�n���Fh�D��W_�a��e��9��T*��| ky�7��c�f��q��!���~�vX����^������~M���4�����/��)�"�R)EQd��v�������g���/�[]r�%4hPf�����G��{���?��� ����*]tQ:u���w5jT��m���~���o���K��m�`��$�s�=���{7�'@SY��.���,\������s���.�v������C���~��y��gr�����G��1cr��g����g�F�?>��!\���KUUU��UWW���y���$���Z�gh*�KZ�����\w�u)�J)�J�o���
�����o�x �w\����1cr��f���kh��3gN��K�.M���}f���$=��Z���SO��w�IQI�3�8c��TUU��+���;���(��s���K.i�QW�}�����
�z�Vuuu��h
5��1^|���s�6m������~����~VUU��}�{���>��(��_�"g�}vJ�R��[��={&I������SE��]�ti&N�X^�����36VQ7n\���L�4)�f�J�6m��[�l����y����m�&=s��9y�����/g���i��]�������w��Mz�������Of��)���M���3h�����.��i����N����X3f�H��J�0 UUU�y���V�o���N���3{��L�:5O<�Dv�y��z9���W~�3gN~��<x��=��#�3gNy��F5j��5s���z�����;s����������U�V9����o|c�Af+��k�����vn���,Z����J��������2d���>�(�\y�����~��_~y�5��w�W����}������j��\w��VQTz�>��y��w��]�tYnM��S���<k�������F5j����
v�e��o��������Q����u���u�]�ou|��_�l�/|����V~�$�/�����=��#��
����W��n�!�
���^�����������g�=���g�]���!f������/'�tR��WI2}��|�{����n���G7������e�����S�y��������s�y���+���m�����S1��k��U���(REn����p�
��������7��R��R��=��#���k��W��G]nXSuuu6�h������v�m�\v�5�d�}����st��7����>:������g���a���F�C��wC�~�����Nk�9����~�����������[�#�H��f�t����gc����{��W^y�E�	��Z������~����l��&��'�|r�='L�P~~���v�9���,�"��
��������+r�	'�{��o%u��5��zj������93'N�O<�g�}6��O�}����v�����{,'�p�*�������O���K����n��{���:uj�|��L�81c���a�Vg�����|���|�i����{������y���7�x#/��R�{����1#W^ye�u�V��6mZ�8�������;@sZ����j�$IQ�0aB/^�������\3|����7��~�=�X�|��r�U�=������O|"�vX��H�T���s��'g�=��-��R�������7��=��#��rJ.\��� ��:(C�i�;,������������W��U8��t���NMuuu��c��w�}9��S�|����%��w�*�u�y���w�)�w�y��1"{��g��-��"7�t��:��3�d�������/���.����k���^X'��u��9��2r��t���������5�\����m���b�-��c�$ImmmF����}��7���P�g������Z�pa��?�#��aYI���;����u�UWe���*�`E�#F�s��\�t��A�e���9���2t��4(]�t�����#G�����[�r���p����^�I'��v�������:������N;�y����t����s������[���W_���;/��T*������������������+Wz���������������G]o��[o�K.����.�`�am���w���V`���d��v+�������������W�w��~����SO���?�E�e������;��O~2�>�hJ�R�d�M6�v�m�<�_;v�]w���w��f������y��r�����;������^x!���������>�����;�L�N��u��;����u�������g�Y�����.����}�.]Z^u�Q8p�
��m�6g�}v�w+��9sfn�����T*�;���J�;����_��z������{V������V`%��?����-�����kjj����(UE~���f���O�v���K�x��y��'���j�����O�<��9�����}�:�V�b������H��s���f�����w����h�$��O��y�V����o��>���V��#�<2:t(����������q�Y�dIy��{d�M6Y�9UUU9�������[W�������`q����NQy�����c�}����N���[�J�
�z��������/��c�m�;,�U�V���	&�G?�Q��k�r��?:t�>������'�0aB.������Tl����������������Ky��W��:d����t���EQ��;���~����w�U:'I��g�:����o��6����������{�L�6-���I�
Z�k��&�m�Y.�����?��E�N�:���������Fg^U��u�g��3�8#���y��72c����3'�:u�z���
6� ������L�<���w�^o�3�<Sg���}�A`���k����z����U
�J�w�1m������$���z�M���={���5y'���>+I�v����R����??_��Wr�m���G��o���(��d���9��C��z����WCuuu����>}�Tz�5j���u����K�����3fL��V[m�����_��{/^�W^ye��j��M6�t����u�Z^Vs�	*e��j�^�z���O��'�\�QX�����u�p�
�_z��:��7��A�-[�l���;6K�,)���k�=z4���`���K2d����NP)U������=#F�����NX���S��Yo��F
:�O�>u���M[�s���:g-����k�NP)5��d������T��!���}�c+�7w��:�:4��e�/^���M�6Mz���,����Z�;5���S���+�4�L�Mk}���C��?��O���~t�{=��S9����$�R)����=+�t��|�����I����t��_��+��lXT��mtv�v���seX
=gyg�j���SC�����\����X��O�TJ���9�Q�f������'I�'k�g����u�������o���,��n��u��^^(�����������s���U�TJU�h
EQTzV�/~�����?����3���G�J���m[g�h����p����l�s�w���i��V�NP)5��)�J�J��j�����o|�u��p�	����V�G����,X��������Mq���Z�9Mq�����N=��~��
���+���Ci���[�����d���sM��fM�����a���(����;,�_~y���
vz��w4���555i��m����=������P�z�J�^���*=@K2m���s}�D4�}����?�N��>���?������nP�e�&M�����'O������*�����9��0���T������{�$�R)}����4��G}4tP,XP~7x���r�-i��u��m��u�&Lh��e���r���m��&���)����_'0�)�j�;�:�T���
�SX��������^x!^xa����r���������{�����O}*s��-���G?���������j�\6���^h��1c����{Z�j�M7�t��Z�pa���Jg5���Rj*=�����^��EQ$I��{�F��^�R��C=�Q�����^�>����3g��
80w�uW�t���}��~�:��<K�,IM���������������K��C=��w�}��y��'�p���z�
7L�^��=�������*=��(����U�[�O�n�U����9�����������g������S������;={�lT�-��2�n�iy��;����Z�����N~����T*����t���~v��w�����~�3����9���V`%�N����5t���~�����^��}XL�2%{��W&M�T~��O���_�J�>}����:����+�X�}�_}���[^���N���w��p@jjj�����g���+=�(�\u�Uu��,`����P����2dH�X����m��&��u[��UUU���C�[o�l����g�}����7��$�1cF��g������w={���w��4�9_������<EQ$I�����}��8p`�{,X��.�����N:i�����z9��Cr�M7%y7��;��N���������q���������{���=�u'���"k����~VUUU~��O��C�6�D���9s����g����w]�v�?����8��A���#����_�$Y�hQ�
�{��'�;w�@}Q��7������w�l�I���/���.� 7�|s�.]�$����O}�S9����[��/���O������K���[�����X+SEJ�R���}:��<���u��v�iy���r�=�4���;��n�����{��^����f��yI��<C�����������_~9��sNn���:�/����j�j��l��V�������w�w����3f�����gy������cN;����5�\����f��a+=�9���TEQ�!��.(?6,�����0Mh������{���Og��	�={v�������*�J�������\��M������T����.�s����={�o���:uj&M������������*�3o������y��'��o��u�6m�d����;wn��{���|0��GV������2z��4��5jT��z�
N��j���f���T^w���������D����<�����D�?��J���^{���y����_����7�WQMD��u�Q)�"'�tR���_~?m��L�6m�{N?��\|��
:�}������r�����{�-�_�hQ^z�������n����_%�w'hNU���s�-�d��A�����h��EQ���:G}tF��c�9&�Z���n��!>|x~���VH�z������;������f����[��V���l��6
>'i�;@s����2w��<���y�����[�l������W��y��s��Gf��%I�R���(���J���&����c~������������3'm��M��}�����O�>�>���*'�|rN>��<���y���2e������{��4hPv�e��V��;@sX��.\���'��l�A��o_o��r������/���������r�A���EE��N=��,Y��|��u�6,|p��f�t��=���k���f�;w��,gm��6�f�m��9�y'XS���_��W9��3�$555;vl�XK�,�>����z(EQ�����6��zkz��<���t�M����y�����������������+[l�E���V[��������4�_���E��(r�A�O�>��~�����>�$)�Ju>{/|��7�������5:��=���I��(R*�r�W��Yku������O�T*�T*����������O��r�UQ��'?���:+'�tR:w�\�3fL~���6�52u���s�^���^{5���m��=zt-Z��(�${��g��7�tS����$)�J9��s3b�����?�e�]���~:���~9 ���.k�;$I�6m�s���������:k������]��O�>���|��I��(��w����u>�����������{��L�2e
L�A�l�I�y����r&@���X�T�J�������%K�d���)�J)�J9��cR]]���#�8���g�y��g^�O~�����IQy���2��f9����w�y����S�z��y����;7EQ$I8����u��)���/����$s�L���s���&I.\��n��Y����:��@�$Y�xq�u>�`��U�V���?^om������g�n������.*�x}�[���o��lg4��:�s��I�
�z��7�������$�R);��S��iSommmm���[k����?�)�Z���������;c��i����Z���F���L��i��}�f������{R*��$����
{��9����c�&�t�x��������W��=:;��CN8����������h��f�`MX��>���&IJ�R�����^���?��O�7o^��H�������[�xq&M�T��p�
���+������g�����p�����!���}��]�v���n�OMMM��`E����}�f�m�M�E���??#F�(�����������V���^��c�z��5*�-*�em��fkn�z\w�u�q����/��������XIr����(��J���;7{��g��z�l����y��3m����'�tRjjj��u��w����i�����9�Pv��g��c�������U�R���
�h.��A�%N>��\s�5y���R*�RE��S��� �
7�0g�}�
{�t�M�=;��SZ�j��_�UW]�K.��|~�E�������?��wO����m�5e��*�J������:(<�@��EQ�(�����������k�z�<��3y��'��S���������6��������[o�u�;��x�����C������XI��k��1"7�xcn��������?~z���}��'_�����[�����K�$EQ$I>��5>�{F��7�x����{���{��m�l34�u"�=�~x?��������&������.]�4�X+����'y7|�T*��K/~���������S��~��w������G>�����N(�*=�U�`m���+������NMM�3�6�`�$I�TJ��=��%k|z��TQM��o����3f4Y_���������nYo��RE���i��Uz$�5FV��U���I��(r���Vx"�5GVq����_�~)�"]tQ|��J��F�j!�t�����+���������O}*�]vY����hM�����#F$I.����q�7n\���/�?�A=���������g��m���C�i�qV��b�=�H�T*�K�R��������������T*e��%M1"@����EQ�z VQ�	�I	�jA��v��`���~�Gh�ZX��EU���E�J�J�Jk����@��Y�Tz�U]]�F��J�,Y�d��X�Z��(*=@�����J�a�J�����d�VC���3l��&�9d��z��3o��L�6-���K��Xo�q6�d�&����Z
��W^��=���{�O�����._|q&N���S���s���'��t4��J@�u��=_��W����g�}������/9���/+=��Z�t��97�|s��(�����y��'*=@k}Vuuu���n�:={��f�m����+g�uVn������V����}����w��$Y�ti�8��
OP�Z�UE��,Y�$��O���c3|��\r�%9��C����?��Z�u���]�v)�"#F�����+=@�Z��$�R��s}?����zE�7�x#��w^>���g��I�s����M�0��~���*8
@]5����R�z��W3i���J�E�$���I�����k��i�&�g���)S��[o%I�`������&s����32~��,]���yQy��'s����H�N�*p�U��C�����+8	@]U��������/���o�|���J�������O�����9s����_�c�=��#G��g����S3q��������A�RE����9sr�e����������3g��[n���CSE9,k��Q9���+|�{�������
����I�E[�������f�=��,Y�$�s�=������m����M������ON=��<�����~�$y�����O~2���J��S�N9���s�=��7��MJ�RJ�R���W\�I�&5���g�������W=z���D�g����������,EQd��7���#��[�������}������SE�N��#�<2EQ���������?��~�����_���wi
,�W���$)����~��#���`�{��I�R��K.�$��u[�>��vZ
�$y��g�nu��gf���O�TJ�>|��^C����<8�<�Hy��}�f�����`�SS���^��Q��$:t�����J�R�:��r����_��}�suj��i��>8������7�/|���o���y��7��s�e���)�"�R���/���fh
ku�O<���������U�V�����[~���>������O���������J�TZ��EQ$I�'�|r�;��F����*=@cL�2����M�F�k��u�w���x���������<{��F��T��*�"����%�\����7�
��j*=@c���;~Q�0aB����G�V�Vxf��YM�(�����g����9��r���f���k����Z���w���[o���{,���V��_������n���3f���t���g-���^k��R���m��s��i��m���&��X;��s�w��������}���Z������u�]�^�i����3����Zg-OS�h��*=@cl��f�~���$EQd��9���d���y���r����T*�(�$��G���|��<p����Cl��J����)��^��?�!�n�mn���,Z�h�{������Fv�m���1#IR*�2x��|����@��)S���T*%I��X��Tz���o��r�������u9��_��G�:d�v�����K��n�:s���������~:���J��	����{������u���f���I���������vO�u�Z��$���/SE~����T*%y7�j���9rdF���=EQ$IJ�R9�j����]w���|�#�=g���6lX��w���������k��J�_��W�{�����}-S�LI�r���?(+I>�����?�y�[o�z���g?k��>����$9��Cs����o����<����3g�rkK�R6�l�t�A9������|�����_���[*�r�W����c�
�J���[��c������(��K/e����5kV.\�.]�d��������k�J�[v�UW�T*5i��(`-�:��~�R)[n�e��r�J���EQg��aZMe��Z�,b�P��^E��^k�����^k��y��e��iy���s�����'�H�T�f�m�+��"}��]�4��&k��9�;wn:v��N�:Uz�����j�8p`��o~������s��'��W_��G�{��'[n�eO
�E�'����	s����~��s�1�l����U�t��5m�Q�v��V�Ze��6�1�������={v�Gn�vX�����m�6���z8��u�n��c�
��={v����g�
7�W���\��;vljkkSE����6c�����_�SO=5�{������������B�����9����$�������_���Zg�����80����3o��E�$)�J��$IQ�7o^~���d����}��W�k4�/��I���e�]����Wx"���N`�y��9��2e��EQ'��(�t��)����V[m�~���S�N���wC�����)Sr�����G%��hn�a�$�?~F�Q����Z�������������S*��aVC���W_����g��Y;vl����;6�f���q�r��Wg������R����������^��5J��=��/��b'�k��:���3{��r�U��=s��w��{��q���7�x��������;.��sO����	��3gNN?�����1w�����y�*8	@]ku����s�-�����u��|0���o�����~y����k�r�[n�%�g�^C��Y�f���/��R��$���kex��:k���Y�pa��H�T��~��l�����k��6�E]��(�$�-�}�����6��/�8K�,)�e�������X'N,?�m�6�sL��{��i��]J�R�d��I�����.]��.�(?����wh��Mv�}�
O����3S�e����1{��$����H�����}��0`@^x���J�r��0b����7������y���s�-�d���)�"����I'��v��5����V`���z���m�6I������[��\{��G����|UE6�t�\x��M1@�����1h��$�?M�0�Iz�?����6�4I��(�b�~������G?���}�����*���������g�d���9rd���1"��OO�TJ�=��O|�)�\e�Y������~��_���K�~��p:��QS����:��vZ�9��$�7���<������np�%K�����fy��o~3UU��v���7xO�TJ��m��s����/;��C�_�50@�Y���w�����������O>�C=4�����C�U���;�������O>�$�u�]��a5��	�b�,X��z(/��bf�����[g��6�.���M6��I�z��W��c�e��IY�hQ�u��-��2�N��m������)k}VMMM����~�����{r�wd�-��y���#�<2]�v�w��Y�r�u��{��^�L��$�w�}s��7�����n��1y��<��cy��G��c���'���9s�����/���k�9��M�\����*����rkv�q��w�y9���u������~��y�����y��s�	'����O�=V�����i��(�J�^xa����6�\sM���$)�Ji��U��v�4(��wO���3o�����[5jT���,^�8�}����������U>����v�_j����'?�I}������+�m���������[o��J��|.����n��A�,\�0'�tR���?�R}��=s�M7e��!
:'i�;�	�G���A���Q�Fe�����D��&uTf_}y�������<hyy05;��|�;�I�T*��{.�"�-�O<�'�|���������������n����b�?�xn���f9��������y��k�0 3g����S[[[���k����ss�M7���hE�.]�#�<2��v[��������o�t���^{-o��v��i���S��T����|��hqw��TU���R�T�Y��W��Z���;6Y��3g��#����_��z���1cF�z�����k7n\���/��{��7�g?��*������W_���3a���;6O?�tf����o�9}��-���7/GqD�`��r'hN5��)�aT�����7�X^�����o��>/��ry�������N�V��d�����Sv�q��������>��w�9���Z��s�&����8���zy=`��<�����w���6�(�^zi��������*����s��'�[�n+<g�������_�����}��u�UUU��C��>��|�����q��$�&M�O��\p�-�N����������#4�?��O9��S�$�[����cW�O��s�)�d���I�V�Z����n�9�3��L��w�l���������k���$gL�6-��?�S��e�]�����;��sr�]we��I���~;�\r����u��g��9���!Cr�Yg�[��O�\~���{����~��������������;@s[��v�}�J��$����E�R���}�s�p�
W�O���s�a�����+��d���n�������2w���z��!�k��V��T*�����S����>����R*���g������+����w�So�{��k����n9rd�d��9������|��w�J���$o��vy��rH�G��~GuT�y���?~���t��v[��I'��J���s�0��~��7��#��[��Ce��i��&�l�=��c��Zv�[o�u���u'�X-�3�<����E�$2dH�������0�E���g�i��-���s3b��:���w�U�[*����{�y�������;����z�}�)�+��>��Y><����rk��NP	�Z��_~����o�t���Q��t���7���~�����%=zt/^\^0 l��*��u�]��W��g�^�sz���������-�/������T��`��YI�R��=z4I��={��g���$=[�1c��Yo��V
��l���*qVs�	*AV�t���sQM���}.\�$=[��^z��z��7n��e����|�n����0aB�������_Sw�J�����#���Uo��F��|��7����uk��-���S��7�h��_��SSSS^/]�4��O�@�[o�U'T�U�V���W�����O������~M�	*�f�%�i�R�2eJ&L���}��v�	&d���)�J����;wn�u���T*�]�v�3gN�=���}����wU-;���Y��5u���:uj�M���=���J��`�#��e�]��)����9���������$IQ)�J�y��=cK�l�S��m�cu�V���l���:����u.���F���J@��W�l��6I�
����������V���'��?�q9Pk�-���o�d��4,��n��u�{�i���z���;����J��B�r�))�"�R)o��v���L�:�A=�|������y�����N9��54q���m�:�E�5����W��9�i���j*=�:���s��g���)�J5jT
����9��c��U�z�.^�8��s��gf���)�J)�"m�QN=��f�E����c����c���+����4�Y
q������o��W^y%�rH����)���#
 ��h��U���?g���Y�hQJ�R�z��|�_�g���C�f��vJ�^���c���;7S�N�O<�{��7��OOQ����m����sZ�n]���Q�;���;
�_�j`��7��}��eg[��5u�����Wz����> ���'>�+��2'�pB/^\�z���r��7��o\��������o��M����<�9���e�&M����o��f�,YR^WUU�G�����G��M���g���Y��W����'�Y�&�\w�J����u�QGe������o��H�TJ�TJ�n���?I�5EQd�M7��>��?���h6[l�E���	���~���m���k��]�����gm�����k�;@��j�v�y����K���K���[�	�Z�{�
4(�_~y^x������<q�,"��/4h��1cV��g5���j*=���u��r�)9��S2y���92���jf���9s��S�NYo������g��v��nX��+b���N�V��x��$��q�2e��U�>|��:����������>w�uWy��Ce��a�t��)S2n����U�V�j���[��w�J�����O�:��J��"u��)C�����������;��J�E�{������|�3�������~�����{�IQ)�J+=����g���{���;.��9���U�s<�r�*=4�ATg}�W������/���Zy����g�]v��~������Gy=v��>|��Zv��>x���u'�X���:��t����1bD�����)�"\pA�w'�xb����W���*'�pB�w\pA��X�Y����2r����S�N9��#V����� ��^�^����}���/~��y��������0#F�(��t��3�8c�g�u�Y���cy}����G?�Q���'O����:���?�#=z�X�9�y'hn5��u��>��������>[g�`���s�=����w�l��V��q��g�����o��$y���2x������g>���J�$��I����}/���o����������z+�K�=��o}+�������9��L�0!��{nz���$Y�tin������G&L�P����7WzNs�	�[�(���CP��f��Qy���2k��,\���=�?��50�����������
�UW]���#Fd����������k�Y�fe��	��������[n��(�2K�.������ou�WWW�_�~���K^{����5��������w��]w�u��i�;�)�G���A���Q�Fe�����D��&yd��pCy����N�.��D����<����L�����?�����+���Og��%��W���2d���q�9���3c����Y�f����^��c�9&����UUU�o�1'�xb����������;v�{�w���n��A�WI��	�SU������?[l�EN=��<���Y�xq��h�O��_?L��^x!_��W��}�z�>����/�K���?�M�6
>�m��������n�)�o�}�u:t�����^x!{��G��I��N�\J��1%�����;���|&K�.MQ)�J��R�T�[�o��?[��R�����58u�5��<��C3fLf�����[�O�>�e�]��f�5�Y���J}��L�<9�-J��]3p������i��m����wj
�G���A���Q�Fe�����D��&yd��pCy����N�.��D����<����LS�L��G����r��&�l��?<�������3�8#�n�if�����G������I���o��V9���R]]]�������^{�����k����f�5KUs�	�X-�O~��������/~�����~�V�Z%I���/�k��o�:��.�"��v[N?���;6c�����^�[o�5�;wn���DU����+���~���},������W+S*�r�!���g���{���(r���������`��jF���3g�(�$���������C��v�m�l��RE����\z��M9*@�	�j����sMMM��o�������Y�v���� IRE~��7��MDV0}��$I�T����u���J������W��3��L��o�$7n\��-�J����3����[���t��!EQ$If����~m��I�����g�y��34X-@����/^nM�N���'N\i��;���x��FL��`�={�,?��={�5}��-??���+�9e���smmm#�hZ�Z��&I������t���l��v�����g��%��3fL&N��R��$�����`��j��j��i�&I�h�����K��s�=����M�o~����*�"g�qF�9I��v��`�	�j��i�O|����w�����:(�:uJ�T*�\]|��y����5/��b>�����O�TJ�l���y����%V����,?�v�m��]�v������(R*��h���s�9���Gz���=zd����w��$����:+UU�6-�d�����J�TJQ>|x�����o~���s�=��VEQ���6o��Ff����(�$�R)I��O:�����f����j!����g�y&�?�x{������5555���;2l��:�K�R9���p�SO=57�tS���5�����6����m�����+��o|#7�pCy������)�"l�A�����b�-�ab������n����v�Uz����|��Tzh������s����R;}z��bO���n�R,^�,Y��d���������������k7�_�������|w���k���H�����k�_���������n#�����8�����k�_����J�4�������;�P�1>����fj�O����&���g��g�����yH�V�����Y�z��Vo���IQz��Uj��&J�������[k��sk������j��8��R�i�K�!@3��.�5����8���mX���*=����b��v��A�2l��{���`�
*=�:m��1y��{���	w���o; ��bj����NO����@�����J@K5��JO��d���9��3s��gg�}��	'���>8m����h����<��?�q&�;-S;����������lW����EVSEjkks�]w����J���s��G��������+=�Zg����|�W2���y��df��$[Wz*�p��B����1bD��T*%y7�����e�]��.�,�n�i�
���;.}�����-��	����3�N�*�lxfj�oO6Y�~U5K�{P��{U:�H�tL���R���n��_`m��D����\�����8���n�-+=��(�J��&L�����:�^{m���'�����T*e��!9�����~6:t����"�G���A���Q�Fe�����D�����[��N&]}o����k�y�{TW/IM��lX�m�R���t���X���<X-��?����:7�pCf��������a%I������~6�|�Z�qa�Z�/x��jg������<rC��kl�^�A��1/]���O'���--FV�h���v�m���kr�]we��%���e��6�h���9�������WlfxOK��uGQY���Y0����W����n����6;�o�9�o����������<Xk�i����k�����<��3IRo�.���N8!Gyd�t�R�y������c��g����~�J���[�O���[��N���p���<Xk�Q�F������������I��a����M���7�bs����~�c��t��L��9���3b����������i���^i���@����`�*v2�2h��\r�%�4iR������#�H�6m��_E��VxR��Y<qb����s����_F�h���������U��+�������8UUU�������g�������s���
��z��E����s���dR�s�>+�l���'f�C7NM���aB`u	�ZE����;�\sMn��V�W�Zo�?����.��������
kK���_�����7n�	����{��r��W���c�L����0�R�T���X�4o��y��Q��_��M�\a}M��l����sA�TU7��@����y�����?�)�\sM�~��$��^%I�TJ�T*�?���g��a�`UE�E��w��=yu����yX�������9����s��RU�����������s�����k���w��%K�,7��(�l���9���2l��l����`����������N������������lvh����S���Z�Gy$�\sM������5+I�_�z��}�|�����a����{�T*Upj��[<qb��~{��j�Lj�������R���U�k�>�3 �F	�ja&L��?�����k��+�$�z�^�U�����6lX>����c����!L|#w�{]&t<*�l���
�{-��OuZ���L��AVq��W��k����#S�rC������n���?>�|���W��V���G�����[})��������}0�}y��4 ��fh6�Z��N:�t��N�U���s�Gd��a�u�]+<)��+�"�z(���;��Wj�
Ya��O����7>��:X�	�ja��*�J�g�}2l��z��i��m�Gh�1�qiF��&789����*K��>�����TJ����X-HQ8p`�
�������w�Gh���6c����>��<��'�+�z����o�t�����8X-�W���6,;��S�GX-Emm<�d�8sv�/93i���Mw��O|�}��r��h1`���?�S�V��YE�:���]��Jk�o�|>���i���0�	�`�-?>3~���k�~�R�����m��cgl����&��4��@�$�+�"&��[�8S�}/EM�zk;�L���K���OUu3	�X�h�����c'�)/v�zv?����bN�������)�J�8!��	�`�����w��������~������>��������f�X��`��xbF���'2��~Y��]�u�U�3t�G�����T��kX����]�qW?�K?M������Oy6���.��|����V�������+�>��z@j��\a��������e�-�k�����,����+��_�K�.J��������'��/����	�H�,�2%�x0w��W��;����%3���o��!��Ko�W@�	� 3G>��~��L���d���68!{��:7�����9�>��<�d^���<:�sY�y�z�������gZ������*XR�g��O]���������_.�����S����`|�L���<u���\�w���K�u�K�����L�C7o���X�������[/�;:���#.���C���U�f��0��!0��[s����'%m����{B>����x�>�7��#`��������r��;��G�_X,�gNx29y�������z���r�������fq�����~�����]������!`3���e���e�����[�z�ZW���?[�^;�n��`�3�����?�.�<���tR]�!��I�]:�]�N�7 �������;��yOg�z�$�VT�4C�w6�g��
�`��O����_�������#~� �m�6��*K�Z�X�$O��<����u�z��l<%{��!�o�����,��L�ti����L������I���U�s��������w@�����y�K��O�m��f�����C;��f����G�Z�����k����&����ei�6���y�������q:����x���e������KR���.�������[�Z6X-TQ���k2���T��+�{�����k��M���`u	�h��%K2��m����N����}=���a:�����4�,���^�'�Y�	���T�_�������t�Yj����,�d��Y���{dA��������~�Ni��g3N�t`��~{w���Li`��k�u�v����6����o8�&&������q�r�����F��u���xs��������{�u���5�!		�w��,eE@� ����+��~����������@l����X(
(E�Ho!4
-@zH���|2)3��'��|�3�������\�0w>�����p��3���1	�%��Zp�?�IQ���c���D���rdrs���;�����a�*��
1��
JZPiO.'&7W���P�v6��������GT�W�*7�n����60�(}�nxw�6$���o�sZ7����#��;A�`@	������}���+7�y��������F!8�
@��XP�rR��}�7��u�Pp�������r;��������o���M�<��6u�Q���Z�`98�
�e����.�=�S�7��O�Rnph��jo�
�Sh��6�J`e�����~�z9rDYYY�T���7o�.]�(,,���wY;�����sNg��K��i�P=>������	�������6m����###5r�HM�4I���6����q������5���lD��U�:u��A�m�������L�5J����m����W^yE�����'��[�n6�������gt�RC��"�oS!s�F|Y[b;�;9�C�=�������C]�
T�
��];EGG[�v��	���O����S�,��zN��HPjh��D�����U�
�qf��8�s/���.\h�=z�u��m��Y�O�����U�n]g���4�z��:{���S�l����vS�;����{��]]G�o������,���:uJ�>���n��)z���T�fMg]@@�n��F�]�V���w�9rD/���]��l�����3�j��?�8��m�c��y�j��e����q����y�?�Y����~�����UK�g�����1C�N�*�9^n������IZ�i�����F�������obP�p��rss5w�\K�SO=%��Qh�^�z��k�u���?��?��D�x91FJ;��U�+(7�B�msR���<5�p�������?�v�Z�8q�Yn���z���V�Q�FY�,���.?'6%��k��
�:��0�6�����+��o�DF�<C([8�S�/�����#���V�>}�X�+W�Tjj���v�0F:�?]�/]�U��vus��+h���*�	���-[,�.]����f���_��$IYYY��c�:v����o9�9����:�r��z��	�>�?O���k��;9(�J{��s�NK�e�����>�x(X��Lmxn��?�*A��c�����3��!��'�Uzz�-uu���h���w��]�y�w��F�n���I%�)�����W�?�Q!5��79(G8�C'O��1�YV�j�<�V�Z�rRR�O�V�}��u��tU��8�N���c��qfP�p��RRR,�
*��px4FDDD�cz*))I'N�����}���n��|�U����e�8T���@��X��{XUXX��c���:��f�����'kW���/���:Gn�je~��7nT@�
�43(_8�C�rHH��c���Z�������� �B�t�2u���Z�8\!�n���(��@9�X�
�����<#33��1��F�9�~�@G��;��S���?��k������HK9##��1����Sc����!C<��o�>
<�Xq����kJ{
pY�,��=�*--M�9��HMM-tLOU�VM��U+�H�����X9c$I���JJJR\\��c=z�R.���233-�}���>���/y���`~(<<\u����C��u�������h)7o��g�s����-����>����+>>����Zd��{`��;<��s��B���p����kg)�]������WBB����-[�hfOPiO@���S�:���-�1F����K�,��{�����H���(��w����:u�(44��y�k��}<x���`�5n���&.+�E@ib/J{P������>�&�"�4�����������;���w/��p���t����X�<yR�t���\�R={�,���9s,�A����Sj�}�q��j��UiO\������^�&�"�4���}(M�E@ib/J������/�)8���/  @#G���M�<Y��B�-_�\�}����[o��$��W8�c?��"##��U�Vi����?z�����nK�<�����#��,����������=���;v��;���������K%$$8�k�������5]��X��{���5`�K�k����u��Q�F���W�*Ut��7*11��&<<\��bbbl�1��,��h��y6l��>''G�������l�[�*U��_�k��6��pP������>�'�|�v���.""Bc����;��G���'�J{�w��7���o��}��n�:=zTYYY���Q�-��kW�����4(`eP�����q���^	(�	���X�`�VA�=�U�V��I�,e�����(M�E@ib/J�P������^�&�"��a�1�=	\>J{��pl�X�`�V�[ql�X�`�V�[ql�X�`�V�[���/�������u��eee�R�Jj����t����0��������k�k�.�9sF!!!�]��:w���
�$Fq��R�X�]jj���[�={����3����h5h�@W\q������X�w����[u�����)<<\qqqj�����m���P���Wv���TVV�v�����=zT���Wvv�*V��*U��M�6j�������S��k�������T*&&F�j�R�T�F�b�c�8��������JNNVzz�"""�����]�v
/v,o���j��}��m��?�s��)<<\�+WV�-��}{�4��S��f����_������P�F���kWU�R����gv���Zk@���i���{����������s�N�9sF����X���U����x5n�X��������
�W�e�����cW������b/�W����={�����'O*--M!!!���V���u��W�r����s�����W��#Gt��Yeff***J�*UR�V���uk���;��s��k�.:tH��Wjj�$)&&F��WW||����W�8�����m��9�G����T���W����;�$�u)c�6m��-[�())I���m�*>>�X���@�}��g&>>�H��i�����'Nx#))��w�}&""��8:t0,��;���`L�X<u��3�|�����={���(�g[�z�|��o�5�6!!!~�J2�j�2w�u���}�Wq��;g�}�Y��A�B�����k�����9����?���	v����s���}��7o����{�W\a���
���d����������;��q��	3}�t3x�`S�f�"cH2�Z�2/���IMM���|������2]�t)����WPP�4h�Y�d��K������W^y��p�
�b����/<<��q�f��M���e�s�
7����|c�n��l�����L�4���AA�#Fx�����_`-peWN�M���.G7n4��7���E�
�|�Is��)��%GcE�P������_(���g�^$33��[���������o7M�65��g�����k�+�K��
s�_q�[�x���"			��g�5�]w����u+���S'3{�l����Q�%K��q���:�3���������u�<����j^}�U3t�PS�~}��S���������QWNN�Y�|�y���W\Q��Z�li^}�U��[yeee�^x���U��X�k�6��M3YYY>z���,����a���?��L��U��U�<��b�
�?%�;���dff��;��]�`����X�z���������~|���ln��6�?K/�^{�5�c���3qqq����������L�����7�;�Ix�����������I�Lnnn�1�.]�UI�A���o�u��x����u�-��3g�c5�V��
����	���1s�L�8�~�����_��; v�eW~�,\`-peGN�M���.7999����8wg����"�'G�;r4��������������Z��]{������;y0���������?��E����5{��������[F_|�k��l����X]�v�*���0c��1n���w����Z�j��O?�j-���W_�5jx5�&M�����{711��o���X:t0G���{x)77WC����-�����[�����u��A�={���'N�_�~Z�l����j���^�Z�_����-�111j�����9���+''�����{O)))���O�p8��.�f�:H��xj��
����l�w��Q���W;v�p�[\\�����3g�(!!A.\�:��34~�xc,�aaa�Y��bcc�����������^���3fh��
>��}����������'���h�L�������u��a��3��8������STT����t��a�9s����������.\��}�z'00Pu��QLL�BBBt��Y8p@����v�|��8����+&&��XEY�f�rss]����U�fMU�ZU:p�����������i��g�}���

r����/���������QC5k���c�t��qg��4n�8c4n�8�!����BY��Z����9����\n���^��=���B�
j������u��)8p�������j��AZ�`�����q\r4�#G(���
jy�/���)������={����v�Z������g5f����^�
����T�5������(!!A)))�6[�lQ����|�r�k���8����k���:}��<h�yc��k�)!!A,PHH�W�bbbT�F
U�XQ:~�����,m���4d���3G#G��*NQ���k��\�r���^��"""����*11��o�����W_�[�nn�LJJR��=��~K}xx�6l���\<xP������������]���X�a!|z����s�=�rR�������G�mrrr����M��u-�j��m�����q��i�S'���g,X`rss��>l���^��L�>�D����Xc��Z��3fxpdd�ON��������+���Y�R%3u�Ts���������~0O>��i���GO��={����������/�=I��������77�|��S�N��gq�������;�ay�>
��}��U���Y�����{����o���grrr\��>}������v��.�mo��v�1�.]j�����y��'��%K��S��m���?�����ZbT�R��8q���3|�pin����+��-[�������0�-2W]u������;����*U�8������'�������tK���,�h�"��uk���?��xk��qY�=z����n��
�{���vAAAf��u>y�d��I���i����K�����}�[q��/����Wv�4���
�r3o�<����-[������lK���$3y�dbi_�jUs���c���9@ye�oP�c~�,���Z��]{����|c����b��cW�������s�=�t<�o�^�-;�"o���	4={�4�<�����o���g]����������o��e.M�6�w�W��]M�������n�z�-�c����1������>���h��%��O>Yd��{�I��+�0'N4�-2���K�m8`�x�	��9$����s��"cy�_���3���0}��1s��1���wi{��!3~�x��L��-�O���_?K���03s�L����l���b^|�Efi;p�@��oc��,^9y��������4e���9r���_���G}���A���c����Z�GGG����k������dGEE�=z��'�y������b�
�]�7��Q�FY�����9y��[}sss��3g�j�w�^�����`����=�������5={��|���#CO�!v������[-����>}����[>�j�����Y�8q�9r��y-Y���&��z��~�v�r+1pQNN��I���ix�J�*��+�0����7�Wzz�0`�en���f���n�����������|�fff����[�w����������b���cW~�,\`-��+�A��p�h���77^y��&%%��>��/7AAA�~���?lO��w�h��]�A-���?���v�E������0M�41��73g�4k��1�����'���\�]�#_[�b�q8F�	0�?�|��[�x���������|���w�q���5��~?���[9��222�u�]g�Z�!%%������8��y�fS�R%K�[o���1�������������<x��>��-s9���|���.��U�V�~���&88����o�q+VQ8�Wz�!�dsQ7�.[���'**�����$��%�-[Vh���\��[7K��{����;�����xc��}f��������^`�d:v�h9}��.�AA�����K$������9GFF����b%C��'`�;vX�����~��8�<��%F��
}���.�����O?]"�,XP�aa�III1�k�����_|a�S�J���Th�_���tIf��%�O�q�����Z����9����\n����r�������{���Z�]}��>�9�����v��<����)��,��~�U�Vx�����+�bg������L�F���~��������8���xc��a����J$NRR������^��z���-q"""Lzz�������&!!��~/���e~�������E�������O<Qd�����K�.�7?���j�������zJ���~�z����^�,�?^�q������(%%�Y����z��Uh���I�&Y��~�mc
��
��A����[�5R��-P�_M����9?���4{�lU�P��q.\�+V8�C���!C|���=��z�Y~��gU�N���s���Z�h�:X�v����8��~��|��eff�<Nhh�n��K]I�I4h�������7�R���_�o�����}����U���Z�j;vl��P���_(�X���i��)9��h����r�����cG���|�����}�|6������
�,��7��1�����������a�u������!��k�+�kO<�����/I�[���y��b��^Pv�E��7�RR���U�����-����?Y�:55U���>��z��y�o��1���v�333�r��B�l��M���w�#""4q��"c=��C���p���]��u���'�{k����'���
�G�n�5j���`���.\��������4h�,���/������	��A�����m��A�7ov��6m��H�7�|�R�{Q�_�;Vg���$u��I��_�5���$JC�F�,��'O�xI:u������$�Oq\��DIE&	233]n�����������_~���,������/��k�Vv�4���
�rt��iK������k)'''�bJ�h~G����_���SXJ�]�;�G��a���9�Y~��WY�1���+;�v��X���?�)������RWT^'�^��[oUTTT�����\J��oL8��/^l)�����')\��R+W�Tjj�K���}������}����p�w�����?������c�����9s�X�yO����G�Z~���];�j��Db����-Z�H�oO�x����}��]�$JKFF��\O��������'�y�R�J����B�w���Y3���Q�~}5i��Y>��V�Z��l�v���Zk��]9
r4�#G�\]��iIJOOw�o�����>�������
�rW�e������k�+�K���5j�rrr$IC����5&{@yfg�������y���`���H��`|��,��e����K����YS���w�����c��v��oWvv����AU�^��8]�v����9���9�+!!��>v��d�ZP�����S�<��W_9/fK�=Q�$�9��w9r��c�:uJ���s�����'g��O�4c�a�K]�|g��u�r���U�B���/�;�g���.�RJ���G-�*U���8{�k)��������<�.R��o��� GS0r4��Y�v�,��;w�}�����-�N�:�jZN�h~G�p�+��������;;s-v��$��"��2e��m�&���.^~��b����<�&����v��m9P*22RM�6-�_�=,{���z�D�'y��1����~��yr
&�^d���2���??��c;w���[�l�Q�����gW���k�ea-�W�����9�,��_��$�����;W}��U�����U��u��=z�/^����a�m����7o��q���m���T��*T������O�>�6m��K�<��:q��$�Q�F�4i�O�e�(��~�m;v�Yn����o������)S,u#F��i��v������;�AAA����J$�����;K��${@Y�����;wj���Z�n�������4����3��?Y���i��)9���v����gff�u�`ff�f��i�5j�O�F���
�rW�e�����~v�Z�����;����:�S�N�������W���z��-u%�kY�|�~��g�r��8p`��z��g,����+((�Dby#55U�6m����9t������[�������gy�Ljj�>���]��j(������h��S��Gc�m�{�n�6y�����C���PXX�G���u�������"|��
%I��-��#,�WH���'u��I����z��7��C��5��C-������x@o���K�C����CZ�l��|�I=����<y����=}�^���/����Y~���^�q��'`�w�}Wc��u���+��������=z�V�Z��k���x����h��u2d�����u���=��.I999z���,u�_}�}|}-���.��w�8���K}PP�:t��~��i����Z��[���_(�X���i��)9~�Q�{������$=����Y�f�7@$''��;����7p�@���@���
�3��������r-v��|!77W�F�r^����ku�=��dl�"���������;�g�g]�=4t�P�����/4|�pK����-�2�BFF�y�}�����U������i����������,W�XQ]�v-�}q�"�\:����=:D+/����'OZNIV�j�<�V�Z�rRR�K��u�k��(F\\����t��I�}�<u��Klo������Z�����g)W�XQ|�����N������?�{�����u��7z+  @��u����������)S�h��
�?������S���������;��C�{����v����={�X~D����3g��������c���BBB���o�W�^�Y�j��������4?~\?���>��3�={����M�������&�'Nh����rnn���?��{�j��%Z�r��s{����4i��qJ�o��8����E>����R��J��{�K]�pA�����u�4u�TM�0A�&MR```����_(�X���i���9~s�5���W^�}��'c�.\���#G��W_�M7��f��)<<\'O���u����������}���G}�q\r4�#G@��/���)����\���#_x�����?H��w��zh.{@Yt���\��R����#G�h���Z�h���������4�|�>?>l9\)''Gg�����;��_h�����9=��39r��q��\r��yg9##CIII��q�>��S��v�����_x|��$�����5|��B'-�^D����������,III��+T���NDDD�c�W��OQ����-4����]��_����,99�R��w����n�����k���oW�v��#G����?�����}2224l�0�]�V:t�7��*^j��q����C���_���k+55U�7o����oyB��e�4r�H}����x�z���u��aIRll�^|�E��m�>	_�5k�^z��B�8]w�u�2e���m�U�A�Yn��Ott�����{L���^�Y�f�[	���[k����������#�<b��������^�k)�E�,==]���?��w����_����e�Zk����i���9~7f�5k�L�������%I6l��

���aC=��C���{�qLr4�!G�o�c~���Oa-������G�p��A=�������>�����l|�"��(%%E}��)�]\\����|��C�
����������l��kW=�������Wq$��{��<�$?aaa9r��~�iU�Z��X%a��	JHHp�#"",���w/�_���E8�G�����y����|o�����~��n����6��c�Ep9�{q��&%9�Z�BK���Gk�������������?�I;v�P`�LX$�IDATP�����g���%6m�$I�R��>��3]{����:T�?�����^}��������������w�Y�{{��w��;��&?�}��^�ugy�������x����O�42D������+wT�XQ=�����?{}c���������j��������G�R<����[n��r=�^�z.O��Oq�#�Evr8������u��I-Z�P����S�Ni��M��������*##��o���6l�.\����|��+�P�<�.R��O��� G��
����?h��
z��'5c������n���0a�n��6��r9r4\�<��W����WP���k�+t��{�K��/Qjj�$�y��z����� �E�U\\�������;����+w���K&LP�n�J4NHH�������/~�r��������G���^��M�2E5k�,��?���d���Ko��~���S����rzzz�������������i���z���].�_��gO-\������{����?�(N``�/^�r�����H�������������g��X1##C�F�r���w�"o��&�������?�X�\s��u��}���H�s������4h�GyDYYY%G��G
C�Q������_�XOc4b�m���Y�������*�q�#�Ev����v���5k����S���U�V-���+44T5k�������k������������5k���'��;������ GcE�������j����M�V��W������c��~��z���Kd>�h��p���_������3�bW�������e��I���vo���W{����W��������u�j���%�P�����_�~j���6n�Xbq��������Y�f����-P�����k��Q�����^��_����{����'�y�����,tL;�x�����Z�����

����*��Qh�n����x���o�G����nu����8z���,�w���U�V���&M���{%�v���O��.��l���2�8_iii:|��>��s�5��t����N;v��"yrr�3Fnn�������?�����l�����S����.��1x�`�����VRR�V�\��\��Ww�=t��������z��8�6~�x}��'���^z�����w?�^`�.]��i��n��]���-[�����R��3�(---�>�t
�r^��i���"G�Uvv�n���3F���$U�\YO>����_�3g�(++K����E�t��7:��O���Q�4q�D����)9��c~�������\�]���8~��&L��,�}��V�EeQLL�%�������Ok��Mz�����ukg����k��	1b�rss=����Zbeff�����������*&&��v��m����/^�����e�%��s��g�}�������]NN�����k��F�N��*�����O�:��ys����E��$���p�DFFZ��$�����wL;�x�����Z���������T�N����/����[����>[�����4l�P�{�������M�6i������O>�F��4���P�����v������f����~�I���s�=99Y�Vrr��1������U+�}��Z�z�>�����-[�������&((HU�VU������C{���m�����1Fc���?�P�X�z���4c�K��I�4v�X��(�~���_�������SPP��.))IK�,��=9�������r�h~G�Wc�����~�,w��I��o������cG���(88X5j����5�|-X�����i��i���^���9\�����_?`-������G�q�}�9\�zu=���>�"�"��   @�*UR���u���k����6m��������	o����z������f���]�vY� YYY6l�<X�XQQQj�����/��BK�,Q�J������4b��b����c���o_%%%9�����%K��r��n���{������������������_]�>E1��zQ���!�z[�Y~�y��ww����,gddh��m.����h����R������w^7nt�oQ.\�����K999��6m�X�H�Kv���[����t�RK�����z��|g���z��w-u����v����8QQQz�����g]NN�On���o��G}�R7n�8=��S�S�k)�E��q�����,u��UR���p-���wv�4����
�V�\�9s�8���U����������n����j��8q��w�� G�;r4��������Z`?;s-v���5o�<}��g��K/������)�"����ph����2e��~���:s��Oc���i��E���w��������iI����/^�����hZ�x��.]��XE9}�����k9��j��.�:��{���p[���ZN\��������G�Z���Usi�����#����_u��g9  @����Q��!�z[�Y\\�K]��M������>��~f7n�����(��5s+�7>��m��U�o{�7�|SAAA>�Rv��(
����<y����w��y��C��[�n��1F���������_�|~�]�V{���y��|���.O1b�f����X����^��z��e)t�]���p-������9�������/�l)?����Z��[}G�i�S�:uJ��������������_���SXJ�]�;�G��8q�����_��z�������<?~�6l�,�����O>�y���pM�6�R7o�<�s*��W_��o��RW����������}�vg]tt����k��XQ���|���,	W��u-u������}���]�����1������0��(�]� ��Z��Z�h�RW�bE����������*�8�HNNv����\]u�Ur8E�V�Ze�������v�e�>	��r��7Z~lw��1:t��qn��&Ky���>�!I
6T��mm����j�����u��|���3g�e����k)�E�&��N�8�o;��e�Zk��9
r4�!G��1F�|���n���n�P���-u�~��O�v)r4�h��g~���Oa-(v�Z��y��������������2��C�\�l���%{@y�n��RWR������J�*�rvv�6n�X"����'==]��
�u*T������}{����9|���c��S��`�X�xv���Q��;w:�]1���9����_�l���.33��1222,�
*������_�]LL�*W�l����_|'�S�J"Fi����e�4t�P�S����?��?T``�Wc��w����rvvv����L���_�+;r�hJ{��;s����=k�k���Gc�m�����@��
R��/���k����k�3�����;���_��-�J+������o���P���P-X�@]�v�j�z��)<<�YNMM��C�����!���9�.��`�X�v�,eON&<~�������|���j��rGBB��?�v�5k�X�y��v��T6�U�J�'A���������2f~���m�S��O���=�����3��5k4h� �����Z}��g
		�z���E.����(my�U�V�������Z`eGN�M�`/�w�����ys999���71�z,r4��<����)���+�bg����\n�[���8999�������_:��������G}���z\���6m�X�<��w/��M9��#q/0�R^�l��1n�]�d����gOEFF�����R�n�,uK�.u+�1F��-��
8�����c�����n��R������������#���M������
��+���u��i�c��W�f���[��o�YK�.�������-�����g�>	��r��y�����8��������Q�$i��M������W^y�>��s�S$���GEDD8�{��q�I			��w���=zk>�����-����dg~����X��� GC�����!���c�q��QK�������w������_(������\�]�#o,\������i�,c�����i���K,�"������1F������;�c��]w��O?��Y��s�j����?�5w�"����^��x�K�.���u�8��+W��w��9���A�
l���l��Y�b�<�,����s��n���]� ��Z��n��FKy�����u��'�|b)�h���/���US��]-u���w+����g�Y�|�#�:u��w���*U�d�e��������";�I����[~XW�jU��Q��q����Y�}���c��i�&[bI��;��?�Qg��u�]q�����T�b�b���}�Z��~�m���mw�u��I��Zrr�%�-I�z�*��]���p-���wv�4���� ������7�|����/��5jT�y�E��;�h�Qy�/���)���3�bW����w�8���C�aaa.m
:�����2����?���T�c��u:q�����-[�H,��G����{��g��5k�n��v���w/2o�<���������7o����1�,���#-u�'O.��
��/�w�}�,GEE��[o-���a�,O����o����1F�'O�������>�+v����k�?���������z��w���������[�������{-�^xA���E�z�����/�8�+V����"��+;�I�-==]�&M��
0�������}����������G��x�A�j��u��:x�������'O:�7n��K����wo�5�R~��W-I��$%%i��Y��@i�0a��������������v�����+;r�h��^P�=�{����p��[}W�Z���������M����7�1��������r-v���{@y5w�\����R���%_������>j����k]:�;w����s-u%�`�G}�%w2m�4�=[q�i�F;vt�SRR���������Wjj��|�UW���1^8q�����4���)S�����#�~�����?�x�q~�aK�
��G����g������6�N�*2���-�$�����u0����_�X���YV�^=���7o�����?�X`�.�a��Y�DDD��'O'''��n���o��&''��>?����~��G)�=�1�%��u���c���n��s��7&N�h��_�Q�S�N���{[>��O?��o�]�v�G}�����V�2111�8�;w6�����5k����[h��������]������E���Ws�R���GM��
-}���k:���=q�UWYb
8�dee��633�0����k�-�y`�1S�L17nt�}vv��������;n��"���_��Z���E��Z�-�r�h�C�P�}��W.�8����B?��1f����f���~M�41.\piK���
�r�����������{u%��{��'�������G��E<Q����E%�{��+W��S����T��}���&$$���!��y��g��%K<����j���Y�x����;w��3�>|��X��m3u��qY����"����M�4��>�=����r��7���KK���`�j����\��[�,[��'s�,^��?�����1c,_�rrr�g�}f���kiW�fMs���"c�:u�T�^���`����>|��{��.�y����z/��"k�:���m���f���.�i��Y>�����m�t�R�}��"����X�bE3s�Ls��YK�
6�=z�|����n��e����a���wo��Z�������].�7m���;w��8�~s�1����F��m�$��S'3}�t�y��|x���kv��i�~�i���6a��cl���H2*T0C�5���3�����MKK3K�.5���\����E���8��<�����o�S?~������+�py?�;w.�c<��"55��j���>00���5��=^a����"���w����K�=z��Hb���.����@����o]�������9s���m����vi���l>��C��];���F��C>c��/�u-���"�q-(�r�h<G�P���������k�1��-s�Fr��I3m�4��g��y��O��w�h���A-�����-��{�c����M�6�8'N,�wz�r-���?*`�GI�E>��3#������������3���K�m��;g.\h���z�����+���h��AF�i���y�����u�
<\������_4���s�u�-����3F�����w�}����/���dff�5k����G���p8��E�
�u��`���;�������s��1�����/,,���9�r�YJJ��1c�	����������������.]L>7l���o���IX�Lxx�Y�z��qV�Z���������
���@��4��'j���]�`�Z`���hz�r���c���
��
		1-Z�0W^y��E���{�������	��L�����W^iZ�h�r��$S�J��O?��,�\a�>	O]<+���A��}���s���e��&**��=Ha7"\��"��R�J�Y�f�S�N&>>�4l�0����o7V|��E���7W���^�vm��uks�UW���[�j���~��k��S�<��"�k/�y�{�f������Y�������Q�F��>}�[������/~�7j�������;��
��(x�5�={������]��s]����eGN������������?�d"##M���M�N�L�F�\n���?~|�����9@yg�oP�c~�{u�]@�d�^d����~��#�b�=���p�1�E�+��������V�jZ�ha:w�l��oo���W`.'&&�����xV������3m��5W]u�i����T�R���O�>E�y������(��I��cGs��W�&M��zu��p8������o��Xy�R����~���|�e����U�V�e����U5jd����^��p�bIOO7��
s��*U��+Vxg����r��n�����LFF������]�`L��v��������+����q�SO=���z��������Y�f��Zn�0��}���,w_+V4�f�*2i\�������J�y�f��O~7Wx�����������^��rs�1�L�6���W����3�o�w�������������+�`����^)Ok�/�tN�r4�"G�$&&�=zx|m$88�<��s��i����
����7��1���:��^�7��X���;2���Ge�,c���S`������9p��[�#���}������~�dee����}5i��|��7��'*`cLBB�G�Y�k��$&&z�E	CXX�>��#}��'j��]��"""4v�X���C=z��8������Cc��Q�

l��}{}����������P��x��u��-�g�k�����W^yE�5*�]hh�n��Fm��U�&M�*������~�IC�Uppp��4h��^zI?����4i�U,f�>	O|��G�:u�z����+���p�M�6z���o�>�3F���>�Z��W_}�q���M�6
,2Nxx�
���~(���R�>��f���[n�E5k�t�O�Z�4~�xm��]/���"##��W��?^7nT�����%���
0@?���|�A{'�,���������U+�����2d�V�Z����Z�j��+�P��X��� Gc?�"W�N-_�\��z��Q�5�����5f�m��M?�p�yr4��
��)���?���t��k�3�����M��}5�|�s�=j��Y���HR��u�m�i���Z�d�4h�V��^zI����4`�U�R��>�7��I��g�=����Y.�����U�����S�N
		)�Opp�z���>�@��mS��=��_YS�^=�_�^S�N-4�U�fM=���Z�n������98�1��#�����O������G�������h�B]�vUXX�Ob���k�����s�����Z�j�s��j���Ob�� �����������y��;���\����^�z���k
�`��s��i�����w���=���H���)>>^��5�Y����}�������{�o�>%&&���s���VTT����U�~}����uPVaRSS�c����_IIIJIIQ@@����U�R%�j�J-[�t�&��=zT�w����u�����+""B+VT�5��}{�o�(ON�<���W���JMMUDD�5j��]�*66����L���i��JHH����������\����R�Jj���Z�n��=�Ev���Zk��]9
r4�c/�w������u��%''+##C+VT�*U��M�l���C�
B������7�1�P�Oa-������G����%''k��:x�����������EGG�J�*j����6m��AYE9x������C��������TDD����U�N����}PVa233�����������~;(+&&F��7W����:(�<�����?���[�*))I�T�Z5�k�N���^����X�U����`+���8��,���`+���8��,���`+���8��,���`+���8��,���`+���8��	WC/��IEND�B`�
append-only.pngimage/png; name=append-only.pngDownload
�PNG


IHDR�
�x��T9tEXtSoftwareMatplotlib version3.9.1, https://matplotlib.org/��!	pHYs.#.#x�?vIDATx���w�T��?���eaYzG�`W�����5��Xn��J�KL"��XPc�)��xC�Q���w�b/hi�"������0����.�����s�s�|��=$Y����'I�4
�L2���E��,6+XlV
���`�Y)�`�R��f���J��,6+XlVM�h|�4���G�[o�s�����.]���{����O$IR���2X����1#�x��x�����7��7�|3/^�{�W�^1e���d[�jU��7��_���1c�������������~����9![�$M���!`K���/���_���z��9s���k���q��'��1c�t����>�`t��}'`K�)v��92����
�_��9sb�������7o����]w�5***��5jT80����9��P�E��e�bG���>;&M���+**����u��7/�����n��7/~��_�a}��q�9�#2%�I����U�V����F���c�����������c���E���SO���?�������'��C=4��-Z��~���g�}��#��U�VED��?�=�\Q?�%I�4-v��M�4)V�\���Kd2���F��W��W��2e�f������o��K.�$���������Kb��a������_~y�e`�����X���N�����E���GE�V���n�����6����Ks��}���u�]7YV�M�(�|0o>��S6X~��U��������{���Z��p��x���ss�=�Y�fE���[�reL�>=7v�a��m�:�U�[�G}4o>��#����#��+�z��G���.*T�z{������N*���v<�@�x��u:7����T�����3��AT��|p����oG�����Ml��N���-��-Z���={�y}�^����27/]�4�O�^��l��;P&L��{��Q�=z������	�U�UH5�?����;%��`���q�I'�����(�����9s��m����{t��=�����S�f���v�!���W�4�W�:�ji�SPl����.[V�H�m���j����,�J-Y�$on��E�������
5g���;wn��L�8� �(5�=���#V,.v����(u�����+�N�i)���T������z���y����P7�|s:� {l���#��.bea�un��&S�@q�X�"on���M���5���/_�Q������_�Il�***�����z��r����	���f���a�;P-[���W�XQ�=�/_��=����n|��_����'�I'�T����lu�cg�5�Y�����Y���1����������O1����6)X���YV�t��z�QsM�
�:w��;w.�^[�4[�X�NM+7�'i]U���H��n[vY�/S�@q�,�����U�=f����=���V���m����R;��s�<}��z�Qs�.���Q���lu�cO�%�-
�J���+�7o���.]S�N����S���e�rs�-�G��������2e�?@})���T�$��{�{��W�����_����c�H�� ����`%�J�[�;�������~��kk���/|� ���lu���'@})����	'��7��o�%K�lp�����o�[��O<�����4�?g<)��5`+��{D���s��%K��k����k��&�.]��8������&����,�J<)��5`�$I���#6���+�����_�/�������������
6�Ay�8���YP*�;l-^~��X�|y��o��v��b��x��g��G�n��o���u��G��GO=�TDD�Z�*�:����/���7���2""�.]�����.�U�V��{��q���4u�f��LYqru��id��H���Q�-T�$��d"I�bGY/X���q�1u��
�7{��8��#���Yg���/p��;��#<���<yrD|Z����0.������O�i~�a�X�"o���o�I�P75��Lqr���i�X�"/^�/����bG�eee��E�h��U�h�"���7i(��K�.��s���'�o��v�����c��qk]��^{�C=�:u�\1�![�?+���e��e1s��X�jU��[����X�hQ,Z�(""Z�j�l�M�)�r[���^�z�o�W_}ut��m��u��-����x����G��1!5e��s�q<����W��MS~4�/��S�6��KM��S�L���H�t��7m�4�?��2dH�5*�~���3gNDDt��9��k��g�}"�������s�_��FaM���vA���+c��)��g�h��YQ�(�j�d2���������i6V����i��9�V�Uyyy�n�:Z�l����$I�[�4M���:�/_�/�e����NZ�zu��=;z��Y��
�JV�FVF��+b��Uy�Z�j��wWzl6���QQQ��������>}zTUU��_�ti�Z�*������m
��V��IYqr�g���ysyy��+���6m�z��L�o����O���S
�JT���3
��NiZ�|F����[+���I�&��u��c
�h�l����"PTi�FUUU���-[)
@��X�V����e�nk���:�xR�*[��>"�����������4U�@��5��K�������d�$)B��2k�&���m.
�JT�gRO��V(
nk���F�Z���Qr[�D���sRV����De��s�I�D��P����s��"@�p[�D���9��P"��(Qiu���'@})�(Q�l����P"��(Qi����"@�p[�D���sRV����De��sFP"`���FV�I����G�$�����;k��@�J����'E���@��f����89�K@�Jk`e<)��5JT����"@�p[�De��gX@�hR�4L���3e��@q�iZ��&2r�����b����db�����F�6m��n����K/����c�����]��e�]��C�&MV;�d��7n\���{1��X�|y�i�&:v����O���N
���/^c���	&���c���QYY�������.���]�t���l�i����o��g���?�8��i]�v��>8�v�Z�kUWW�k��S�L��>�(����_�~q����:���D�,�J2��@��1"��/����������:n��������>�����2�����W\y�-^�8�
��zk,Z����N�:�UW]_�������������;�x��x��7c����<�k��1x������������k�=:�
�>�hTUU�����{�q����}���O�2%z����5_����k_��:��<yrl��v�|���*n���������w�]�9I������\rI�p�	��k\~��1t�����s���b��q�UW��w��f��[���{*�������,���t�����O?��:�Y�lY\{����k���O>��7���I�&�1�����5������7b���q�
7�7�#�<_����}��Yq�e��m��������N�~��_��_�lv�'��eU7�xc�i�&�
V�|
�����i���'O^�yi���o�'�xb|�_����;Z�hQ�����[q�q����3�d��P�j`e�������i�z��y�W��u����/���ee�	���/����s���A�����$�>}�D����O�>����_�:�����7��+jk��y���N�����~���{��L&��h��1`��?~�?����]tQ���V�Z����p@������G�H�d����?�U~��i��y��c����]v�%�4iRk��A���g�>��O���:*���{�������N;�
�0�P�
�@c��?��J(Yw�qGL�2%""N;�����Kb�]w��?�����K���o���������'?�IL�6-***�������G��]s�M�0!���o�/��;6d��8��S���|����������N8!
}���Ux�x��x�����+����?""�-[��~z�=z��U+W����??���'�]tQ���>��-^�8F��=�X�y�������k�<�����k��6��O~��8��#��9?�g���q��+_�J,_�<w��C�.� ?���2����=���\rI��=;""�x�����~��r�:�[�O~���3gN�����������;��C�������/�\��;X%Jk���	�q[S~u�u��y��W��:�M7���/�?��O��i|�+_����G��-����C9����w�9���o��b���1k��x��G���NZk�}��7&M��z�Zo�V�Z�g�'�|r�|����c�ED�[o�O<�Ds�1k]���#,X���<���������4(
���/�_��W�����>"��{}����W�W��SO=5��j���q�%�����U�V��o~3�=��8p`|��q���������{���t���gG�&M�����������~�����9;X%*[�?g`@IK����?��1�he:D���2�+_��Z��>k��a��?�9��O�%aM���~����_�QYY�\rI�~���c�?��:�z��]������%����|�IDD��OZg�����7�������6m}���W�����{c��������v\z��\��{�����{��W�?����>����:_{��!k-��)�(Qi6N<)%�z����s�b����8gN4����1�*I����+6x^�n�b����7�x#w�W�^q�9�lp�����d2�r�1c�4<�Z�o�>�9�����{""��W^Y����/������ec���������������kw�}�8���������|0������l�k+++���.�w�R�x��X��XO���=��#v�i�:���n���_���T���e��n��r��i����.z���{=c���;w�Z����[�|��w<KC��??�\�����v���k�#�<2�z��%u.;����u����V)��%*[�+Q�P���w�:���C��y�}����?�0""-ZT�5.�������K/��o�}�Q,Z�(�-[�������N�:�:>h��(++���������b��1d�����O�?O����K��in�o����G��=������i�������*enk���:V�P��V�.���Y�|�����t��8����k����o|#�c���Y�f���*��������G�s�9y�n����~��c����/�0{��X�`A��S(������?��H��^?�w\�u��{�.��(M���I��s��89��(��!v�3��1�he:;�:UTTe����7/
����F��r��u�����6f��?�p��Q�F��Q������$Ib�=��c�9&�8������F������|�O>��N��n����n�`��l��$S�@a$�L4����1 ""���/�*����G80����n�m�l�2�7o�����w���_�t����x����{��k��&�z��Z��io��V���[q�UW�q�����c�v����..,����������vc��D���sF��C��#rs�V���[n��N;-��jm�����ZI��i����vZ�������O��#���^�y���:��G�^x!}��8��C�u����������q��Q{���g��o�`�����'e������{�������i��V��,h�u���}���s�=7�4���{/�z�����{���^���x��������4iR�l����[��;���l�M|���/�5����(Q��X��^{����:�)��R�����+H�$Ib�]w�s�=7^|��x����������_
r�����w�<q���_�O��P����s��"����s�w�a�(++���E���Q�6I�C9$~��_�{����zn��_��iZ��80o~��g����q[�D�5
���=��������:������X�b���|p�<o������E��y��eu�F���c��v���&M���)�+X%*����'E(��]��^�7..\��53f���C�n�T����k�����o�7O�<�^���O~�7���?�O>��^{�ank��l���'E(��:(����*.�����?w��8����T���%�\w�yg�^��N��i�_}��}��w�����/o~���b��Uu�v�g�������1�3g����V��?���q��W�y���m
���(�J<)@�y��y����g�uVL�:5��������o�=��#�z�����u�]�t�w�y'����F���c�����O����k���f���^�#�<2x�������8�����w���c�=���|�Ax������&y��x��g�~V�X�����,����G�6mr�^}���m�����.������={v<��#��o;�w�g�}v�?�N[�&�@����sRV�Y�;��9��#��c���{,w��;��;��#����:u���������*w����;��c:����3gN�z��q���FD�6�l;v�-Z���Kc����d��Z���������:�=������F��F�Z���'O����.���;����|�����GD��W\qE\q���c����k�h�"-Z�����s���s��de��sF����5�:��x��7���������:��SO�?��O��_�b����G�G}����7o7�pC|���^�>_��Wc���q���F��������#���N��#G��7o���7o�z�'I=z�h����b�a�X�'E(��m��/��\rI�i�f�����/���������i��u���C���w�|����K�
���}���w�����`��W_}u���[1d�����>�;w����:g���~����7���z(
���XVVx`\q�1q�����+�u��I�6���7n\���n�y�����_�"&������O>����_Fl�����8�<�TL?�����[��q��"&�z�^�:>����c;��c4i��H��0V�X���j�?>>���h��it��-���;��SA�1y���0aBL�:5>��������-[F�N�b��w��}�6��--[�,^{���>}z��??�/_-[���;��;����k�h���1�jS���������	@�d��sRV�l�***b���1p��Mv���{G���7���RYY�
*v�-B��h��FV��"DD$I����P�j`%�J��%*[�?'e��P_
�JT���3�J��%*[�?'�J��%*���
��R��@�J���LYqr��,������'E���@�J`%�m
�����2e��P_
�JP�����DP"`���`e<)��5JPv-X�'E���@	J�k��m�
������O�%�m
��U��iZ�Ponk������L����
�JP��},��P"��(A����`��m
��fk��m�
��e�kK<)��5JP��}L�$�N��@	���+�I�D��P����������!�;��O>/��R��7/��k���o����Y�bG�M"���I&"I����`����1#�|���|�QGE����y�|����c�����6�l�������$Y���k)�(
�hTn������k""�M�6q������9s��a��g��4M#""��W��i3g��N8!����8���7}x���XX@	qk�F����Y�v�iQYY��s��f��������a�^�:�>��X�`�&N�WZ�?'e�����)S"I����g�]�H��,����	reV��:��:uj�u�]�$I�i����,����_�����a}���q���n���K6�?'�JH�b�5���+�J�$:��u�����5���S�$I�����N:)������8���c��Q��i�y��q�UWm���9�5
�2
���������s���f�h���:�}��G"����=��3��*"�i��q��W���3g����_��PDiu���'�1"�$��\~����D	P�E�1o�������c���<o��%���oF�$���|e��}�������������i�����9��PB����X�lY�u�-�y�o��W��4M#"����^�yM�4�>}���Y�f()_Z�?g<%��6h4�4i�{�|��u����/�^�n�:��s�u���u�����odBh<���9��PB����h��MDD�i��O_�y���?"""I�8������g�����
���:N�k�@	Q�E���;�^/X� &L�P����g�+��I�DD��������s�[�n]���d��s�S"@	iR���>���L&�4�������q�M7��s��7F��w��$��?|��-^�8f���+�����&J�_Z�+Q�����3���e�����k����cc����u����G0 ��i��}.\c���	&��UUU��m����s���?z��U�O��.\���j|��G1o���f���m��~��c�=����;o�5&L����z��93����s����������Z�O��(���h��]4(�y�������[�K�.1x��(//�;��3����H�$�4�v�!��g�u�7z��\�V�$���;n���CZ�?'e��@��1"��/�������c��U��_�*�����;wn�u��5�/~��q�u�E����t�1c��=��O=�T�����^�����O�{����o~3�7o��}�$Y���C����C����������l6��?����oc���Q]]����$����;�8���������[o���z��������7�\�����k\}����/|�^�R7
�hT.���x��gr%W5�}����?��z�z��Gr���m�(�&M�o��F��_�����h��]���.q�AEEEE�r-\�0F��'O��F6��6m����n�����]�-��f���,���p��8������_^�9+W��{��'{�����{��c�Y��7�xc|����s�?�0�=�����>�`���u^[���^�r�)��;�l��4Mc���1z��X�hQ\~��u������^{�z�?~|�p�	q�W�%�\R���X4*�~x|�{���n�)������5�Xp@|��X�^��{on��>x��n�x ����=z�Z�o��e�}��q�e�E��7[����/n���1b�z[��{���w���sN4i��@1�5
��LqrP�l6���/��_u��!z��+V����'��+r�-Z�(���/�c�=\���]�F�V��[�n��M�X�zu��;7�O��w�����rH������s�|�
{����K_�R,\���{�:u�m��&�6m,�)S�D���E���^�W~��U����g4o�<�N�s���;��K/�~�������]���\C�����.��m�\sM�Z�*��4M��#�����+�����4�<�HL�:5">-��PK���r��������_�{��%K��o������{��7=��M�k���q��g�c�=V�����������n�{��g��4P�+����q����}��'����8���"I����������.� W�b��8���c�����m�u���Y�8��������;,z��Y�������������+c���1k����7�>��Z�}���#"�����!C�����_�3�<s�y��s�Z��L�'�|r^�U�f��������sN���7��%K�������{o�u�]��VM/��BL�<9""��?�#����8p`4i�iS������������������~'�pB�<6�?I�+��2>�`�����|�����[q�q��np�O<��K��N��q�$���W���Z������g����M��<yr|��'������sL<��3u��
�h��8��#c��������S���#�$�3f��Y���5jT80^|���n��6I>�.[�?'
�J����c�=6x��(//�{�e����o}+����b��9�iI��_7�t�Z�=��c��3����;���:t��|�;���|%�8��5jTDD<��C�����*������?Q��O�>������O��?�87w��-�x���}���z~��-��#��#�8"�����6mZ����������?���QVV��~�$1`��x��b��������1#}��8�����X7�6h��u���n�!n������K�\u��7��1cr?��w��i7��k��U~���|'�M�~�a�3&,X��w_^C��e���SN�+�*��������N8��=zt��3'F�o��f|��G�����g��w����������I��ni6N��~�c�m��{���V��g����q�w�������~�~��m������kw�}wd2�WO4|��:�o���z*^}�����Y���_���}��k���|����/n���Z�W���S����K��=���u��d��k�������<��UW]^xa��L&_��c�����}�s1e�����d�W��U:��������zk������7����w�u����;c��w�K/�4w�����W_}��el��X_��IR�4P��X��#
�y����}��~��h����;���b��A����FD����������|�;����;�������ZDD���+�w]~��_����~�����+�Xo����rJ<87�=z�e�)�����k������C=4.���u���{��������s�n�����~:t(X�Gy$���ss�N���������/�8����?~|���?�`3�V�����-�n�q���b�6����v�N�v���q��������:+W�1b���`ED���;W�5f����[��U�b����I�&���~w�]�M�6q�QG������G��=c��i1}��M�kk��lb�l6���?�����#�@k����rHn^�xq����oA�M�0!o>������r��2�L|��_�;6q���f`��l��)+N
c�=����������o������=;~����g����{t��%�7oI�������s��-[��/�s��x��7���{���k����Z���Od2u�^���s��'�|�)"m�`�&��+����sss�>}j��c]������<�@�E,X� o���G�����3o^�pa!"PG���9��@I�m���u~��=�u���y������Z��7o^�s�9��{���~w�uW�;6���+V����6U���I������o�\g��Z�E�-r�7U	���I����i&L�i����E�b�����E�>g�y�&H�a�>�h�|�GD�$uZ{�G��#F���K���R�m���������;v,H&�&���
�J[����}���h�����f��h��Z�"�&M���������r���Z�.,���[PU_�t�N����>��~{<��Si�+V�[o��7t�Au^��[��n��b��)QUU���n���� ���k��y���u^��o�����!"PG���9SV�@�4o1��b���5o��s������kZ�h�7/Y�$����*�=��Z�W;��cv�a���;G����E���y�H�$w���^O=�T�3��������-[n�k�8(����;wn���W<��3��i��J�$�4������?>o���o�����7W��f�B`����E�X�tiDD������������u'N���������"N?���d�n�l��d��(�$Q���)(�e���{����5j�G�z��������.]��������������~{��4D�V���%K�l��R|nm��,X� ;��x��gr�WS^�1�Y��|���6mZ��=z�k���O�0a�s���m���O�w���O��#G�s������c�������a��E�����
S��e�7o^��,X� �:��D��������{������N�W5�����o�7��3g�\��kR��YC����{/�$�$I"M�h��My������G������1�l��yy%\����.����{�\�_�^xa�7.���������������;.�<�����W$I3f��g�}6����X�jU����;�����l���,��6v��z�?u��X�hQn^��F6���#G�����+<��:�?n��z�i�w�1o~��77�u)>X4,����/���$I���.�/�0�5kV�x
�d������2�u��E�����2�L�y��q�A���Cc���Q]]=�P<��C�\w�����C���/h��OK����[�5'N,x��,��������0�y��X�`A�o��N�?���y�����7��??V�^��w�y�:gy���c��u>?S�[�4���}��'*++c��e1f���5kVt����{P�`�h<���Q]]I�D�$q����%�\R�X�fYUEEE��h���z�,�$I�{��^�x��1x��x��G�{����w^8��Y""n���:t�&�`K�f���,���j�����{����n�������7v�ays�����:g�����|nDD�-��5eVuQ^^�~x<����z��������+��WJOf����1}�����gEEE2���6��+���M��{�f������/��Lk�t�����;�����""^~�����������^{��y��l���S"%o��a�x��
����O���>���7o��vZ�9:t�&M����^{-V�^����z��z`�o�>o�<yr���{��y�5�\���N������A���!0I��q��y��EN��***���� ��r������f�����_�p�
�r��w�9n���x���b��%�l���4iR><��w�����{/9��x��
�	�
K��gX����>�SO=5V�Z��s&N�g�yf����:+��m�w���,��?�#o����~���8qb�x���������+Z�l�������\���~xr�!�y���q��G��k����[o��z4nm�ht��%����������#"V�XQ�=��R�k���b��8��#�������7����?c������;G�-�y����O�8���b���q����_�zu�v�i1~������w�c�����.`k�f��LYqrP�z�����{,<��x���#M���K�.�?��������9sr��t����/��g����.�(���>"b��yq����~����M�$Ib��w�s�L&�~xn^�pap�q��W��>�<�L���������h��}n�9sf��������$�e��K���O?�����W�^�GJ���2������iL�>��i
�fY��e�"M�H���{,]�t�{n����:����
����#�Yw7^�$1l���6mZ��/��O���;��x���
��s����s�������(�J|M:���3�@�:��3���^���~:F��:D�^�b��1y��X�|y��f����w����[��_�����[n���z+">�v������n�w�1��m������'Guuun�E]3f��	&�9��~��x���r�]���~\x��k=���������g�w�}q�I'���#��^����.�������sl��6��i��?~L�2%�5�������F�~��o���i#��o�Y�D�c��yeW�V���~�!3f���UU]]7�xc��a�������~�������Ol1�e� ���`��L&����s��\�����c��������*�j��U�{�����~�{�����>;��c��l6&L��_=&N��W~���8�
V���vX��7�����z���/��r�������3gN����1r������_m���Q:th����^Z�$���y����g��i���k������.�+"����g��7/7w��18��:����G�����9M�x���
�
�
Kk<��)+N
�M�6�����UW];v\�9M�6�SN9%�}��8���7�g��=c������������u�w���O>�_}$I�������c���q�����A��[�nQYYY��������N�~�����{�wmYYYt�Aq�M7�y�����O�b��:������F����'�|2��]w]�cm�]v�%�N����}��������?��~�0y���y�����?xz��c����3f�(H66���'�&`�P^^^xa2$^}��x��w���?���[���n��m��k�6m���~��������_��'�'�|��7�=z�={��[3|��>|x��o���1t��z������8��s��s����g�����g�����G�&M�]�v���;�^{���?����.�4mp�#F4x-���F����}d2�������n�7�|3.���0`@��5�^{�O>�dn~��W��������>�(�L�������o����r����I���:(//�����7*u���W�`lY�4i�rHr�!��e��q�1�l���K�.q�I';��,�$I��[o����~��x������v����{��:u����z�y���o���w�����W_���y��H�4�$�����z*o8p`�l�� �:t��7��9��{��1#o����Fe�����9�(!
�h�.\�F��+VD���`��x��g������b`t�A��c��7o^DD|���1b��8p����|��',�v�m�7O�6-&M��o�}��/^�8F��w��k�xiu���'@C�n��^{-����_}|��'�$I��e2�8�����
:4W��.���?��_���Z��SN9�`�v�i��v�m��]w�uu^��_�*V�\��+++��(X>�/���3�`�}6���[4*���^}��1k��\AT����\p���e��������W_���g�����7���{����c��^��eaI���#�{�����������;�X�����~8�
�w��SO�f��mp-���(�J<%��&�����}/-Z����4���>:N8���m���C�QYYY�����c���O?��Os�.����6mZ��g?�n��EDD6���z(�=���6mZ��n���y��W�\��~�v�m�`�������������{.�����;�������&n����~���*++��K/-x>�-���3e���
�h4���x���"I�H�4��o��w_z����V\pA���+��#����r�-q�m�E�^��M�61y��X�pa����������F��m��]�vq�����G+W��>|x><:w��n�m$I3g���>����L&�������W���n��^���H`%$S����/�i�F�$q���n1�W�E��o�SO=5�xuuu|���1f��Z�W:t��{,>��M���C�g�yf�Vs�����G��Q��Z~��K�x�����O�d�X��f��D��������s���m'�|r�lq��w����{���:�k��E|����w�}7��s}�s��w�y'n����e�]6x�v�m��
�q��������P[Z�?g<%PRi��~.���bG���I���Z����$I�O�>�$I�m:'�|r�|��1q��x���c��QUUm���]w�5>��������i�68S�V���?�a���?�Y�f���#c����p��H�4��i]�t����/z�����P�l���'@C(����v�ms������d��a�b�v(v�Z�v�_�����Hk`e���!����������E��1e��X�zu�#@�U�+�)����A���[�8��#""b��%����94^���9��PB���Q���K���,""�?��X�dI�@��f����89B�����o#"�������;.f��]�T��d�����D����������{����[�K/�����K/�4���F�����B���O�%�I��g���'�:I�H�4,X?�����?�y���G�������^�&I�&M*t\(��:��'@C(��Q�2eJ��*I�H�$""�4�������5kV��]�l)���9�'���������q��=
4��7""�)�
X4J5�a�1V���D�,ht�V$�j��(///B�|�V����$��n����F�g��E����:��'��$��M�FUUU���%K������>�h������\�1e��bG�������,hZ�j������-�N�:�d`����
���iS�4����4HZ�+�)hZ�j�7�Z�*f��i�)�������S�F���k��IQ�@��xF%X�(TTTDyyy�Z�*wl���1i��h��u�l�2�4i���&��iTWW��e�b��%�l��Z%|-Z�����"%��,��V��IYqr��$�n����i��
gV�Z�������1@Dyyyt����1B
 @	J��s�S"�hTVVF��=#I�bG���Y����W4k���Q`��l���S"�����aM	Vyyy��DDD�V��W�^���R�b�����Y4>����������+c��E�x�����*v,`+QVV-[���-[F�-�������(��Q9��s6��I������I��bH��s�q=��[�$QQQ��s�H�4��l�iZ�h�*I��d2�$I����,�����4i�*�`������Lqr��$I��i�P���f�eco���J��sFPB`���,���5�Wi�n�^�Xek`%e���
�hT&O�\�5��-��s����#�����7��$Ib�v��o�=z���	�@q���s�)N��P�E���W���u�]��C���;/������7��&M��N;-�y���e�]
��'��>�Q���6��|�K_�'�x"***b���q�����E��
&����l��h(Xl����C�����S��e�]V�DP8iu�cX@	Q���;��NDD�i��b���EN��fkK<%��6�bm��6��w���X�|y���EN��U��8�6��u��)�����+b(�����L���@���i�#@�)�b��d����e��1	N6[�X�)�����k�������G�$��m���I`%��
�X�\sM�^�:�4�����{9��
�2�JH�b�B�f�q�5���W_I�D����Y�8����

"[]�XR��s4�,�^x�A��/_�g��1c�������O�4M#""I�������7/dT(�t-X�����P
�hTI�l��-�J�4��~����+
�l���DPB���QJ��A?�+�J�4��{�x����]�v��8PP��
��6��R�E������k�_�|����oD�^�
��/��},�)��4)v���.���k�$����h��u���+��g�����&H�C6[�X��5���	`�`��4��6i����89�w{���:�(�J�,������'D���@�Ik`e<!��7JL�:N<!��7JL�������h�&����/l��=��M�7lN5�2�"(1
�hTI�|�$Ib�����![�+Q��X4Ji�;4Ziu���'@C)���ih�U�$��l��L�89J��e�]V�5��-��s����#c��q�i�;�g�qF�#@����9Q��X4*
)����c���_?�pL�4)&N�����I�U`�Q�+�`����N���[��v�-|������#M������k_�Z�c@Ae�����89J[�+��2�:��\	��w�]�HP0i6N<!��7�b]v�e��i�5l	j`e<!��7�bp���}����4iR�3����0���sRV�
��-Z��=s�G�]�$P8i6�(�J�,�h����W|��9EL���Q��xB(1no���f���������"���I��gX@�q{�-�#�<.��]�v-^(�4�?g�����`�E�4iR|�{��$Ir�>���1N�FV�	��������:�~������c�����3gF���$Ix����G�bG��H`�>IR��AM�>�O�>
Z�|������c��U������������
��-���3
����Fe��)�$I�i��=�$��QVV����(`J(�l����89J�R�$�^��4k������w��]���������l��d����`��������WI�DEEE�n�:z�����O{������o��P\�XX@�Q�E�2e��bG�F/�������h(��Pb�l��xB(1no��l���'D���@�I���LYqr4�,������,��(�(1i�,O�%��
��^z)���r?�=�\��y��gs{4i�$F�U��P<5�2����i�@���A�����>�4�4M���1p���3h���{��#M��f���?���I�x���s�	����A���f����$I"I�8��36j�3�<3""�$��z��QH��sRV�
��F��w���?�8�4�����;n��[�>M��={vL�0a�3@cP�+�	����A�1~�����m�F�>}6j����>��m�����Q�@c����O�%��
�Y�fEDD�$��{��������^��1� {@��5������`�h,[�,��E�����,Y�� {@�e��s�"@�q{�F�M�6�����/��,�����,��Pli���"@�q{�F�S�N��iL�>=�/_�Q�-[�,�N�I����.�������h(X4���K�uUUU<��S���O>UUU��iDDl����4�l����Pb�����c�=�s���$I�iW^y�F�7l��H�$""��m���!b@��5
�O��Y�~�3�7hTN:��H�4""��?��������3fLDD$I'�tR�J]��LYqr4�,��/�8�6mI�D������&�<��X�hQ��/Z�(�����o~����������l'��'[�?'�J��4*=z���.�(�4�X�����={�~��x��'b��yyk���O<�D��?�^�z�]w�i�������w��E�DPxi6��'@C5)v����.��c������\	��E����n��n�)""�$����X�lY�i�[����u��rJ:�(�6��X��HJ��4Jw�}w�{����i$II�D��Wi�F���w��V�����wm�� �2(��!�z4-���LIV(���Zf3�L13r8z2�����(dx��KCQ1��)82	�,��^��s��{���������{?�y��^Jx=<�7�����G>�/�EDa^D��g���rKY�����+�`����Y�fq�UW��������������g8����<�@\~��QSSS���"�����>T�f�n6��#��#�8"�~��x��b�����o��E�b��e�����v�m���Kp�1x������r�
�*_/+��t����*���>��>�����{��7b���1s��X�vmt��!����������r�uuu��3���I�b��y�n��h��M�����n�E��}#��K
��R]q-�6����_|q<�����M�6q�I'��^�:uj��"�N��_~y�~���x����k��m|��q�����G�t
��K��:WS�>���{@Z�fM6,�=����_ED,_�<�������_���m����|�5*v�m�����6~�t������c���M� ��+�3'D���T�`�5+w��"������������kjj�G���]��:uj,Y��������3��L<��C��~�5j�����|�+1f����k��]t��5��m��-�������+�6.��kX@���M���/_/����N�3f��)S�����E��]w�=z�(�Y�re:�(�1�|��E�W��5����1q��x���c�����SO��I�b��e1y����������dY���P,_/+��Pe����W�p�����K��F���{n�X.��c�=6��w����c��i1s�����+���.j��n�������u�n���{���w�}��s�\���7���g�uV������������<}l-����-^�8~��_��'����'�k����e������O�f��z����b��e����#Flt~�������u��UW].,yo,�o����]�v����n4�jC:t�P�����/�3'D�*S�T ��5k���������b��U�R*sW['����7�X46r����l��z��q�����#"b��eq��w����^��.���X�`A����}��)�3(�|��\My��Z��A��?~���>q��W���+�����������/�	&������;���{O>���z��q%�������G�.]�������>��Ku�u�	��4+w�~uuu1d��x��#��p��Rt��5z��O<�Da|��w�V�Z��E�b����n���w;��S����<?�}���?��
����A���<�H�X�"Z�n]��~�����E�
���55^�P�R����Up��x���[o��{,�,�,��W�^��C��Y������\]y��1a��x���c��%q�����G)����3gN6,�����_��������������f���[����W�^�vmL�4�D���u���lmO�~�"@���AE�������H)E�����G�C9������A���q���{�������U���SO�����������'�����������^C<���E�{�uuuq��������G�u����}��e�]b���q��7���+K�[&���9!T�T��s��������,�,�s�=7v�q�-^��#��{��7Z�h)�8�����g�m��?��U�b��Ec[������W�WD��%K��W_-�555��g��2eJp�q��G�w����j�\�2�,Y���z�3&��?�3v�e�����K�[&��YMy��Z��O=�TDD��""b��a�����
�w�}�������|>����K���Y�`AQ��l�Mt��y�����{Q=o����6e������v��4iR���^��O|���g��O<1�=�����������	��4+w��9s���v�]�v�����Wo���O?=F�)�x��c����S������/_^T�j�*�,��5Z�n��5�������,������%K�D���~��_�<0:v�.�G}4n���X�jU��K/�4�w�g�yfI��x7�k���[t����^��T�T/+'����3�P���-��w����~�
�i��y�[�."�(�iC�w��z���S�FJ)&L�G}ti�����jkk�x��-[nr��U?�������~;""��{������G�EsN8��8�������|�����s�9'�8���u�]K����^]tQI��0Ju�uVS�>���{P1�5�g[�-68�m���R�����g����G
�S�Nm`�[n���Eu����x���,>(�ksm,Hk�v�|p�������+~�����Kal��5q�W��/>X�~�"@���A�h��}�z������S��������k�X�b��M�����^�v���f��M���6����_:t����:u����'Ec7�|s�����|���9!T�f�n���w���H)��9s68���x����1~��M��l��x��W"�����v�mK���i��MQ�z��-^�~�T�5�����n��b��!�u����8���b��%��o�8qbt�A
���3����;n��y�����c�i��*]J���2X@��E����?^�~���c���������g�}b����R�^x!�y���{��7�����x��w"""�����g�5��C�V�\)�B(��X�b�&�,Uo���_l��6�ummm�������������$�s����s���a����j�����~*�G>����G?Z�'L�����C�F�e�eY���+_�JL�>}�yc����#G��jjj��l��7�S�NEaW����y��m��f�*�KU?\,"b�]w��5���+"���������rN�U��e��A��?��O�}��g����>)���,^}�����_2$�����w������?�|�]��0�K_�R�o��	��Z�l=z�(�1c��Q~��}�WDD����y��Ecm����5��������6��9!T�T��C�FDDJ)����/_o��W_������,�b��U1n�����K������'��""��~���O~�t?����U�&M���'O�����VMMM����Eck����5V�^]T�j���}�i
���4}
!��������g�_�����N��^{m�9=z�����?:t�Pt��,�"��H)�;�����k��M�����{�&L��{�z���6mZ��f�m�_�~%�,b���*�����E���7�����c�{`��u��e����T�`�	���\~������,~��������mp�������j|�[���]�FJ����[�8���������^US;������z(�f��<PT|����M���v��G��<���_�G?��������c9'D�*���
���n����+��+��2�|���;wn���K�.���;�������G�N�b��1e��x��G�����{��������K��������6V�^/��B���k��.�|��/��RL�<�hl���%���m(+�T�|(������O~2��g��
�����rq�I'�]t�E�R��}?�p�?�Po���1t������u�6lX���~������?�aQ}�AE���K���[,�i�>B4�#FD�6m
���>�^z�F���5+N9������:+:u����dYV�y��G>��/�0jkk������n��=�^{m�y��Ec��w�>��K���rN�U��4�N�:���������;/�8���={va,����q����1m���x�n�����n��v�a�1bD��)�����7��7�,�1cF�~����o|�h�K_�Rq����6��9!T�T��w�=�����;wn�[)�#F�QGU4v�u�E�=�w����^{E����c��3f��l�2����h��}���������R���?��={F���c�}����{G��=���E��
s��k������7�����j�����EEy����s��w�1>�����1cb����n�$r�\�3&�?��������2eJ<��s�x����:v����b����[MMM�;6�^4�R�)S���O?S�LY����>:}��h��M���?m(+��PeloP��y�����������.]�����O<�D��j��������c������{nt^�����3��I�&������-Z�o�����{7��eY|�S��?��q��w�hb)��X��Pe����/�Y��/^�_}\����O�>|x6,z��Q�N���!Cb��!�����SO=�f���k�F���c��v�Dmm���Rjpo������Y���'����������C���k�0`@t�����`��>`QQ�N�7�tS�|����oDD�a���k��� .���8������N�!C�D�V����V���O�����mlP����_�B����|]q��"��W����{PQz��\pA���k��c��)�������RD���R�|>�<�H�t�I��K��������_�R�����|q�9T![T�������_o��V����oy������G6���iRJ�|��=ztv�a��W�������_/g��h�`�������Jf�����E�:th�s�=1k�����+���D��"�8k��q�%��G?��0`@��W��%K���}(�|]q�������EU���s���W<�������������������|��8����k��q�����m(��/�s��*$��������W^3g��{��'�-Z�(�a��"��W��1c���[(��X��!@��A�����#�<2���7�z����/������,����V^�!`���v���N;�;��S�h����@����:WS�>�Y��R�<yr�=:n����={v���F���u���@�E�Z�pa�~��q�M7���>)����������>U�&�����XT�w�y'���?�M7���w_�[��(�*��H)EJ)v�a�8��b���������s(�TW\�`UHUa���q�M7�w�o��vDDQ��{�W�Z���������!�Y���m(�|����<}PA�q���,*��o�7�|s�|������FDq��{�Wx`><�;��h��M�z�����u�+O
!���b��;vl�=:}��H)m0�*�;��s�x��q��'F�^���84�|���,�
	���l����j��������B���m�w\><���r�
e������<}4�,*���+#����g�U�eq�a���������������]@��|q����@C�����""�o��1|��6lXt����]@e����	���,*�v�m�|><��g�r�'���)O
!����[o�6�lS�6�b���:�T�\���~������!@��PER����!@��PER]q�9T![U$�/��������H���s:�B�8�H�������,���| [U$���)O
!�����u���
���"�^V�tP�lqT�TW\���-�*����������H���9T![U�~V��<}4�,�*��+�3�C������l1[U$���\My�h�f�n���e�b��%����K�.��y�r�M�~V���@�E���������b������/G]]]��|09����y��gb����}��}����_hL���ZP�`Q��|��8�����^����R��Y�m��;��#����;""��mo��V���6^��DR����������*�O��8�����^�����|�������H)���K�w��]c�
M�~V�tP�lqPqn����������+������>��8�������v�!9��B�����+4��,�C�e��iq�gD�e��9��s���'�x"����������2dHDD�����n������)�sN�U�Y������b���������n��C�n�Zp@������7�x#z��]�>�\R���j��@Cx�c���q�]wE�e�eY�z��[~����F�V�
����K�&��zXN�U������+WFJ)""�9�������k���z��Y
Z*A�^V���
���bL�:�p��{��i���f����K�.m�zPn����j��@C��b��??""�,��]��|�|�W�@J��z|�tP�lqP1Z�hQ�^�vmI�\�pa��c��%Y�����s5���
�e��>�,*F���#""��f�j�z�/�3fD���8{o}�f����9T![T�>}��.\/��r������#��GJ)""��g��� �����<}4�,*�'?���n��"�������~������������]�vm�zP	������-*F.������R��R���?���{n��������g����,���N(e�P6�^V���
����\p���y���,��]����zj��������;/F�Y�EDD�����3�l���I���:�)O
!����g�8���#�Y�����c����N8!x��X�paDD��"������O>?����w��q�e�EJ���O���v�m����d���:s:�B����w��������G��,����.n�����������b�����EDdY)�������
k�����zX9X���5T[T�n�!~��D�e���R��"��������n��Q���+�(�O�F�������
���"�r��������k~���6�8�^�{RJq���_���1bDS�M&_?��<}4D�r7�����������_�{��7���'O�������U�V��S��i���������^{�U�������u����*$����o����o|���.w+PV�^V&�B�8�H�+��������H>_\����-*�]w����+wP�R��������(_���k��q��g��O?]�v��������-*��o��^{m|����~���e�]�g�.w[P�u�uVS�>B+�/��r�w�y��g�8��#���o���W��5(��/�sN�U�e�����u�H)EDD�e�R����x���b��a��K���W����/s����`eN�U���o�9s��M7��vXdYQ���R,]�4n���8p`���;~�����S��64�|]q-�F�8�8�Z��N8!x���>}z���?��}�FJ)"����N�]tQ���':�����c����lU���������h��w�s�=7^z���8qb�q���v�m0����SN9%�t�'�pB<����y�aQ?+s:���q*�-��'?�����kb���q�]w�1���5��RQ���+���n���G�=�{��^L�<���@i�`�8�:�l�Ms�1q�]w�[o�W_}u�����R��(
��5kV\z����O|��-@I�����r5���!`Q���n���7�'N�I�&�w������{��"����,RJ�p,�f)��X�tP�lq����o���O~��O�������E�r�%%��hV��T�,Yw�qG�=:�x��r�%��@V����h(XT�|>��{o�=:���?��5k"�Y���;(�T��X�k�>JU�������G���������(
�J)EJ)jkk��c�������](��_L����PM`Q5�����rK�=:^|���(�z���b���1t��h��m9����o +W��}4�,*��5k����}�=:z������h�U��=��O�O<1z��]����R��c��j$��4~��=zt�3&�-[Q|�^�U�6mb��!1|��8p`;������e�����`QQ.������[b��iQz�^�UD�!����!C�D�V���.4��,�CB���/.]�?�*����K><N8���q���*4�T��X����h(XT��R�k�.���/����c���+wKPV)��X�k�>J'�������������E�r�!/���EE�����+_�Jt�����@�I��	���,*��g�]��b��Y,�i�>�;>�D���"��,�4�,�*����s2�R�9�D��������jV�������u��<p�������$���W�UJMb����eY���,�y���W*{T�|���	���,�TJ�����o�'N��3g���k�C���o���������=*L��US�>�pYV��	������q����_�>���o��M�t�Iq��F�N������\�2v�}�x��7������o�����TW\g��*%�&q���t^�Z�fM�|��q���nr������k��;��#��x`u�a���z�W4�|���r����`�$`E������w�}w�xMMM���#��kS�N�%K���?~|�3���z(��o��n9""&N�?��O��l��zX9X@���M���/_/����N�3f��)S�����E��]w�=z�(�Y�re:�(���]�6N>�����A�[�n���TW\gN�U�64���%�\R46j�������[�n��\.�{lL�0!z��U�9sf\y��M�n����x��#"�{�����}��{����~����<}4�,h�]vY,[��Px��1b�������{����.����b�����c}/��R�5�P_s�5����6��X_���s2������l1�����|�x��Ec#G��,�6y���p@�^�lY�y����c}�|>N>��X�vmDD{��q�1�4�����X��!@�jV������x���b����C��{�������-Z����0aB��?�P����1p�������O�����q������^���?��?��SOEDD��m��k�i�g�����YMy�h(XT�Y�f����_��8������F����k��/|!^|�������k�������7J�����cQ=h����l��4hPQ��#���+�u��%���)S��~��B=j�����[�=������\y�h(�T�k��&�����W�����w�:t���y���A/��b��"�T�.��g����>:�����h}���������}o�n��W�^�z���1i��u�a_��Wc�����~��������`��zX��!@���AE����AV_����U�V����|'���Y�EDaeY���N�t�I�h��F�|�&O�\T���o���?��z���_�:���?GD�6�l����
�l(?X���m*������W^).u�Q�;}������"��H)Emmm���q�����7����O!������/��I~C}�V��3f�����[�F�����J������z+�9��B���~7>���5���:���:WS�>�Y������K���,�����{���F>�/����[��c�)|�q�����g���R�r�-1j��F�C,XP�M�l�Mt��y�����{Q=o����V�g��/���]v�%�?��Fy[/�������*%��1u���u��]�]�v�{�=�D���W{��GQ�UDD������/�#�<2""f�����j�����o|�/_^T�j�*�,��5Z�n��5K��;��q���_���Q[[[��l�y����������_������r5����`Q1,X��Zu��i���/_���
AR_��78�������X�zuDD���e���P��-[nr��Z�pa�y����?��?���.�3����^]tQY{�D���:�������A�X�re��u���7q��x��w"�����f����;�\����S�N7�{�[�i������E��z��U
���o}�[1o�������s\q�%]��I��:WS�>J�Y�f��M�<�?�p��m��c�=6:�m����e��5��-W[[[T�]�v��X�f�&�l�{��7n���B}�UW�v�mW��(��X��!@�j��S�i�k�.""RJ���ont��?Y�E���7�����jj���6m��)�W�^��k�����Z�lY�v�i�z�����/�$k7�g��w�������1��8
T�|]q-�V��}��)\/Z�(^y����G?Z4g���1a����,""��5.\X�n��m���L���V�\)�B��c���\sk�{��1c����h��U\w�u%Y�:w��;w.w'���\��+�$������^{E.�+�C]}�������k"��GJ)""=�����l���5kVa�=z4B����S����u����y��h�Y�f����:ujQ��E]�z�j��4��X��!@���A����Cr�!�R��R�������1��X�xq\s�5q�������{���F�{��gkED���.M�;��e���o��1c���?�o��
�k��%�.��sNdY����.��h��n�������7�76./����3�P�lsPQF�Y�EJ).������Kt��1�:��x��w"�Y����mr�{���p��}��`E�X5i��-�����\����:�dP�lsPQ=������^���H)>��}����SN9e�k�;6�,�,�b����������E��	6����z+�M�V���f����_�:���zXYMy�h�f�n����~�����.�,��[W�]J)
��v[��l|���{�����GDD�e���|�Q{����:*.���B��C�ym�<PT|����M����O�x�������G��7�\�?��8��s
�6�l������/�3�F��,*��_��~z�}��������U��[�n1h���o��>�����/��c�B}��G7f��������S,X� ""�L��<�H|��x�o~�������|Izj��Mv�a[|�c�=VTw��u��`���`�`UJ�[�nq���o���\sM���z�\.N:�����+
c]tQ80�,��}?�p�?�Po���1t��F���������<}PaR*w�������#�M�6���G�K/�t��g����rJ��Yg��:u��s�,+�<��#
������u�dP�ls@���S|�{�+;�����3����g���|�7.�����M+�w��-�>���j�
�����)O
%���#����*�����G���w��k���c��q�����3
sZ�lw�yg�o���;�����:s2�R�9�z3g����;/8���m�����q��g�s�=W����r�3fL��E�uuu1e��x���b���E�u��1���?����S*U�������P��(O=�T�x����������c����~��q�e���	��W^���z*�����w�}����o��7Ommm�~��1v���s�=7:�u��q�g��I�b���M��-_/+s2�R�������_��rKdY;��s���g�s�y��6lX�]�6""�,�,�
������Q��y��q�4z�[b��!1d��x��������Y�f���k�}����n������v��M)5B��4r��9rd�>��K��	XT�����p��/y�s���o���k�W����,��R��G?�!C���>���7�@}���d��_�+�s��*e���1s���={v�>��#7:w���������v�i�x���b��U���o��g�)���,������/o�������uVS�>J���_.\�r��s�=7:���n����R�r������8��C�E���{���OC���R������}�[���4�T/+�dP�lsP1�M�Y�E�=�E��{����~����_����w�y�����������6M,_W\gN�U�6c�����:lt���s��W^�,�""�����78o�=�������^z�4�@���X5����`Q1V�ZU�n���F�=���R���C=t�s{��U�^�pa;��������!@���A�h��e�z����������u�VrU_mmm�z���
k�,������m*F�"""���M����=���eYx���\s��e��-Z��S(�TW\���m*F�~�
�+W���|�9/��bL�<9�,����nr�y������j��������P��{��G�n��nu�E�7���/����RDD~��]o��91��B��N;��]hr�^V&�R�����q��������?��A�b��11n��8���b��1�eYdY������s��=���Eu��}�hl��rN��!YV��5+w�~^xa�3&��])������������"��8���7���q�
�;��ct���1Z�&��+�3X@���AE���w\����#U8�)���SO=5
��uV�Zw�}wdYY��A���@�K��:�)O
%��s�	'�}��}��-_E�������%�\�]w�&����c��%���:��F��B����!@�jV�`C
/��RL�<9^}��X�jUt��->��OE�->��w�y'�:��B���|�1��&��+�3XDD�T�`�	������n��n�m�}���7�(��/�s5�������J������m�*��|H������:WS�>�Y���t������c���1y��X�hQ,Y�$RJq�-��~��W��I���u���@��E�z�����?�a�p�
�|����RJ�eY�Z�j����1f�������GL�:������`�9�H&L�=��3����X�lY�����s�9'RJ�R�3f��?�H�@�����9T)�T����oq������3���,�N�:mV��{�{��W�;vl����������<}4�,*����������+WFDDJ)>��O��w�K�.��s�F��aXd��!�5x���k�H��9X@��EE����c��9���3�<3{�����>�Z����;�����i�b��9%��Z�^V�dP�lsPQ~��_��9����O����1�}���������4iRIz�rIu��,�Z���b<���1o��H)ED������E��a�
���S��[����
��t���&M*\w��!��o����}����%K��S�^V�dP�lsP1���Y�E��=K�fmmm�z��5%Y�%���9T)�T�����uMMMI�|�������/��P.����J�����,*F���#""�s��m�zk�������N�:5xM(�|������m*F����3g��y��5h��<��YS�?���5h=(����T<�s2�
����-���A�0`@�h���S��zk�����k
��;w�~��5h=(�|~������(XT��-[��)�H)���^.������?��q�"����,�9���6M,��?�9T)�T�����eY��??�>��X�x��q�����a�"""���5�#F��UhR)��X���J����0 ���/DJ)""�|�����?���ob�������.&L�_��������e��EJ)�,�o~����W�&��8���� "�����4+wP�o���2eJ<����eY��=;N=��8��3b�]w��(�[�u�Y�R�������+��K)�����K/-����Hu��e5M�@)x��U�Vq�����������[/��Ra^J)&M��&M�+VD�G*�{��<�������?�T�|~���,�JI�"}�#��~8F�:t(�gYV�y�X���X����Q�F����h��mY��RK�����m*V�e1b��x��7������}�s��C�H)�������;,�����6mZ�1��
��9T�f�n>H��-�k_�Z|�k_����s����c�����U����St��%�5����|��cYM��P
��s����'��w�=z��������>��~�&��/�������R�E�������3�,������
T�
`e��*e����x��H)EJ)�t����+wKP1�u��e5M�@)��bt��1""�,�������,)��X���J���bt���p�b��2v�gCX��!@���A��{��#��EJ)�O�k��-wKP1�u�uVS�>JA�[�n1p����X�jU���,oCPAR���S!@��AE����]�>���b���e�*G>_\gN�U�V����l|��_��R���k���~6���W�����,�C�V�g?�Y�{���eY����~�����#���_.wkP6���:WS�>J�Y���;��C
�;v������E����/��/�8��v����g�m�6��f��^7��x����eh)_\g^�T1XT�Gy$�,+��]��""b��������h�I)m�|�D��r5���`QX��._/+�������TXT��R�[��������<}��,*J���h���H���}.W�>J�V@�������!�T�`��������9T1[U �����<}��,�*����TP�luT�TW\��
����*��������RhV���~���t�f��E�v��]�v��g��k���u��%}4��/�3�E��,*���##��F[?���'>��8�����N��m�6�������r��*f����R��gk��W������?���7�O�>������~4H�+�����P
��8��������}�����}o~� ���K)���_�B\y��M��`��|q�9T�f�n��/�KDD��7/�=���6mZ��"����������n�E����E��t���={v<�����?�1����\.N;��:th,_�<-Z/��B<�������d}�����v�->�����w���������R�EE9���b��Iq��'���3#���
������;l��|>c���s�9'�|����/~��7�����h������_�j�����eY�����w�+����`e���P
�:�(�-�#�8"�|�������kc���~���b�������-��c�H)��W_�F�*�w�����c�Xal��I��?���?J(��9�B�*f������?f��Y�����i����k|�#�1c�Dmmm��b���1}���9m����o�9RJ�eYDD<���%�
����:�)O� ���b������
�y����k���'�;����x��w�W���zs��s�8��C"��?��V?[���TP�luP1���W��,�b�w��w��A�r�!��|p�s=����H)�[o����@cJu�u�������b������������u��9"�
�z���68�w����E�5���X���:�)O� ���|�����%K����K�+V����v����y��?K���TP�luP1:u�)��:uj,^��A���o+\w��q�sV�\Y�n��u���)_W\��
`c������A��i��"""��x��w��n����/_��v[dYY���o��Y�gn���[�<hl�^VVS�>JA���m��6""RJ1r��x����j�3�8#�z��H)ED�QG��y�<�L��w��[�,h
�|q�s*����\5T[T�-Z��'�)���,�/_�rH�r�-���[o��{l�z���eYDD�l�2N<�����������
��{����$����
���*�%�\]�t���,�b��%1|�����??�����G��s�����#�����K���_��o�=�����.�����)�B����#�{���=����s�����?��,���Y���k��m�{��1h��X�padY)��4iR��?�����z��SN9%����lp��Q�
�t��):����(�|]q��)O��]T�=��#}���s�=����'"
���f����������F�s�M7���Sc�������=r9�w�r�|q�	����*�n��'N�������O�B��{�����0�R��������=�\|�����3z��Y�l�����;�T�`y4P���������8��3��3��'�|2{�������f������5k�]�v��v�E�~�b�}���?<:v�X�����u�u&�b��
��������t����I��:�)O��]U�~V����������:s*�b�:�@��YMy�(�f�n�����1q���9sf�]�6:t�}������Gmmm���n��x��W���^��s���e��M�6��c��}�����x�rr���~���
T3XT�3f�t�f��E�v��u��%]����_|q<�����M�6q�I'��^�:uj�^�N�c���|0{��X�j�F��k�.�
g�uV���.����u�u&�b��(�z��,�J�n.��=z�'?��0`@|�+_��;��9d��5q��'������y��/�k��&����;vlx�����AO=��f��d�����������K.���>�Q�}���/�`��V)�T�O]]]L�:5������c�v�SO=5�.]�d�)���������jjjb��v�=��3��kW������3��L<��%�g��u
������v�)��g����_4o�����k��9�����7J���+�s5���`Q��,[��9s66/��p�5k��o~���}����_l��q�����w�]4v�i���3b��)��s���E������=z��\�2�K�,i��v�i�9rd<����t���2eJL�81^z��X�xq�|����g��{�������k�/����u�TP����x�O<�T����5�N�Y�EJ)""�w����[�o�>Z�hK�.���g�K/��W���b}����v������c��E����=,XP��R�3f�g?��x��'�k�����.\�\rI���Q���s�-��rq����������L�6-""f��W^ye\t�E%�m��q���A�6��e�6lX|����#�8"�~���w?����_�rl��v%�
�����T1[T�����q���G���c�����}����Kb������o�<w�yg�|��q��w��O?��-�{��')�H)�SO=��zj�3&~���7o^<����������3g��g�������.�e���<0F������w�_���EcW]uU,\��d=5o�<����x�������h���u��!���[�.�-^�8~�����/6,_W\g5���`QqN8�����Y��A���j�w�y���;n�����8��#�O�S�v�m��y��3gN~�����O���������&���?F���#��H)��1c��W_m�������o,9r�Nz��q��e����w�Y���7o���g���n������������R��F�|q��T1XT�n�!����H)��>�������c��[�������o"�+V��/}�K�v���9��������RdY�|>~������L�0!���_�w�y�8p�f�{��'����+ag[���\3f�(S'�:���2�B�*f������(""�,�+��"Z�h�U�|��_����/""�N���z�zs�����N;�T�y���z����XT4(�,��{
TT?��#�b������:t�PT/Y��L���Hu��,6j3�3@9���b<��31m����h���z�O[j��!�����k��s�\|�s���R�����^k��6����/�������v��-z��U���]�&M*Qg[o��YEu����	����/�s5���
�R�;�-&���^PT�e��g���*��w����o���*\/Z��A�����'�����������^9�?���u�]��	���|���������b��?�p�������R*Z��:v�X�^�lY��Y��U�b��Ec;����Q�+�����b���1v����#�<�L���H��[T��-[F���U��O��R��{��7
����8s�l���m��&:w��Ekt�����7o^Iz�Z?���b�����S�Nq�QG��#�
����9T�f�n���[�����������;l�����~W��"���;t�������EED�j�*�,��5Z�n��5���	��+�,;���w�Qv�e���}��T&H!!#aH�B34JD�d�@��z��I@�p�fiZi�Ie0		
$BF�H��������N�>Uy��j�z�����E<�����}/��iS����7/����U�L�2��*M�����|r��,*�!�R*�J�4.���3fL�l�r��u�}�����K��������oDDD�$��w�m�u��jjj���[���5��y���SO��������C�����������O#G�,�u���6;'�|r���*F�n�JEUI��o��{l,^�x����C��g�I�D��q���o��_|���>���m�7c����y[��Z�j��W�Z��2m�5k���'��f�*��o�>~��_GU�_����\�T�������x���$IDD�i�=�\����q��7����7y^�X�g�y&N8����W�k���4M#I�8��c������L�:5��[��!�R��SSS����]���X�f�f�����b|��_���G�������{��~��5j��YZ����h���7t�����k���.+S-X� .������K�G�������C�l�2�/_s���7�|3V�ZQ*�J�4�����~�F�����t|uuuu�Qe?������W���k��}m��
�����|�4'I?�������k�{�|��[u��)S��Nh�@ -f��_�4a
��8���w���*.���(��2����3g��Y�2�������3�����O>����F���{����+#"�k����S�����eU+W�,t���+6{��t������d�n���8�����]�t�.]�4�=��b��D��)��"]t�Eq�a������?~|D�&K�����i�i�[��.� ����E��-7y��/��������s��k��u1o���e�]�}���gg��*�����������}�����|�;�r���XU��(����5t��7n\�5*���oF���KeRu�:v����������c��9q��Wo�����n�:z���Y�9s�V]���{���'��%?��O��K/���1"F����`����\P�4a�y�-9���������+V��~�/�5k�D�b��v�]w�5������{��3J���c����>��I\�!�u�]��o;�v��g��7����`��������@��&�m�������c�4(�z���<z������V�s?����>}zin��E0��K~�����g�i����?���#I��/[��)�*(��0[���=�������f
�6��������
�v���-��=��q���Gmmmi��c�����;
vEr��f��*�������;w.�S�N����^��q������/g��^x!N:��X�vmim��a���F�-��l�b1;'�
�0[��
�B�y�����#GF���=�����?�����}��1|����;vlw�q�j���������������`��u
�
�
�0[�.���h��]i~����������g�������#FD���7{�$I2_�?��f���������e����
O<�D&/�J�
�O�MXu�`K�~��=zt�?>,X�/�5k�l�5�$���{��nY������.��.���v������3�{��^t��-""��b�����#F���3K�v��-.����f�����#�������m_|q�;v��w�G�3S��*""�j�������#��u�]c���D�I�4�$)S�mw�%�������G-��v�m����,z��:t�i������3��n�:�������cY�L�<9����Y[�bE�~���t�4M����XV���9��V���6���������3fL�X)M����l��<
�x����SO��������Sc����_u��)��8��C1)��X��Z��6%I�N[d���s����/~���_%IR��x���^�$555����&|��4h�&�k��m�w�y1q��8���-�)-n�V�j�T�
{���:��q/��B��'?���[�l]tQ|��_���{GMMM��g�}6���1-Zo��V����_��1w��H�$��sO���~y���:������N�)S��+���g���k�F�����q�!�DMM�V_wk
�;���+`����%~-:��)���\{����"�������Gq�&�o��et��5�v�������+���}�{q�M7��I��3��L<���q���6�[�*����~����
�7\S�4e�:�+V����{.�$�$I�����f��6�e��q�
7�O��H�4�-['�xb��;��R@��XV���s��,*��/������iDD|�[���k�s�9q��'GD�G}W\qEY2@���%
��&Lc����;t�����f�_�f�f_����#""M����{b����<$� -n�V�T�����b,Z�(""�$��={n�������[*��w�}c�]v);z��2%������S!@f����~����m����1����4M#"b��y[��n��V�~����0!��X��ZR��9�E�C����/_��c:v�X�~��[�f���_q�x��m�yJ��<4a�:�={����4Mc��E=f���.}��+�l�z�������F�$��U�2%��U�HV���	��A�8p`��9s�����78f��A����Q�F��9s6y��z(�/_i�FD����Z���H��
�`M��*F����k���y���s�	'DDD�$�~��8��sc���7u��1bD$IRZ;��C�AZ��I!�c?2��(���~������
^:th|�S�*��>�h2$����=�~��x��G����n<8>���H�4�$��|�3��g�FyPn��`4e�y����������#"������>�:����?�qv�a��i���q���g��[�UDD�-����o���P���\P�4q�;�(�sL<8������Gop���?��O#""I�H�$�4-}�m=M�h��E��g?�8�Q��S�NVR�O�r��;|\�V�b���[<��s��=��3.����0aB����`t�Aq��7�A�Q���������@��&k��a��k�����/��r��;7�4��]������{��,�``M�,��=��#��c��c@�)�)�J���P.~�@�Kk�s������P��bv.T���\`T�b���!|\�������
��f��'B��$�;l���
W,f��*������u�<4q�;*\Z����8��X��IU>9�E@�K�`y"h�lwT�bmv.x"h�lwT����O�M���
��f��*��������������P��:X�'B�&�v@�Kk�s�*�������9Q�4q
�*\Z��������P����9�D�����pi1;'U��(X�nV�!@g����`%��8�.���
����v@�K���P�O�rQ�P����9�D��y'��f���������J������p���\��'@�(��pi1;'��8�N�����p���\��'@�(��pi1;+��:X�nV������P��
��f�v@�Kk�s�!@g�����9��'@�(��pi�,O�M���
��f��'B�&�v@�+�sR�O�rQ�P�����x"h�lwT�b1;<4q�;*\Z����|r��,�
��s������P��u
�
��8�.�S��x"h�lwT��6;���P.
�*\���O��1i������
��)�*x"h�lwT��6;'�`3�$�;l���
W,f��*������u
�
��8�.����'B�&�v@�+�sR�O�rQ�P�����������P��bvN<4q�;*�XU��(X�X����8�.-f��!@g���)����X��U��(X.-fgX@S����-�J<4q�;*\Q�����pimv.T���\`T����Z������P��
��f�v@Kk7\+T5~�rR�P����k�'B��4�;l5��X���,����P���
�
U���&$I�N[������%��8�,-n��h�lwT��F
�
��8�,��p�P��9��v������1c�����k���w�1��{�8������&�\i��k��&L�y��ED�.�����_<8�$�-��&-n�����@�r�������/^{������]�8��3��+����;7Z�u����~�����[b���=f��v���??����?��E�F���**��!�����Y_��W��O�d�UD������?�q0 ^|��F�6k����������6Y~������^t�f��<��`<4q�;����8��S��{���WUUE�>}b��A��C��k������>:^z���6o��6lX�?>���u�8p`���?jjj2��7.�
,h�l���v�����s��,h$?����G��}�[���3g���Sc����h�����~={�,�r��>|x,Y�����y����{���������[b�����o���c�����0S�������g��`��(�,$I�K��Q��`����������k��6n������[i�P(��'��G����{�������� ��~��x��'Js�-�����#FD�6mJ�m����|�;���OF�-J����O�S�d "�S�U�4����Fp�
7��e�J�g>�����K6y|����?��?3k7�|s,\������������~7>���l���~��d����W�\�UZ����|r��,h`�b1������UW]I�l���}�sq�����e������_�lo��F�3�4�m�6.���-�w��G��mK����c��Ie��_��9�4����6z���?~i���ov�a�:�_��_2��?\�d�<�Hf>|x�o�~���o�>N>���Z���W���\�4������c�e�����$I�����?�����X�bE�e;��#�}n�l�>�hY2���s�i���
l��	���������u���{���k������+M������m�v�!�d��_=�4-K6�.���IU>9�I4�I�&e�l��u��{�m5c��X�rein��m���������+��iS�W�X�f�*K6��X��O���-h@�V���3gf�z���U��{����?q��]gksm��re���:X��A�f�:���-X� �4-�-Z��.]�l�5�w������W�lu���n�m�5�w��)�*W��n����h��y���E����]Ks���5o��_ *��9s��[M4����g�6m�D�$[u��m�n�����u���>*��y�b���[u��)S�r��0��������h�j��S���;�'�P�B������F���7{�mU��~������#�r-��&Ik����������3s��-���Z����V��D������imW��w*\����;lQu��9�����k����k�Y�f���V��
���a���?���cP��$j8 �������H4�v��e���Wo�5V�Z��kn�J�v�y���'��U�L�2%N8���������nq���y���B��11�T���*�P/
���-�Z�re�iI���+V���5����}����u��%�t�R�kU�B!�h�/���,h@�;w�$I"M���X�n]��7/v�e�z_c�����\�Pu�����o�5*��X�fMf�2eJNI�u{^���l�,h@�[���={��3Jk3g�����3gf�����,���k��<k����F�s��m[��r�	'�`;5k��<xp��-4p���-��8q�V�?i���^o[���+Z�n]�W�X�)���3f���+Ks��m�G�e�@����A�2�����}�|��O/�-Z���%W�$����ns����/�y�}��$I��
���:���{��q�����g�}6�4�WY��O?���
���+k�W^y�4?��3q�i����g�y&3w�qe��->�����?\�{���Z��/�fL�2%N8������G�~��M����m|��m��4l��`��,
��g���Y�&f��U�?�����\X��>�����s,X� ""�N��?�|6l���q������/k�/}�Kq�W��x n���-�l-[�,x�����:v��{�m��_�8p`�1���Y�����m|��m��4l��`��,����o�y�2��(
q��gf�F�i�n����{.���?�����������m�}���C�������
7����n���X�bEi>��c��e�@���%�\���+�/��B\���<~������=�6b������f��$I������b����:3_w�u���/n���e���k�x�X�:w��]vYf��K/���;/���SZ+��������O/�w��-.����v�QG��GY���[_���G?�Q�\����b�����[�����u�������/��>���@���%�\�{lf���n��={������N�:��'�3g�,��u������c��
������>}�����W�����;w�}��'�;w��|�;�z���q���{���W���yR���P(�<��zjf���6�N�������g^���S<���q�!�4h�]v�%���?�~���Y_�jU���[1q��L�UD��A��O�S����
�
��G4������o~>�`4h���m�6�;���8qbv�a���W�^1f�������[�n�<�[�nq�
7�+��=z�h�l4/�y���I'�'�tRL�2%^y���={v�]�6:v�����C9$jjj���i�~�\-[���/�8.���7n\����1o�������K4(���<��,�Q�~��_�~y��@�P��C����C��@3T�;�X4*X4���lov�y����+33�e>K���Y�����m|��m��4l����$M�4�l?
y`���F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��FU�w�rX�xq�����G���U�4ok���Y�f���~����c�z��h^x��8������z������������
�hT�y(�=zd��~8����S��o��)q�	'���=0��hZ�j������)
���n��(����xv���E�X�w�g����_�w���"b������|^�I��U�l�X��@%x�!�W�X`��[�6b���N����@�&?�bavm�"�Z���\�*�
O��4�w_vm�AG\�K�.�y�5>b�����S���Xl�����;�����d���,�[�fFL�]|rD�����n�vv�i�����Xl�V-�x������G�h�O��(�`�����X���s�*b�I�����,�;��"�?�]��s�w�'lo`����\�����!�������4Ui�F�X�4M��4SI�D�P�$I�����i����k�
��e�\��vI�VX�n],Y�$�,Y���S~4����h��]�����M�X����#���]rJ>Y`{����Ys���+V���_�>/^�/�������Ct��E4���������NB9�0;w����|���J��[�.f������;
@�����E�b�����[7%X��4���#�~6�$4���#
Uy���K!�����6f����
�8K�.�9s�D��yG�fo�X�W�Y�v��;l��P�>���X�fMf�P(�;�;��C�h�"
]�@�H�4��_+V��e������3�/]�4���c�]v�)!l���w��O�h�&���Q��	����l���Z��-�W�^Q]��O�q�h�"Z�n�;w��������i��^_�dIt��%�$�1%4_�EL%���KD�����|
-"z�C�A_�;	l�4�l��+2s�$��G�W@n��k���[��5��V[[+W���m�����q�g��g�:�EM>y��B�*��e�2s�6m�eK��@���k55��^�tiNi�y[�Q����k���
�`l��+2s���sJ�U������������X���s�:b������(���4M���6���u���d�m�63�_�>�4�)
4O��FL�]v���#�u�'@s�`#���kUUU9$����<���[��{������k�����9R��i�n��$II6T(l�ncn�&M#���]�9$����h�`|��q���
�O��J����/;��#��A�dh�`���3"���]<<"��PV�X�����kv�xT>Y�3X�rq��'�k���u.q����@sV�>����G�_���P���r���)���pz�cWE���w�����h�9���,(�4�x��������Ob�)y'h�
y��f���������e��S4_
������w>���D|���S4o�y���������:�4�y��q��g��a����c�k�~+��g����)TEt��$y'h�`@��@v�����D���'T�B���X�Q����k�NP~u)��2y����������[�X
���������Z��G���O�d
���~6b�G��������:��=x��W��w����gG�P��w�=�
:t��y�W��Q�F��I�b��e���;��{��zhTWo���/_�<�z��x���c����j�����Ct��9{���6]���-[������'����c��5��M��q��w��1`���e�]>�}>��3g���cc�����GE��k��q�!�D��]�z����x���c�����Dmmm80�=�������i����k=�Dt�#�<P�`�'������a�J��W^W]uU����O~�����������i�&����_q��WGMMM��e���5�\��~{,]�t�sw�y����k�_��_����w�����7���O���cc����<�k��q���������q��u��y�����k���{,��]��c����sL�{��1`��������O�>=�������:k���6mZ���{���]�6n������~'N��1I���!C��+��/}�K�}s�UW���#K�����8���b��Eq�����w�~�a�����O@32sl����kCN�'4
���X�"N<��x��g6y���+�?�A������SOE���#"�������>z��Y3������o��f�|���������q�W��~�a\y������,z��:th���������/�b�X���M�?����C�q�5��;��z��W���N�i��m��4Mc���q����q����o�m��[}�	&�1�s�����4!����;���s`>Y�)(���4M��SO��_u��-���0`@TUUe�����#F����y�����^*�J�$���C���}�np�[n�%������Y�z�k�[��=��3�������'
������g�a��&M��{���;��K/����}����O}*<���o���G��$��Wn��b��a�_�l�2��k�8��b�������
�;���7��psf��_��2�W��w�!C���{�555��f�8�GL{9�6dxD��6�z��[��������GD�i��W\qE������������~���?-����g|�����.�(f��555q������]�v-7y����7�/��bi��/����G�-6����*�:�������~x���w���e������������w�����+W��������&����Y_|qf���N�K/�4��y��-�W_}5������7�^��]K�aO?�t��?(�v�E��G�����V��[o�)���V�*�z��q�%���>��L��e���{��+��"���c����|�;q�m�m��u]t�E1o������o~�������~���^_�jU��/����l����kv�pT>Y��P�e����o�1.���
^���S��'?�U�V��w�i��)���&M�v�����?�z�����^��O�����&M���?�0{��8��6�g��!��{�E�^�6��}��q�g�I'�'�tR<���1a��x��'������y�=�\,Z��4��?�s������}?��8��������������^SSGqDD��
0��Z}�_�>N=��L����#��+��h�W������F|��_�a��������~{|����O�������s���:~����W���
^o���V�*�������w|D��\�@�����b�.\�w�f��S�H
��cl�)����������k����e����R������_�M�6m��+���O?����Ol��O�>[����&~��_E��}c��%q��wn���w�����w^����e�����V��>�`�������s�����[<�{������6
T�����n����������7Z~
a����������s��B=��x{����80�H���'�:�1�w/�I��������E9���KZ���>�w����.\�v��w�fm�y��z�����QI���W_����u�����3����W�8����x�q��B�T�4~��m�;��S}��q���FD����7y��U�2s�-�������[J��i�&����z���O}*�?��x���""��G����������m���K/�t�����]�4f~x�-�;
�4���1���y���t���(�{o��;MZ��U�\!����������{���}��'3�x���*Xj��]����4��9s�2�G�>}J���=;�������u��������g�.���{�����;n�5�<������/�w��1�;���V�������_5!kZ�3���wP�97�����@s3d��z��S��<x���:w����t��z��x����o�F���_=>���X�ti�\�r��.X� v�y�
�?���������������c���q��F��}��~�m��Q��ii�����={����&M��u8����l�t���#�ft=7��Vy����6�������M�,(���DmJ�6m�r��U�6{��+b���q�����5k�}��[�x�F�{��g�}v���?/��v�mq�m���!C��#���|�3q���N;��M���&M��_|q\|������-��q}���D����������������f����Y�=�c�e�v��u��_(��C���[�eQ(�0�(4IUU��,�P��S�1o^�1���N����I555���),��?<�x��Ot��g�z������������q�b��qq���G�$��~���Gg�qF8��������K�,��q;��C��
�T,f��;D��|'�0l��!b����#o�����%@�`4��P���w�;DD��'��A�U�=b��a1`���m���]�v��u�(
�c�������~U�{����#�<��{o�p�
1a��
�I�4&L�&L�k��6�9�����[�_�~���m�����~�b����-Z����Iu�����T�4�x���Z�":��'@�`@3����>������}��������N��]m�s�=�U�J�$N;��8���b�����3����?�F��lp�c�=/��b<��cq���n����M�6������c�9�]�o_�@�I�`%
�*��1�g��?%�(A4c��{of�����8����u��E�������#"M�x��������|0F�U:n��e���|%�{��h���6�oc:w���w�u�8��#�z�i��`U���e�N�#z�K���S+4c/��r��N�:�����}�[o�U�I�D���c����?�9^|��L9��y��W��UY��q}����S�L)�=�"��9I���&-�1cLvm�)���o
���;wn��~��EUUU��[�ti�7�A2z��q�u�e�F���cu���
��1l�����?����@S��)�J
�*����s�����%
@������F�]����������W7D���8��C2��6z\��m3���+�}�����>��S��{��x��'�"%4u
�BVEY�Q����k����U>y*�O���u�����[o��/��9�g���#G6`�
�v�q����N;e�i��m�}.����|�����%K��P��4;+��(��]����E����P)|j�f���.}�v�����K7{������c��WQ��\q�q��w�����u|��q�M7e����c�������u�����3��\��w����>:���S�k�[�.~��_���__�s�Q��9I��������������h�S>y*�,h�����93�~�����}-f���Y_�lY�q�������	""������o���O���w�s�=7�|��X�p����5jTy���������i��~�F���K��o��J����tP��G?�G}4�}�������3�WUU�o�����Ci���^�}��'����x��w6z��s����>��sNt��=�<���4iR��y@cK�`%U�b�3�g����K��S�w��y����/~1����]w�w�uW���7v�y�X�xqL�6-��][:���O�=��#F�Y�{��7/n�������#"b�]w���;G��mc��1m��X�|���t�M��{�M^��.�y�7.����c�M��{������^��C�I'�}�QDD|��Gq��W��W_�;w��]�F��mc����`���?~��7��NV(��i1���Z��#v�=�<�F4s��sO|�_�1c�d��N�S�N���SO=5��������Ot�>� >���M���u�������s���u����)�|����~i�nS�a��������vZ������,X,���I�D�=���l���^�U/�Q[�w���s�w�E�;����f���]�]��[��(���F�D,��]���|�T"X��u��1^|���������[c��%=n���q����i���U�����|<��c1j���;w�f��i��b������~7z��U�{\��q�g��~��x�����w���K�������s��w�1c��������[b��Q�v��M_UUp@}��q�gD��}�}/�o���������'�v��W��������O��G����N�"z�C�)*G��v	�������}���4����1p��m�������w������Q]�7��m�����K/��I����>��-[F�n�b������{����M���'��3b��%�v��h��]������O}*P�.�\�2^~���5kV,\�0V�Z������;�^{������m��s��4'3���X��y�h�[v�?
�i�E�Q���/�����S��'�}�������6lX6�����O����O�]�\��i�~x�1�{������hft�_���S;�����STX�&-3s�����n�rJ�p��51k�����K���1�l�H�$
:D���#)�v]>��"�?-�E���TX�'M3c��/��g��S��3����7e��r�n���n����l ?�bvN�|r4����}��>Et��O�
��O���s���/E|�~vm�)�d�Jag���i���$�)	@�w_v�y���C���B�)�s������w#f��]|J�p�wv�O�fgX@33����f�����'T;���X��I�O��|A���f�}9��e>y��(� 7i��������c��"���>W�������@%�3@~�4;'I>9�l������
8*������������������a����f��'T";��'M��,�H������90�S�\�@E��;@�H��X?kV���yG�n�k�d�$IrJ�-M#�/��]�w�c����
>%�,P�`D������G�g��;���P�;T��E<����S�N����7���y���bg "���*��I�w�8��X�US7x�����`D��3��@D��k��#@EY6?b��y���h�)����N��:�!M�N�]+��Ct���h��yG��2�����S��:���K#�[��*�,��H����������g�f;��hIUU�1���[���d���R����a�)��MS����1i�*
559��x������kCNU�4��T�b1;'I>9""-F�vv���;��'@�)����������L������������DD���9Q��h�}�y��#z�'@C�#Q,f�$�'����N�����!���
�yQ��aV��[�x����f���>�O��bG ""M�s�����-_��s��O9��e>y�,��H������5��&�6����su��}O�-@��#���Y�����x������"�t�%@��#Q,f�$�'����d�����������`M����#I����g��w$���[�U���@�I������90�S�\�4���Y�+b���Q�"���;�vc����9I�|�@+�F�����/E���;M�R\�xvvm�)�dh
�������c��G�1(�N��_G����Sl:��s��S4;�@���?I��������#�vi���������9�PQ���w_�)�C�G$I�)Nu��-[�vm����1}���={v,[�,��[;��Ct��)��w����TUU��~����W^y%�|��X�paTUU����C������f�_�w��^���h=th�1��Lz:b���Slz|:���y�hX
��B=��������_���x���c�~��C�q�i���#b�����{._�<��������b��E=f����K.�$�<��H��@�H�����s��G�f�S�������"i�"�(P1�4b�}��n��2<�<�Y��"�
�(xh��gT���??f��]���,Y��~{�q�q�e���W^�UUo��F��1m���7y��8�����������/:t�P�{����������W��S����D,��];�k}�%��,hBjjj�g����C�(��`���9sf��-o�����#G��Y���;���u'O��~x,X� ���]����o���dAIDATZ�*�O����+���SO��G������<o����l`DD
��������zG���\��L�	�
��[���7�����b��)�b���<yr�3&����O����~���m��2�����;��s��X�~}�|������v�)~��_��E����_�w�y'>�����������y������/.���X��I�O��X05b�����S���Lu���{����S��T$[���w�1���o�W���8��#���^+�v��������LiU]���/��7��\���s0 s�N;��\sM0 �8����m������c�=�����������/�o��f,Z�(v�a����Gv�a��C�m�������7����'�G}k����;F�.]b�����W�2��On�����K/�|,�b�;v��w�=��o�����'�������W^�9s�DUUUt��%8������4�4����Y@��6�����cD�#s�@3�*�����U�����q��w���#��z����/�Kz��=g���q�5�d�n���
��>���O�'�x"������k��UW]��s�V��������a����+��2����X�n]���?��n�)�����y�Z��O<1n������{��5~�����{������_��������7F����7�u��������F�#G���y����������b1�������[��W_����M�����t�q�q�Yg��;����u=���q������c7�z����������;n��yI����(�r�bQ��g�k����U>yh>��C3���2dHfm��I�<�����Y�f����{�Yg����\u�U���x �,Y�
���Z�xq6,����n��*"b��5q�������'���5��������n�	&l��*"b���1b�����c��g����*��q?k��	�((J� X��Q�Ac��9�������b��y��ML��$jS������wDQQ!�i2�{�������kf�}_����3�z�g{��~���N����%^~���w�}���x<��~��i<��3��o~3~��_5�>��sNu�Q~��?�;�������7������C���s7F�^�^]Q������|�ef�]v���������o�9S�������=�^�kkk���oo`R(_�b1N9��x��GK�=z�~���
������%K��I'����F�]�b�:�N�:���c��a1x���q��Y��K/��������w�p��t�A��/����={��{�������?
[�d�s�=7.���R��S��c�=b�����={����.�n�a��[M��m�9��U�2b����n##:t�'��2�@��? �k��\{�m�e����|��#G�<P�o���8���7�z(g��_b��1x�������/
�[�lY\s�5��o;/^������?�&M�����m�����{l><�������u�]_|q��3'""�x�����?����w�s�=��s���g�]�����3�8c�y��g�uz���j�|�����n��|�+���|&v�}���e�����?�_}\s�5�W}=�PL�>=""8������������w��&M�x��������_~�t�W���8���J��Y*3eb��I�D�,�����K���PF�4�q��ezC�Y���s��o�Q���m���{}����&L���P��~5j���������*���;����8�����C�y��E�;C��;���������G>��8��3�W�^��=��_�b�z��1r��?~|DD�r�-��K/�3�*"��#���Xg(T���K?�T���c��E�z����;��3��k������c�92F�?������^����;��S��T\y��QQQ��y�$1b��x���b�}�-
�={v�v�mq���7�}����i���|[K�F�����?��.�����e���ci�KD�n����
[��I�&e�]w�5��i����?@g���QWW�����*-F���w����KD��h��w����k�~���_���8���K�?��O���0�t����=���A�u����?b��v����A��������
��!����x���Ku��m7:������G���7�~�����Xg���z����~�u�Y��w�a���3?%�f|`
(K3�E,����j>Y(O&�@������K_�R�.
q�e�E��'�M�<9S����
�_��=���:V�X�V���������<����;Ey;�_����b����7:u�����:�����>��w_DD����?�������(9��
�'�x"""{��F�wC~��_f�s�9g��_m��}�{2����Gg`=��3M�	E�f�
�h*������E�t@>Y(O`A1e��x���Jummm,Z�(&N�7�|s���K���i�&���?�G��������w�a�g�~���?��OfO� ���*N;��M^��g�`ED<���6+"b��w.
�z��gm��jkk��(������|��K�.q�QGm�����G��}K��9sf��(GKo�-j~8������j����m
���`��/��xv�Ix����W������H���Fd����o�W���F�$IG}t��G?�}��g�k�-[��;t���L�������7o^����
�f����roh{��wt��}���1"S?��S�_���s����c��'����>���K�,�+Vl�����GMMM�k�n��m���~:jjjJ�~���m�]���]��B�����4����j�Xeg��W���|�1Z��,�T�F���E�6>�$lLu��AG���rc��SN9%���������u�UUWW7�~��4������q�E5�^��=���A�����;w�%K�DD��3"M�H�d������s�9'�������|������d��i�2�������X[�^��~��}k�`��^w]���d3��@K0�)��Z�}O��j�w
��XPF��c���C=4���?�������+V���m��i��������@����q���NQ��u�;��������t���4�X,��%K�K����6mZ�1"f���E�V�\�E�o���3uCT5������o��w�V��G�hw�y��&�����~�w�����SP�������e����,�555�`��x�����o�k���4������C��=������z��?8f��U
�T��a4�I
�������o����t��!S/[�,3k��U1j��u�_
0 ��>}�D��]�v�$Ii�%�\w�}w�35���K3u�����l�b�lw�A�f�����>�l]?�����5�(����'b�S�^�a��'�j�-b�Q����rd�P����v�!v�a�8��c��s��SN9%&L��/�N8!&N�]�s���`�+V48���6���������rJ���:uj�p�	�r�R��/o�5o�{Jf�?O����b��)�z�m��?���q��G���W]uU��l�N�:e�e��m�����4Sv��g���>�S������u�8�GUms�le`A��u�]��{�������3#"b���q�%��~��u���S���x��=��W�^��W�F��0��_�p����B��;w����k���7�xct�A
��)u��}���y���}hZi����$�)	PN�/��tw���	�_@kR�;�x��f�����2�?����][���Y�|�9s�ltOh�&N����3f��%K���~��e	��7n\��w�}7y�UD��/���<�k��������*������O�-7�������+�"�=1�<�����O<138g��91c��u�
80S���k
���y�b����M�6��������/���7y��>���
��,Xuuu�������2eJ��={���NL�t��<xp�o��T?�����ol��4S����l���n��v��G>y�|8�e�k����{�Lo}hv�m�L=m��X�j�:�6d��I�z�]v����$��U[[�^{�&�����3����3u�!T
������v��FDt��!S/_�|������#�8�T���5��4?i��m���F��1����������Drd�UUU����n��n��J���+c��������>����w��������~,]��}��u�]q�}���v�������Y��G����'�x"����w�	&4xU�z��Oo����?�������/���=hf�
�J
���/M#��������k>y��8�ef����p��Lo�m�]��c�9&S�s�=�|��k?���n�������q�i�Emm��L�:5�8��L��3���]�fzq�d�������O�:5�?����}���;v,�����c��E�|�G�zh�^�re}���<k���1a��M�[A�f�$�'Pf<���3����O _`A�����"]��Q��=�w���]{�q�e�?��O�k7d��i��������5j�f&����_�����������|0�g�����+��"�
���+���v�����=����w�g�}v�����������������^�$Ib������P(�GQ�/^x`��'?��o�9�����_������-�w�^������
�o}�[���/�������{��'���/D�~����n���l�b�.8~
l���f���"v>`�k��V�w�������^��{��Q��a���:*v�a��5kVDD������?�)>���l�>���w3�|N>���������q�g�O<��sO�?>F�=z��~����+b���QSS���m������-�u���=?��O�������	"""M�������/b����k�X�`AL�>=V�^]��;��N��=;&O���������-��R�s>e��8��s�������#Fdz}���n�!N8��X�xqDD�X�"~�����~�����W���;��i,�W_}5��I�|�{�bb��L�x��lo�)�_7@��W��s�91n��]�p��8���b��)�^EEE|��_��5m�����;/�;������^��5�\sM��o�����.jPV(w�B!����8��CJ��3�</���:��:u��_}y������*n���0`@�_,c������O���S3�����o������>|x��W�����_���>�h4h����7/�{��7n\��?�1�
��K���H�|�-������K��G����X��}��1l��8����K/�	&Dmm�:��4��_~9.���8p`�{������_����k����g?{��G�^�hQz������%���J���������'3����w|����	e�K�.q�}���~���f�m���M�61z��x�����c�}�=��������|�+Q]]��ux`�u�]����<��<l������I�&�\���b�������7h��w�=^x������b������q�����_���77+3M������@�-_��]��>�GTm�k2@�K�4M�d������s�ezm���>}�D��]�M�6�t���9sf,]�t�{�y����?�1
�p�h��Iq�!����3��;�.��5551}��u�p
6,x��h��]�a�{��c�=�,�'N��j����x��W2�Dee�f�I�z�����/�^xa|���-�uuu�����/��-���;�;��~xt��u���l��x���c�����[oE�v�b�w�<0�������i��;7���;wn,X� *++�[�n1`���w�}7��Ek��Q�f��.��&D�zu�QZ�9��d���U���������rLMk������
3���	�|�.TF|������<�Bl��S��X�jUL�>�}�u��9~������H�d��4hP�w�}q�����3J�e���3��]Gyd\w�u�b�4w���q�������h{v��1>���4�~[���n'�pB�1����'���#��lY�QZ�M<�-���x���S��F~�]!�������O~��8��#�s����>I��{����K.��S��Yg��������>��/����w�[�n\7`�����+������]�6�[b���~�$�O(O_3�jk<:�@�*��k��A1h��8��s�X,�+��S�N��^{-�,Y�����S����K���N1x��M��~:u�?�����.�'�|2&N�,�������w<8��k�Fx�
W���yG "���w��I<36���N�"z
�;�7���+
1p��8p�V�gUUUr�!q�!�l�{��4��I�Qh�.�0�O�6�D�o}+���s�Q�������^��m��S��$b��#>������X@�P,f�m�������('��Q����P���Gt��_&�rW�;��H�
�J
�A[num���g{�0�
��9��i���$�@Y�����d{CF���51h��l]p�2i1~l�������K�V�2����1"��O���?��$�����g#�M�����O������!-3uRp�2��f��}"��O�����e�7+�$�@YX43b��������|��6`-C�f��c���{���X��
m;F������:N~-C���
�6S�����g{{��}>yZ#'?�!�7+I���-��7G��x�.TD������F`-C�f��c�@�������l��Gt��O�����e(�u���h����l~�7��|��f�yh����K�?= '���y#����[U������>�~8������j�o��m���f��:��_�3p�ne�ixW��l�g���v�'@kf�z�o�LmmmTUU�� ���6S'I���}4��^�n�-����fn����n�;�g��y'h�<�`=�$�6m�dz��-�)
@��%K2uUU�X[�����@DT���w�������;������w
���,�
���S�^�dI�i�S�w����3�K�.9�h��b1��^��N��!C��4���e��N��TVG��E*�N�:U������S,X��T��������O�>�$I����j��U1s��(�;Dm@�}v���s���'�����f���yg�xh��4��k���{F��|�����c����y'h��������������Ro���1m�����st��1*++�P(��(gi�����c����l��X�|y�i�Y��C�����)!@+V���������a9���Y"�M���~<������f�,�
H�$��~�x���2gjkkc���`���DTUU���n�w�V)-3u�!j�Z����]������d������h��}���7�$�;
@F��m�_�~��m����Nk=P-""�/�X43b�#������|�@se��xwVUUU�Q""�S�N��_?�\�S������x���Xkvv��{��-4[�yh	��o���K�\�2�,YK�.�U�V�h%***�c����c����CTTx�@���J�|r���%o���:.�M�|�@sf�&J�$������:z��i�F�X�4M��b���$I
�H�hv��I
�������D��x�N*"�;9�<������$�����c��b1[������g���}`DD�ms���7�Pi���$�@�1���eof{CN�'�`@C����8�fi������{E��=�<�8q
����$INI��`�s��d{���Oh)���J�l]pZ��c�u����Oh)*�@>V��B,������7��������m$I>A��=����+�NRf����d[�O�(T�Z
�Z��o�3;,����<
y'��z�������4�$��M��=��;4N��B+��3��:v�;lP�F<ze~������6��N��X�Pq���#���~�����6h���7&���u��#b���N-Ce��A��)]�D��~5�0-W�6�D��},
;�6h��l�q��=��'K9��1��w����,������m�����^Na�������e{CN����|���,�����+y���?~t��-��{l�m�6�h�4�4['I>9�&����Zs���E�������,���������*�GuT���g��_y�����>'N\�g�{��+��2�>��&�
yJ��L�
9%���eo���:6�m�|���,��e�]?��O#"�K�.q�i�mp��y�b���1w��H�<�2Y��4Mc��9q�q��
7��{l�������Xsv(/��j�{uR���c��X�G�QVn����0��O?=��o���g�}v����|��0�������>.l�����9'SRp��I�.�����]���'�<�9�D�X�xqL�<�4���c����3f�5�\I�D��Q]]����w�qG�����C��a-Z�(.�����`�)3eb��W�X�F�7dt>Y��2��X^|�����$I����������Q\s�/I�����'�pB����rJ|������G������-~��5i~���=kS���s@y?6[o7(b�����>�G��>}z�u����K�.\{���F�;����g������6m���_\����S�Li����5�+)8N�b����'f{CN3�h^�X�l��??"�j��6�lp��e������d�o�O=����;��#����T?�����rV�o�@�?&[w�����d��(��//������=��SQWWi�FD��G��u������R��o4RRh���))8N����#^y0���c��|�l�K�����~_SS��u?�p�u���c�}������;�^/]�t@����:I�������#������]�^�/����O����KDD�i3g������������>x�{�=H����R�>���X������7���j�<�h�Q�<E�[�G�y!;�����/����yLDu�|�l�X��]w���z���1y��8p`f���s���+=�r���s�����;wn����uu���>5O<�w��m��h�y<��o~��$b�)y�X?���l<8
�Bi�����u�\v�eQ,#M���8��#6����Kc����������X����_5I��)�8��#������`�a]���`���lt��->��E����i��w���}�{���o�������.����'��V���k<x��=��3��""�U�@kS�`A���v�w���G"�z=�$C�+���}��o��q���F�$��i\t�Eq�E�~��0�$I����F����[K��v�j@SYs����*���+�,�QEE�;���������2������sD�����ZUw���������`����q���/9.���H�$"�z��Xx`|�s���^�_}i�~��M��+3e�;��������1��l�C_�42�<4_��@c��o~��w^TVVf�_E�3k���q�-�DEE�����[c����?���4if�V���(8�-��1��c���O����@S����������o�9�L�555�������#���z�������g�}J�q���qZ��9K��i�S���;9��7�X�>�lm���q�Ygm���]vY#�`���l�$�����7D����+�#��h~yh�<*�W�f��cM���Z��-����DTw�'���b@���lm�8o�X�l�F1�����8)�+M3e�$96Gqu�3c��]���C>yh�r���F��&hI�=���lo�S��@�Q�whji��������^�%K�DMMM����)�8��&H@�?��$��6������"���OZ�([��v[\u�Uq��wGMM��g@)�u��O���x9b�s�����o
��3�����o�'>�����{#""����H�$�4���.M&�7+1Z��c�u�m">px>YhY���,\�0��'O.
�zw������Y@��z���z�����e����4Xqu����NAk�|a�����}O����'-�X����>;^~�����.]���?���k���G���}��ceh�K/��N�U���w���P�;@�2���_Q�8�$�v��{�w
Z
�(.�������WI���^��{n�m�6�x@��w�y�_5�$�;@��|Q�����[�w���#�:�����,��}���W��$I"I���w���~���V�v���#��6������p��W4I!b�)y��%1��1s����H�4��kg�}v����$-��P�v�%�����c�u+#&��w
��jq�Y�������,���U�<�&I�0`@�k�.�D@�Ro�v��}t��Gs
�2%Q��g$I�w�a�=5��������c.qh��u����;-�X��m�����������,M3eE�Q��wNa(wi1~L��wH�������
y��2t����H�4f���s��)�u����Va���g{CN�'��0����{����������~:�D@k��i�N
���t�_��������|�l��(+]tQ��\�c��)�u������`z��Of{CFG$�%� >����|�����}.�4����+�>���#�E�f���94��c�uu�����'��r�������>���/D����_�"F�<�@���rW,fk�h�EL�+�������\�l���@cK�$~������_�������#�8"�u����_���3����^�$q�UW5Qb��i���$�)	����#�V�W*#�=)�<��,�����c����b�������}������45x�b�.��@��[1��lo�##:n�O�-ae��'���N:)�����
l%`��^�7b��lo���d�R`QV^~��8���c��%����4MsN�
��(xh�(M#�������5 �<[�,������X�dI$k��iG}tw�q���{F�=�}��9��QZ,f��P�)	������e{�G���1�E��2eJ����$I�i��w�n�!;�����VU\�<�<���y���zC�h:�,�6�<�Z������1����uy�����l�m������1�E�x��G#""M�H�$~���~@�4��sb�����B!��`O�5��+�Nl�!�F$��h�|�A��;wn�u��]���O�1
�g���H���n���
R[1~L�)�MQ�9b���N�e��lt��)""�$����G�$9'��������kw���v����
��+������QU�w
�-S�wh,;��C���U�rL�J�4Sw���z�����>��m�8"��g��r���g�f{�����|���$�w����I��X���C�FEEE�^�:^}�������J��*3e�#������S�%��c�fe{�\D�!�����LR6��~�9rdDD,[�,�����@N�4[6n��l�s����h�n��\p�QQQ��sN,[�,�D��b1['I>9�a�����f{CN��@�2��r���������2eJs�11w���S����i�N
�����l��G��#���N7Rv�:�����k�s����#��{�\pA<�������T,fk��
X�f���f{��Q�&�<@�Q�whL���/�N�$�4���~����~UUU��{����n��I���i�;.4���J�|r���"����+�D�}Bnq�V�,�����Z|�$I$k��k��Z�*�x����8@KR,f�B!�@�V[�������h�5�8@+ce����-`��*.4si�X����wF�X��
�O��1����o_�v����
�|r�VZ�xfl���A=���h}�������yG�����,���<�hf�7dt>Y����F�r���:I��4[��d�mv���>Y���2��S�������b���yGiqV/Y����g��������p��%���������L�7d�����e���^�8^=����93�(��,���E�B��yy'as������S����@����
�jDI�6yG��=}��W-��'FT��`+3hv�K���l�u�����;ej����o�;[�}��}N�;�U����X���.]�����i�*��6�}�+Qh�>�(����X�,������cz[��="�=)�}�����X���|�3M�o�$q�UW5���G�f�6��7��O`��b�3�e{��8�'���e1����?�9�$i�=�45`k+�u#l�i�E,���
95�,�<`�Z�zOn�aZl�z��F��O`��_��{����|����E��?����z������I��L�F����1kB�7������2��2}��_�|��x��7c��q1f��x���#I��u�]������}�6AR6���
�|r�5~l���#b�#��@�de�_�~�u��A�����o~��q�
7��?���6mZ�~��q����n����I��b1['I>9�u,}3b�����'ETT������Q���N:)��������9s���Q�b��%y�h]��*8����"����+�F�}|~yh����:th�}��1c�����sN���i���$�)	������o��v?:�}�<������/~1"�9T}�WDMMM��Z�b1[q����;#V,����'-�����{���w�9""jjj����9@+���:I������g�d{����/�<�l`�F��������_�1	@+S,f��#���<�hV�7xt>Yh�*����e�J��/_�c o�3g������j���~�>1 W�����EW���<��&[��%���|�����x���2eJ$I]�v�7����.f�rJ,������nk>�`������_��Y�w�����Wu6�������?����H�4""v�y��yX����_5�U���b��j�=b�#�N@KV�whn��b���?����'�$I�im�������
�A��YyG "���{�Z�9#^1�4G�O��l�w
Z2�(+=��f]WSSs���g�}6n����9sf�iI��g?��h��]cFZ�5�fT��}kI*+����G����;
@�4~���B���A�QY��CO�;	-����#FD�$[������4�]v�%����5F<�J��L]=xp�<~|Ni`�y���W���9b���FP�;4�4M7���(
�J�4��o����{�[�ny� Ok>K,)�������#����V���������S�������^����������SOE�~�1����z�Cu���|;��e{{��c>y��S�whL^xa��I�$����s����_�<xpl���M�h��?���YS����F�Z�^�"��X~y��cees`lLZ,f�$IrJ[G�.�����]���'�<@y�XZ��z����v����#����
95�,@�r*6&M�u�������d��El�W>Y��elL���>j�|�����lo�������\��4M3u������c�u�^F�(s`�������v���7"^y0���c�����#	���z���>����lo�K�lme���#����U�"��h~y��fee���$I���$I���5��@P,f�&�L��jy�����<&��S>y��ge)��fh�?�H�����v����������:)rJ��-�q�/"�N��������Uo��H"��[�0�������zOi6D��$]�:f�xb��??�(���g��*M#n�0���y'!���O�)�rfe��/l�5��/�7�|3��/��bD�3k�]w�����j���%M�x��W��^�Y�f�����m����[�0`@:4�����K�.�G}4�L�K�,�v��E�~���������Q�����3�����r�m���U�~����l��y'��X�������'�y������b��i1u��������[����E����n�;��3�������/+TUU�1�_���b���[t�����\c���U�V���$Ib���q�E�a��E�����W��U(t������cl����������>{��(w`�Z��s������������q�5�DD�_�������_�r\y���@�>���q�M7�M7�g�qF��7����;7��c���O���|��
�I�4x��1bD�s�9���(�$i��hdi�Nk��o��m������2�����]��������H�7�����������v��F845�`=.���x��������k��&F���~�V���O>���W��w��v�m���6f��o��Vf�_���x�������wt��q��y�u������b1����g����1o���={v�k�8��i��'?��+W�/~���x�4�z��DDt����P]�CZ�g����f���q�g"���-e��wh�.����xg�������k�������v[,Z�(f��O?�t<��s�`��������C�\��SO��>��M���i�����tf��>����w_��7/��3g��I�&�I'�������e�p�
[�hi�N+)�H��[�$b�m����~@�r�6������G�;��}���z��v�)�����3gN\~��1j�����SfMEEE�1"����������?�������7�^��~�����z�����C����Y7p���������9��uuu
y{4�t����$��@����"jk������N�/��,���}��^?��3[��]tQL�<9>���F�v��w}EEE��������?����+���_|1��S���iW_}ut��y���$�_��W1`��Ro��i��?��}�@Z�����h��u��3���������2��3lDa�/��7o����c��6m�4�����8��s2�����}�������q�i���A�6zMuuu�{�������	����$��9h������Q�!�����fl@�X����?����:�4���C��,����o��[n�%S�����{�z����C�R=n���3g�&&�������h�4�?&��~��������fl�����/.��m�]~a6Q�n������[\?y���:uj����C|���t��k�4��n��ihLi���K��f?1��lo���d����1m��������B�!��c�M3{��uz=z����	&d�a��Eee�&�����F�`+*�u���4��1��s��]�'���gXc�����s��y�����_��3'�4�$I����w�1������������6m�lp��I�2��������__?��4��`��gGL�?���D*��@���;4����o�u555�h�������(
����������g���)������F������'g�������~lE�b�^�yl�g����f��i��1���0������F�$���u$IR����"����8��1e����������>��Om��y��e�v��A����O�~��7t=���gdI��SZ�K#&����������@�`e)���Y����w���a��7��M:�Q�5�����gz'�pB6l��-[�,Sw���k��������+�m��
���y��5x����S����������?�1V<�l�<�����?_������g�����X�0�$���9�5��I!b�)���u0����o��J�$����s����_�<xp�5*��k�&J����b|���Y�f�z]�t�_����{m�X���
�w�v��������o]t��4_��=7���y�(�B�	�fn���1_�X�����
�y��SP��������yG�����o�w��������w��}�]�bE�n��M����AW555�Y	��e���w�V��������
�b����wZ�������u\z����9�����i'����3��U�t��+W����=Pc��t��yG����n�;��.�Fl�g�)h
*�l�k��&����ez������?��&���c�L�b��e�Y��S���9���/�)����k�N�'�p���
��L������o������{�]?���c����F,_���}\DE�|��<��)b���N@ka�@��zk�y����i�w�I'��W^I�l�>��U����
�Q}eeeTWW7h�����W���k�����>�������D�#��)@�����f{}�D�<'�<@�T�;�0���r�)QWWW��92���DEEE���?dj��Y
�~�����g��
�h��b1�h�>�r�=1Z�7��|���X��<���q�q���+J��>8n���h��M��8p`�~���t}�����[�3�P�f���-���c�u��;�O��r�����#�DEEE�����������J{TVV����9i�=������|$�-[V����~q���G�6k���^z��]?i�����^�b�N�|r�B^���D�7dtD�$��9�DY���i�F��1t��8���7k�}�C��~�E��Q,��+�h��
3y��9rd,Z���4hP�u�]��K���w�}����������M���G��~�UoVR��%�����l]�9b�����nN�S6��b�~���$I$I��_��E��q��$I�r�-�q���1#�<���7o^����;�=��={����w�m��e�]J��o��=��&]���o���?^��$�c�=v���C���F����Y�8��;��}�����%���E�x��b��E�/Ls�1[�����is�����'oq��z�����#��Y�f�z}��������O�F��q�������M�n��1�l��R�������o�(��2W,f���-���o��[�^]�������������I�&�^w��5����E����.��k�R���/n�~
�p��9rdL�6�����g�s�=���;7�}>���D��S���������Y�bE���?��>���6Z&���y�I�XM�nU��7d{��q�|�8IN�x��7"""I����O����;�^��=�Q��K�.���>:3t�k��q��w��A��^{��g�=�T�Z�*�<��X�d�z��i_�����W^)�������g5P���L���:h���|a�7��|�DDT�����K�;t��({����e�e�Mq�q���q�2�o|�1�����{���!C�[�n]���?������7.;����/#F�(��2eJ|�;��n�>��?�qTUU5(�z�i�m<��)�i��k��Gl��|�D�E���K���e���{�e���e�M�������6k����?3�j}v�u��������x�'�=�\~����g����o��7/f����R����q�)�lV6��*�u�������L�����!����.�(={���w�>s������v��m�~��/�3fD����_�N;��H�4>���FMMM����o��o���k�>����O��"�V�z���y��HW��;JYI����B!� �����x������NBS?&[w�!����dx�X���v���z��Uq��w�������u�]�j��Y�$�]v�e�36w��~zp�q����u�]����]w�a������>|�VN[��^�������R��<��zV.���Y����<��A
��,���{��z��7�|3�4��/�x�`}����$I"M����k6��n\��[�^����?����������#�<���J,]�4����o����~0����[>�Z_q��W[IRQ�whu����W�Uu��=>�w
�(3'�pB�����g�}6���o���^��}���o���>I�D�$q�	'D���<��s�5jT�1 7����;B���om�;�*�+#&��w
����"�����,��y��������6�4�_��W1�������s���{��%K��_�r\s�5�$I�im��������
���$M�L]��%*�w�)My���'z^xa�������;#V���u���
��T��������;	�;����������|'.���������q�-��g��F�����?��f��5������~:n�����_�K�,)}�%I�����;��s^o	�K��)����D��.�)@�H������
��������2��s���������gi��%K���/��/�<"�l��}�X�|y���k�J�4F��"�Nk}��B>9��OF,|5����\���9�OY��?���?�i�F�$�$ID�3�*M�(��l��(��^D��ED|�������o����b1[��9@K5~l���SD�a�D��3��TYY���/��;��8`�!W���xo8�!�w�}w\r�%QQQ���r��g�J
>ZZ�7�E���
>��O�Q�whJGuTu�Q1n����������i�����c�����S����{0 =��8���c����;6����d��{fl�n�5b��s�`�::4��w�%I�l](�����0b�����'FT��'8��S,fk��l���k��+�"�91�<��>�G���:I���l�������
�pD������`���l]���2M�;�fq�7xt.Q��)}X�4��I�O�-�������
���K>y�]`�������5����T��W��!��2*�Mi���q����c�=�>�l��??/^�V�j�>I�D]]]��|�i�w������$Ir
��uhY�����w����\�@�X���+W����W\qE���D�/�@}5����3��U�&��e(�N�{���.�X�z�I�\CFG��	@s`e��7��#�8"^|��H�4�4��_�;kCOk70�r���h�UC�@+������Q�2�$l�v]#�w
x�X����W��'�'N��w�[�i�{���v�)��R����������c���Q[[[�YD��;�}������V��������T���Vn���_�t��Q�6���B��1����Gy$�$�$Ib��v�{��7f���>�hD�7���K/��{,^~��x����������;.�4���7�x#>��O������n�	�L��w����Q��������]��,Z������S�{*����?�yDD�i��u�x v�q������:F�#G���o�=>��O��E��_�B�������~����������s�u�v�=r
�|:w��>}����tg��������g>yh��v���;d�E��;wn����$IDD�{���4���Q�F�w�����+W�7���8��Cb����r������h;hPNi��*-F��.��iX�NC����B���<�����yZ�'>����O�=�~m��
�o~��Q,����k�������|t���'#���
9-�(@�-��o�Qz��w�����F��X�b�??���"I�H�4�����?~���f���"�$�@�6~l���sD���d��X���FDD�$�����wM�6mJ�kjj6�_�>}b��v���4M���k���\�����# ��i3�e{CN57�r��@����,�n���z�t��9�5O��3g�����g������oaBh>��}����z������F�K���e�k����K�,Y��m����z�������o�������gV$���4[o/�x��lo�#*��L*�1����.�D�;O���7��f�=�,�~���7����Kc�������O�N�))4��U����	7F��}��h�������o1P6�n�h���;w�:k���z���c�������/����H�|�_�~��rT,��[�P�������
��{>y��ce�g��1p��R��c���f����$I$Ii������3�Yw�u��w���H�|����";���[��@�-)��x���#jg{CN�%
P�*��i���1y����������O���_�~���~4n���H�$�L����{}��1p��X�jU<��#1n��H�|�'I�8����k��[��@�I��u�k�ni���l����m���(O`QVF��]vY�i�]w]�����;f������|0�,YI�DMMM�t�M���=�*M��v�m��?���|���7�P��9�fg�S^�����K���EY9��C����f�X�"""^y���o��2k���w�uW�5*.\I����[�i;��C�r�-��w���h�%7�K��&�o��w��e��u{�~g�j������pF�Ih��_��)b��H�3�(;�\r���6lXL�2%�������cc��9�����'�8��8����[�nM�-����c�I'��l$�B�h��b����xcR�Ih*�G��	4>�h��w��^zi\z��1s���;wn�i�m�]����y�`,���#��B�NyG�����_��v]#�w
�����;z���V��lt<�����=��@������t�#����(G`-W��)���Wt��'s
�rU��St��G��@4�����d{{��o>yh<I��^���w�\��Xi�Xm
���VNi��?&[��q�7"*�������whL{��w\z��1w�����5�i�L�$� ��,�������'~��1��2q������;��cs�1q�u���U���@S)�u�G��L�!�X�^]�&b����@��[ ��������;���N����.�:��x�����@cK�lml�+"��)�������r�@�[ ��4M#I���������8��Cb������0^{���S�(��l����@�z���K������@�dee������~7���i�FDd�a���+q���G�����#�������|��<#���]�����>������c������S.qh�|����_������W^�Gy$>���E�.]2���4�b�<�@|�S�����.>��O�����sz�X��k�4��OD,z-�|j>Yh���l|����?�!^�����kc��QQ(��?�d���4�e���_���8��#c��v�.� �N��gt6�� �|�Mm��l�M��~�������@({m�����G�����g�����g��^{E��KQk�z����?�A80>���W\o��V����b1[���/�4�����lo�h�/��3�V�W�^��o|#&L�&L��}�k��W���z��'��_�b���;N;��<c�i�XI�G������w�42�,�l�B����{���^�f��[o�5F�m��-
�J�4�4�+V�u�]�sZ�k��tK�<�h|��GL�'����������e��;����"F��F����z+��W_}u<��c�$Ii @SI��X~�}�r�����8+�{.�(x�@�x{A��OE�����w��Q�{��h��	y���3���K��y��c��w������U����s���X�����<$I�	ho����G�,�;	��Q�������,��I�&�_�������s���;����W�����;F�H����@#x�O�_��O�;-�X�Z,���q��W�3�<i�FDD�$����'$P����H�/�;F�h�ayG`-�1���S�~�����)h���U������_q��W��w������WI�D����i�����O~2�<����>�sr�l�����
�B�v9�i�����t���������z���b�{uEUD�=��CV�D�q���N@Kg��SO=W_}u�3&-Z�|��������I'�g�yf|�C�$I��
�k~W���w��v����?�>�d 		������ (J��VA%�������^����u)X�s��Zj����%�V��F@$�8��|2����N�d"'�g����Z���|�3���"{o��fk�n�)z�� ��iC��;��1���'�t!X��W_}5~�������x���"�Xz�v�UD��	���.��'F��}�eO^.o��J�I ��_�������i�]Kue���q�����7�=�P�y����<���C�K/�4.���5jT��@�z�;�X4��1���n�)I��Z
��+��u��ED���.��w�}c���q�e�������Q�T.o��������>����n��4Y���������[��]|�eY������.�,>���F�^����[e��R�s@bON.�����4Y����������QG�]vY����I6,q*������o�@�X2;b�����I�H�z��������%�\�]vY��]�w�@
x��kY�� �3����{@���$�T�,������%u��W.o������D�.��yoqw�G"�{��T���<uE�Ps�|�]���4���G�o�27��8�#����	H(/��_fY��@�6D<}Gqw�9}�O������^}���?~,_�<V�^�������/F���OhD;(��J��4��+b���n��$Q�*S�E�{���G?�Q<��#�`���w�A������g�qF�@
��<6���K��3�w��e�U?@��!�my�tWy1���n��I��.X��3f�e�]��O��7�������������n�q���O��8��c��j��g��W?����������R)u������S�����PK�_�:P-���.��g?�w��]1}�����,�"����ky����S���N�o��j���[z�5���e'�e��U#���Wt��"F��:P-��@��~��q���G{{{G���%X|p��1p�����O�]�6�.]O?�t����{oam��!>��OD�����.H����b��9�#4����R���c��i�D���SPk�_��,���e��O��O;���<���{��?����?��8���vz��/�?�������~�[�.�,�������?�g��8������*���4
C��_;��j������:���G��F{n�$@5)���\s�5�j������c���~��9r�;�{������?�'���������g����U�V�������������Z^.�!�_�/�$Q�������
�y3����v�Eq��"��,�\S���Eu#����������#F��?�����uF�>�`�x��1����<~��_(��</�������o�0tG���i�w��/b�!i��}�R�Jy��'b�����ydY���w;]~���w�����z�o��e��OT2.��r�8�|�@��G"V-(��_�&������f����o��q����>��G�~�:��^zi��5����Y�&�����y�Q��K���Muc����eY�5*�����z---1j�����*/�sV�3[,x.����n����1O'Q7���;~njj��5��Ny������yq�h�V��\��q�Yi���)��n4(""�<�y��E���x���u�v�������m[_�3oZ�0����/�hjN���$�����;~^�bE���{u����?�/_���@C��t>�����y����}���+�������S�E�x�{�����,�"����g?�6m��km��)>���u�}���SO=�RQ�&��ra�J�b bc[��ww�~(���i�P<�D�hii�����ydY�>�l|���5k�t�:mmm���|$�~������,.���hnn���P;�)��,K��ne�=���1Y�����P#`QW����E�="""����o~G}t��'?����]����?��O��������������z��W_}u�g�n/��s�W����1������E�7<MjGs�PI�F��o|��W�W�eY�y���z\~����O}*���w�q��>}����kc��e���O����hkk�<�;���,�o~��1j����0�������h4���X�Z��4)Mj�,��g>��X�lY\{��EVy����k�����zh���y�Q���/9>��OU'8����X��/��9sRG��6��za�J�DI�Z����G����I��5K���##��&�Eu�k_�Z�|��q�W��E�:����v�UDt��v�U��1x�����������jn���<^����4O#�n��{7�wR�q��#��O���2~�?�=���������+����8����T*u\m��]�T��O>9~���+����
���/^�����8 u���zH�U=�{`�g�N@�hN�R�����+��+��"��]O>�d��7/�/_k����}��~��#G���N:)����:2���7��PSz�vZ�?>u��L��:]&�8�/#�ZR�V(��a���'N?���1���|��A7��}�I�{k4(z�zjdMM��5�uF�����S.�xh�<TN�E4&b�!��PK`DD�����]tQ4��� @��zSq�78��?�(��U��<R@]y���;~>������{|��+W��O?�1O�0a������v�,��?+D�z��w��+hd+���q�%�{��q�Yg����|����>o>��y���d�{������R�����n�����lK������������yG	V%�@���wA��	��mX��]����"z�M��J�@�U��
�S.o�+�
`o��;bc��9+E�xQ�<@���-�
J�@�o�����)o��vKqw�i���t
�`'��]��s���&��ry�e�W�{c�#�w�'��t/�����9sf��H���QV�U?@yrrqrt���i���,���+W�
7�Y��QG�8].����|�
��ZgD,�Q����[xSs��Y�\s�nw��7���>�����<���b��9q�����+:^{���������\�n�ii�cSo.��E~F�(@7������~u��y?�����y�w����%.���=�5����:(��c�F�z��;���&�e
x��`�,�(���w��G�N	�"6���n�%�+W����l^���P�����o�UnO����hfD^�2���{~�<@������yE����}���g���&L���t'�Z[c�)�D�o��RJ��	������__�:{��E���:��(���<��;��yg�uVdY����c����}�R�}������?F��q�z�v����:!��3u "��#���)�+Y����C��,j�����[��p�	�},@#(�]�:BM�{���#1�����R�`o����R��X��<�SG���r�07
}>��Di���c�����T�@DL�\��=(b�qi��9YD:2��S'�#X���6q��m��{��~��Da�Y����w>q��i�P9���*��<<����MSo*��G~z�,T�,hy^�`�����Yw�&F������`@�(�cV�� �}=u[D����ZzG�=/]*��'��2��.���#������yq�ei���
k#����{~D��i�Py
��+�F������,6o�\��TU�\�K�49����#6�m��R�������`Q��<O��������Vys��[���&D��&]C�%���O%Z@�����R)M�]��H��������d��(���\v�e�>���-�,Y��M�U�VE��eX�rH�v�i���L^.�m���''�!GG�&]Gu�'?�����y������~��1u���3gNL�4)����
&H(��s��&�N���X0��I��>���	7xK�e��}(~����e�]y��7����������*�\.�e�nf�������#NO�����:t7����o��o1s��x�������v�u�Y��| u4�-��-��/��:F��4wnqQ��Oc[�0b���)x����Yw'^Q�_2���F`�����k��?��?���/|�
���X������F������,�RG�d�~���S�`WZzG�=?u
�J)u���:�����_�y��O��3g��D��k�Q~U)%_��Zg(���~(�W��)�*�p��hjj�Q�Fu�O<�D�0@����P7zw\�������N�Z"�ML�����:tg={���y��k�{���X��/���\����}�9'��gSG��[� b�C�]K��&��6��8��"K����������w���AZ��r�0�����}�)�����[#���5��;��_F���.4�R��]=��C�x���y��A	���8�|���
k#����{��+H������-����*�,���|��	������w�]�qO���[-��/J�,���+�����N8!f��Y��1�Gyd�t@DD�yq.��xg���i�w�O�0,Mht��@%�u�Y{t��u�b��E1����<�<�,�:���o|��I�=����9��DI�Z2���U��q��(���<���{��k��?�]~q��W����[�|@lS�
���0urqrt����d`A�����<�<�c��a��������~4q2�`����(���j���"Z�-��]�?RR�E���}v7���+��w�9rd�7.�=��8��s����{�\.�l�w0����wP�g���Iu����@]�Q�uV*%H��U#^z��;�cM���<@��AVdY�s5���"��-sK����O�x�,j��
�J��vlc[�3�*���PD�}����t ��\�~�e�����Dl\��"�71Y`+��P�����X������SG�~�|�UV��N��:-��D�x=u*a���|��"K�(R���l^�4Z/�t�EO�D��N@���&�W_�X�:u���I�oS�E��9sfL�2%�z��X�ti�X�"6l���kdY��%�~��_S�L��3g�����G�1|��8��S��CI��m|�y�W���M�:u����_��AGD;>u
�m
��[w�yg|���'�xb����ydYV�T{���_�'�x"��x��'��'�����<�9r���;w�^�g��%q��W�O��X�v��?~||��_�.�`�����r9u��r��>M����A(o��vK�t�}">������������W^ye��'?��b�U��������^���������~7��hmm���=���1q��X�t�.��:uj\x��q������_=z���l
e������{�I�{k1"Z�O�:��C�w��������rJM��3u`k
��;���g��n�����j�R�|��w��j�����~{U������������+��G��������������x���f�����[�����r�0f={�>���(4�<��zSqw�1c�0M�FPJ*�������,�"�����G����]��93��__(�����b��������{o|�_�A�u3f��x����\.�����}�V�Z��/�I�&��F�w�qG���1m���3gN��;7���������/�{��^��o6�l%+���Z����/w�'���(<AI]����y�GSSS�u�]q�5��G=z����=z��!C�����k��6������g#"��^�	&�#�<R�_�����g�qF|�s��[n�%���w�uW����o;Z[[;���G��)S��.�,�:�������q�������kb�������r������5�N.���8|B�,�Buc���q���G�e�eY\q������S����G|�[�����.�<���W�G>��X�hQ�����??�{��X�bE<����o}+.���9rd���d�������������C����/|�1a��'@W�\���w*�	��m[�U��
t����.�N�(���&@��%u���������<"">��O��������8qbDD,_�<���/W$cgz��1f��(u���7�tS�Y��c�0aB�}���<'����W�R��p�
���K�~���49�AL�5"��w��w�����h
����������q������
6���/}�K��y��������}�n��;�,����'v��3�<3F��1/\�0{���fhTy�\��.,F�F�aM�������G���&@#�%u��7����,�b��;<������w*�:���b����N�2�BI��5k���?\�}���s�,��������w������</�
���<{w���-sV�wQ�<�������7w���O���_���z�x����x����w����/�e�������M�6u��G��!C�����}�{����+
�����9����:W�1�����	�����h`Q7�������5kvx��:~�7o�;^���C�+V���l��/�P�������=~�����*n�P��
t�YG�^T����&@#�%uc����y���;<���������������c��Y�eYDD����BI��_|�0|���:����������\�.���9":>��5urqrt��c�dhD
���sL������f����9��"����G}4Z[[wz��o�=��Yy�GD�AT���-^��0>�S�<8���;�r���-�H6������%_�@����X�\q7��}s�����@m5jT2$.\O>�d�q��c.�������Y�����������v[��)"��W^�O���eYG�{�����:�e���>}�t��,��w���z���^sO-^�8�,Y��sf��]�{����X��G�����$�i���B#O��~u��_F,��:	��dVq�7(����dhT
��+g�uV����{DD�������]�zW�;6f��w�}w�?>.���8��#c����������X�zu�yY���	b�����t�m��z����ktU�u�]W_}uE��������	��re�(�G��:A������1���I�*'^Q�M)@Uy������~����[n�o~���eY�����Xy����>���g
��]|������7�<{��_��0���������ga^�n�^eX���)��F�O�����(��g-�#���:@�)����}(��c����}���)S�;���N����.""�,�,�"�������y---���(N>����:��W�^�y�������
vyM������A���\�:B��:9u���?��_���9u���={��O>���]y��q�G�_��_������]�����'�����{������\��}����;}�u�����{������'v����g��^X��	����i��c�'?�(Lb�R�>���{�y��4��G�~��;����G��C�d��!c"95u�����u��g��i�b��Y��c���E�"��2dH�z��q��������-�Z�vm������
�
�
�����V)�����A�^�(DL�%"��m��O�~)��>�"@]P�E�;������O���-�z���:u��E�b���s�T��V$���r�0gY�(	D�_1���n�����J�iy���y����:��G��z���\@����\���<{W��u[��)b�E��@=�)4���:�0?����:��^����H�\��,M^���i�w�����4y��(��u�1�DKKK�<w��X�`�n������0�p�	��4�</�%_]���#�,.�N��$
�%O�B����_L�0�����{w��<�����+��?���eW^.�L	�y��7wq�1i�@=�)4������?��n�����9s:����)��R�l@�����eir��^&b�����Ii�@�R�
��K.�>}�t�?�p����.���<������O��O�T��������	L��8�{P�a�����S���
�Q�]~�������s������?�1���?>���uYF���yq��49hX+^���pq7���Rs�<P�<���o��X�n�v���~�0�_�>����^c���1f�����o��o�g?�Y,\�0""�����zj|������??��6���������_��_��K_�����S�.��������twS]O�[����'����������?��?�y����q�-�s�9g��]v�e����t������1y����?��X�~}DD��7/.���0`@�=:V�X���������\pA|�����_�;����V)/T�����]��=?�g�4y��)�b��	q�=������7����X�"�z����?����n�!2��mx��X?m���N����+.J�4Ak���L�����4������n���"N�(]�g
����8�����������:~���E[[��;����������h�@�X��_D���I���Kw��#n���yO�N��"��:�'X����;���<xp\w�u���~7�L�/��B�X�"z����
�SN9%;���f�Z�����:B����RG��Y)��.�_�:�/X�vz��g�}v�}����@Mj_�,u������N���NN�����O�zl�P�`@��yal92J��'
S���b��N��_�j�$U�:#b����~G4�H��!e���8����@}S��V.����O�������L��8����G�|���R�Pw��8�|����l���pq7�"�W@}�.TX^.�,�%��<u[D��o���c�O��+)��J���\���]��6�������E���&@W�.TZ�\�`�f���m���"N�(]���	\��</�Y�&5��9b�-��a�E�&@5(��
������|�f�f?�jaq7~R�,��	\��</�Y�&5����y��C���P-
������\���k��`Fq7~��4��y*-���6#vb���������H��`@���ra�J>~��U#f=X��xQDSs�8U��J*.��(�^�:F:�`E�U��y���*���N�������;b����T�,*��w���?���4o^�(�G����X�|�=_�X���������^�R��XT���|F�����K/_�q�W"V-�������qS���R�����f��������������Zw�i��NP=��Pg���	���G�8��_������L������
<4���J���`PYy^��~{�:��Da�j��(��O���uF������m������TH�9����ST�,*�\.�M�G��������7�}�D��o+@wUJ����ya�J>zv����.�N�H�������r�8+��2O��o����w��������)d*+��s���Q�6��x���n��=�������*��s�G��0����m[��1��ty�3<�@E�y^��,K��~�7GL���;lBD��i�@g)������\����f=�jaq7~R�,�'<�@e�yq��49��������#��&�	XTV�\�K>zVR���3�������x
����|�]������\��
�8��4Y`O)��rvP�%=+e���Yw'^QjN��Gdv`�M7��o��������<�����������O}kd�z'�U'�����[���c�O���,�m�{��h��?J�f=}�=�d�s�,f��R���PD�~�S@��R�n�}4u������b�]'�71u�3
���o��:B��;�/SGh'�Q��a�S��iN������s��������k���w\��?���i�a�7�U�1ll���`lk���C��>��Daj�����5��8�/�����2�S)u��&/�sV����ll�x�W��1�W�y�`[y^��,M���FlX��"�71Y��S���r�8�|t��r{��[��CN��D�<@��)n�m�yq��49j�+S"V�V��4)M�6(��F^.������L�\�<<b��i���S������eir��E3#^�^��4�?2`�`l�\.�%�vf�����G��&P;<�
��</�Y�&G7�zI���w'~,��%M�v(��V�\���N;2���r����g�q���Oql#���"����6��x�����F���&P[�S�h�2%�M�y{{�(]&�#,�V��yg���M��k�I����t���lN��������dj�,h@+�������8u�.���_��#&���gD��j\?�H��u����H������[y���#t��-C���_L�a����1�a)��T^�*u�.7���"/�H�!?!��q�S��9u���r�0�<��h1"Q�������+?�o��[�}�v�:Y�M�G���+��~<$b���,K��%
���ya������g��T�3wFl�vq�����F�O�@-+�$P.�,K������7w�N�8`t�<lO4�</����h0���7�w�'������S��n����"���ON.�����4Y�1X����0f���h�����Ow�'�U�@]������)��s�4DM�\�{�8��$Q�X����8�j����e3�-�N�hDs�4y������r�8gY�4����M[��'|$YvA4�|���T�
6m�x�����D��_�<�Zm?���</�Y�&G�����u+���'��nP���\.����h���&w#O�xH�<��������Z�����=7��b�����sO�h��l����c�+	��E/F,�[���8Iv�,��?�A,��g"���v����6f��Z�Y
��ro�������W8`T��SR�`Wj��|��|��X��/V��ju�1����W�~����#�,u
v��:TZ���Q^�����3�/�z?vl��#����)x'��@��yUo����h=�O�zO�w���s>��3u��,�O�����%K�y��.���"�7l��Z"����>t�����R�����wY�%���!�������Q~����������R���}�����������VP7`P�|�]�u�m�N.�F��8����
��,�O����T������X6��I�ouG�'���eY�o3���������T�6Pw`Pw�ry�]V��[�es"�>^���8"������?;(��,��-��\�{������-X��<�~W��[�����Wqw�-�*v�k
��?����,�����3�}����q�G+vy�{
��;y�o��J�y��yC��������w`E.
A��\�~�e����"��w�'U���0�S`�,���X����+�{mY�w���:���W?Xw���?��z����\z���<b|���+rih
�j������W\���66����Qln���������na��f��]s]�g�����O=�����R�U��wp�!�I�j�,�Z����u9k�yC�w��4�Rs�9������NkN�����0�8������K3���_
-�v����>}7T3^��|��hrPE�Y*E>:����,4X��\.�M��}>xn<wk���'D������`7�R`�yq.�����_*��]\�D�M@-*��s�������a���z�v�,���ya^�����9qbD����v�,�ZT.��11b�N��}#�=���v�,�Z�U����bn�/����T;��Q�P�����W_���c��"N�X�P�G@
�����(g-1���]x��3#��"��Q�P��<""�z+�4~R�@�O@-*�#��9C���v\����D�]
�jQ���}O�U}���'%��	�����w��������1�<��K�����A��/Q �NP�����_~��ho::u�tJ���71���$
@��R������M}S��VZ��8���)v�,���Z1��CS��vNx���c��)vOs��1���<o��������~-#G&L�NV�8�����sR�(�MP36�E<���n�������W|��v|�N)u����FlX��"/������d��<X@M(�GL��������~VD�[�Z�-�	�L�X�zq7�����,�$`O)�j����y�5O���zsP�PS`�����M/�F��Ct�^����%�"�no����w�Uq���[Y�X@��zI���wG{<J���9+yKPK�E����"��[���G�x��,�n(��,��������1����V\����%�"�n��������wqD���e�U-{�9uhd����~�(u�n������>���G���F��/��J:=j�,H���x �~fD�H�f���x�gl�B�U?{��:4��������1jJ�5����;(���(yKPK�E@O�Q.�J����7"��k����j�Ns��h6o������y��h���N�Xs�6���-F����#
��z������}�����'`@��poD�������'����9fL�P�����zPJI�GL���;`�}�o��%,�4m@�{2b�+����x��,�~ H@T����s���q���Y��4MP%��D�}������"s�����`@�L��8�lZ���|����e��
������Wq7b����n�"��
Q�U��������<F.���A
�h
���m�1������7G�M����e��
�b3��h[^��x��������`@����7w��tH�����@c��]h��K_.��O��ry����*� ���`[�~??����x#������b�>�^�
��������R��Z`7)�����oV�����1�����/��_EDD�U7$����_~9�x��x���b�����~��QG��zj���+u<����"�l:&u�.��iY[|�_��������r"HC��;��#������i�v�z��}���x|�+_��V9�n���t����q��?��r�^l�A�^Y��	(�:l��!>��O�/~��]�f����~�'O�[o�5&L�P����U#^z��;���������~w�L����hn�6"�����#������D`Q.�c��Iq��w�MMM1b�������3'V�\����%K���`�w�}��������CO���o�������}+C���G�TT)u�{�����]��'?���?~���+��SO�o����/c��������_\(��=��-�������-�+"+��
��F �-[�^{ma���=��_�%���+�J���|$�L��F������k�����K��qO��5[-�r�j��7��$�����o}�[�z���y��	���~��6,������������-�����r{��[���o�*�����P����"����r��'?)�����F�e�<������N;�c^�zu�|��]������+[��Q���2���G��(��7e��X�dI�|�!��g��[�~��(�w�qG��H�N.��7>��z�c�J���z�Q�=��S��9����l��=��s
��>k���X6��"^��;t�����p7O�A4�����SO=u��:th�5�c��qc<���JF��:�8�1t�]�e�WPO4�@�{��
��1c:u���o{=��U�"^z��;�c�|cq�e�t9X����[���/�>��N]c��_|����E��~[D�}���+��"�r�p\���,h`K�.�<�;����4hP��1l����x���d��ml�x�W��1���oDl��2""J���z��:���5k
�>��Y�u�}����5�����c��%�:g���{}�jY���x�sR�HnC�lh?j�M9���U��C���|y��N���7X���-����W����w�]^sO\w�uq��W��u��uK7D��SR��v-�+���k��wP�T�8@�(
l�����G���F��=��u��*�kt��v�Z�_�*&��,h`�z�*�7n��56l���k�������C;|����G����r"�+5����o���~��N_c��u��������b����:g���q������a���b�Q���m��gy�r47}}�����~^YSS�d@WQ�
l��������<�,��k�]�v����
�A���u����g���c$����#����<""6m��/�����5^������j��
�y���Ir4�m{^����X��z��#F��y��u�������������:�b�:��W_-�^xa����W_�q������.�ts�V=����:��^���`[
����p�	�y��)�}��b���sKKK�3�B��W��i�w�y��o~�c����"��������o~S��<�����o�3���O?=����������={&��Nf��^xa�|�w�a��.���`�x/
{�{i�3�K���^�����m��!^}������O��s`A�;��Sc����t����x��W���3�<�����\�/���.��;���{����c�9&u�9�K���^�����g���=��4����7n��W�p���J����?^�]}�����.�������G�����_|qWD��(�����|����c~��������N�������//�>��O����,#�C�/~���������������cW.���;��SO=5�����:th��_�u��P�`���>�;����_��_b��q�����q�����|�#1���cz��7�|s0����U
����(�Jq�-��%�\R�����+��O=�T�X�����������}o�P�`z�������zk�p�	;=�O�>q�UW���?g�qF��P�S���}�c���},f���?�x�����q��0`@}������7z���:&5J�S�vXv�a�cPgJ��X`PU
�������_��W
3�����=��4���`�x/
{�{i�3�K��,��<uG)u�,�JU���R�@U)���`PU
��*XT�,�JU���R�@U)���`PU
��*XT�,�J����}�YY�{~�af��Ho
(h�����M��DM,I4�5��h��S,Dc,�%����X��H@Q����y�?���
��l�r���u�Z{��y"c�8?�+X�W�X�`�^	�`���z%��J�U~mP���o��Ff��S��[�n-N�i[�dI|����~����5��]X�&��7����:����l=���q��GV�l^�g�,�X��k{����S����O>[m�U-M��?~|u�Q���90�#�$��[7k��V[E�>}ji��U,YK'O��16{y�EA���=F����:�����=S�;.��k{��^������=V�c�D^ml8f\r��+rN��t������,�����puy������=��)Ij{����Z~~$����Yy�=�X�W������=�X�W�X�`��$Im��&H��,����`c��iTTTD���=
��J�$���"I���F	���4M���$�����������	�L��S'6l�7��
F�:uj{$6ai���l`T��E�������K���(�f���<�����������G�v�a���`C�h���2e��+`�1���<y������,��X~��im��e��%1i��X�dIm���.Ij{6A��=��*M�����V
�*((�&M�D�F���� ?��I�4���c���1��X�hQ��Ieee1m�����s-N	P}�V���$�.]����q������+`�)((�z��E������4����(--�|�p��X�ti�����W�l������.((~��������K��e�'���ski"��#`V�j����+�����G�&M��`P����'`3 �i�Fiii�^�F�ji�l+`-]�4R������DEE�J{�0	��V��(MSX�N���l�`T�� ��b`�����U�����z%��J��,���imO�f@�U~m�1�={v����c���QQQ|pl���=��$��	�	�����������=�X|��g+}��+�T�u�=��_|����3�<3��l�`U��7�W\qE���F��+}��&�n��q�UWE�$Q�N�8p`�AY����`cP^^G}t\z���d����_]��2g�qF4i�$�4����x��s1*�OV�w�y���OF���$I�i;��c\r�%q�m�E��k���A�8p`f�����rdX;U���u%k
�
w�yg$II�D�V������#F�u�]��sNDD$I��ZGuTDD�io��v����rt�
��5���+"�������o��r�Z��m��2��,Yc����`Su���fB(�$�{����G��O���l�`����~o��V&t���b���^�z;v����g��}�YM�	�Q����
����H�4�����3�\��m���|�>}�:����Z����*""�$����G�f���f��M3�������66�Vc�����-Z����K�,�|.((���X���i�������H����g>�j��Fj@�I�����@~m�!k��uDD�i�'O������[���/��"������}���<#������q�b������[n�e���?+l�2%%%1l��(**����G���c����}��'�������b��1��g���Y�b�����i�h��U���N��g�����������#c���1g��X�dI4h� �7o]�v���{�[l��}���)S��?�i�����~M�6��m��^{�m����^�����{���I������������O~��5�`c!k5��~���E���o�����Z�{��G2��������:���a���������+�����*������n�[o�5�����
�y��W_}u��W/���������<xp��7o���[�����.�8��*������C=/��b|���QVV���m���s�9'~��_D����T��>�(~����s�=����=��[�8�����s����{g�'M���u��������~�*kG��]W�}iii�q�q��w���~Z��$Ib��w����wq�G��
�\u�U1h������_�~�������������_��7�d��~��`�qH����MP^m�!���gt��-���/������5o�����["I�H�$v�u�h��qM�
�f���q�!�����_i�U�w��7�xct�A�x�����	b��w�n�������3f��g������8���>�z�����*�{����_ED|��7q��W�v�m��_c�e���7v�u�x��'�~�]X����>�`�{����?��z����V~��i|���q��G�G.\�~�F�����.n������6w����SN�4M#M�x��������v����8��Sb�����iDD�{��5=*�4M�����W^y%���}��e�]�w��Q�N���o��V���1}��0`@&4+I����{������{��z��O�x`�������W�~����g������.�D�n�"//�?�N��������5�������.�,***��7n�m�]��������G�N�2����3�<���������������W���7��z����_���*�=\�/��">������2{:t��w�9z�����[��l`���^m���$I"M�8��3��o����*�����b����3�D�$�$I���3N<��O@m������g����N8!>����:uj><����M[)���{|��'q�)���)S�^�zq�W�W_}&L�>� &L��}�Y����Yw/���X�t�jg�S�Nv�a����-��,��c���~����'��9s�_��W���3so��Eq��'f+�d���������9�����c�������7�}��5jTL�2%������Z��7��-��b�zm���W^y%^y������������2�U��m��+�3fLw�q�x����>���>�l��;7>���x������(f��w�yg�\|�A��W�Z����.����>}z��S'�9��7n\|���������cc���q�M7U�&��$����5l�0�����~������������K���o�N8!v�y���H�4�$�#F����c���1d��2dH�i�	�_�~<����$Im>��4iRDD�t�M����f��[�l��v[,^�8���������q�EEE��Q�x���c�}�Y�n�^���^�]v�%���""��o����{.�:��J��y��c��	��K�����q�8�����c��c�9&�����5jT����q�!�Tz���^���gg���rJ�w�}��3`��0`@\{�����_f}_�^�8��""V��w��������,�?�����A���~��J7n�8�:��8��C���1n����<xp���?�w��J}�M������C������_�~�����U�~x�v�mq���F�w!%�'O����>�\��q������,`��� ����*�g���"�g���16iuZ��$/���X���;�������������/***""2�V��+
�Z�A�����.N<����/����n��Uk�z���?������{��;7""����U`}���Y�e?/����0�w�^�����G���Gg�?�����+�X��:�c�=;��C����7���������/�4�
6xiZ���UE?��Oc�-�������7�dB���Z�^&I�H�$�4�-��"y���{�������W>kV�k��������>=�[���1*�$I\}��k<��}��e�]��>��u��%~��������#///�4r����-Z��C9$~����x��wVyv���Y�����e]��O�|n��A\w�uU���v���GO<�DDD<��SQ^^u��Y��
�e�]V�y`��\�����`c����GQQQ\{����]�L�U���_�K�4�5k�
��c�
��L|�{���={V����n����~P���F�E��]3�)S�Tk�����[����Sc����k��}��_��W���6f���.v���G����U����|^�`A���;��h��I�zlN�k{��M��M��K/��/�8>���x������(f��s���
D�V��[�n������o���m������U>��e���N;�T��'N���y��U���9s����a����_�u��7/-Z���3g����[��?`���S�N���GD�-��%%%q��F�������6l���p�]v���5:w���.**�R��}�V���D2�Z����w�1v�q���
Le!Q���A���x����]�pa4(������%K��cys���t�S�N����$������w�w�qG����q��������{�h�b�z��������__|�:��={v��u��m��l�`�@��-�����=�&�N���=�*��W�V�����3c����'��S��g��/�o��&�y����#F��#�����$Ib����C9$N:������:��&�f����s�����&M��xo�M�,�H��"�u��""�G?��J�W�:u����G����c����Q��_�~���e��������J=���O=�T<���q�
7��Q�V:��i�5*F��]w]v�a��?�)��j�uz����3��kVTTT�\AAA������M��O?C���7nw�qG�p�	YaW�y�����+I�8����N�O?�4^y��:th6,f�������{.�|��x���b�}��V��h��A���.��;l�jv��}���� M�����,��=���Y����oq�	'T�������o����w��q���G����g���/��>�h6,sn������0&L��5Z�~�i��U��]�vq��h�$IR�#�	���M�#G��)S���y�b���k�Xw�W�`:�?���^�s��-��c����1c���I��6�l�l�M�����[o��G3g��������?���8��sj��2��u�Z�?�F���`UQyyy<8��������k����URR���N|��g����Faaat��1v�m����{���0aB|�����_Fiii4o�<��z��s�=�^�z5����
��i�2���j��S�N����7/F������g������8��33{��
�4+///k]������g��R�I�XU0n��8�����O?])x#I�j�K�t������S��>���?>������c������t��&MZ�>3f��A�����.����;�������#�\�^O>�d\s�5��GU�}�F����N�+��2Z�j��}�i������*--�����QRR���""b����Z��9��s
6�Z/Z���=:t��n�m�=:"�|����C�������`C��_�~���	�J�$+�*M�j��mo��v}����C����c}��q��������~US��{���n�m��J#F����:*N=��j��,�d��8����?��*��"",X��zk���;�|��j����uy�~�m�6�y��11g��5��:uj4(�S�x��y�J��h�"k]\\\�>]tQ���.��s�V�5/��������o��&|��i���+�8���n���e����A���Z�O<��z�5l��8��Cc���Y���5�n�����~_|�E���g�����c������f���NEEEw�q��SOe���S':w�M�6�������3f�!����j�������{��g&4���4.������;Vy~��q���W)(k����w��W�8���#?��i��i�|��Y{;��s�g�����~�����������*�v�I'�
7�c������?�<9��x��G�}��U��t��x����o��K.��Jw`����=����`C��W_�3�<�	��[�n�s�=QTT�_}�|��q�!��~���V�6D�5��Z�~�mw�qY�J]�t�'�|2f��}�Q��I��g?�Y���<n���*����W
�:���c��)1q��9rd��=;�����s���E���c��
�����	X�N9���������SO���'g���??���������F����m���J=>������:t�s�9'^|���5k�J�***b��aq�A��O>��o��A�x����n��Ml������q�b�=��?����������������$�~�:u�����M�f��}���v�m��+���?������M�g�}6~���E����N����*�~�&'Ij{6A��=��l������$�$I��[n�SO=����9�7��w�9v�u����o����Q\\������7�xc|��W�u�n�b��a��}��s;v���G������/��_}��q���G���W�g��Y��?�!k�����K/�4k////~��D��}c����I�&ED��_~��c��A���7�����C=4����������t��=Z�ns������(--��9���G�U�{d��������c�����]�h��U4l�0.\����`�����|����C�U���o~��5b��1bD�g����k��Y{�z��'�x"�9�����o#�������:����h��U�m�66l�����3g��3��n�/����-
��Q���O~R�������1cb��9�����
7�?���K�.5�c������5k����Z)Tiy�]vY��������s���nZc�n�!����Y����q�%���|����{��-���f�Zmo����	�=<�@���w���'����c���
�:�����{�Y��_�u|��'��{��'�|�R�U���c���q��g����������#Y�4��������c�]w]���3g������������J���$�N�:�u�	�Z�4M#�������*


jy�����[F���#//w��~�����}��7�����I�$�������������X)�����ZcH�������Of=�������;����yP��5ko��f��w���M���\�>}����z(
�\�������q�1��[l���-Z����>;����g?�Y�z\��1j�����c����6m�D�z��<c�w?�>���x���c��k|c�:ub�=�����:���\sM���jI*�f�x�����I������9rdm��sC�����g�]�t�I�&U�����Zf}�}��)����{i���[n�����w�y'��c�J�6,+��{��1~��5�E-����N��:��x���Vy���Ou��>�3&��v��z�����O���WVV��������G����uM��������EEE����Faaa�o�>v�u����g��(..��c�����c���QZZ�5���[�v�m�{�� �]Z�hQ���{��_��Y�b�����Q�h��U���+��f�h��am�Y)G�KEee�u��#��;��@l��%�EJ�j�����]�����#M�*�m�,Xo��f��AT��I��w�uWf��g�]e��s�=��>��������Z:4.\Xi��7e����
G�z����Ya�5�[�n��[����)
4�������`C���[�n��s���7�x��'�8�3&�.]�Yw��-��m[��{��W�z��Q�<��w{��g���o�>�v��Y������~Z�YoZYu�lD���'`3 k
����H�$"".���(//���6|EEEY���{W����W�W��i������5I����?����H�4>���8������������;6k��S�j�_�����+�=_�xqL�2�F{�8������o�	���+��2����H�$y���~����{���s���h����g�;v�X��[l�E���g�1k������93�4��

�M�6����C������j����&XQ���q���������~z�7.�8��8��3�[�n��u��W�^��%I���Z���],�Z7l��Z��$��������WY���
D�$����l���l������1}���1cF���?�Fz�{��h��	��?�9&N�I�D����iL�0!&N�X�Zi�V;�hc�bRu��"b�������j�t���Mk���o�A��H-6<��������O>9-Z�	�����UIII������5�����^�xq��Y��6�7��`��{���{l,]�4""�$�4Mky�
[�z���������d����\�}�g�M�M�Ff���$��9��	�Z���;/�.]�	�*,,��O?=�8���v�m�e��Q�~��s���Q��uIII�k,^�x�5�g���kS|��8��s�G?�Q���?>�:���@n	�Z��?�8F��	����K������G��m��b����u?M��
�Z�hQ�iI5�W���aQ�T�7��6m�D�6mj����`C��DDd����.�WU�bp��_~Y����M�����:///Z�j���V�ZeC-]�4�O�^�^S�N�Z�*t��VV�7��`����33�[�np@-N�����W�z��)�����.]�D�z�V:W�~����s���z��+=�Mk���7��`�F�-"""I����K-O��X1p��O?����������^���}`E�V�C���.��I6.}�������z��I���_W���o����a�Vyv���y��*�����c��I�uAAA�����������	�'k5��s�(,,�4M���8JJJj{��B���c�}���{��W�t7M�x��W������~x���W_�4M�����_�Z���?5jT�Yo�V�7��N��v�`�&k5Z�hGqDDD������>Z�m<���-s��wW����������[l����*�������U��z���1t��*�Zq�#�<r�����T�M�<Xkp�5�D���#"���.�i����D���?>6l�Y����1d����I�4
��w���G^��������i����7h��HWL\�k��o��Vf��q�8��cW{����6o��I�Y�^�z��>1u��0`@�3������i�&~���g��y����W_���u�]o��ff��i���������K.�F�e�o��F\���<?u��8��3���?��h���j�x�w��M���*8��#c��!��k�(**��w�9N9��x���c���QZZZ�#V��o�����J�F��u�����s���j|�����q��G��m3�����s�=�����4M3�_~�e�}��q���g������E�k|K�V�����m��e�]��{nV�SEEE<������{��I�2��������7k��M��&X&I�O�a%u���Z/��J�d��&Ieee�Tc]t��5&O��N5N=�����{W{��7���>8JJJ���5k��u�9s���)S���<��#�<2�x��*�>WTT��G�>�l�~�:u�K�.��i�(..�9s�d}_�~�x��Wb����RoZ�7���1cb�m���G�}��Y�zeee1n����=zD~~�Z��)�� ����"��&����F�������P�K�K^.z���b��v��2dH.��i�f~E|\�$I�����������s�E�-�����#G������B�N<������]�P����x��G������///��'���#W
�j��e<����
���u{�X1G�9���1c���Q�b��Q1v��j��lh���Dx��4`�����O��s��
����;��=�X<��Q�n�j��W�^<��C�����;���s
6�s�=7>������_��Dx���	�t]��V���o��.�(�$��={FQQQM�Xo��������_='u7d�/�w�y'���b��9QXX:t��v�-��j��5~��x���c���QZZ��5�m��&��k��W�^����
��1cb�m���G�}��Y�zeee1n����=zD~~�Z��)�� ��V�����'Qo�lXf]r_r����]��������z3t���a�R�~����c����y����j��5yTO^.�v��5���o��E6R9	��}���m����iL�:5&N���6l�r����'�tRf}�-���
��`ED�����v��E������-�x��\�6�&M�$I2�N;���	6I���l�r���y�x����M�6QVV�|����O,X� W-������o�7�tS\t�E1m���������sv�a��o����[4i�$


�U{�}�����9����_$I�Y'Ii������G�Gyd��&Ieee�<�O~�����}��k<WSV�j���C������W^W]uU�
�&)gX��i�	�Z>+M�\�^�{��73��+�Z�\MY]?�M]N���\�v���`]y���*]c��%���V���l�6�����=�4Mk{69���u���F�P5�m�/eee��{�����c�����I����S���/�6m��u����G���c����~�����Y�h��M����\���9s��w�����:f����Y��r�-c����6m��s��c�����_}�U��S'��i}���m���^@M��h���������+�����*�.]�����o�3f�t�n����� n������C�z�92~��x������?�4MWy�{��q����Yg����_m�$I*�4hP4h��^������*������������%���������;�I'���~z4o�|������_��/�<>���J��f�m������V�.��W���h��9������K+
���X�dI<�����w�x���X��[o��v�)n���5j�j��""&N���~���.1~���z������b�v�O<1�{��U�_ED�i}�Q��7��?�����s�������������8��#��k��Vmr#}7L�4F�EEE1{���;wnTTT�)��]�v]���Q�:u"""I�x���c��k]���^��:(S����Ff`�RQQ?����������l�2:w�%%%Q\\%%%�����G}t<������U�]��2�7����G��M���,f��_|�E��O?�4��g������M�65��5{��������9s���]����]�vQXX�g��I�&EEE�Z����K��o��7n�;w��������W
���+�O�>q��G�U?j�z��������o���z*,X���{��w�X7�pC|��g��s�����r<i�4M7�zlx�����<yrDD���Nq��7�~��I�DD�����K.�$URR'�xbE�f�VY�n��q��G������_t��y�3�f��Gy$��������""��o����:+�z��J����+����/�0����8N9��U�������7i��8��c������?����'?�I���;�����w��G}4|��U�Z��o������n��5�\���������&M�x��7��s����DD�/��8��#2��5���	P�r��PZZ����b���QyT��?�m���K/�4�$�$I���N�4(+�V7�hY����O>�dd}��Q���O�������;�O���T]~��q�m�UZ��C�SN9%��i���-[����>;�;��8��c�����O���~�RUD��R(T���3�U��'��~�mf��}�x��c�����|�F����<0�����2eJ��,�:������{��S'��$I�_�~���o�;��	�:uj<��sq��GV�]�Y�$#r!/��-Z���_<���W��x����u�H�4�4�x �@�j��]<���+�_-�G�q���g��s�=1w��J����g��W�k��y<��C���?�����*�_/��r�����u��uW~��-Z�;�P�~���K�y��+�_-�u������.k��^�rj^~.��p�	����g���$���:*:�����S~��k0??~����w��V\~���;gJKK3����[����VD,�<��R�iD���u�?��?��q�5�;���c��1d����X�xq<��Cq��g��=z���}��{�����N��]�?��OY��/����Wk����^m��2�{l�s�9��G}���X��`=��3��3�d��z���=�Xl���Y��}�:�;��3�4�>� /^�������4e���������s#�X�Sl��y&�A����rq���W������	���:th�`EDt��-�5r������K����C3����8��ss��i��q��W�l�-�s�����_|�E��`�r�u�5�DDD����m�:th�k�n�j���������QTT;��S���>��?����B��w�^���+�����E�U>��_���|��;��M����?��{������>}z��7/JJJV{o��E9����c������;�m����>����N���W��m���`��;7WcP9	��6mZ�1"�$������6�*������[��3""b���5����oV�����U�-K�4-Z�����c����C3�-���e�m������;G�&Mb��y1y��H�4�sty3g���/�8����(//_��������	&d�w�e����6m�T�|��
3������XW9	�z���#M���(((���?~�k�j�*�5s��u���~��U2����\x��5���N��ZlXZ�lY�;-Z��`UTT��y��i��Yg&L�����/��r��[�d�:�_���gg��PU]����i}r''X�|�MDD$I[m�U4l�p�k6i�$�y���\�2�������Y>`���O�=��c�k��M#�y������o��3��A�������d`�������R�U�=b����^�zE��a��Q�~���;7�xc�������������n��Q�{5lrv�:r�5w�����������3����_#5��.�VU���U���/���os��}I^D���=�e��E������������yf��[���������X������<k�q��Y�\V���IV������|�����o2�[�lY#5����+W���A�"I���8����{��U����
6�-ZD�>}b�w��������9sf����=;�9//o���~8k��O�{�Q�����E�������K_6>9Ic�b�-"""M�(..����(,,\�z����
����:���5`-s�����j�7����GW�����c��y�u�.]2��1|���z�v�r�UD��1c�5�����G���?\/}������.����\ZZC�Y�z<�@�saaa�����T���4�4M�kO6^�|�I��=����x���u��}���f�������W�^U��������S�|>//�?
���o��v�
d�#G��o������|�$�S�N��w�H�$""���������_�_���H�$�$����;���WS����������N;���l��.]?�p���w�}Y����/k�bUiii�k�~��U>��a����E��|��� �����������
������������:+����o����j��?~���?�o��6S��.��1�h�����j���z�
������}��?��^z��2dHf]�~�8�����l�2���3���{/����X{��Q��j��E�����Z��?����
7��|�I�j���g�@��,��s���]�FDD��q�W�y��s������^z)������^$II������vX�F����_���K�.]������)����w�����X�N��m���j�|����?~��8��#W��2]�t�F�e����Z|���U������>���Y/Y�$����W9k���1j��*�`�������x����^�z�$I�i���;��'��	�H���s�=7�tS�}����g�8��Cc����3��7��z(W�@����KDD<�����{�o���y�p�������o��1}����[l�^{m�5W�������/��1s������c�]v�)S�D�$��W�*�������f=g���}���������z*^}���_��c��_��-Zd�_}�U���7.�������V:�p��x��W��?�it��%�|��*���)?��w�m�x�������������.�����w������K�4���?e�#"���i�x��G�[�n�j�)�����^���+1b�����_�l�2�t�%%%Q\\�/��S�n�������7������w�qG�5*"��Yy��7�-��=z��f����Y����8���3�.����:uj&T�*~��_��O?��y�������^Z���_=�������s�x��������9s�DDDIII�t�Mq�M7E�6m�]�vQXX�f��I�&EEEE��`�����>� z��i�F�$���$��J�4+�j�^�>}����_)\6Tyyy��#���{����5kV|��G�����~��q�x��G��Xe����x����G�Y�1v��x���c���Y�W��������}���o�����sT���5�~���f�mV�n����������c�����6C9������O�5*|�����oDD&�j����������w_|�����g��1&���M���!C�����V�ZUz���0�=�����O���_c���;������?�y��Wo��v�}�x������o�
���_��QTTW\qE0 ��o
4�V���{�'�|w�}w������[�N��s�=���n����7k53�#k�_�����O�'�g��a��EQQQ��5+���
4�V�ZE�n������}��=�3fLl���������O�>k]���,������G����_��l���������������2����x��w��O>�o��6�4i;v����G�f����������������s�~����S��}���s�������6mZ����1m���5kV���G����G���;�������Q�JZV�d�u;6���YK�![���ZIIh��Eq�q�GT���3�u��9�
r#???��g��g�}j�f�F���C��z��[lGuTm��N���l&�rU���G���5kV����5^��'gXg�}v����5Vo���q����1cj�&�_������G?�Q�1b�k��7/:��5j��@��YVD��������'�S�C=4�^��P[r����I���������~��1��5/^�vX���;�$IDD�����GVaY����`��/�4M#I�?~|~���h��*�_�dIy�����oF�$��il��V�����jd���`�{��q���fB�>���8��c���b�wKKK�����W_}5~��k�x����}���6oiZ�����e�k��6��������I��/�g�uV�}����SVV�{l�������;�k���:u����V�����x�*��u���q�D����i�{��q�WTz���<N<��x���3�W�����^{-�u���QX�s� ??���w�}���?�4M��Ct��1~���f��i��zj<������6m�����=z����~����x��H�$����Z��6�<+"�Q�F�����{�S�L�4M�����v�����#"��3��|0~��e�x��Wb�m���L��{o$I���k���,6�����-o}5j��m�����y�H�$�����N�w�}7�>��L U����Y�x���b���[_�UI��+���������l������~:<��())�E�E�~����,"��j��I�����N;�|��	�J�K��J�Uu�l��kVD��{�<�@���?����K�f�k��a<�����n��|����j�/**�s�=7&O�i�Faaaz����_��n���e����a�X�pa��5+�����o��?�|���F�$��[�����c������`��iZ�#��X�XGuT������;/�$�4M�^�z���O��{��^f���K�����q�������#M�8��3��k��V�Z��N��������3f�o������c��Iq�����O?���OM<`��W[��9����o�	�z��'����5�*M�<9�<���7o^DD�y��q��w�6�jy�[�����+�������;wnq�1e�����!����:u���K�,�C9�Jg�$�����aU.����7o^$I?�����3�\�:g�yf�1"������y����/��~���jJ�$+��iZ�����b����Z�5��j'%�iZ�����T���2{��x���3�K.�d��]z����[���={�:�r�� ��K���$+[���$I*
�������vVD�h�BUC�j#���������H�$�v�]�tY�z]�t�n��EDDyyy���[51&�I�Daaa���ji�l����Z�6*�������n6'N�|n��U��l��U�T��4n�8f���Y��7/Z�n���l����V
�j��i-M�&'Mk{6��:th��0���DDD��1s����|���%Kj�&�+`-]�4�N�:t���������/���"k_���v���m�����'O�/��2:v��������(..���i�f�gr�^�zQPPK�.����??&L�M�4�F�E~~~��������,M�(//�E���b��E������a�(((��	�������gDD$Ii��M7��������7��	�H�$S�0%I����)S�d�,]�4f���f����"


b�-���1�-'X����^x!�>���w���h�S{��g�o�>����H�4n����m����N�v�|0n���L�V�v�b������@Mj��At��y�,��V�n����S��(l����'`����/��b��W��_��W��_�:6l��69�$I\p���i$I���8.����3gN�j��3'�?��8��S""2�.����
��e!XBf�
E����K�.�^6Z��(�`��H�4"":t�]�t�E������u<��#1|��L�_�����������~�����n-[��
��E�b���1z��x��7��������L�UD�.������k�e@u4h� ��r�X�dI��7/�������=���S�N4j�(5j
6�:u���H�$'X�[����$I�}���h�������/�x`|��G�$I�i�/"NIDAT��{,{����_����;��?�|��������$I��W/���m���4M���"��9@MK�$���2!��s�4XOr��|����ss�b�j��y:4.�������""2A��I�$|q��g��7��7���@�%Iu����16:y�(����GAAA�i�&M�����z��Q�<xp���;q�q�Eaa�j��"��*((���;.�~�����;�_���\m��E|������Fiii<���q������z��n��C=s���w�}7>���(..�9s����a����Y����{�������{F��Mk{l�
FN�"".���x���""���/�C=4Z�n��v�]��M����~|�����Q w���'`����{��G\w�u��i|���1`��(**�U;69�������c���Q�^�3fL����q�i���/��g��ek6P��*��{��k��]������?����?#"�Q�F��I�(((�r�$Ib��	5;,���=���`M�4)�$�4M#I�H�$""���p��??���_������Z�dI�92�����o����G�&M�M�6��N;�V[mU#������������G��Y��N�:��]��y���O�>5���3u��x��wc��������3��{�h��Q������'gX��d�.�F��7k���9sf��3'�,YR�����o��p�1"n���x��GW����C�8��3�����-ZT��������;����gWz�W�^q�%��i���N&�x������b����~_XX�w\\}����k����)�	��W��(U�k�����:���9�[/��R�s�=��;����S��N�$QVVV��m�***����m�x��QQQQ�{[l�E�{�������w>���8��#��g���������i�*���.���K.�o��J�6l��w_s�1���i�)���n�mf=z�����O-N��E�bl��Y{[N������Dl��%�%gX���c���'��F�������E�$Q^^^�m��:��������~�
b�-�������Y�b���+����O>�r���;6��{��9sf�~�F��{���x���4iR,]�4��=��#�������~��_�������$It��1Z�nS�LYi�:u��#�<?����gS|S���uWiVqqv�Z;�A[����\
�)���c�]v�Q�F���$I��������7�>��J�W�{����{.����������������i�b��AQXX�9[ZZ��zj|�����SVV?�����Z�h��w_��=;>���������o���/�<���������_|q������g���c�9&��S�L�#F��3��W_��}�{�3���q�����I���gS|DD$���Nd�3gNl��v1u��H�$�4��M��!���u����."��:����C�1{��3fL�1"JJJ2�W�l�M��G?�����+k�M��v�m�G���w�e�:th4\!�oyC���>8���2{�^{m\v�e��s��w��~����y��1l�����w��|��8���2�������O�G��}Oiii���++�������o������s��~�af��SN����o�}6�7���$��X�(����eqqv�Z;�A[����\
����_��	���8��Cc�������������w��zj\{��1x��x���b��i��?�1�6mi�FQQQL�0!.����"�j���Y�W��~�j��""g�qF��3�<����������>k���nZePTD��'�'�|rf]VVW]u�j����������z����rK�AQM�6����/
3{<�@|��g���)�	��imO�fB��q��$I�i={���<�7o^���7�.� >����~��#M�x�����N�����c�f�;v����k��s�1Y�������K/�_|�Ef��k�8����������
yz��Gb���������=k}�e�E�z�V{�w��q�q�e����q�=������&X���,X_�u,X���GY��q���o����$I��+�����j����C������m�H�4z�����S��npf�������S��v��9k=g��U�}�������~zV��l�����~�e�K�.���~����������2�F������>g�q�jg^���&Xf�`��??�����I'�[n�eF��M�c����i�(,,����*N>������j=kY0P�����Gq�j�WTT�����[�5�\�Y������!7`M�6�Z/^���wW<��U�U�}�����tP��x��Y�g�}��}��k�h��a�����^��A��z���1n��*���l��$������E��������C�{�����Gqqq���E���_eee1q��x��������:��^X����4s�����_�.]��1hMsw�qQXXi���1cb���56��h�v�Z����t��>�Z�����s��M�o��&��[�n���NU�q����Z�5j�gW�n�=��r��������^���`y9�����c�v�?����`��H�4"��Z����4Mc���q�-��;��q�G]���s3�[�lY��
d��`����k��Qt��-�>|x
L�����cV���%K�/���-Y�$���?e��q���-**�Zo��VQXXX�{����?~|���U���w��k�z�������e��c���f����B��4�F5n�8Z�l
6����Y�b��������7.<��x����G��9K���3�����&M���E�""��/�\c�f��e>��W�6�F��������/***""��+���������Z��9s������ �����+=?v���u�N��5_����^�zQRR���Q\\\���u������T�
�M@�I��#]����6�?Or-gXK�.�#�8"f��I�D�w!R���{��'?����?�u�������2dH����w�}7sw���q�G�'�|��9���h��e����\�k��]|��7��������32�KKK�q�
��{���zk�w�y��i����i����v[}����W��_�~��93���x��c�����x`<��C��?}���u���=c���c���Y5+�Z��������C�z��W��)�	����,�~��*��u��1g���8TM���n���7n\$Ii�F�&M��;��c�=v���u�g�qF�q������Yg��������?�<n���8���s5v����:"�����/*=�������##M�x���W[o��)1q��L�W���kv�
�9���z��_���1f����>|x>|�w�w�_|q�u�Y�����s,�Z7l�����xg���/����u�U�>��o
o��������&��������X��k���~�~[��@��,���o��_5h� �;��S�j���?����*��{�X�xq�i�^�������QVV�/��'F���������q���FD�_|?�p�������+"��@�$Ib�m�����������+��[n�e����u��9.���8��W~�r�R�z��=[���W[sU{��U�>��o
o���o�=
T#�`S5����_9���u����1��>]h-�7.��I���A��~��;�W]uU�i&L�q��������a��e�]2�!C��t��c���u�f���>�������7"b��yq�y�����I�DDD��Mc�=���#6��-��2n�����_EDL�2%�=�����k���X������uaaa�g�[�n�z���k��6�����^������t�����%u�F�o����k{6A��(:r����H�4
��3�X�zg�yf\~���t����5jT���c���������{�ED�3�<g�yf��M�6�_��q�M7E�$1o��8����?�yl��VQZZc����������$I���/�V�F��K��	'��=�Xf�E�����<?�����G4l�0f��~�a�s�=���OF��1{��8��3���(n���J���W/k����:�,Y�����+--�t]�T��)�	�]y�E�G������Q��H�[�"gr�5}����H�$�u���5[�z��5�������c#"b��i�:b��p�	q�UWE����/�_|�:u�:s�UW��/��G��$I"M��9sf��5+�4��[�]��}���/_oo�M��sNV�U��}������m�f�k��]80O?�tw�qQRR7�tS���;N?����7j�(k��Nu,^�x�5W�WRRR������lSxSu�{������Zw��GuT����Q��^�{���yy�+���$k����M�4����7�|^�pa����=z�3�<�	!���X�L�
���_������oD�waW���4M#M�8��C����������3t������3�6m����>�[�^��#�8"n���8��32{]tQ��Q��Q�b�����X�Ne!N����:u�Dyyy�����U�Oe������M�6��M�������#�a���$/E[�j��>M�:�Fj~��W��-[����Uu�a��1��sLt����3-[���_=�z��8���k��Q�~��W�^t��5N:��x�����g���M����k�_�����\����eN;�����gf=k��x���W:�bH��_~Y�9���UY�eV����V�waU}6�7��r���}������:F��N������|�
������	&��b���1a����?�x`m����iC���8p`������a������o�t�W�^Y�)S�Tc�����GIIIf]XX��w�����Z���[o��>��`y9	��k��"???�$������j��-????��{�u�G�}���1w����n��U�����N�����&L����U�QTT���r�-#??���+����O����^�
�����IV��Mc�}��4M#M�x��'����^�Z������$I"I��w�}�I�&5<15m��%+��*�iU


�����+�i��m�m�6���#�������Z����<��w���N������|P�^���`y9	������+#""I�H�4
GuTL�0�J�'N�G}t\q��W\qE�F��l�r������Z5�N���n��u��;����+��R�+�8p�*�����w���V���o��-��{��={��r�M�M�L����w�8���#M�L��3�<�z��~����W_O>�d6,F���
���z*�������_���3�z��L�U�$q��'�>���������S��O>�a����o�s�����6�����]���!C�T��k�����r�-+=w�Gd����������0aB����uAAAz���<��S��q�3�����5���������Gy�j�o�o�{�eWU����Bz��) 
	M��E@����*"
DT�S, �)" !��$	 %BBHBz����knz���L�g��8{�}�~�$~+0����������K��d���y��3p��|�S���]w�5p@�8��80>�`.\�$���<p���j�7o^����r�!���c�w���w�9p@������~z���u�]4hP
����
��:P1���~������}�������n�����F����^��3.����R�O}�Si���
�9��S*�?��3g��>���/���n*�kjjr�I'�����N�H�`5k�,w�uW����%IEVQ��$�+�*�J9���r��w�i���w�n������#��vZ���f��iK�^���{.'�|rN>��q��6mZ�����;�b<l��|�_(��-�����c�=�bn�m��^{����m�Q�=����o|�1b�r����r�����M�4���W�+IN;��t���<�����}�k�����ws�	'd��y��c�=6�{�^�9���`�z-�J������?�i��}��i���J����H�f�r���������^�����w��������:*o���R��z������h�"EQd��������+�:���N�~�*�����p�<xp,XPqo�����O�]w�5o��F����i���r�:��S��O��x��)�o��2h���s�y��|�{����_����������+}������?�a��o~��y��y��W*������/O=�Ty�M�6���WzNc}'H�R��6�:6m��<���y���3z��L�2%3f�H�6m��c����#{��g��s��o��!�-�E]���??�{eWEQ�s�����_�w��K/��|��{�I�������>���v�m)�J9��C��������Z&L�����;#G�\�^�6m��W��l�2�'O������r���:+?��OVz��/��}��7����R�l����={vF�����W��}��3t���l�r���_�B~��_W��J�l����t�M3z�������kjjr�M7�����*�����><�o�}y<l���1hl^�x�,�2�<���i��~UL��fmz_�k}��/���`���E���O~��N;-M�6M�^	P�TJ�`]��9���$m���;���&M�4�[T���cs�	'd�����\�f�r�E�[��V���2�?�|>��Of������������t��a��-\�0���7r������V�Z��k���G�Z�$�����,64
�����}���P������,\�0EQ�Y�f��?������������{��g���W^y�.�����r�<87�|s��������k��}>�����^��g����WI��N;��^�9����;.w�6�l����*w�}�jE%���]v�e2dH�[��6o�<�����6l����;u�(���X�(��vyf���M6�$���O��s�9����������rI�=������/w����g���)�J���[r����O�u������SO���_���S3g���k�.�l�Iv�q����{�%Y�b���y���3l��L�<9M�4�f�m�]v�%;��C����7.�<�H���9s��m���f�m�����]�vuvNc|���6M��>z�c�,�:�<���i��~��gmz_��W��^z)�n�m}m� |����7/IR*���/}i�����k�O��$�0a�Z��>j��m����~����9��5�����}���^�I�n����#���s�;��n����������
M��I����i����w���l����_�0 ���O�=���z1n��$��_���3]�v]�=;t�P�~��w�z?H��J�N�����?%�7��I�ms@r���NQ?��+I&L��?��O�����$���g���_.����s}���~���u]e]��~555u�'u�vA���+���P�X�E�$9rd����\s�5I�����\���o��o��!�����[��g�����x��&�lR'{P���K2yT�S@�ToXg�yf�������J�R��b�1"/��b�������d��w.b���~i��e}�[%�;wN�^��c���~'N���c�_��]���������G���k�*i��:y�0��P����
�~���'y��i��!�����^^�x!Vmmm�~��<��3��O~�f��e��w/b���^i����.�v�mW�~��w��3�d�]vY������&y�}kjj��{�uF����I����;���;T'465�}@���s��G��+������Q�F���������]��(����������~8]tQ����:���������\���;f��6+���/��{��???��OR*�R*���;d�M6�����7�%��Q9��#���.�{���w���O>9�_}���#F���E?��t�����(��g��Y���{r�9�4h���:��a��A�����h�3�<3�����w����eL����d�e�s�[%��:y��j��%m����������/y�����SO��?�q>���n�:�R�����|�;i��mJ�R.\�#�8"���W��)S���c��UW]U~��6�,��vZ}E`

�[2�?�s{}6i�Iu�@cU����J����'���Kv�e�����OQU���S�\v�e)�"�R)�f���G�}��7W^ye�~��$)�7n\�z���x�����>�=z���nJQ)�"M�4���^����W��X��w������g��OW%4jM�`���y��'3x��<8�>�h���[�_*����EX��rJF���/�8�R)EQ��G���>Z��(��|��K��J��s�^zi:�����*x��d�����_M�T��������^��!C2x��<���>}z�����Z�n����/��2j�E]����*g�yff����Y�t->�h~Q�U�V�r��W����j�����W��Q9���I�]��)�z���3x��<8C���I����Ux��y�����0`@����=��#M�V����ON��}���(�]w]f�����kQ�����M������w�������j�X��H�\��7�t���/U/4v��*��?�1C���!C2f�����
�jjj��.����0`@��w��l������^�z�7��M.���:4>�`^|��L�<9S�NM�V���S����+��������;W;6��2~~X3/����w���'��V'l������O�TZf�U�l��v0`@�����}��C���^t��1�~x?��jG`
����E�\���]��N�P�[��J�R�w�^.�����v]���x����g?+�����g�}��^ `�2}b���������7���+��~9i�Qu������J�R�d��y��w3}��L�>}�(�z��'s����T*�Y�f���_�H�l���~�������LW�$��^{&[�S����kVQ��w�y'��_����%I��[d����f�mV�Q�Hmmm����{��i��]����nT~���4M�~Y�$4������[o����l���)�b���q�2h���x�����[��n�|�K_�m����S��W������T*�c��UN�+f��<yC�SP��:9��{�S���i}m|�a����K�L�0!C�)F��$)����?��O��������ujjj���;���0`@��o��l����.W�n����&Mj���u�#W'�g/6QJ>tdR��j�X��d�>���V;	l8��kq]�v����c�=6I2r��<8C��}�����z�����6�<�L�y����'?I�f����{f�������g����}��':t���S3z�������l���l`�������*��?$�{fu���j�qh�^�r�����n��o��^x!?���s����C�I��(��y�����\�8��r6o�<���g������
v6�n����X��q��>�V/���*XK���O�<���~��y�����O��K.��{��$)�JI�W����;���o�>Ir�����Gm���u��'�Q�W��vl��Su������E����|0��_s��w����.�_U�[l�?���i��ef����|�#���~W�L@�[X��E�\�M����N��Y�j^E�z��2$���?�9s�T3�R��������������>o��VN?��\|��9��������W�^i��]�5k�Z{w����Rum�?��_������Y���X�5x��#2x��2$���M�V�WE��T*U���C�9��2`�����g�r�E�������s�������R),���@=�7+y����N['}>Z�<��z/�5jT�R.��8qb����W���j�*���o����d�]vYj]C*��|��
�����?%3'W�����Iu��������N��!C2j�����
��7o�=���\x���{�i�z��Z-
�`�3����?U���#��{u�4��0u��W�T*U�^-E�&M����`��j�}�M��-�+�;����������=|U�`�������/V/@cPoXK*�"}��)^p�i��}C������jG�d�����W�mH�i���h,���W�^������g�M7�����X� ���v����W$)�7n�2�����h4��k��Q���{}m,�T�v`	E��{2��d���9o��d��d��d��d����Imd�������T;����
��_�!{������v
�R�N��GU;@�PS����;!y��j�������Y�j�h�V;46��_�`N�SPgJ�O�|��AXP�^$y�����{$[�X���JI�I������~�.��&M�[����m��m�S4.
��������r�e��c�'-�U%��j�������f��_T~KR�u`����?U�m�S��#U��4X���"|Y�p���j�$���J���*X��^�'�L����J:mU�<��S�ka��d�/*��vI�:�:y`}���CW&��T���j��eU��zA�����	�$^J���rn������JXo(��5��6���$���5�(����T�Z,X/4�v�
��Y�K��w��v���	�[/W��yR�~��������4hP����N�.]�x�	&����.�O8����e�R���&�}+�\��P�6���zt�S����
�n���|��H�f����q�I'���?��s�=kU�5|����`��������g%M���
h05����?��l��f9��3���O��1
�(�uz?`�Q� y��j���m����.�N�������)S��_�*������| '�tR�;��l����yl�+�J��4#��LW9��>I�V����)��.�&<��I`�R�X�E��^z)��sN�=�����?'�tR?���h��!"���(_+��
��y���V�u�.9���)l(j�k�O<1�[�.�>�J�E�����{��9�����k��v�iy���+�:e������[W1	P
/��L�rn��)�6<�V�u���f��	����<0���Ik�?�������k��&}����[o�/�0#G���HU����|��c�*&��9���*�������*q���
���U�V9���s��wg�����~�m��6EQ$�,�9rd����}9��r���f����A�92W^yeJ�RJ�Rz��]�H@z��d����}NM�[��Ai�Pm�������o��y�������>7�tS&O~�Of��a=��Cy���r��g����	'��<����}���]�u�^zi����U��(���5+#G��s�=����E�R��~���i\`=3oV��+�z��t��*q��TEQ���������+�
�]w�����Wa%�+��|��s��������v�mW�9jjj�[����gM���(��m���?�I�.]�h?`i�����o_6,}���b"�_/�k������=y$������X����<|U���W&���N���6�/5�jU4k�,�vXn������������|�CZ���(��?>?�����;T3�)�J���-Z��k�U~�9�&O��rn�}�_��`-n��7�����<��1bD���oe�-�HQR�������������}jjj�����+_�J���q����������3*��>�:Y�M�`Y��v����?�%�\����79���2w��z;o�����/�"[m�UJ�R�������{��������u��i��]�6]'�������	X��$O�\9���I�m��`]�N�2M�6-7�tS
�G}�������*�����*�x�������j��?[�<��u�k�����?��A���;����sS��m�T*U-W������l��j9�������o������&=�`�R����{.�
�����L�81I*����HQi��E;���x��
�o��Q
z��R�T�,��A��y��4I�:�zy�%U)�z���r���g��A6lX���������g��x��9��#��]�j��:������$sg��3{��b���x��>�&��p���OV��?$��Eu��k�k�������2h���{�����]n�U�=r�	'��N��[o�P�i��yi��y��{�=������}X��z<���I�����������r?�U�f�'V;�����|��4(���3}��$�(�ZTz��M�|�S���'���}��w�U��{���o�6�lS'�����;��N~���f�bM�4~c�I�8���X��tX��K�S�;���������_�Q�F%�,�ZT|�$�����'��O}�Si��U}�Yc�?�|>����+�����V{�=:G}t���J�:J��`������,�W�$4�v]�=N�v
�uK�`]t�E����K����6�l�O<1�|��r���Pgf����N:)��{o~��_�QQ������~���6mZ=$`]�����o$�T�o�o��k����}/������_�b�v��)�-�%[����X�$��z+�Z\Qi��}�:���x���k����:��������O<�o�1;���*=;g��|��_��W_].K��-[�gd�_I���d������M� �Y������e���q�~G���
�X?����55��G?�o�1&L�o~�������_�jEq��/��=��3���/W���#��n�U�_E�>}���'����T���'�|-�;�r~�}������W�����K/�4c���]w��#�<2m�Q}U�.��������o\.��;wn����������S���o�����n1bDE��i���'�|2�{�n��A�3&��W��S+�{��|���I�j��uC�`�u�Y���k}m��>��������~��WQf����5;��sy����w�}7���g��/|!�g�.��k�.7�tS~����E��x
��������z�r~�&��A�t����uE�jX_l������2p��\|����1c��o�������o�w�q=ztEQ�{��o�1=z����AQ$��O��=�>��iX��#���+�6�!9�GI����X����&L�~�r�q���7�H�T�����}/IRE�3����r���I�&��4E��|,y|P���N����mr��I�V�N�Xk�o��y���r��'���GJ�R��j�u���s�u�����r�u��/����>�����Y���e�t��%�����N;e��6Z������Gy$/��R�L������[�n�c�=��V[��[$���Z�x���7.���K������f���N�uW���	�[X��r��u��W���5����O]�l��n�]�s��>j���s�f��ay���3u����;w��8���!�����S���/g����?~J�R����T*�W�������>}z~��_�w��]F���u��7�����O����W����O�4)������9s�k>���{��^>��O�v���~��������3�,�~�6mr�I'����O�N������N�X����%O\�L[�4��N[%��<i���I`�R*��u��Y����r�����g����j����:J�f.\��~�������F��(��i�80��sN��������SO�[o����t��%&LX��C��g>����������N�UW]�����r���"�SN9%��Wi���n�[n�%����j��4�w������o_6,}���b"h�j$�?��{>��W�4�OQ$#K����r�vNv�D��u��b��l�ls@��E���R�6)f�,�{>�hZ��g���6�/M�+�"���;�����I����UQ*�REJ�R]�[mc���1��G}���(�l��V�;wn���R������n����\w�u���KUs�.����u�YK�h��E6�|�t��)�g���o���eO�{������},�g������Cz���)S�d���j�
��3r�-�����������w�Q1��I�t��=������#3m����I�&���h�������^�;������L��=��N��l�:n��~\����&���`��������?s����7�X���T*�?KZ����kZ�U�����|��\����#����>���>�rH��{��7;��S����j������:_���+~?������G�N���^{-�?�x���g��I?~|����|�S�J���W���)Sr�QGUE���#��~{�y��<��39rdF���O?���[o�5�_~�*����^�TQ�g��1c����_���>�w�y'��zk�w�^^3k��y��%R�;������K�������'�W~U
�n�|�������Q~�2,���`]U*��Y��7�L���3m��r��[o��|�3���WN?��r��7���l���y��w2|�����7n\��v�m����i��I���O����5���u�Y���+*��Z�l����g9���*�_~��9��s2��$��w�����_�z.����{l(^}������3gN��Y�f����c�9f���2eJ:v���5���wr�%����z��C=��7�|������s�-���o��#G�����'�W�^�>}zy��K.�����e�?~|��w��5�<w�y�e���+<���S}>|x��~��x��a���O�*f����U�,�����w'�����R�4��wH�8!���~#*���M��3����=��{�Q�Dlh�����
����o���.+�X�r�)���+���{5�555�{��sO���_~�(��q���7���_=�R)p@n����k��>�.�������:*�=�\E��v�m��o�y�_���~:G}t^{���3�R)���[n�������A�����������<�������|����4iR��j���1�<w���f���}�(����7<�@y�;��N.����u��g��?�qy����g�������2x��x���q��m3r��l��&�;�7X����$/����g2�?�N���|�d��U;E���U��^�;)�b�`Pm�\VQ���S�N��$�}������V�YQ�"3g�����{��7�R)����=��S�qW�]�v�9sfE��g?�����H��-W���3r�g��n(?�$����o��y��
�
Uu�w���+�?������o��3~��_��_�ry��������_�sC��(����k�x���?-\�0]�v��I�*�����J����������������~���;�7X���s�WL^�W2�����v"�F��I��$;�l���i`���j[�����4l��L�2�\����|g��i��u������}�KQ2dH~����e���1cF��M�6�������w+-�Z�������W_��-[�T*�T*e��i9��c�3�:��+�����u~�w�Q1>��SV��~���W����	&���[��Gy��(j���J��}W��%3�~��+\��	�
���d�S�?/N~�������)�Z�m�c���%��=���W������/����6����������-[��~��y��)�"�^zi�8��:��*���.����n�)[o��j?��'g����QGU��i������_���;����l�j��y��*�>������R)x`�������������^�\�]wU�:���J�U:����:43g�L����Z��	`}������$3'W;���X�,\P������>���	�W��z)��<����S*���W�4o�|�5�����={��}��H�V�2k���5*/��Bv�a��
�_��W���8��5[�=��v�<����������7u�n��������_�~u~����3����W�^����*?��>�T�E=��s�]������{���|����g��5*I2o���1"����Rk�;����!y�W�N�85m�ls@���d�>�b?z�:�YK�>��z)��>}z��c���\��u���1#�R)����
��h����g��1"�{�=
U�u�w���D����F�W��U<���v�iu�����'�����N��g�}6�^{m�����3&s��M�����6�����1��-��b�g�������{�V�%�/�_]���,j�~�*�j����)���_'O�P�$�K�&���{�W��/i�����j�����[�������5m����3�$c��]��m��)_O�0a-���*�Z�G�]w����]�,Y���V[e����W��k��f���G�����s��������W���80��5[�/��r�x�-�\��K�=zt����-ZT���=;c������������N����=?J����I�M��^���%m:U;
�.���M7��|����.sM������o&I������hm�����e�����{�#��W_}�b\SS����?�>��J��={v.���<������[��m�e��8qb��[�n���K�.i��i,X�$Y�pa&O��-���b��o���(��f���s���u��{.�}y�������$;/y�����sZ�k�����k�!i���)�uM�`m��vI��(2v��,\�0555kv�i�<���)�"C������������;vlJ�R�d�M6������f���s_�����W�R)������},��u���3���������o�Q~��{��I'�����/�<g�����[�V�R���-[Vd]r�e��j����qU-�mY�,k�1����8qb&M��Z�,Y�������vv�����&���N��Xur4F�R���w�l��F�;wn�����_~�\��H�~�r��W&I&M��_���9��3���(�|���,_�J������{����������|0/��b�y��L�6-EQ�����^{�U�|��E_��=��3I�+0������~�U�?������~7��~zn���������A���NX��%�Z�h��Y��,jM�Y��u}���N��W��UX'{������|=�<�r�i���&[�[�\�U�`m��F�k��2t��$�=���T�����m�f�������g���OO����$/��R���o���{J�R��H��]��n��G���2eJ.���\s�5K�,*��={�2�=�����?�9I��{��9r����!5i�$w�uW��c�e�o��M��������������?��r����T*U��3gN��y����u��6�/�����i������[� �?g���{�NHn;;��V��Fm���l�cur�JE�����$9��C�Xw�qG���/W�o��e������s�I�T��y�r�9���s����n�y��e��)���
��>������W��z��Gr�1�d��q)��/K�1��7����|��I�1c�d���0`@�d]�h�b����z�r���������l��6Y�pa����_������}����y���v��s��p��<�!�j�w�o������aw%sgT;
����|����V�N�8�[���G�R���(2t������K�9�����_�r�UQ�����	��;�,U4���|�"����SO���p��W1_*���S�r����>�]v��<���[�<���M�6��?���V�����*x`�������s��Y���`���+��!�i����V����6l�>��~{��

��a�u'%O���j]�q����(��OM�k�-��"�=�\����$������7m����+����3h��������(REjjj���>�_~y}�]�3f��C��Y��%]{��g�9��0 �Z�JMMM9��|�S��3�<��(r��w7@��i��e�4i�����\��m��~p��8��*�NO=��Rk�,\�9s�j�,�b���f��U.n[UKf[����N��s�����s���������$O�1)V;
���mr��I���Nk`5~V���
��d�vX��-Z��k��W����|��y�����[o�(�t��5{��w�;��|�����u���f��	�R�3�<3�_~yjjjV{�<0��{n�d��Q�0aB�v�Z�y�%�;w��o�Y��}�[������'N\��7n�je|����`������f�em�:u*�%����3q��t��e��?~|�xyO�������Z����I�V;	Kz���G��4oU�$�_�`���v�);��S�c,����m����������{����i��Ijkk�$#F�h�X�m�]EV�v�V��%�O�2e�5K�d�3f��Xr}�=��E����l�2��w����+�]���%��v�m���1��,�M��1y�wI����o�'���U���F��E�b�~����`���y��L�81IR*�r����~m�Q�u�V.9r�Zg\����;C�)�����Z���3�b������K.�1b��x��W����/�1bDv�m�:?�1�l���O�������W�4����n��w
��jX�-^<��c����^k�g�����M[���e���K�����Z����-��&�,��O�>i��Yy<j�������|��?\1�y����v�{�<��*����of��Q�q�f���w�e�m���W�O�����N[%���d��_�aQ���
�J�Rz��Q'{�h��|=w��:�s]u�!������F��w�yg�����+����Z��m�����s��s�*�_E������O|��]����b|����(�U:��������/m��Y����N�������%�g/q���z�{�W���J4�*X+P[[[�n��I��9e���u��d�uU�����>�T��z������r�m�U����w�k=�����W_�Jg�w�}9rdy��K�����]���{�S�N�������C���YKf��'?������`C��_�^�+��o�����/$M7�N6�6X+��s�$IQy����z�y��e�������C�����^1���K3w���>w�UWe��	�q�v�r��/s��G���[��<�@���������+�N>����,�5559���*���(Vx���������m����G��g�;���(�����|�{�?������N
��%
�V`�-�(_�7.'N\��~�����>}���~��c�9&;��Cy����'��~z.\��g��|�[����������/s}�����/}�b��SO�o���3.���<���q�����o~s���$g�}v��iS������~����������Z1���|e��g���`CP��N�j�{��|���y����X+��>�d��6J�TJ����\��~��_��;w����{��~�����\~����a��������~�b��i�r�e�����3��������|g��|�[�J��]���#Gf����_���EQ�7n\�8���{����{���x��W�>�:uZ*�9���/|��T.��������;�F�*�o���9���VzNc}'h��&��$y�������d��'���l�J��M:,�c�X���&y��j����d�M*��������������}����v�a���>�������������G������|��]��[���93���Z���Wq�M6�}���v�a�g<��9���3g����:�W�^�:uj�����������'s�m�U�t������O~2���*��4i�=z�}��9rd�N�Zq�e�����{��>���9����������������
K�>}���
I����'/�����_K>����4~/�n�b�����������W1���}���P������$)�J�4iR=���J�V���G�;��$IQi��i�>�����N;������i��Y���	��SO��_\����@}��U*�J����?w�uW6�x����S���g����#�*�:��cs�M7�rQT�^������}������y�������.�{d�M6������.�j�������_�]���T�|�\�W�,M�`]��>�����tn����J�<��c�~��3p��u�Qi���2�������?�_�����[�%E�R)_�����g�|�u��g���:(\pAn�����?��z����~��9��3��y��:���1bD�?����X[��>������n�8���~�$i��E���?����t��������[����[��O�������;��Y���hX���nHF�+�5��i����yK��OM�������F"`�Q�Nk�T�D�2�f������g�y&�R)EQ�T*�i��y�������'y���w��)�"�G�.-Z_E����{��'555�|��{��w��#���W^��i���M�t��%���K>�����g��#�<�_|1S�NM�����[d�=������:9c�W_}5�?�x���y���C��n����>��E�uvNc|��2|��l������a���O�*&X7L{#������N��h�Q��$=��v��{�U��g��=<-w�������M���U4i��u�Q:th��jY��W*���W����},7�pC��k� �aC�`i/
N��q2of��l8��N�q�m�j'6
�����}���P����n�����K.I�����R����\�^�U���s�%���;�T~������0��|�W
�M����+����?������>)�J9�����/9�
�����<���y��w�Z��e����>��G>�SO=U�� &���uA�����u����d�6
��k�,�t��Y�j'����5��e��~��9����$o��V&O���S��U�V���S�v���M}y��Q��I�"������'�J��j�lK��T�t��.]�T;T��'��,�[�$����1O/=��er�YI��4|&���z��32}���m�6m���v`
����o�'��j'aq]>�20����I*5h����s�
7���c�=��c�����|�I�&���{��s�p�9��c�^�u����O8�����s��9rd���������[�h�N�L���_�k>tt���I�f�N��RQE}2k��|�����~����93I��cK�R��M�69���r�E�e���s�jjj�y���������<xp:���~��kg����~����a���O�>UL���$7})�7��IX�e����&���v��K�Z��=�<���i��nUL��fmz_��W�E���|�3��k��V.�*�J���)�"��O���_�;��37�|sv�i�����,+�[������������z��t��:�6t�L����X�$+V�X/��r<��L�<9�{�WEQ�����m�M6�$�[����33y��L�>��������J:��<����f�m�3�2)��J��&�z2sr����K>����IUb����������C=4�'ON�T*�Y�������+��k�e��iy�����/���_��i���k������^{���(������9��C�`����\�.\X�����/=��������L[9��N��.P~���[�W\�W^y�\|��m��x��y��Gr����W�^�|�W�^9��S������oN�v���������+�����n��i����[W1	������%^����Ur�%I������K�`��W�*�_�j�*C���G�Z{|����}����-[��Z���~���u�N���V_Q$��(�h�|���?IZ��N.�?�R���+���W_M��J�80��������;��.HQI��^{-���J�em(<�@~����T*�T*e����v$X-]��G�\����.{�h`��9|X5��M�}��$IQi��yN9������SO��������'I�{��l��6k�s���������:+;v\�}����Y�2j��������R���>x�����HF�3�TR���i���6Y0w9�y���XX��,S������6O�q�I��$`=V/X'NL��J����+:tX��:t�����*/��r�����Z����R�����[o�������b�������s�=����`u�+����NAcU�I�0�b�j'`}TS���1�|��]�:��m�����3g���
�T*�����H�N�r��7�}��UN4v��_�4f~3y���NT�������i}l��S�$�>�?�N�|��7���l�I�����(�d��J�RZ�n��7�8}����?���p�	������XeS�V;�Q�&������v�g�R��������|��6,�o���7|�������.\��������r{�=����uz6@}�]�L{�rn�C�VU�{�K5I��V�i��4�nFV�]���>`�W/X���O�6m����$�\�[n�e�������M�6������WKQ�,����7���rn�3����`q5��i�����~��(�E��n�-^x��u���/�KJ�RJ�R����k�p�i���s�d���O���j
`�0el��e�W���i}m|�������K�TJQ8p`�y�����?��[o���_��|���w�Q��T*��������4t��=�.LW9���:9���
����w�q�����Vw�yg����e�}�M������;�S�Ni��uf�����'������!C��C�(�r�U�T�q�������"4S�V�7��:9���
��������o�����T*%I.\�|0>��
�]���(�t�A�����3.@��dV�n���,5��y�f�r�]w�k_�Z���Z-�^�'I���T*������w���M�����X�������,��(��y����?�1���.�,��zk�����g��H�����O:_�����}��c�����<���y��g2v��L�6-�g�.w��R�������R��s��+�`��z/�Zd�]w�
7��i����G���?���Gg��)�1cF��i��;�G��s�=���{�}��
o�f����/�8����3q���?�EQ(����qK�u���s,O�`-��}�|�#�G>���>z�=���9��C3n��EQ�/�JUL�lK`���4oU�,���X��1c������o������E%X��a�+�S9��eurP���;�1X+q��g����N�TJ�^��{����:*;��s:w����[W9%��LW9���:9�G�
L�:5��rKJ�R��H���s�5���c��v4���2�r�q���X��jX�������M��J�\r�%���u��q�cX�R��	`�5]�����\���Wi]]Y�y�a�������(��E��q�
r.���;3��N��,`]��X={�Li���R���t]]Y�y���w�-���6��e��
r.���:�r\�I�o^�,���X�EQ���E:t(_�h��zAV�;K`���4m^�,�SS�������|���oV1	���:�r�a���X������'�X���e{��w6�x����;?~|F��^�zU;�rMY���,`��X�^{m��[�5m�4_��Wr���'I~����g?�YuC���1������`Ej�`]w��gg��vJQ������_���LE�L[9�q��dXX+��y��u�]��>��������/~�����V;@�����3*�`����P�y��w�qI�R���^{m��|���$?��s�Yg���_�W���\z��9��#�����s��i���j������u>�E����4M�u�N�iTX�g���Q���W�U���[�W�TJQ7n\~��_����R),���I�)c+��7�`]�[��(�r���XEQT+@�%�:nY�+�k,*�Rv���*��V�4?�zL�J������J���w��:9VF�J(��E�LU��'j���7sr2v�\�n��@��J�N�L@#0eL���FI�M��`e`4S�U�;tKJ~rXG�6@#0el�������*�V;��l��9y��'3f��L�2%��OO��m��c����#���kZ�hQ���`���q�n���*`���s���n��W^���~:����]��i��������>�c�9&��7o����d���q�-��`U�T;���_��W��z��z��y��'�`��E��������c�����l��z��s�=�~�ZX�L_9��[u��
X����.��>�����)�"IR*�V����EQd�����G>��/������o%��+�6�^�,��i��~��_����ORYj��e������i����S��n�:3g���o����>O=�Tf��]��y���M6�$g�qF��h\���7o���P�(�D�J�3&g�uVE�U��]s���c�I��m����3r�
7d���y��7S*�RE�����c�X�w�W�ko���q�-���(�:����u��w^���[���?/��R>������*I��i��}�sy���r�A�(��J���;7\pA='6K`u�N�U�k,X��n�-�R)EQ�O�>��?��v����>m�������l���I��(r�������>b��
���N�U�ky��L�>=EQ�T*��?�i�5k�F{5k�,?��OSE�d���y��G�2.���:�r�X�)�Z��#G��;t��<p��;����c�����__��j�'����S��a(���`�)�Z��'&IJ�Rz���R��V��J�����<�4i�Z�0���XX9��[u�����P�:v��8���k��I�z���u�gmmm���F��v�������h[�(���
�>��������oe�m�]��^|��\z��I�R�����z��v�e��w�}k|��:w��$)�"�G�������Y�5�o���5j�R���)�*���N��T*U;��z+����_���q��VXo��F�~�+��k�l�M�z�����;s�G��~w�yg�O���������cX����>7/�b��oev�}�l��&)�J)�"g�uV�}��5���w��7���r���o��w��.����*��U'�����EeO��R����:*EQ�T*e������_���Z����0`@F�U���c�Y��>@��3�r�q���X�Z�UWjkk��M�4i���?���m�6�{�X�>�l��v����9r�
�5jT.���l���y��g��Wm���y��W����m��d�������`u4�v�U��;�����i��go�������r����(��J���93�������?=z���;��N�:�u���9sf&O����>�G�N��sEQ�I�&���~�N�:5�{���qK�uT�����Gy$IR*���K�?��#���i���/}),(�Y%��Q��EW�[t?Iy}�f�r�W����t�e�)K`��4i��:YVGM�����33h����w�K�TJ�����U�r�i���GM�>}��V�R��kI��+�";��c{���z��
�h����w��:9VW��yx���Z�u�w\Z�h���E�Y�fe���)���p��CY��ua�]v������}������������Z��.]��������<����
��U'��Z��Q�F�T*����h~��	ksL�����:Gy�Z�U>�����p�d���=zt�L��3f�M�6���cz���=zT9)��-U��eur���*�Z�T*-5�x)�����E{E�|���_��-Z�Y�z��
����*�`���*�����r��F�]���s��*����I�������O�>���?����i�����e2g��<��#y���2e��4o�<��u�{������N�z�����Od��q�7o^:v��m��6{��w��5�w���?7�t2cr��@��pA2kJ�\GX�zb�
�F���{555��?��������E#v�1���o������
-��I�2p���������3���C�P�����������-����s�E��g�Y��6m����N�����N�:��9����0�~2��%����N�RM�a�j��AE���Y��5W��2+q��w.U~������{��+�XnQT�<���9���r��'f��y�}���ss�q����_nQT���1#���/��w�<���}N�8�	��o�����$�|M�4�v]�&���`�4���O<��������}�����SO=�<������>���>=�P�;��$I�T����t����r���M�����u��C=��}�c�={v�|���W�L�2%c��Mmmm���A�2c���r�-)�J�t���s�QG��;���o��I�w�����g����6mZ���I����~4��{o��k�
��h��=����d��N��{T;�����k�����nP���o2t���J�t��={�������{���^��q��$����r��a���7����?>I��u���9s���2eJ�:�����=z��?�y=��r��q����?���o��n���\~�������Jg]z��KE�q�����W.z[�pa����|��_��1c�$�f���G�a���}���;�����<|U��MI���o�#��M���
B�&��m��i�N@�����`}P*�b�Zd����*�F�J�T�����/�p����w����I�m��6#F�������C����)�"555���o}�[��=z���Q�Vi��|�;���K��^�z���*�7-�?�A�=����}��9rd:v���s&O��^�ze�����K.�$������~����w�}+��������7�w�o�����o_6,}���b"�
��#�^��3z�{M[$|!����Jz�;/6k�,XP�z����y��`��6�/�}����zE��a��V�q����_~9o���Z����={vN=��,�^;��3��n���^�&M�/~�������j�EQIr�9�d���/��M�����'+=��?�qEQ�������>{����b���w�������3y�����	������%�\���=�&�������19����G(�*��
6�|��E����M�;��SZ�hQ����^���W������k�%I�w�����k���7��3f�������gJ�R�?����k���\��,.���^[1w��T*���d���+��O���o�y��4�w`���C�
g$]�<z��?��#)j+�m�<9�����H:v�N~`����|��������������S3w����������dK=�����T*�G���Y���&M��g��y����$#G�\����'�|2?�����+��"m��Y��������)���J����/�z�*�L�0!�=�X��k�e���G2i���x���J��}W��SN9%>�`y|��������r�7�w`�2gzr��K[��.�&=7��W���)�?~|~��_����}&N����5T�����������=���w���=�����)����������|&����x�3f�������?�J��J�x�������s����[u�]wU�:���J�U:����:43g�L����Z��	���C�MfN^�gj�${���~\�����f`}S��V������/~13f�HQ�]��xgykJ�R��X������U��u]�U-^���I�:�s}q�%���^H�t��!����V�
><���/�{����]�������OEY�s�=���K��{��W���7�<={���Q��$�����#��n�-��1���7�%��Q9�q��S��?��K��c��[�g2�1���?����g?������EQ,U|���
a�M7-�?~���.�Z�pa��[w��i�3�/F���/��<���~�Z�N����/V�{���Z�/�~�����EeQ��[VYTc|'���{.M����v���&�7�Z,�����^{-g�qF�4�(����~�����g����G>R.���O~����>���N��!C���GM�^V������0m��������G����������f���^��{��L�>�<����Z�[_,\�0��rJ����$�o��r�i����/��r�x�-�\���\?z����3'-Z����={v��S�g-�}y����X<}S��k�s{V�P�����?�a���[_x����w����;��s���__t�Ey�����/|!�=�X^|��|�����w���7���"/e�=�H�V�2{��$�e�]�VX�]vY��y���g�}�:���������c�%y������r����8qb�xu��t���M�f��I�+��<yr��b��uo��v���U�f���s��:k�=�������N����<zM����Kv9�:y���^
�jkks��7�K�>����_-��;���z('�|r��������9��C��O�Y�f�{)��5K�������-Ir�m����o��G��wpo����z����I��}��e�:��.9rd���9���m���N��1cF��u����|�TJ��-3}�������V�Z�v�����u����;���'f��I������Zg�lh�"��'����M�����4���v�����"�y����93�{�<���7�h����\{��1bD�~�����������,���)���P"	�^D�t�(+X���H��Rl���l��V��Q)
���@AX�HBo!!��RI23������^f�Lf������}�����%�WHf��H.���|�+_i������|%��_R*�REF��y��������q����3��Ly�R����PM��zj�ka�m��W����{��������c]�����U���g��gZ���/��o~���`���<_���M6��:y����56}�����]�v�����K�,Y�k555����%I���O��E�2A���{���~�����E���SN��#r���g��+�o�������:(��zj-Z�VH�R)GqD8��6{�j����s���&Y���^zi�t��b�����u��k����V���<�-�	�������?���90�����`-����@K�k�Mg���di��[l����{�J�R�z�2�e����M���3g��L�>=<�@��c��
�
��������g��I)�J)�"�����q�RSS�m��&�N��=3o��L�>=O<�D�����\�UEv�q��=���W��i�r�Yg������������


�����o��l��<�-�j�g�}��%��Y�s#>�t�Y�8@'�*X���/_���g�kz����s��T*e��������6��
���>�$�0aB�`���37�|s>�������/�wE����L�4)�=�Xy}����R�T.�z�{�����.�z�j�����O��������.h�3z����������W�g[���g��3��3�<3Gu�Z����O���p�e�^��<|C���}���J�i���<-Z�h�kz����s�&I^|�������P��>}�z&\{C������|����~��r���eXo�����(��W�|�s��7�������/y�r�������/�����o��-~���Ko/^[EQ�SY��R�
�Wf�lkZ���i]<8�n��X^Scr�2�s[�-9���Z|[)����`�*mLo�q����__�����g���I�|p�{N�<�|�6%=-���>���ws�9����.�������{�YaIQ��=���{����'?������
������._~��9���[��e��L��V����+ill,�kjj2p����
80�R)EQ$I�,Y����g��6Z����Z����:�3�������9����u5����g+��99�������V)��~���$EQd���Y�dI���+����.���;SE����{��+������+��R.�ZQ�O[���_�>���}��ijj��/��Y�fe������W�����7�8���U�Y-�g�._�t�M�TX��/,w�C=�]w��<�f�m*^{I��Xv��a�������n��e���y��*�]���e��v�mW��#>��4-I��b��3�NBK�u���V;�Y�����l�Mz���$ijj����[����/IR*�2g��|���]�^�-��>��$K�����~wk�^'���2dHv�i����>�i��2d��N[~���-\�4i�Z���c��r�j���	�x������T������U�b`y�R�UWW�����<�����[s�a�e���I�[}�;���g��G}4�/��y�����-���_�����J�$������.��Fl60;��C�������>��M[����������������v��w��9��M���?_���g���_����L@��dar���������d�����LZ��y��_�%��?��$����s���V\W�o��9��SR*�RE.���\r�%���(�^*��������r��7f��%ku��?���:�<�h�������b�V[mU1���W8���v�m��[n�%'�p�j�+�"��zk���>��������|���/�o�����������o�x������
�v�g:�\�,�U9��G��n����)����I�>��I����
��>��|���MSSS�����w�}�s�=+��|��;vl����r�NQk�^�s�i����xkE��x��k}O]]��bCCC�������#�8��,���/_����o�=�=�\y��Fe���Z��}��'�����$y��g3v���1b�g]~���#�<r��;�3�s�������=�!_�N6\5����2c�����;���u�G���������������X={��\�_����
����=z�������1cVyOQ��7�Y1w�I'��f��s�����'�X1��o~s�_�ow�m���;�,�{�����>z��t�g:���,�W9���������
���o��0`@�����)�J9�����s���K.�I'��~����>��N:)���/��s�����j��l���|�3s������K/����~��7n\y��O��}���=��s�M��=��;��#����W�~������>U1���}.\�9���
��W�\[9��!�F��N6l�Z��6�SN9%�_~y�������n���_��O>9����v<��s�9'o�qy��s�e�}������EQ��2eJN?��|�k_���k_��}�
80_��W+�������3��(�jnn�
7��}��'�?�|y~�M7�����N�L����_'����j�}?����*���m:P%c����#��a��U-���q�����?o��F�|��}��[d����<yr���*^?��#s����T*��9���9��#�����b���6��
K�>}��s�e����w��-��rK��w�N�L�i����q���	&d�v�b"�8fOM��4���w�P��s��	H��K����[���]v�b":���}�i�P��8���t�M����������C����[�(j���������(*Ijjjr�����c���ojj���>��zh�������ZEu�g6Lw�we�Um�d�����
_�`|�����zh����?�Q���Ci��t4|p&M��3�8#��w_��w��]�������*]�v]�s����.�]w]v�u������G�<��L�4)t�Z��t�g6,3�I����]?��\�<��E��:+E������&�R)Ir�-����^��n���z��I�R�������Ag�p���}��y���2{��t��%C��^{������E�z���s���f���Y�xq�������.���oZ����L-i����q���	&d�v�b"�n�J���o��tON�&���j��z��6in.��?>
��R�Dt6���R�Z���(�r	��n����C�!���gm��V-^@�"������	��WI��c�_��jZss�W�a*����V�u���~lU�k����i������X�����b�^x y��s{�t�^�<t,D���3��={��b�DQ$��$�����u��K*��'�|�*Q��6��1c�$IJ�R�R�4��3On�i��K�NBK���I]�j���h��R����,\�0�=�\�����=���.�����h�g&c~�<9��Ihi��&;V�t$�U�U[[�����H�����]�c���J�|�#Y��hYE�L�)��g��y�NCk��SIM���.��z�3���T-�nEJ�RJ�R���n���#�<r��j	3g�������z(�'O��9s�p���~�R���n���R���^Ln�A��?V���fqha
��w}4y��j'��Y��az���������+��2����v��<��s9��s��?�9K�,Y����H��;9�
WSc����{�H/�zC���K�?,�m�������Xi��w�Q~m��vJ�~��x�������#����;��C=4�����D]/�_}>��O��7�(r)�:��$�����Wd�C��M�������z`�;v������������^��������1�����$K����(at&�g&�~.Y8{��zo���K�{�y,`�^X�SEJ�Rk���<��466����t��Q�F��#��N;���[�n��	�&������J5���5��SI��U�l`Z�����/_>���iU�>�h}��r����Cs��7g�m��v4�67kr���+�n�������U'�aj��
�����$)�"�R)�_~��+�����I�����K���^���	�S+�j'�uVS����������!�R�4���c���W��v��+`��U;������{��7���j����]w�5��J��]�&IJ�R�Z��V���*�z%{|�:y�
_�`-Z�(S�N-�7�x�t��}���x���u�Y�����d���|MMM�8�����?��!CZ+�

>�|=o��6=��x����T��y��,��R��	`�����?������[g����v�m��^{m�ks������.����SE����)7�pCv�}�<��3�w���o�����(�<��sY�pa��PmEs2����^��w}�:y����
����?�K��8��2d�k���o����J���i�-�J)�"���J�<��455�V��0 ��G�$�-�u�]�fg�����x�rn�������t�R��h��<���)�J)�J9��#W����_���r�UQ�o��r������ON�����X�=�X.������R������W�$�W������+mz>@�4.N�����[$�V�<@��*X'N����SE�d��+]{�u�e���I�R�����7n\��������ez��l��F���_���+��5l����o�������Ky�{���{�M3T�#7&s�U��ZRS[�<@��*X�>�l��o��2d�J����L�E�M7�4��~���o�y��?��\���#�d��i����?���|��<xp&N���v�-'�xb���?g���Y�xq��hm��'���rn�����V'���J��U�R)�n��J�566��;�L�TJ�T���#S[��[�}������o���s������v�m�E���+���?��:4��uKmm�Z}�����3��~�,�]9w�I�T�8@�*X���/_���k�����y���(�$�?������W6�|������o��k����}���w���O�TJQ������<����-�K��\�<@��*Xo/wZ�d�J��u�]�������=�Y���������	��9�������:uj��J�R�cm��z����J�,|k\�I�;�jq���56���w��EX/���J��~��I��B��������J�655���^���~��_��/L�VyUQ������o��{��m�Z�����'�O�v���)y�O�s;| 8�:y���U
����w���M��3fd��Ak.\�[o��\*u���r��^{�|��g�L�rMMM��W��di�UQ�a�r�y����O�=�$���9��+��������K��'���hjZc�w��]I�*���o~�������Y�`A��H��1b��-Y�$S�L)�em��&��zyw�yg^~����tP����}�����P��]�+��MzoT�@G�*XC���;��$)�"��~��W~��������r�T���s�A�t�	&d����������5b/��GM���_|q��lh+�����U;�Q������v
V��?������3������R��y��e���v�mS__�I�&���)EQ�T*���ON]����r�-���]�f���o�����_��|����w��M���4�o�k/V�m���K����}�90���I���NtD�V�u�)�d�������S*�RE{�����R)I��&���_��*��������������o��6�x����
j�3�-5.N���+�6�&���~�������T*�/�K��o�EQ1�$EQd��6��7���}��t������(�w����V��:�|=k��6;��#7&s�W��w��+� �~6 u��y��}3n��\{���������Of����t�Ms������OO�~�V���^�$��#�<�5#W��������5+�>�lf���A�������,L�]9��]�a{T%�H�`������QG�N�^t�E���^�����b�V}}}N8�����?NQ����s�y�������q]������N������jX�^�z�O�>���v���g��a)�"����r�]w�yhio�I���rn���!;W'�K�/�Z��v[jkkS[[������O�>����3l��,\�0����_�2EQ���P
�.Y4�rn�S�����eZ����.�7n\���/��g����>��~z�����#�H���wg��AihhX��8���
kb����k+��yp��;������`���:(�R�<.�J)�"/��B~�������R)���-������7��j�}?U�<t>
��PQ�"��bEQ�H�����<rc����%��V'���5�f���+6t����i�[���d�OV-����8����Z�����������I����NL�j(�������hzk\���u|���y)��E��Pr�o�OW;	+3f�x�������M�e�k�?O&���IX]{&{W�tV
�X'Es����;/N��[�4����KzW;��,�����[/L�M�v���;%�>��)��`��/H��,y���h^��.=��OJm���X3
��A['5��N@g���y9���d�k�XT$O��������9$9����[%"�Q*��������m���+�Jilll�����������b�������/%�������K�jEQ����K�����K����#���-���`��R��VEX�Ri������f��d�_�����L�b��-�	��`����B��Y�`Af�����>�[�X�m�Y����IsSr�+���%�����u]Z~5l�d-��
�L�j�;v���9sf~�����.��/�������_�zN9�����&�%y�����OJ�Y�<@�QS�����O:�>�h����e��E9�����������Nn�����T����vTu����6��w�����v�m��(��/|!<�@�c���/M��S9w������:Xm�{�������$Isss�>��*':��O�S��;G$�v�N����v������f��Q���R�~x�u���f��qy��2l��j�:��9��$�[su
����Z$��PX�m�]����j�X��]�f�-���I��$w�}�,�MM�k2mR��{F%�7�N�s��v���G���_|��I��f�����+��m��~lu����6��K/��K�R���]�L���;�Im}U�����vX/u��qmmm����O����'��
�����}��7�~x���Z����S����X�D@g����#7V�mu@�����tn�V���m�����9sff�����{.c����^��6�(���gr�����"�7�x#�����,��)�Jy���U�T�T���tLE�����h~k��k2����tn�V��$�R�\�U*�V���B�U���=�>���/�������_����>�x�;Z y����[r������.��:4���k����57&�\�L���k:���Ozo\���U��>�7�V�u�����y��L�2�����.�o�y�����]�f��9�6mZ^}��$o]�J����>�����y�2k�����inn.�^E|��~�������^�z��s|���\��.\�W^y%�<�H^{��r�������o�XFXW��.���j������~\�S�Y�`�;6I���~7�����R������x����'>�=��3]�v]���S���o�%�\�G}4I2w��\w�u�j����1c������2f��r���	��/9?���[�9~��_�������_o���SN������`}������NA5��|R���o������K_�R�������1�m�]y��\r�%���WX~�$C���g���z(���w�$�>�h��o�<���I�^�z��#�������.�(�R�\�u���g��)��Xk�����(��[�\x��������
���hNn� iZ\�$�����=���{W;	������������(I2t���y�������_SS�/�������g�������c��<P.�J��N;-��O�����$Y�dI���?�s��\�=KQ�|��A���n����`>������-����7%S�W����d����6��OR���)Z���_�z��T*��/\��������_����0aB���?�������5��sN~��_d���I��c��X�s�=����J�444�w��ihhh��R�����y�\�M�NW�@�h��I�&e��	I�=z��#�\��J�R�=��r���W_�\V��]s��G��K/-��R�
�b{@{0����y�s����
��S��>��I��Wm������_����v���^��{�Y��9s�z��S����V�m��d����N�U
��M�V�����z���K�$IQy���W�f��A��9s������,����a�\���A�V�8tb�R�UWW�dia�����{���Q__��3��
����yq2�����M���J:�V)��t�M�����j���������s�z�M6Y��Y�f������^�@G3����*�6�3��������k�M��c�$I�TJ��{�������i��o�=7�|sy�=��s��&M�T>s��a�t��(�<���y��G3e����=;]�vM�~����[g�=�HCCC��9w���u�]y��'3g��t��-��
�>��SQ��&N��|0��MKSSS�w�1{��W��Z�f������(���������g'���hS��b��V[e�]w��?��(2n���x��������8�����QG�R���(R*�r�1��p�]w�U��n�������O~���z�R���/��U�n/^{���p�
�����1c���W_]�����~�����?�<p��}�����o|#�\sM/^����R)x`���o��X�s���W\����y��'W�f��9��3��/9=z�X��:�3m��+�Y/T��wj�g���Z@QT;��RQ���jo���|��(��f�m��o}+GqD�t���{�z�����?�E]�%K�������g�}r��w.�~��i�l�����\z��9���[�9jjj����7=���Zt������t.����5��	'������J������k��&'�tR,X����R)��sN�����������s��G��[nY������������kuN�1��5L�81;��cy<a��v�
���?3y������N��47.-�jn|kn����.Njj��X?Ess���G��'����W)�������V�����9��3��_��\�������c�I�=��n�e���K�>}��K���7//��Rz��<���I�*�*�"���_���.���477'YZXu�a���c��e��Z�L�����{WX~U[[�M6�$m�Q�,Y�^x!���z����G����m����={����^{m�;������
��6�,��O���S��'EQ����~-Z���Gk|�������?��w_�|�.]�����k��y��g3���k�>�lF�����;[m�U�~&:�9�$��6y��I���GURS���\�WTWMkn����,g�qF����2�y����;����^�����������'���k��SO��|�\��F���n�;����3g���5*�F������!C���sE��o>���W�bu}����g���n�)���Z^|��<��y���3s���~�����+�����r��'���<�LN:�����]v�%c�����������_�c�=��~������?����5>��_�bEQTMMM�;������y��'��#�d��Y���+��_���3f����NSSS�}&:��S���~r�1��?(����12����c�������T�A#���_��|�3�6m��C���o���'>��������f\�^xa��Y�`Af������?W_}ux���J�l�������3t��$��a�Z:n�����g���������#G�[�n�\����3�<3�^zi���1c2b����7r����w�+���c��z������rk������^q��[n��<uuu�<�����;�XQ�����6�w�
�O�81���_f��]�������t�I���Z������;��&L�;�P�D����}W&��7)�W�������'u]��X_Ess����>iR�n�]���O�K�`%����s�����+������e���+T*e����G�SN9%�|�;�"^�����SN9%�g��&�l�[o�5�n�m�c���n�)�zh�t����455�=�yOx������#s�UW����'f��wNsss��K�.?~|�[������y����SO��.����r�)�<��c��5�\S��=z�*�������O}�<6lX�z�����w�gjm
�Z���&��:ybL��|�IM]2l���z�t�j��4�cd�c@��-A��Q��vEQ��'����S3{��,Z�(}��I�����v��o��m�����9����p��l���?~|z��]�X����^���>�<0`@^}��U���/})?����N8!����W{������O.���s��{��+]��k�e���illL�����������WyNsss��^x�<����5��:�3�6X���1�_��47����.�NJ�8.��q�f��`��O�KMk�Z�R��m��6�rH>���e���9������{w���$�c�=r�Yg%I^x�����UN�>������3gf�����O�S���P�r�1��G��������^zi��o���rQT�t�A�-�J�����t�Is7�p�*������g�������������&��&9�����S������OO�E�_���Y�pa��?���[n���__��'�x"O?�ty��G����>kt��k���M7����������o��I�C=�b����e�k;�3�a���d�2�[��{����)�&}&�9�:��
��6��&�d�-�H�,\�0����r��g�����
0`����_1�s�=SWW���������oU��i)U�����N��]���^z)3f�X�s:�3��y����?W�m�r�u�~�%���+�5V���s�f��i�;wn����A�����*&i��������a���K������*��o��Z����e�{��%K���O��Y]�v��[n�Fgu�g`�s������q]���/&
���	�8��k������K3r��l��V���O��}��w�#}��M}}}��j��92�\rI���������y���,�b�������+���W���'��o��fku������M�>�l��n��e����rVG|&6,���<_��#�^�V�`m���!s�������\q�Y�pa��(���555��g��s�=����:_���r��'����v����Q[�������O�T*%I���[�@��_����7�b��O\�=��O����X�3�R1�1c����}�r��{�l�#<������U�������z�w���#G���_.�^�J�r	��E����.���_����71bDk�mU\pA�,�5�b�-�����5kVN;�������s�=Wy��y�*�=z�X�s�]�d��,Z�(]�vm�sVt��{��Y��������WZ��2O?�t��
��=��d���s����w�J��j�����o���>��&YZ�TE��w�����z������g��Y�3gN��7�O�6-�~x���?��@kFn�����������L]�v��X�h�Bsss>��Od��)��>}���?��j�]�p���a����m����7o�j��������X����/~��|���l��Xs��%w]V97����U'�q�Z�K/��c�=6.L�TJ�E��>8�F��A��6�l��&O��;��#����3f����o��F�;��L�4)�n�ik�^��q�������W^�C=����>/��b���T*���O^aQQgt��g���*�.���~},��7��w��e��^�*I���%�Y�Y+:�%�j������+���+��LR��JV��?��V+�:���2g���J�E���g���y����������?>�|n����5*3f�H���;7g�uV~����V��t�A��u�����(���[�[��VK������?�����s�9'�s�����P1^�x�Z��h�����������g��g��{����T�m�2t���:�V)��3gN����r�S�~�r�]we�-�\�}�������{��k���=;EQ������9s��w����R�:���J���CQy����?������_'��������?����O<1�����x��={V��x�����p�����������g��gZ[g�yf�:����������?��9�3����i�[�����3����Z�k���Y�hQ��P��������M[m�U�������NK�,^�8��~{�<����:�Z~��{���w��SN�)������������_��Q�FU��~���e�]�R����,[�4����������444��9+�gM�:�3����g���-��������*�v�h�hu�����g���Z���_,_744d�������?��|����o��$�2e�z��6�?�����T*���!�{���a���n�e��6j�t��o�=GuT�s�zh~����u9��%Ik��1u�����A����e�[��VV���	���(��?��k�������:�V)��3gN��EP[l�E�w��^�u��=[l�E&M��R�T��-�K+w�����#�(��%�>������>]�tY����f���������e�o���+\7|������K�.\�3f��\j}����@���m��I�s�9)���:y���U
����_�nhhh�=��O�~�ZdO��#�<�|��7o^y�]�zW�����G������K�&MZ��{���V���������[��'��8��\�s-Z�g�}v�����t\�'y��d��j'a]��^9���d��T'�y�J��;��$)�"�'On�=_x����N;��"{�v�x��z��y����s�m�]n������g���u�]+���SW�f_�w�u�*�[����E�}��k\���f��E��&�l���������tL��=�������v��Im}�S]Mkl����'�
J���93w�y�z�7n����93�R)��{��1i#/��B����f����2v�-��-��R�:YW�n�m��r��x��������������������R����Y��e_���[�8��k?���tmG|&��Y4/��?������]����v
�3h�����|��_,����/���i��jll�������jjZ%6�`��i9��C2e�����!Cr�m�e��!-r�GQ1����������:���+�w�}�l���+]��~0uuu����c��������(��_��b��#�\�=��������y3������o����R��I���TE�766�����w��R���?<������G�5�c���9��cs�M7%I��o��~�����m��+�p��\{�����{�����z��y��'s�=����w\���[$c{5k��p��8qbyn��A���;��v���9&L��;��7���t��������7�x#;��s�z�����_��N;m�gu�Q��������?>�G�^�=�_~y>��O����
��O>�.]�t�gjm'N��;�XO�0!;��C��@G6����OW�m��d��U'���K���IC�j'`MMMy���bn�c�����V)������ZV�����9���r����T*e�M6�y���c�9&}��]�}�g����������2m��E����}���k��W����B�_~yN=��$KK��}��l��&k��K/�����g��%I����79���Z4k{2w��r�!�����s}�������]w����;��cs��W��{��Gn�������w�E�3�8#�\rIyn���y���W[J6i�����Ninn.�����]����I�����f������.�,'�|r�|����F����O&�^xk��!9qt�g�����F�A�,������$ijj������K���T*���>;��sv�q�0 ��w������f��	y��G�d���m��7�	'�����5>���F�<��������+�R)#G���W^��{�92�����$�zhn������1"c������������{��z����~���r��O?�]v�%,(����.�����:�<���O�+_�J���?V��5�����Z�<��vZ.�������&_�����/|��s��%������/~1���Zy��;��|0u���dgy�����]�%���r��K�}LU�@�����]`����T*-7������5����������_�������$�����}h���������I��]�f��Y����z�l����nY��~{E����������#�����A�2t��L�>=S�LY�����O��5��`��x��y��*��t��-��"]�v���>�y��U�>p���u�]y�;���gu�gj-
����x&��'��������%�]���V/tF
�h������B�L�T*������}^���OSSSy�8`��;�����x���?~}#�6�{l�����J�f���|0/���r_g�uV~�����9��w��7���>�b~���y��'��#�,W����g��1k]��	�057%�|�����69��W��V-�*���?Z��O>Y�:th����^����'�m�Yy��O��~,������	2r������t���c��?��:�����?��rK.���l��V�\���~5�>�hv�i��>'���lx��!�6�rn�������:���zhku�������Z[����g'IJ�R�"{4(�'ON���5�E�l�Z��lm><W]uU.�������SO=��s����!C������!C���95559��Sr�)���G�?���L�6-MMM0`@v�q����^�,����l8^������s�6K�sbU���Z���Z[������uK:�}�E�����X�����~�M��i����N;��9�����(�[�,YX9��s�������������&YZZ���/������J��_�~-�'���oI���rn�#�w�Z�8���J�Nk����������M����'g���������3u�����
o��3jnJ^y"�7��IX��9��������N:X���^{���������W���u��7��M��(��J������`CU4'7�{����N��8�KI���N���������g��vJ�����.�K/��N{M�:5?����Z�l�M6�l��
��y��W�w�l��S�(�Z�SO=5EQ�T*���_�a����������J;��������N=��VJ��-Y��yq�S�6��L�B�S�Q�U;@{w�)���.��/��R��	&d�w�~���92���+�w��%����r�9�d���)�J)�"�x�;r��g��S�/��6�7�r�����m����'����P�$t
�V���>����r��g���)�Jy��W��O~2g�}v>������<xpz���y��e���y��2f����93EQ�������.]�t���T��������{��?JJ��d���5���{��+���'��%K����^}��\{�����kWx_QIR^��k������>�������q%����j��U~�IM�l(�=���y��:th��H�TJ���}]�rI�k����[n����+GuT5���>�<q[���G&�W'P
���{��'�x"_|q��v����e����;���.�,�&M�n��������9��'�s]{&��\�<@��U;���K�.9��Ss���f������;��3�d��Y�;wnz������g��������M6�������K^y�rn�O&��V%PE
����!Cr���V;@��xA��K*��
Mv�hu��US�t|�]���Y9w��%���	`�E��zQ�@�z�����+�6�+�wu����V5�I���������^��`�j^|(yrl���Il^�4@{QW��E�e��	y��W3{��,Z�h��8��Z!�o�M^�Z�T����7�N��du�tx�R��S��,X�+��2W\qEz��466��~
����1���I�T�$�7���t�]�@�)�ZCw�qG>��O���^J�E�N��J�E���\:�9�$c~����
�"���j��Xk�o�[>�����y����_/[��l�UQ�\����L��T;��A�Mj�+5X�5m��w�qijj*Z
><GuT��b��v�i����>;[n�ef����'��;���)S��o�����������=��9/'���r��.���N������%��Q�$@{�k5��?�3���z���S��T~������>Ir�i���������\E�o�1g�uV�}��<��c��o~�n�!�{�n��6p��Is�[��.���Iz�^&����
EQ��+�(�_�������K��W�S*���8?�p�����(��q����>����*���L��rn�#�_�<X�0a�����k)�"I���~u�����Gn���l��V)�"c����_��Q����u������K��'����K�*<������������_���������[�|�;�I�E���-����%�Z9���I����@��kf���$)�J�b�-��K����J�����W���>��t��=I����Wl�����I���/��K�������M�*��;�|��_�����G��H���3g��u��5�o�yy<~�������K���V���������`�kz��Q�^�d�
�����|���/�v��={��_~���H��=������u]�=?^�<�
�Va��A��9s��p���C��?��j��6mZ����i+���=5��?�s�|8�1�*q��(�j'���k��n�$IQy��������]v���f���ill\�~�=�X^|���J�$�����
�=�N����K]�d��W/X������k��I�����'�Xn��#��3f��E]�������g�]�N��w���#@�ymJ2����]>���_�<l8`�B��]���{����r�rk�8�����+�R�\ru����_/�y���s��G���kJ�R�d��7�{�������I�����k�����:�7�6
�V���/_�x������[�|��_MQ)�JY�xq����d����t�M3p��������������s�MM�_~6L�MI&�\9��G������
���8��cS*�RE����{l�5_���2b��r�UQijj��/��Y�f�(�$o������K>�����s@K��WI�����!�cd������v��n��!?~|/^�$8p�rk���r�M7��3�������o^E��(RSS�3�8#?����&<�b��d�3���$3�^z=kr��X�dmg�����M���N6<
���N;���5


���+���>�\sM�������+)�"o�q��g�|���6�l������)%K��v�5S��io�]��R��/���=��v
6$
�Z�.���]v���1���S������Y�$��]?�t�W�lHj����(�[/T~��l�m��	�N������<���p�S��Rm�h2h�d�V��-��=���mu���")y�������?���v���16x�$���r�K������Y[
�+��l��u�v*�0)�Z��w�=;��cF������x���	`�t���y3*��wn���U�TQM�l&N��s�9'�m�Y>����k���E��`�1�����+�����sDU�U�k
E�����|��9���������O��w�]�h�ZQ$c~�47�5WS����T�^.�z`���X�.��'0�������_��������w�3����3y��j�h���L~�rn����C���#(���`�(�Z��o�=�=�\���of���*�G�����~��|������s��g����?~5c��$w�W�\���{N�N�}P������;/O<�D�����z�����OEVQinn�w���N:)o�qN<���3�������N��Z97�sI}����Xki�����_��_~9W_}u?�����&YZ��$EQd������+s���f��a9�����SOU3:@�z����V�m�g��������g�`C�ku��%GuT���?g�����������.)�"Ie��/���|�;�v�m��>���K/����^����(��~�Mo���'��W
�Z��A���/|!���?��#���_�b6�h��a�{��9��3��&�T32@�z��d����=F&�6�J��Q���v�q�\x���2eJ��������N��]SEE��E����u,��������'{_�<@�SW�UMMM;��v�a�3gN.���|��_W|��(���I��,����I���i�[���~s���&�;��9iZR97�sI}Cu����VTEn����=:7�p��+XOSM��(��H���6��;�r�j��X�`��I�������*��MK���T*U9l�^}6����3�v�Vm����'��x;X-��W_�o���=:=�P���WIR*�R*������=5jT����b������L��$E����J5�{�J��v��Q���,Y�?��O=zt�������q��WEQd��6����Q�Fe����rr��d��N��,^�<��d��I�����I����U�kG���vI��,�\[����KR�u���v�:Z^�w$
���h�`��{��'�G���W_���g'IE����W��w��>���5*#F�H�O�T�������G��,�]�4��n}���Jv>ri�Xkh������+3z��<���I*K��,�J�<0�F�������g��U��[�"y��d���y����uQ�-���d���.������k5�����=:w�yg��Xa�UQ�r�-s�	'��N��a�������\2�������uQS��|d��QI���N@KP��'�|r��*IE�U���s��Gg��Q�w�}���e-�����C�&�M�N����K�yP��)I�!�N��?6T
�����W�R)�zhF���|�#ihh�v4�Q���$w�<�?s�k��;����{�������7������5PE��n��5*���'����V;�J���'oO^x Y<?i\�4-I�'���^7.^:nn�vZV�iI�p��_�589����JJ��L�I�j|�����Q�����W;
����7�����T;	���>���d���n�N�
�;(X��_��_�����O%�~��p���Z�xO2�sI����H`�����]�%�'IQ�4��>�$}.�r_oh��,��Y� ��7��W'��V�f���V�'u]�����KR���sMm�J�VC�d��I��	�v����Z�59y��d��I���>'��I���qI��$)�����j�h��_�90���d���Yp@�S��Q��'��6y������R�-������M����cS�+�da2����%���vZK�6��C���Lz��v��A,c���CL&�9ycn�������pF2`�j'�\`�#���	M��-Y�Z��tNE����M+_��+y��I��Im����mo���RM��f-������C��sR��,��<|}��5��Y�N����<��_�����w�v�p)����%��6��d��j�ae��;���d��I�T�4��S���3�<����/S�L������_�l����g�}���P�x�9/'�>y��I��j�aE��%;|0y����C��:X�rn������G�������={��O�������q:`U����&����}��iX�����G�~^���';| ���v�xK}C��NI���N����3��4��Q�(m�X���`�(��-Z��O>9W]u�*���7/?���r��W������F	��y��d��$oJ�N�v��V${�l�]�����O?�E�&%EQ�(��hn���~��1���H�477��c���7�X1_[[��C��O�>y��������_�1cF>����[o��{������k\�<5.���d���N����M�{_�����W;
@�WE��7��W�����e?�d�ct,���NkL�$��~�\��������;/�n�i��%Y7�xc>���g���I�������	��O�6�
@�����6%Y�0iZ�45&�K��nZ�tMsS��n��?�<���s����Q�5��C���&�7�vXw�3g�y��j��v�(�����,y��jG�i�~P��N����~��j��5����3��o�b����n���/W�����#�H��s����~y����$S�L���|���l���So�I��7y����{�3U����mF$�
�N��4�N6�+����I���q���������G��LQd��wW;�P�{T;@��:4�;/���jG�5��\��s�j&8��r����t��!Cr�e����}oy�G?�Q>���f�������(�Y/,-�z��d��I�T�T�W���v�Kv��d�wV;
�b�'?�y�S�cTE�[$����l�J55i�s�l������w$��Ltr������+*�����=�Ri��r�!���s��w&I����k��&g�qF�eX[K�H^|(�3m���")���%Is��>/sM���d�#��/U;	C���xx���I}�j�`},7��6H==Til�����8��t�j�jG��,��������1�<>|x:��5����O.`%�
7����y�&���<sW2���qq�Q����%��IM�[��uIM]RS�d����@]�d�.��L�lZ�4����7��V����:��M7M�3�L�f�U;
��`A'w�M7U�=���Jk�>p���V��������G�-�`u�"��t�����^��x�Q�%�{2|�d����U;�E���^K��\�(TQ��YY��C�Xo�S�d���oj���v:�e��w^���RXs���t1"��^ayuu)��T;�;
���?~|�x�}�Y�{7�t�l���y����$�/��I���{�`B�����g��O�,H�����>7�m\4U;�[����%o���us�����`��d��j������W��I��;�o�v"X�/������u�������G&�����������������`A'��c�U���~������/`���,:���d�������'SN��v���T��z��L5�IM����������suIJmy�����^�����
~}�������N4���%�>[���(���������������C�v������{�5���75=zT;
������<������O�jGh
��[�pa&O�\1��f�������'�;k�(�������7������H���i������������"��E���F�%K�8��U�E2���y��^��\�,Y����V_�0����!���='�k��dq���4{v��pC���C������G���,z��*�h?�g�N����������~�M��U��|��^}��o+���������j�!C�T��O��"�:���.����\���X�f��o������e����kz�����%�y������V���_,���mZT����})E��7�X�x��??�����mQ�uQ������EJo����������\����V��"�2�����Y��������&EQJs���M��i�)u���_�����kS����������y���9�.]���5��\��1
i,���s�4�[�����-�����!�PC�m��5�}�3���3x������)�$I���-,?��N�V�vHjj��
����N��#S����Ck�:4��9��1Z�,�����W1���{J����T����*�\��O��3�����~z��m+/������(��B}��l6�WB �DBI@z� �z�U/�����"M�������H��+J Bz��f��G.#��n��lv?�sr����<�Dv����r�o��t���H���!X���N��7U�RU\������uU���5Y����UHm�j�P\����j���^/�_�Bj+3IR(������a����'�����fz����AU�o��%���S����eUm����m��]��+�W��U�;��U>*���7�m�#�6��t��H�.S�H@#T��c�#�Ujg�L���~��JGir���V:v��O6�bmm
�[��;T:
+��m���j���5�����u
-ZT:�~r��y����[�jU�3Z�n]6�;w�*e��)�.HUqa
��)k>�������PH
�~�����:��t��x��~"mj�����IZ��B�b1��f������k�5s�*�;6�6�0�
�t�Q;ujZo�e��Y��Q�bmmZm�aZ��U�(�J�
6H�e���(��f�M�6e���������L�VU]H��)+��X������w��5�qM�>����kq���
)&���N1��M��*)Js�{|j?�|������2~��y�P�����(�/|t�g�ew�������}�,J�P��,�����(U��R���3S��GR��y
I�
��sW���/,J!��*��v����?��Z�{��E��TW/H����n�0-[.H�R]�p�\a^
-��j���5G������}Q�)��j�>-7�`��ZI-:wN�n�����I�����ZO4c:t(��7��g��;w�g���N:)GqD��><�r�*��&l�����}+��r`A3�dY��9sR,S(�|����Wx�����Wz������8)��f�G�)
)�I��f��	Yg�u�|��1c���*��?~�x�����\,���d��(��f�m�����_F�U�=zt�
�F�]6�t�M,_}���{e�C9�"9����{/�l�M��V��,@#�da����^����
[�y�$X��m��Ve�'�|��{����#G��-[���A�(MUu��u����/.�������
���{�������:4x���}��s�����}��M���+���><�rHi|���f��6�\ XK�,
+�giX9>K���YV����r|����������+�w�}�:�U����;��=zd��II�w�}7?�p���{��������Z2�E�.]*z���h��2x��J�������r|�����4���`��,
+�g���f�mVj_U��2UUU���P6w�y��X,�p�<��{�4���c�<����&F��|�;���Ci��#����/^��1c��+_�J��)���=z���4
�����#�������������N�|P����������w�9#G�,����'��z����ZN�$��w��8�l��+�L�~���O|"�l�M�w��C=4�G�.�i��m�����K�.k81k+X@����*���s��G��/Z�(���n^z��L�6�����������.������S���i�&�_}n���l��V�]��}��t�Iy���3d��5��������������������g���1c�`��t��%�m�Yv�e��i���1XK)��k��6�FmT�41U�@���5JkTu�47={��9��S6>����r|�����4���`��,
+�g��[�X,+�����h^`�F)�`�R����5Jk�,�(X�Q
�X�`�F)�`�R����5Jk�,�(X�Q
�X�`�F)�`�R����5Jk�,�(X�Q
�X��+�!L�6-�<�Hi��o��n�������������+�w�}�t���N{`M�#�<�C9��1��[o�5|p��V��,PFkTu�4��}���o���l��FJ��
><�rHi�d��(�����[��7�h�<�Bi��%{`VD,G������g�E5�NCs���d��*�b�P�������WT:�Uq��������ZTU:4F�&�\S�4g�
�t��F,��&�'W:4M���M��������H6��2y�����������A����d�J�X-`���+��V���_J�^�<k��'_���3K��.]Rh��������_���,X��/wZ7���+�����uW�}�S��ASU���L��|n��%U-*��"X�/��k�3n�.�������H��s�W�(��|��u�����J����N����D!��s�S�b��(��$�������}��I��*��2X���'�i���m{De�@S������q������L���P(T:MPu�����bjkkS,+h�
�B������0qx2����m�L��7�
��a����>}z�O���*������t��!�:uJ�v�b�/��|��k��^����,�:�?~�����gW:
����d��i�6mZZ�h���;�W�^�����������<4�nU�<�(��.����SSSS�(Y�hQ�L��������G	@x��d����[�L�<�bq*�X,V:�@U�4f�-�{����
htf���>���4����+���m�w��[e�@sQ]�����c3�������t��)�:uJ��-SU�KX=��bjjj2{����93���+{������:��S��k��LfO.�����d��D�r,Z�(3g�,�k��U6�`�TW��	�-[�L��m��G���5+���~��b������W�^)
L	��{/%O�>�>��IXYs����n��X�,���ig5����g�.
����W�P1:t�������{�4�h����3'����`2h��NOn�n2V�����9��	�y��t��j���e�v���U�VJ�X���M���3fT(
4o��������^2`�J���A�r��=�l��c�
%(����Y��1�i�b���*���T�"������~�����,Z��l�m��JP�}���8qbi\SS�b��B�P�T����R2����=��t�S�<��B!��Y��s��4�b��(�X������Z�P�	4��zT[[���A��Z>��a��a����x
��c����)S2}�����f�-�L���au).����&�HTUU-5���[��1{J2����-R~E����
�������M7��'�|23f�({�����{����;��3�'ON����+��������w&�5�W�J���X���7��o~���0aB��X,��_XA��/����>;I��u��;6�;w^}a�)�&���|n�=�6�*�`mUU���������:*����W���N:���i�&�b1����_������Q�%����}���dX�)�jD.�����g?K�X,�]���3GuTN?���
���k���w�}K�;��c������[��=7J�\�(k5X�������w�y)
)
i��M~��_�������_��/�8IJ�X+r���&I��by��,Z�h�f��`����'��>ypR�JX���N@3P]�,v�Yg���6I��U����������Rg�������f���o��M7��Ar@s��Iq��-�&��S�<k��J �={v����P(�P(���N[���$0`@:v�X6�!b@�U[����s����n_�<�F
�N@��x����`����$��'���g�����z��q�|4g#�NfM(�����dh
`5���~��P(d�
7,+�ZY]�t)��1c�*���+���{o���ie�4
��I�&�^����A����)�����+k��d���s�<�2Y�
�H�@���K�g��� g~�T�{��
r&�i��S(J����?V:����$���[�O6��bq�X�@�^��$�b1����*�7a�����{)
I���{����-�I^��|n�g��m+���b����*R��l��f��3f���/��J��~��Ij
������t4W�<���\>���+�*�P�t� X��'?������)��?����/V������.K�PH�P�[l����7TThV^��|�g���'*�I��t;�������4Ir�5������>��S�s���o����J�
�|�+_i���������'�V:	+�f��?������dhj`5����r��Wg��Y����a��?��9��#�������7������)
)�Yw�u���~u5'`Y>x5��7�_5%m:%�V:@�������G~�����_�j
�B������>:?���r���g�m�M���
�����y���3|��<������2{����$I�-��?�!�Z���c��{������3fL�����O|"C�M���W�o��yy���3l����93]�v���n�]w�5��+�m|��Yy�����od����;wn:w��=zd�m���o�R�~���3��K/��7���i�2���k�.]�v��n�A�e�u�Y�{V��������g����:uj:w����{g�]vI�����E��������#3v��,Z�(�������<�K�WM������+��iP���|��_���#���0�B!�b1O=�T�z���u�b1_����+
�}�^zi��{�5��z���3t�*z�9���{��Y�hQ~��_���E�~�����k�.���7r����M�6e���93^xa������1c��={��E]�/��u���[o�����?���<������Y����{��O�7���t���N���_��^�;��3,X�����g�����'��A���G�����/s������~��#���.����+��o~�������\S(���������A��g��������;�4~���2d��L�2%]tQ�����7�l��[n��	�z���+�����m��a�N�t(�jd.���0 ���73g��$�������p�������k����:Gu��
@���g��C�}����5s�����^���~:��sO��m�$y��w��~�-�4�C'N�W����������+V���;���X������9������7���[�����i����|���Ommm���1"���/��s�\x��u����y��s�11b�
���<���9���s������O����}��/�����?|���F`-������;$�lR�,���]��M��W�$��|��VX�����2$_|q������;7Iy���W�WWW�����~������b�X�u����.+����O����9s���7���E�J�=��c9��S����&&L�{����G'Y�5������{&O��w�}��������n�����~�y�����\��m��o�t��1�B!�'O��Q�������!C������f�m��g�������~w���;f�
7L���3w��L�2%���~Y������#GuT�{��Z�j�����s���1cF������}{��Gy���i�������{9���2a����z�����{g����?_�����*�����X+
�N@����������\t�Ey�����c�e��a�<yr�M��v���G���������+�z��tl�\s�59rd���c��Yg�UV 5y���}�����~U����~�o~��9���3z���i�&g�qFN<���������7������G-��v�i9��#��e��fj��E��w�t�A�c�=2`��TUU���9sfn������y����$s������_|1��|�?~�8�����?<���w��6�,�o���y���r�]w����[����{�������\z����N?�����>�}���^}���^[��j�]w�w�������e�V3g��
7����:+���O�<��������+��r��.���O��	��E����w�����h��J���;7O<�D��`����I������$[T�<���b��!V�k����7��4~��W3x���>���&o��v����S]�7��=���:t�R��]vYN=���������?����f�m�a���C���������.s��9s��v�e��a��[n�%�r�2��1"UUU�`�
��<�����������4w�]we���[�����+���i|����O�S��Z�`A���0`������������C���/���d�?�[o�u^}����y�����:k��^I2f��:�����/�����z���=���w�yes����������}��y���(��k���7�%�f�gn�C��N�X$�z{�M���/�7|����v�
&��Z��-	�A��6�&O�t�&�E��)TUU:�ru�Q+,�J�/�0���R[[�$�B����'�-�J�v���������[������[����zeo��M����0 ��OO��xjyXo��V����N��]�Z�Zn�UC����������������}���^n���l��V�?��/�<�]w]��>���VK���k�,/�J�m��Lh�`��&O���zU:F�6p��T��Y��T(r�����>}�d������>[��`�
��/}�c��-��IDATx�����*�3���K+x�u�����/7�pC���'�\���s���[�l��YV�O����v�����.���-��"|pn���$�m���E��E���]�v��w�[��������/�����[������������'?��7��Nk7�|�����Z���:d�
7,�G�]��u�����1c�d����\��O���u�]��YV�������8��t���^g���>���f��s������N�:��.�~#�I�.����Y�,��X�t���J��f�m�����������f�z�}��w�$3f����i�����n���?�W^y%c����32g����;i�����s��=��#-Z���E��$W\qE�����N;-���4��<��|��n���}F�~�U���
��9;��C��`������=$���c��,(�j���b�|���=:3f����s��<�����_
�X�e�D-O�v�d���sW�v���9�������<�����5m��e����7_��������4w��W��+����n����+���[v�i�t��m��^��
+�q�9��3V��)S��i]���W��>��MF=W>���I�P�<
�3VX���w�����:��{�����,X�Zt���&T:F���{�JGX�6m�Td��L�4){��G�����9+*�����q�����G��/��^x!_|q
�B��r����~���?����R��3y��?s���uZ��S����������vI6��"Q`����8qb����+����X,��Y�B!�b1�yP���T��Y��$9��#�*����o��A�e���O���m�TUU��\s�5���k�tG�6mr�m���n�%�\��_~y�5�b1/��r^~��\t�E�������4m��*=��L�6����������-[6��4^s�&��-������ue���@V#1e������y��7K�U�X��U)������������;v��W^�c�9���jYx��z�U(r�1���c���������/?�p��L�4i��w�yg}���y���u�]�uW]�k��l��o}+����*�9`��U�@���m����h�luH���ZAV#q�i���7�(+����s��g�l������RE�qn��������s�1u�;e����w��A4hPN9����������{s��7���/��9sf>�����w�I�V��e���G�x�u��^{���w@�������6�+i��2y`m���2eJ����R�U�P�9���3�<3�[��t<�bO?�t�u���s��G�y�k��� 
�B6�l�l��f9��S��c������I��$&L���^�O<�A��P�������o�� I�| �3�|n���X/@�T,+�f���H|��,Z�(����s�=7��s��+V����K�7�h��h��N�f���^xa�d�u�]����l���_������*���<t�����>X��P�b������n��X�<�K�P�t� X��{���dq�G�6mr�i�U8M�G�,XP�}����3o���)I��.���'M���u���/��3��w���z�|��K�w�y'w�}w=R����R2����m��LX�TW:�)$)
8p`��m[�D4�{���#�$���Z�M��.]��p��1cr�y���\K^u��u���u�V6��Y����O�	'�P�[���;����;����a���]������*wY/���d����F`�u�)����G@��y��K�Q,�w���\y���]?q��p��6mZ��8�����&���������b���/��ln�m�]������o���\t�Ei��e��}����%�\��^{-I��[oe�����7��>}������/�K����|�;u��qj$7��L}��IhH[�T��t
X;TU:���o�dq!�{��d
@�9�����W]uUN8���U^%=s��\}����'?��_~9I��f�������9�����z���O�?���L�<y�u���y�����>���[o-��k�.�{�2����W��r��������>����g?�w���������y����h�"7�tS:w�\�{���������s��[o���{���;��#_�����z��_�B�
V����x�>�WMM�����t
X{TW:����3h�������4iR���l��v��@��>�����l������5�\�k��&H��=3m���1",(�9��c3p���w�yu�k��	����r�UW%I�]w����#�������3b����5k�}�_~y�[o���{����y���y����v���p�
��6�d��r�-9���3u��$���Ss�������O�=��w��o�>3f���I�2q��:?7@}���t
�._MZ��t
X{(�j$�;��q�I���>���V�����|�3����>[6������w�]j��G�?�����~�J��;6c��]��m���W\��}�k+<���������K/�4�bq��:4�=�\�9��<��se�M�4)�&MZ��B���}����K�\2i����sI������)�u'�}��I�J�|?���F����W�����w��=����N;-�]vY�c�t��%�>�h~����?�y�O���u������s�1�:����m>���y��y���3~������[�<���y���`�
�t��_�������k���O������32o��:���'>�g�}6���?����4�?�x,X���-Z��;�����/����3`��:��"��P>��/�?I��2y�c
�N@T(U�5�b1'�xb~����P(d�]w�����!C�T:4z���Z6�|����W_����W���������esLu��@�n����SO=�a��e���i��U�������>o�q��1b������5jT�O���C����g��b�4�Q��4g��<���y���2y����;7:tH�=��&�d��6K���+s�|�����w�?_>����'�LX�a-[&55�q��^J����\ �U�}����
�\u�U:th���o�����{���]�f���N��=��M�z�y��W����m��i��C�f������������������]������43��P>n�%�l��D�(X���i���/d��y)�I�)S�����Y�bQ4�''o�W>���I����PI
����~:�vX���$)
N4��oN-���E�d�C+���`5o��F��w���1#����b�X�T@CX8/y������I�w�H��S��H|����3R(�$�b1���o:��l������{��kW����x��d�������L�X�b��(�j�z��<��C)
)����[n������n����bm��_�����t�_�<Po�B��UU:�O<�$)�)
�����_@���������=�2YX�����K��t���?��i����
����H�mW�,���F�c��I�B���P(T8������r���G'���NV#�����^/X���I����
�����M��L��DV#�����E�)�9rdjjj*	XE3�%o>T>����-+��1Q�����'{��w�d��Y����+�XU/���g\�&�����uV,������I��t;���s�}����6g�qF��:T:������&s�U:	�K�6����s�6i��2yX��N;������9�����[oe�����������:��@�Y������_�t��B�����xTU:�q��'��nH�N�����g���9������+�b���h�^���9���I��+�����t0`@�u�PH�X��)S���0?����e�t��-m������B!���NC�`%L�<sm�S�����?_����Fb������B��B��$)�I�d��q�>��s��bmr��Im��
-���W.�_�N�V�%}6�t��EV#�da��X}X�@����d�+�s���vRe�@%)�j$����JeW4^�''���|������T�<+T,��u��(�j$F�Y��&�<�?�|n����m*�*����){������6�'�p�����@�&�$�_^>��S2������Z]�u��wf�m�)�z��+	J��:�9�|n���v]+���JX���Z^~��$I��m��.�T6���o$/��|��6���*���JX-Z�H�
����/�[��p"Hjk�{/I����k�*����P�\.�����Z]������^w����I�?^�1��V��N'$]�V&@���N@3P]��b�
7,�7n\�����������g�]�u
eY�k�y3�WnIfN�t��XL^��|�{�d�c+����k��vJ���3n���3&���nP�Xe�=��
���eR-k]CQ�M��9�_ON&�S�$�Y!��;I����GU������|���/�����
��x�b�I��^�br���_�m�<$��y�S@��V`%���������)�����[n�����R,�TF�����M���#S(J����/T:���_���t
��s�d��U:4>�����v��;��3���o&L����>:��~z�<��t�������C5�:�y�\�����ZwH6�;)*��k�=�|��N@�����GM�\v�e9���3~��\t�E���~����?;��C����N�:�e���:{��v[�|���{�����c�;�I���,$�����T�b�L4����XC�)���P(�X,f������������+un�PHMMMC�����?��C�����sN�=��� �%�}/�7�|~�/+��^k}����b����X�b�R�VI���wi2����O���x|e24�&Q��a���+�)y��d�=�s]�%�� )TU&@CX���9��JGhH�
�\w�u���>��g=���������y���N�d���_N�E�\�v��%��W$@�Q��H�92�����s���Ys��-;X����������|~�$�7�L&����`5%��X���D��#I��J'iz&����Z>������*���)������&O?�t^}��L�2%�:uJ��}3d��t��y���6mZ^}�������:uj,X�.]��W�^�~���������iy���2v��L�4)������K>��Od�-�L�^�V��7�|3�<�L>����h�"�z��;���6�������N���J�h>6�1����N@sP,��,�|�<XM���K�[�lY�$���?��C�����sN�=��,\�0?��Or���g���K�k��u=��\v�eYo���t�K/��n�!��{o^y��eh�?�)����~��i���
�-,���y�����;o��z��2d��������k~���������E��{��[o���������]��0������|������?���7�l�\|��9���u.�l��H����)���}���I�ZT:	@���t���cK�;v�X�$���i�2t���y���,�J������n��A�r��w�����/��6���K.��/�����$y��ws�)�d�������W�9V�o�����*�{l�~����_%��__|���z�����~V�{�8��|�3�Yn�U�6,tP.���z�
,m�����'�T:I���}r���6�*��aUW:��R,��K/e��a�2eJ�O��������p�
+o����;�$�B!����p�����6GqD�x���\�����_���7/#F���y�J���1#�vX����:t��~t��:v��>}��s����������{���y���������W^I�^��	?�C=��;,��M[���={f�u�M�V�2e���92���+u��g��K/��&�c�����_��m�Q�F-U>v��gg���9���V�>h�jk�;�Mf�/��K������j�l<4��^��4�&W���+����/�m���Y�f-���?��e`]r�%y��7�$����������F�]�u������dq���9s2b���x�����[J�m��6��	�����k2j��$��_~���}��S(�$�f��_���|�;�)D��7/�{l�
�.]�,����[������w�}�E��'O�����\p�����$����W����v�m�<����K����i��V�?���r���/7��[n�����#s�����_�n�:'�|r���/e��Ae�g�����z*7�xc����,��%=���1bD�d�w�\��C���z���b��Gy$'�xb�{|�����O:���:���u2������L�a����PM�_#,X�o�������,.�X���#���w��y��)
)
�������U����0����������<��#�,������~�����[��e���;t���������C��O:&LH�������~~��_.�����/�|z������w�����9������{���m������_}��$�k���d�R�����c�=6S�N-���������b�-���C��{�����{���.�s	���W_������.-Z�({�P(d��!y��G��V[������;��3|p����7�O���|�C�����_PM�_%����=��3�>�l���R%S�Ba��Xu������O����$����������,���|X�U,Ke"��W�M�N�t���m��PU��������nX�����k��&���oi��C~���s��K�<xp�2t��5�_}6�t����&I���?��K.��9�q�������*�[�n����%u��-��u��}�m�]~���,U~�Q={��Yg��O<�4w��w+��z�8<����sU���&��W&�-��
�I`s�1y��gJ�W�B!�rH��g����7p���Q]]�C=4���o�,.�X]X�S�XL��-s�q���?�i��@�5wzr���N������]�J�X�����������g>�=��#>�`�d�����������Ar80;��C�~��$��O>� �.���{�8��:�_����?�%c:��#�
�^|����	��y3������+����I��+�	X���J'��X��������G��j�������������\�C�������7)�y��g3w���m�����p�	�}�O�S)��{��u�]���VUU�}�����[�!C��g��������e�}��u^�	'�
�����n��$�������^j�s��p��<����quuuN:���v_������|�Nk�u��~��e���I���{o�����vQr�������80�����@���`]p�I�b����{����Wy�Gm������-��a���6�4H�$���������?�^�q��c�=�^��O~�����[��2�l����~������o�[�~����_���	2c����7o��������z���3w���x���N�����m��6������^�z�
��O���b@�����O����,�����@��V`�?>/��B
�B��eX+[~�,.����g&N��$y��7����������|�����_�~���Sf���$5j�r�'L�4)g�qF����,Z�h��M�6m�`���;e���������^�z�k}���K�?Z�@��~1��m��Y�N��k�Q����������Ue2�t��XO<�D��b��e��9���W��=z�
�&M���������������{���m���T:E���s�,_������[�n�������1#�;�?�;���!C�����_�|���_���3e���q}���M�6��|V�w�Ln�nR\��N<P�"9�������!����k��qI�B���6�(���_�3;u�Tz=k���?����]��W�Z�bO���]�z�Y�{��Y��
�,X��~��K�_
80���{6�d����zi��}��m�B�PZs�����{��w���9sf��C���N�Nc_O�q������''�oU�4ku����K�?Z\�*f��]z��m�9��e��9�����?���QW]uU�z���x�u���������{��W_]�<+�c��e�5Y$	��c����3��y�NB}l~@���*���B��	h�����]��^�kU�7���{��
r&���I���g��)��UUUK;�p�
e�[n�%�����}����[����	����=fONn>5�;�|��&��"���n$�?�����(+��fb�.�Zg�u�$�b1#F�����U��>����.+-����*g��y��W��~��Q�1cFi������	����s�=Wo��Vu.�J��^{�^yV������?�������9���'����o�Cr�I����^����t�U��v��^/X� >��*���?����U�V�i��V�<������2eJ��?��#e�v��l<y��������l�I��~���2f��:���*�hP�G+�6�l�v����/��R��W��4]�&�?��V��:�$^��
�����o��4hP
�B����/^���������M�PH�P��?���i������,\�07�pC����O*����e�%K�,XP����_�ym��o��l<g��:�m��e��s����������k�{~��z�|�s���K�V���h���>��~�������B��G}4?������^g��93����2u��$I�P��������%����y��W����g��9i��m�Yg�l����r�-��u��>{��yy��'��od���i��U�_�����0`@>E��;���g�������k���t�M���;7h�ZS|&h�.���w�q����
��s�=y��K��m���c�)[��{�TWW���&I���O���&��+�6���/����[�ne�#F�k�)�������%�\�#�8"[l�E����x��d�=�sm�$�_�����-@3��`�t�I���~�Q�F�X,�����|���G���������{��o}+o��V
�B�d����������7[3g�������w���
�UZ�j�v�!����r�)�����'����������={�k��v��u�Y9�������n���\p�y����~���/|!��sNz�����4�g��n���9���s����e���\3|����es'�pB�t�R6��E�����y��'Jg_~����w�������>8.�W�
6� :t��Y��$<�@�N���]��i��{��]w�5�=�X�d����w�}����N%XS�L������V[�+7��V,&�E�N��y�������U�I�$���2���a�/�j��e��������7o^��b����\s�59������&I��b
�B��������>|x|�����;����b�u�������O�t�q���W������������o�]���~8GqD&M���u/��B9������o�V�Z�����??_�����?�y��f���_����_��o�1���[��I��3AS��d��Q������O}*�_~yv�m�R���������%���w2u����u�Y'?����y���_*�J��~���8qb�8������4?i����O�\�����P(d��7��o�Y��UUU�s�=s�m�%I�M���v�)_��������}��e���v��������l����2eJ���>�;���O>9_����������={v�|��������_�SO=U���q����9S*�d�Wh�tA���J'�^��3�Z_��$;��cn���}���7o^��e��_�������X,��?�i�8I���s��������5������+r����~�?��M����'=z����s3v���-{Z��<���g3w����.]�����:uj�{��,Z����k��&�f���7�X*��8���9���J�0j��E������;g���>}z���'f��������O}�S����98������O�����/��!C��{���`�
2o���1b��[�n����n�2�}��_��W^��_~9���a�_~y����80]�t����3b����	���w3f��:`%������~�����o��V�<��e�}���2d����~�����o�!��i��%I�����.�,�]vYz���u�]7�Z�����3r������9��4��������_����;I?���-��KU�4�<0�>�l
�b�XV�S(J���bY���s��3�<�T�
�����������j�����w��i����w��3�<���_�8qb���k��6�~xZ�j���O�:5GuTY��l�[o�5S�L��/��#Fd�������V����o�W\Q�g���K�*��������G��w��K/��)S����oN�~�Jk����#�<��D��=4UUU�����O������'��_�����T�U��s��7f���Z��-[��m�����������7��3�<������_�����r���;��������gi��e��~��'�x"�m��R�M�0!���J�{���������Fk���g+�j(�|5����N4M�+I��_~9��_��;$I�����W�<xp���?��W^��o\��M����s��'��-[��_����u�]�w�}��u������'��_��o�1������q�����>(�����'�|2|pY��������*?��������:u���3y����^t�E���+��O��\UUU=��<����p�
K����~~���|�=M���9���s|��\t�E����2��j�*Gyd^��p�{f�~���s����ON�6m��n��v�=����/����E}|�����a�r��gg�=�H�>}��]�z�7h��������W_����z�{[�h��w�9���/s����Tf���p^r���y�+��i���d��+�hL
���B51S�L���?�a��e����6mZ��k�=z���:thY���{���z�4�����#�8����8qb�Y�f������������S,3d��<������}�{KA-�;��N.����x��v��?��R�x {��Wi��c��1"��woV������k�|��K�W_}5�^��jjj���o��
80���+}&M��?��C�����sN�=������&O=�T���g������S�_�:4]�tY�;g����{,��������m����7;��S�����O�z�?>O=�T�����'���:]�v�����V[���Es�k�^�br�y�������n'U&���]��M�J����55y�e���o����lR�D4f�����[�u���:(tP��N�81={�\
����n������#�h���$������v�m�E%I�P�9��S�����}.����?�����C���������$�s�=�������K���93���r��'6�g�����:���kv�u�;�C��o����5a�u��!�R����.���A��YI������TU:�������gN�<�c�������7e�s�9���������_�����o������i<n��<����]���Of������2d��:��d�[o�u����3�
F>�<ze�\����)��+*��&h�/���������
v�������{���^k�3��1c���{�)���j�<�A��5kV}����}���N{�B��k���;��c���������{��B�0����e��~8�g�^����Lk��$w��k?2YH>{v��_�b4Ik}VMMM�8������|��3��>����_^�`
`������Ks�Ae������{���S]]�|p�{�����Gg����8q�N\����g-ZT:���x����p���������w�����.e���/���;�\�{����
7��4^�`A^��e�m����-�����d�������|b�e��&�X�t����+If������?����*����~6�=�\&[9���n=��l���9��3s��w��w����SS[[��
�@�{���������-�����jM[��r�-�,�~����?��?�r�-��k��k�.n�a��{�\v�e3fL��6lX�x��A�����%���]M���b1��E��w��7�5����dh��+`UUUU�X,f��	�w�}��O�g���:c���������O�P(�X,f�M6YM�W���n�������93�b1�B�����V��SO��~����L�81w�qG>���{��,�0`@f���SN9%�����Z?j���5*���>��|�[��y����-[.��7�|�l��o�ze\r��Q�2o���i��l~���=zt���d���7�g��n��d���EKQ�{��c��[��u�0����PU�HM�Z_�����<'�|r
�B��8 =�P��kW��������G}�T0��F����_���v�]w������E�J�W�b1�{�N��}�*�Z��7�8���K��$��7�\������������n����^���s���E]���{.7�|s:v���u&L(��������:����:555I����L�<9���^��I�&����l�2�z���]K��d���7�g��l����?NjT:	u��Cr�EI����"+a�/�:���������?�q
�B���y������SU��Z��������_*��p�
���O�>k�	�8qb�9��R�U�X�G����b�-�,.���kE?��<���)�)�J�.��9�l���J�W�B!p@>���f���������K/��k��|P�s����_�Bn���e�3k���q������P(�m��eY�<sYs���������-��e�7�g��	&d������d�4o?��}aR��t���|���k�Jh����$���~���?�]w]
�B����|��_��W_��=5559��#s��w�
��_�<����w����\PVXt�%����N[���Zz=n���=:���[���1}������_|1I��{��r�-�u�]��?������ _��������4��7��k������=K.�i���YW�,je�Y��
}Wcz�����~���;�A��5a��!K}��Br�����6��j2�S�N�K�P�t��&Q��$����3n�����I�?���Yo��r���/�v��E9��cs�������]w�<������������RyW�|�s�[���$4hPZ�j�$I�
����W���E��y���q���~�r���f��I���{K�?���r�q�-��p��ye�V�Z�;k�����s��]j���gM��&�	��q��[�L-,���N���]���V��-Nv8��I��&S�U]]��o�9���[^y�������?���������.�+�9��r��7���z������?�H���~:��MK����?��*�W]]���[/#F�H��=zU#�[�6m�9���|e��W�����W^����v����7��#�<�!C����K��c���+<sM��&�Z�����Q�M�%������d����,��++��f��`%I�r�]w�S��TF��b��o|�Yw�us��&I���/�/�K���{��������f�U,��o�]z��W�l���|f�.]J��O�����W��9���~�N�����+��{oinYXK�3o���M2wn��"/+���gM��&���N:��q���3|��r�!
r?�������[���6��y��+�P�*�J���{������?��L�:5�-�1�����/�����?��T~��K��s�=
R8�*&N��$)
Y������������4�����m��h�"�-*�u��1[o�u���}���
������,Y�4{��z�,�+U5g��������Kf�kVSx�����Wz��� g��2gjr��KfM(��`�d�������QU���n�in����i�&�B!s����!C����6����N�:�����6�lS��IU��jkk��)S��^w���A���%�6�h��g�8�l�I�x��	K�Y�����	������UUU�G�K����GY1�����gE��S6^^�SS|&h���Nn:5�:�|~�A�A?L�[U&4VM�+Iv�y����N�PH�P���S,�$����w��w���)���g���\���[������Q�F���><M�l�����:u���%�O�:u�5K�d�=z�5+���
6� m��Yj]��m��_��k�M7]����L����On;3��V�|�
�C/MZ��H,���]6���+`u:��C�������7��B��b��6m����o��?��J�+�p�
K����Q�Fe�
6X��z�����$I
�B��j�UL�r
�|�4�?~����7�l������d�����^�;�
����|o��Qewm���
~WS|&*����WnI���t��g��d����N����H�v�L&h��tV��x��3fL~���M�6���[3t��J�*��N;�C��={v����c�9���>��+�(����_��W�6�lS6?~|��O�0�l��{���<8-[�����$#G����c�������'�x�l�������*��sOi���O��N��=c�����#K��-[f��A�\��imTXF�d�X�@�����.5WUUU�$����������G���&��"����I��j�M	-Z�h�_]tQ�d����o������z�u��l�2���o��b��b~�������~��<���)
)
9��#6l=����ee#F���)S����^(o��&K����cv�m�������N������esx�r�p�e�������H��{o�x�������2�6�gZ-�H��R2�J[�������eQM��O��j
i�>9���k�J'X9u��U�h�>,�j�_�B�g��t�9����*�B!3g��g>��z�`������'��B��b���m����N[=���W�^�e�]��n���:�����-��R67d��e�=�����W_}u��x���2b���x�u���;����;��sz��Q����y����t���>���o����)
i��U���Y�*����3��-[�T�,�K7&���t���U�����u6�th��+`E>,rju=�!�������O�/��
������b�-��o}+�w\6���o<?,�7n\|������3�<S�^(r����g��k�Y>�k_�Z{�����K/�q����[�p�o���7�4���S>���,s��G��}�{�={v���G��>�=��c�����w�yes_��SU��N����|�_�e�]V�;���2d����<��e�;v��G���M���F;v����K�3f�g��Jf�����Y��s��J4v�&%O.��f���d�c+��)kQ���e������B�mOu�q<k�C=�F�[�hQ����{���"���o�Y�f%Y\n��[���;7s��-��p}�X�QG����~��_����l��V����]�;������~��L�<�L��k���&��g���.�h���y������K�������O�>}���G?�Q�������;w�����n����y&M������e����r��g.s��1c��O:#G�,���?�\��{��3�N���Z6�|����W_����W���s��=g��k������'�yZ�`A�{��,X��l~��6J��-+�
h��<7y����c�J�l��������f�6es�x����h�
%�1[���F[��\��;7_���s����
v>�#���jY>����������o����L����d���.���^{��?�q��v������s��W��s�)+c�x�������c����c��)<xp��W��`�
����<x`��������^�_���e�/����~��uz��.�(������N<����?(�S������o�)�����G�����'���Z�t����4�gZ�VGV�X�;�������l�2�:uJ�R]]��27�UU,�h����3'�f���9s��,��}�����B	����y��e�?��sXd��$�R*�n��vpkS[4�r���q�MS�������kN��X���S���t��R�4��\JPSdQ@QdY���#��<�s^�������~����K�s�6g�N~���s�| 9��j��>����g�}��*J��LV����<\pA�|��$����������>���7����M2n��.�(�������!C���xG-Z�I�&e��eu���j��y��y�{���g�}��9��#������766f���;wn�M��������sL~��_��k���+W��c���~����.]�d������&O���s������gn���p��uNG}�MeS`%����3m�����T�[�ny�;��-����(�f�yEr�'�W��>��o��k�^�J@{��
����o�_������{��Od����{]�v����s��������������
�������3������k������z���a����q�������+���^�O:��\~��\��������d����{��o��V���r�!�l�9I�|�MaS`%J����[l�w������[�Q�����&w��~��/'�[I�Xl����l�mI�����������~M�8��H���#��~��<���Y�dI.\���>���J�-[���~:�^zi>���l��WI���>������|�e#F��~���������$ijj�����������Z�����������l�����G�����r�
7d��w_����{��3����7�(�#�S{��W�6L������o����5Z0+�������N���j����e�	�$��l����?�#��O��$)�"�&M�����
�z�?~�����~:���K�>}2x������y����*g,Y�$����O<��s��{��:th��w�l����r�*�<�L���?f���Y�lY��N;��H�7��DG|����&��U�e�.]����g��Y�lY���6]�tI�>}��O����;]�t�:�������V�(��~��}��"���|��<��g��v�<���mWQ"6g-�}���B���fU���C�_�#����QG���:j����g��3&c���dg������z��t�wjO��H�=��G�4(eYf���i�=��f�(�444�(�������P~��=T~l~�u�����$��Cl����i�O}�S����:+;���F���O���/N������.kq>����H�.]���$i^���^�\�~���V�`]�u���W����0I�]y��)�"Ir��'��k��u�)����O?O�L��;��I��J������ZS�.�5jT�u�����g��)Y�hQz��]u��V�e��js��e��d�����N���lN���~n�N�{>TI�������r�y�����~�e����n����Zu����
��j������d�����$)�1g&EC�Ahw���t��?_�s�9����}�ky���*NT�����u�.]*L@g��
��6'�����k�����o�|�[�JY��9sf�����OT�R���J��O�>&����@�	X������T�`��V�5�u�Yill����L�0!{��GN8���p�	y�{��-�����mj���I��(2x�������� y�������t�QM�����d��I�~U'X�v_��������v}�u�-[����:W_}u��O�>���_�u����E�I�&�n�Ml��E�������4EQ$Iv�u��S��=�pR�|}��{r�%���.����g���`M�2%EQ�,�EQ+~*���f��Y�`��[l���V/�Z��O>9=z����(�2�/����S�e�����>����
�k�C����*�`��}�*o,�jI����Y�i���u���/���Ugl��v9���[���i����SM��v_�5l���]UaMyW/����Y�GY�y����o�1=z���������y�~n���dZ�j]8�)���)S�Ta����k����{�
����������;[n�eF��#�8"����K�V�
k3���q������@������u�u544���������
@�L}�~<l��hX�ZX�J���eYuXo��d������SM���U�5��zj�z����0	��Y�$K���m�:���:����W\Qu� S�7�#�7��,�/
Uh+.���3�p����@�0��������@�������r��������������{.�����]�t��a�2j��|��9����O�
@��bi2������T�hEeYu:�U��x��|��_�O��,Z�(IR��o�+V��g�����s�u���_�r>��O����fz����������d����EC��=��@��a
�{��w�q�4iR���(�E����������}/��zk�������n������z��)���^�Z�������P�x��I���d���XO=�T;����=;�k�WeY����������*�{���E�2{��,X������O?�t?���{���a�Z%�'>��7�p���jM�Z�,Z�������&��m�n:��������s��Gg���)��Vf5j��\z���4iR����g�}6��_����f��y�4iR~���d���KY��g_~��}��Y�bE�g]U��VkZ����j��d���s���$
�T�/����K���O���������������s���g��k|n��9���r�������O�~�j�������K.i����R����<6����d�o_��#�z����u�:@K���?��_���+�����{��A{|�c���o���Gg��%)�2�\rI���/�8�W\����jS��s��K�J��N�����~:�<�L��HQ���6��j��w�=��~�:��$��I����Og�vhQ�SO=�U�@��2��`���}��$�d�SO����/g��w']��a*�][���t����GI��e�������Nk�~��~z����e���I�G}��X�������~n���d��n�M7e�	'$�yhO���f�J�E�#F����E�566f�m���_|���������Jn�������y�)��F��U'��Zu��X�pa��_�~��g��}k��-j�=���w������������=�M��
1���������&tv��O�:�	l������!U��j�XL��e�����3f��]o��V���[y��s��7�(�t��-W^ye��bes2�O�s���&�fE��I�.k�W.Y�^��� ���&��Sh�gh�X[o�u�z���y�����.�l�~&L�+�Z}�M���9�kE^��
K�~���\�/>�,]X?7Ll6��qGzx`�1`�4T�%8��t����w����h������kF����������$IQ0`@��	j�C��-�I����(�s�����9��S�e���/��|�����.����x��)�"EQ���J�~�Z9������]���Kmr&l������]M��v]��$��w^��(��e�.� �{l&M��^�?�����G>�s�=��G��{���,�p�illLY��:ujf���fg��X�$��x���}��@����-u�A���O�5�\S+����[��_�*�G�NSSSv�u�80�{���E�2{��<��c7n\���?�,��e��(REN>��x��m���w�q�����'I����9�����|x+�?��\����K��=*�@;�������.���33v��E�$Y�re�����s�=�|v����,s������.k��u�=��\���?~.���y���o���<@k(��<���l��-yx���gNy�~���I�^��[�(����[n����s�9����_+�J^+�Z������/})^xa�vm�/���C��_�"�{l/^���:*���wr����y�cX2/��7��%+WT���f�>U'�=�XI��{�|�;���'���~�������l��u>S�e�w���}�c�������������i���w�+�\sM����>/��b>�����/��?��������#��_�t��m��6l�&J
l��6�|�)����]u��S����{��k��6����}���?����:uj������O�>0`@��Q�Fe��Q�������6��(���(��e��S����/��}����~DtF3'T��������;U�����`����u�Q9������A���a��kY�UF���3�N@G��_r�YIC���$�����Rx�����������0����������
�}���[A�_����wp��w%�B�S�f��SO�:���{!�~F��}���*�P��`=����q����bW\qE��d���q�F�W�����-���;g���9���s�Wd���UG���7`5n]M6���:l��Uh
/��B����\w�uI�m��&MMM3fL���2h�����y3����V�`M:D�*���i'O���/�<�_~y�d��v�br�!����16������
���HC�Z����|v�y�Z�U�E���B��,3q��\r�%��G>��f�}���g�����wY�dIU�6��3�����&m�o�k�A����~��$��Y�2n����g�}��f�B������O��?���K�n�����7MMM3fL��o�t���_�Q�Fe��19��C3z�������3C�2�������dX��,������i�2v���;6w�ygf��Y��z!���$���g8���3&g�uV��mhh�����{F�����455e��Q���K�e��h��	�e�]j��<#G��0@u��\��������XI6�����sk�����^�GW�N�%�/����|���;6����]w��9s��s}Qinnn�t�`����w��=zt�k�=�l�\�^(�x���%?����]�'�xGR4T�	�����������
���q����;���R�ey���7.c������,^�����N�����]�_,V��p�������o��$��r���
�v�i�6Nl��N���Z��y�4X�+�"#G����s3g����5+�<�H���,����������k��,��+����o��7��$2dH=��Z!�6�l�������5`lN:M���+���f���;vl����,]��vU�UY���+�"{��W��k�|�+_��+r���g���7n\����,_��M��e��3g�����u�]�$�f�mjeXMMM<xp[�P��3���C���6��/�K����c�������j��Tt��w�x��3fL����Q��k��=ztF����;/K�,�=��S{�Gy$+W�L������'���/���_��(�b����h{�����+�63���g����c3v���u�]y���j��Tx��{��5*c��ISSS��w�t��y~Iz���#�8"GqD�d�������2n���7.'NL��2,���;�~��u59�f�l{�?���j%P��M�������!{��g���2f���=:={�l������1�{l�=��$��w����������(R�,���.J�����?��(k�������n�eO;��S������r�!illl�����32v��Z����?�$)���d@���x�D��RI��j�X�+�"��
�^555e��������3'w�yg�����k�����F��1c��UD`3���>oK�nQM���0XEQ$I.\����g��Y�`A�-�Z�xq�����7.c���c�=VWt����#F����V6h����l�N�7n]M������Q�U�e���W^��7��o�1I2t���3����o{�Q�j������2v���7.<�@�/_^�����������Vz��6��ab`s����
���P�/�����j�QO<����?�������r�UW%I���w���=��466�q�5kll��%Kj�5^���?|p-��;����v`���q��jr�K�/�:��cs���&I^x���7��k��)I����������k~�����!���{���2f��x�����go�,^�8EQ�e���g8���3&MMM�k�����PI>�}�;�~��)���zk�X�2dHN:���t�II���'g���7n\��������uS���y�������������[��5�V8u�T�EQd�=������q����w%9���yE2�����[W�`]�r�F�n��	7n\������;s��}���o��EQd��m�����v���v�����;c����1c�����[�nm���	&d�]v�����9��Dmo��������q[��5y���jl��y�j���Czp@���lZ�����Bm�F������������/��������5*���WeY��{�>���_�~��W�Z�|y����\x��ijj��r��G���.�C=��9�������������.]�P����g���;vl���?��O�����r�-Y�re���?�r�{��Y�dI]�����s�w��;�H����?�rH���������NU�P�y����C���e`�:EVY�y���2n���;6��{o^}���c�ICCC��g����>����,[�,��w_-��>�����b��;7��rKn���$��!C����1c�d��1y�;�Y��ml���q����x+�k���;vl��������7o^�����o?�d�B����|��3fL�^����������.� �-�=��S{�G}4eY���9sf����\{��I����.��_�z�
��^?���Lu��)S�d��q�r�Y�f�����j��^�ze���ijj��1c���{�i���w��9���r�QG%I����q����;����c��SO�(��B�I�&Uhcsg���V������O��7n\�L�R�[W�U��������
�F���]���a����G?�=��#���[����������EX@�V�����s�`��������.�,EQ��^��e�.]�d�=��^�=:={��8u�����;vl���q��e��i�{o,�:�%s�e�����$
�[j�XoT�eF�Y+�:�������c���y�r�]w�J��|����U�_���W����{�mX��f���$}U���t��#F�
����������H-������{����c3n��<��#Y�re�7^EQ�+�2;��c��p�!�d�������N���4t��:�v�cL�2%��
�:F��{��7n\���?���Y�lY��.�>|x�����)C��$?P�y3����V�`}����P~�$x`��H�z���
�\+�jjj��#*�l>����q�jr������������,�466��C�^����U�6Cs����+�6c
�6#eY�W�^9��k�W{��g���:���7�~�8���C�f����OSSSF���]���o��d�K�s
�:���:�7MK��s�=��@;5����o��9�WC�h������$�{U�`}(�h���������X_
����3���C����`�s��P��_��S�����^?n����K@;V�L��������)�h���4/��kZM�����7�~�u���V�dX_
���������N���,�K@;��,��]�/������|���cTb���q��jrP���:l�v_����},o�����>>�`�q�����cX@{����d��9���Q�Fe��w�������1��h����[(�o]M�
�!
�V)�2O>�d�9��><Gyd��������UGhuK&����kZM6EQuXo]��R��zjn���,\�0IRE��Lsss�����q����o�;���r�)9��+N�fW]uU���#�����7z�^x!����j�SN9�E�����o�(�~C*��A��RW\qE^x��������;,��iW��,���??�_~y9��l��v��7����'W�M>��O����d>��Of��	-�k��	u���7`�}[��{5Y6D�/�J�^�z���������.S�N�����7;��c��LR_�5y��\p��~��s����+������_�*����y�;�~�8���C`�n�������L�0!<�@�8��l���k,������O?=C���������o��4jU6��1�
X���&���pX��{��������1cFn���{�����k���+�Z�xq����u�Q6lX������'��8��[��K�t\sg���V�`Cu��U�u��c�=67�tSf������^{�U+�Z�k��������������-�p���u���+LlJ�����+���NQ���-��2�����<���8qb�:��:4eY�(�E��,k�X���������*Ll*�+�������&���Zu�*���������[��V����+g�yf�.]Zu��<yr.���E�$�y��+N�G����+�g�'���NCki�?+�5X�����s��V�`Cu��y����?�y�����w�}���O}�S�����/�5�\����e���g���y��G�����,SE=����tb�wr��U�6�}�}�N�~:]���+����&W]uUn���,]�4��~�MQ���+��r�g������n���{���'��r�F�t^�+�?������r�dk@��4X�>�h����\w�u�5kV�����,S�ez���c�=6��zj�q7����U�q�Wd������g~�,�]u
`C]�}N�:����X/��b����\u�Uy������^�^|u���SO����~��m�L��o��5���K���w��#��g��v�a��:�Gn�zW��I�di����O�l�hx�����U'X�k�����/����*w�qG����Zz5|���r�)9��S��v�m�l�'O^�|Y��v�mS��_t�\sM��������!�{�N�~���k��-����������sR��a��`�����u���{��'W]uU~��_d��IRW|����O�>��G?�SO=5�rH�f>|�z�<x�z�hM��T?��U����d:�v_�u�y���k���)S���^�*�J�����z����G?�^�zUw��
��(�$={��8
��:?y�w�s��t�VM��j�X���7kEW��^�e�v�!��zj����.�|�;���N�
������K_7tIv=��<l��(�����`��,����?���s���f����:@�P�L�e���'}V���:DVCCC�8���z��9��c��[Ti�-[�,��wo�}o���~����/��L�c2wz���&��5T��.���<��s����r�������$�w�}���O��~���9����������:�Gn��m�d���d:�v_�u��gf��!U�h��{,{��W�����5u���=:_|q��l�t@G6��d���s�4)�j�_�/��H.\�O|�9��S�x�������E��c�<�������e��~��}���,�	(���E��,s�5�d����c�=���������g>�N8!s�������s$:��K��o����I7E6!X����JY�)�"I��SOe��Q������|v����g�}r�e���(�2#G��<������'K�6Q$�}��8@'�������K�������_���s�t��
���SN�������n�����O~2�g�NQY�ti���/d������+������~���K_�R^}�����O����~�=z��;�KY&��X?7bT2���:�U��x��\}�����+��#�d��-��-�����`}���t�I���{jeV��?���w�=�^{m���$����s�i����n�_%I�~�r�������k��@�3���K���v�H5Y����������}���w��3���>�����,�
�����*:4w�yg��_�%EQ����M��C9$������?>���{]�UY��w�}����*����7���o�����,@��!
����7�vXf������U%R����vo��*��Vihh�\�;��#o��k%W+V����������)S���u�Y�������W�h/��<}W���I��)s`s���-5s���x��inn��Xm���9���2b��|������+_�v�m�W^y%&L����<�����;��s���/�K�.����9��<���9��S����&EQ�J�V]4(W_}u?������,z%�;��l�'oOV6�>��E�������[��������|�;�7o^�����O�%�\�n��%I>�����y��ijj�����-���/��y��g��O��k���7��~��������������;vl�/_^{��,SE~��*����er�eI|]���I���c�@'������W\Q+�z�{��K/�t��/�"�{l?��|���w��������G?��o�}S�^o+W������|���~S�nQ)�2'�pB.����s�9��<����?~|�|����3'��w�;��������v�m[��I�&�����?�e��e���q������G��vNG|'�}�;=���U��������I�.�z���3g��$�B}��_��}z���[n�%���[�y���7.��_���}�s�w�<��s9��s�}��,�Z����n��K�f���)�"+V�������y������3x���2o�O<1����]77|��L�2e��z���r���+���E���f����������c����57�|s���o���^��>}����D�;��8p������o~]uZ����A;T��+���z+��,��������|��I�n��e�����{������������������n�����I�#Fd��I�(���r�-9���2g�������?>?��O�|���z������j��d��A����r�GT�{c�z��9����4�1Xw�uW�;����������SN�O~��7��y+K�.�i������g���mo{[n���t�AtN�1�iS�0aBv�e��������#+L����'�%g�>��{�e�>��f�(�!;'G�����Q��'��I�hQm��������V����%�/]7U��0{��$IQ1b�K��j�,Y���>���W�^Y�xq�L�����/y�{�����a���9��3s�%������G������O������zk������s������$�f������|�K_�����t�����o�y�������[e�?��y�����������1"s���s�=���������*.�
7�P��d]V�\�������[���t��a������<yr���W���K/�}�{_�������~�����o��������'�v�&�SC�Zb�����qM���S�e�d�����o�-��6�lS?���-����y���5����,����Ny�����V����{��7�n�m���+W�;��N8��L�2���o��|�+�>}z��~�6��9s�����(j���������+��������3e��|����{���n������>���/~SQ��>��L�6-�>�ly�����+����2l�����������+��l�t��V?�.�Wl�v]��zi�������o������{�-����O���^hA�
���{��G�+����>��z(#G�\�s{��Wy���t�Iu�>���c�=r�����;l����+?��O�$


9���6z��/�83f���G�������c�IQ��w�������\x��u�����9s�����g���o}�[���~�����6������?~|]����?��~�������o����{��F���,�o���mo{[�z���k\3l����c�=��{��9�v�����tf�����>}��g?�Y~����g��o�l�>}r�5����.K��=SE����y�r��'n��e��%9���S�e�����|��g������^�������'?�+oz�s�9'tPm<o�������[���o;,��:���}��k]?t��Z��*����2{��u���	���=i^���K�d����@����v�i�$IY�y����r��7��m��jk�����X�b��=��y���RE�d�������,�����y���7������dz�����.�r�������d��II^+(��������������:���3f��E���;�n���/_��l������+���?������3fL<���x��������LG|'�c�����v������@����v�y�l��I�e������z��C=�v��K/�G?���*�2_��Wj�I�����v�u�������/�m��F����;����>��VL�z|��|�����/������g�����[����v�z=w���f����/�����������^z�6�v�ms�!���Yo�t��7�s}G|'��{����7|\w�T����]`m���o��j��o��Mk�>�����7EQ�J����og��y�5O>�d�9������NQI�!C�d�}���/�7��rK�����[�n-�k�-�����p�
illly�V�|���v�iinnN�w�q��?���-\�0w�}w��G�^�E��;�n�W���Z��v�mu��?��g��~��u����+�-Z����N@������}��o��������$��^��Q��r������3_��WS�e����e�r�9�d����z��3p���9�V�j��g�������|�Cj�=?�����Gi�}7�������/I�466�����[���	�|���x��2d�z?���}����}��������z����6�����-������#���5/O��]������.����k�X'�pB��HY�������O�i��g��C=�VnU�e�����/��W^IY�I��(�$�������m����a����$�8qb.�������.��b�5y����;��A��q������Y�����������s#?����^�}���C�������<���iM��]s�m���SO��/��Vz����3��
7��&�;��+W���N��e��$x`>��O�x���z�n��w�s�����S���W_}��%K�d��i�z���m�#���=~[�x�n��wT����k�Z�{����\��G�\q�����\���������/�,�2$���N>������n���g�����o�{��'O<�D^y����7/eY��k��~��Wu������������$��w���^Z+k�Y�f�����
�������k��X�"�kE]�g����C������)��6���[
�Ag�q�7f_�|Gx'�}[�r2����]>PM:�Q��!v�m����nU�X�9s����F.���,\���^Y�)�"K�,Y��'�pB~��_$I�
���'o���2y��|��_���9����������6�{������H��=�`�������^�zmp������5�w�w��f��K/��A�<��3�v>������+_w��������+���F�tX�������O���?��o���!�D_��Wr���'I�M���c�f��1�$����g>�E�%Iv�q�|��_m���X���G�
�cc��6��u���gmN��1~����.h����S��������)����<t
U�u=�P�8��<���u�EQd����B�u�k�����{��7�pC��\_�]vY����$�����^����������j�xc��b�-��K�,����<�-�	h�f<��y�~n����@��k3�p��}��Y�xq��,��5*��rK����_|1�kERo���hm����w�.�:��93_���k��O?=x`����G����e�6x��K��s��<�-�j�w���o�xG2t�j��a=�6]��k.�������������������
�(;������}-I2e�����2dH��}+�����s�&I��o���~F�>}��������d��u������Ym�N��3��q��A�<��39��c[-tv��$O�����?@�P������\+�jjj�~����k�]wM�.]����$�8qb�`����/����?�A[��7.-Z�h��/�r���/^��,k�_�������#���4hP
�j���w�V��J���|Teq�`�@���g��Y)�2I��o|�E�m��y�;�QO�<�E�m��|�+��|�9���7�9o,Hz���7��_|1+V���2p��7�8p`]1����3k��
:k���u���;u�w���o�o�������@����$'N�]0 ���_��lll���S�$���k�~b������n���hi}M�:�M�=��#�}��k�w���u��M��Ag�q������G�7����g�
V�z�zv���}��;���u���x�.J��7Y�r�IZ��~�)��,y����]>PI:(X��Y�f%I������[e��K��.]�*{nn�X��z���x��'�����^5q�����>�~VG|':����?���k�IhK=�'�Pu
:����477���t��*{��3�v����*{nnF��n����S�L���3���{���n�����u���?~���9sf�L�Rw��-;����v�w�c�����:��O�v�:I���4(IR�e^|����l��L�:�68p`�����rK�/_�A�<��c����\<8�\sM������n��o�t�A;vlm���o�)������e�;���n�C��Z����E]T�q�)�2EQ��Y�������zh���������X��m�	hk]{$���t4
�6C��]?����5kV�kc�{��Y�tim<r����P|�?��k��=z���{���>������.�l�������L�<�6<xp��w������3p������I�g�}6w�uW=���<���.�s�1�\��	��a�+�������s��_5y6���9��J���{>�l9��$t4
�6p@��b�,[�,I����,_��7z������]4(;��s�3n�N8��|��_��E��$w�}w�������>S�e.�����O~��ihhX�3


��'>�����]p�9��CRk�����cs�=���}��������	����;�r���n=��~��_6���qh3={������,S�e.�����={�����[s��7�(�E�c�=�u�nf
����O������3f���o}�[����k�����+_��[�u��g�O�>�����\t�Ek]?}���~��us_��2p��u���	����������
�8
�6_����$EQ���^��G��s�n����or��''I��L��]s��g�v���Yg��!C����'O���������IY�����>����j_�U����e�-�|�s��~��us��sN�8���r��+W���o�����)S�����z��y�����h�^����D��N�W�h�`m&8��|�c������e�]r�e�e���k}���9�����'����>:,HY�)�"�����m������:[n�e~����G����S���c���[n�=��3�n�m��f����?�{��c�������>�����?������G6lX��n������j����8��M�����g����466v�w�}{�w��^��{W�������@{�k3r��Wf�=���`��1#���g��V[�=�yO���}�_�.������x�����������(�$�rH.���j^�tPn���l���u�s���#�<���'������I'����������hhh�/~���p�	u����y��g��#�d���u���j���������	���,�\���aIC�j��_�)�Z�paf����Ve�z������79��CR�e��HY�Y�|y&L�P[W�e&N���'f��E�R�U���������e:�oo����)'N������W�^k]��{��o��~��l��|N�=r�u���n������u�{��g���'��C��s���N�?3'$�f���tD5Y���(W�'u ,���^����;���{��477��w��%��
��Q�r����OL�>}*L\�,�|�����_�W^y%�k�V�Z�$���9���s�Yg�s}g�d���?>O<�D�������g����w�}������Y�<�L���?f���Y�lY��N;��H�=Z����N�i��	�e�]j��<#G��0@�1����7�>�����&�����{�W��K����<�@z��O���lZ����
�/^������O�E�%y�jMV�D���'������o~3={�l���c��%������_�:��{o�ku={�����:*��~z���WAR��,�M�yE�_�$��{}n����>QY$�FUkI�K�M��=��c9���2i��Z�UQ����)�2,������z��������n��E����g�|����g?��$��/����gg������W�!C��k���lf�����*Iv:��,@��!���z��v�a�={v�������a���7[m�Uz���E�e���Y�`A��U��~��~�����{��;T�.�2x��<��@'�����o�%iZM��h�:@K-_�<G}tf����(jeV�F����^�I�&e��yy��g����%�>�l����I�&�'?�I��o��eY{���_��G�+VT�j�Z�(�tO��N�W��X�V��.���<������~����K/������F���N;-��vZn���|��������$��_s�%��_�B[�B����F���SN�6�l��{M�<9W_}um|����$�I=sw�b����.�����t����?�a���W�^7n\��s�
��c�X��~��=:K�,IY�m^�u����(�$����[T���������O��~���I��d:������O?�g�y&IRE.���
.�Ze��w������,�$�&M��O?�jY����7����c����?���tD5Y���]`=��#I^+z���[N;���w����[�n����>���6TQmz��<56)W�>��3�ntuy���]`��5+�k�Q#F�Hccc��kll���n[����-��*+W��i���v�[Td�o��;�t�QM��i��H.�]����U����o�z��E��g[�7o^��w��&���S�Y�����J�T�.�8p`��,�L�>�U��1cF�z���j�=������������z�w���[%���&�1�������v=s��<���-�o��	uX���^�}�������(REv�e��#�HY&O�^?��aIC�j�S������]����9Ir�����n����?���u��]3z���F�����^��<��0`��-�2�/��)S���/������G�QY����K���:Uzej2�
v:��,����:l�v]����x�����;�$���/��o|#��{��u����oLQI��:(���k��w�uWm�5)��/���7x�r�1Yu��A�r�I'm�^tN^�����l�:	��-�I���@G�Pu��:�����V�T�e.���{���4i�z=�����#�H�=���I6�D�JEQ��������s������'�=��Br�)���v:<Y����(]��RtPN>��\s�5��[o�5����2z��455e�]w�����w�,Z�(�g��c�=�q����C��LY����O>9x�&���`��kVWEz���-��2#G��G�SN9%���t2��+�N���K�d�#�N�z�
hG�}V�\v�e�9sf����o�@�r���s�=���{�����WeY����e�]�Ir�\��O544���~��ijj�$���2������.IC���!���d���~C�NtD��)��u�m���s�9'����k�V�kWk�z�UCCC���/��/L���|YV�
me��d���s��g2�=�����XI��{�|�;���'���~�������l��u>S�e�w���}�c������������AT+�0`@e9�|&�o������T�����`����{��k���y�r�}����c�N��9s�d������O����g��Q5jT���_u��u�]UG�Z�,y������J��3`��pX����?GuT�:�����f��{����v>��,t
U�3�7��w���{5Y�<`@'�xN2���s;UM:��U`������?�)?�p�{����7/K�,IY��OQ����6QJ��'nO����]�H�uhuy�<`mf.\�/�0W^yef�������T��ZM����'�{U���e�-��6m����
�^�Z�����{��}��y���S�em�(�6�@����d�_��v~_5Y�|6��m������(��X��-�������L�6-�~x^~�����J�V/���0�7��>oK��YM:���k��-j�%Qg�}v^~��Z�WY��w�}���<���{
���{W���`�������v:"i�RM`#�����s���:��s���nHQ)�2��w���_��N:��ht@SL���yT5Y��6��SO=�U�m�~������9EQ�(�|�[�R~�&3����wL�QM:�����+�h�u����{.IR�ez����}�s'��Z�0�tO����U�heEQuXo
U �?~��(�������g�������X����k��1���sR��hll�]����� tx��~��~I��J���)��������n�m��6�m�]���e�]j�3g�l�~�&s�'��\?�����@�������%K2e��$IQ-�o�����[n�W^y%��O����3b�����������m��&�[C�H�v��/|���~��
���+�\���aI�n���s�Zu^s��g���n�c�=���Gy����#�<��X@'���#7$gW��M�yY2of����U�`m&�w���n�-c���SO=�������r�g�K�.U�:��/'7~)yuA�IhK[n�~w�)��`m&����$����/g�yf�}����?�S.���|�#��{��A��G���A��q�����_uF#�J���tV
�6�rH��>ITE�����?�������}����+Z#"��X����NA[��u��1U��3S���)��V��z!VY�UE:�'�&K�����L��G%qh=�mF%=�V���L�fdU���+�-�e��
�s��N�=��<@��k3q�y�U�df�%�����=>VM�sQ���P����o��{��~�d`#�e�	`�5T���`V�����v�h����<@���z��I����k�d�T��\`t2��&��O�����}��@+)���zS���<uG�����=>ZM�s�Zu������|0��M��9s�`�����7�������{�G�U����L��~n�>�V#��tN
�6SK�.���^�K/�4���������]�v��{���|�39����{�6L
�'�����k���&�y5T�7��o����.��~zx���X�"eY������s����S��T��n��~��U���z���q��d����t^
�63���7����?3f�HY�I��(�����eYf���9���r��n��@�2�������v�HR�$���V�����?�y�������g���{����n�e������w-Z��_~9�=�Xz��,Y����s�=7[m�U>���U�>���������q�����W��`m&�M��3�<���j��!9���s��'�o��k}v������ks�d���)�"eY�K_�R����g��am��fj�����S?��QI��4	`�i�:@{4`��|��9���s�A�����{n�.]Z755��'��g>��u�_%I�>}���|&O>�d?���e��(�t�������h���=yu^���&@�����>����Yg��w�q��z��'r��'I���e�]��u{��g�����>��V�X�_���)�"eYf�]v�o~��t��m�����o~��_e�����	R�en�����'?I�.]Z-/���e����s���l�M%q���W^��(�$'�|r�
�f��Q���
�Z�����`��$�o}�;�����U�u���|�;9��#�$,����s���Z^:������,]Xu6���������c�dH:@V��eY+���{+�'O�]766���k�~�vX�9s�$I�}�YX�����}&yu^�IhK�C���Ntf
Uh
mYV�)��5+�k���6���}������k��^z�E��q��*�W��M���1���,��#�F���477���t��f��~����[e������o3o���d��V����wp2��U�:��U�����+��>}�����
J�Z����S�|��t��m��[�|y�L����`u���4/{}��[��A��a��;(���d���x�)�Z�����$EQd���mv�;�P�^�pan���|�#���n���,X�`��@�,_�Z��v:"9��j�-WE�`�5T`s�h��\u�U��OZ��]w�����{�����*EQ�,��y���?�F�5��|��_����[n���������_'���#*{�PM:��UX�n��z�;�����G����,�,^�8�g�NY�)�2�k����6*��(�"������0EQd���9��C�?��?:t�z�3c��s�1�2eJm�O<QK/uV6'�y����'[��&�O�(��2eJ���T����^x�E��:c���������6�y������:.LQy��G���;�K_�R>��Od����p��)���+���~7�-��G��}s�����[�<sw2oF���'V����]`�R���V/�Z����j��,��w�;7�xcz���q!7�������'?�I'���,SE-Z��������f����u�]3p�����;�-������c�e���������t������8p`�����L��~n���;v�$�T�(�6l�Z���N�Z�7h��������*�����' �$t�)�4)* *�+T��+`�(v��,�(E,i�����{I�%���@�d���r�@��d���}�y���Y{�o'�����*�jhhH������l���o��r���K�.-�{Ey��y������Y�hQ��*I�|��Z������,�t��5?�����~����><�@����s;���g��JiXO>��R_khh�]������{��
�V���?>�o�}�=���?>I�Z������LY��j��r�9�d�m�m���/w��~��:��{T��������}eYV�Em��vy��r��W��#���A�jWK�4hP�<������}����
�%��d2������J��������_]=zt�z���&iy���_��o�$�SO=���z*/��R����>}�d�5���a�2l������}a��G�d���d�sk�X��sN�Z��+����������><����<tn
UV�{��4-|c��k����@��:��&�_V?��I���X����[2ov���GU��������I�r�����_���33����+_��*H�d�&M����������7��n���>7�tS-wQ9��������XN������/���`�d��J�-�,�N+�C`=�����O�s�=7S�Nm�~�Y�u�Yge��1)�"C���;��R�����y�����3�$I�>��|��_m��@gR���$�?�����tG�}���$�������j���:L�\�O���3gN�e�VbQI��5EQ�,����r�%����9��t��e��ill�1��o��I��.�H����c2��U��%�="�U�)�����;���=:�g�~�kEQ�������\~���[��I����O���vX��{���_�~�����s�5k?�s��Jr�o�NAK���I+6�Z�0�v������������d��LQ)�2���{>���d���9��j�Vg�yfF��3fd��	�����[o�5�kEX�o�yN?������U�a�����=zd�m�i�~[o�uz���y��%Ix��<�Y{��C�&��U���4p�d�QU��P�u���g����������z��K\��6�d��������o������'���n�->�`���/���G�F=��SI^+�6lX��_�.]2|��<��CI�'�x����g�_������ZM�V��?���d����.U'�v^�����?��O)��~�p���_j���l��6�����o��o���~�|0tP����t��uU�~���g������"{�y�Y�f���@�1����������d����t,
Uh�{��'���J��L��r�)+�OCCC�9��l���)�2<�@�<�����L�z��]�TY��K��t�����y���q������&������z�cF�w��=��c��.\�����o~3IR�e~������V����}��g�}�������O��k��f��:��������yP��XM��i�X3f�H�E���_?

o��(j����[�~���OV[m�$���Ss�]w�`��6lX�z������[���m�����g�����n��:�G�O��y�D�lypeq��]`���+��~��-qM�>}R�e�d������K�.ueT���o~����w�+�z���u��?h�~o��[�n�m��������K�x���jkW����uV��}k����_���V[�v���O���=z��]O�:���_��]���{�,��e��.�,]t�J�u����K/MQ)�"{��gz�������j������m��J�X�.�Z{�7>Z���_^��
6��v}��w����'O�]E��t+��_�b���,3z������]�=~�����c�����}������{��l��J�X�.��|���$eYf���Y�p���l����5c�������������������5�\s�^�]v�%���S�e������s���g����e�]������j.�������9��2��$�ir�!5jT�=��-Z�L��~n��.]��t\�Uh�M7�4}����9s����	&d�m��[��~���?�i����Y����|'���7�����������IR+��~��[�1j�=��<��C�8qb��HY�;vl������l���4hP���N���~8�/��]�eF����?�U����7&sg��myp%Q����������w��6���k������A���V��o;'�xb���d��9������w�;��~{��H�l���z��[�A�O�>}r�5�d�w��Y�����)'N�
7�����*7�pC&N������e�$����w�9W_}u���������������&�?��(,��{�9�G��+I>���������zccc���o�
����/��l��6���g�����:(w�}w���(���~���
C��M7��������W]����X�{�\Y����ON=���;6�n��@���s������|_5Y����`y�����K���w��;���mk�;��|�#��[%�F�����R���'���|������v���|�;�<yr�����=�yO���_�{����������<yr����������@�4�����}����$
�	����d��iijjJ����{���?��l��F9��32w����^�e����/��9���Wi����k��SN�)������<����1cFf����}����Y{����K������E�����m~@��{5yXIEQuXn��+IV_}�w\SEN;��|�S��W\��n�-/��B����k��]w�5�~x�������.]�d��!2dH�Q�f�m�����<��,@��!
�V��A�r��������:
@�0�/���G$7�&�94T�����<qk����T��<`tb�J��o���L6{Ouy���������{������g�m�]�������|��I��(�������#�?'y��d�������K�x�}�n���t��k��1)�"I��K/5k��^z)c��I���������������NBK�����AC�ZBY�UG�N����_u47L����@g�!
����:t*�$�_Vu
Z�N�����,Z��v�������&��T?��I�!>���i��l�G���U':-Oo2m���u�>}*LmWY&w_X?��v��?�&���]}���_I��(2d����@����������?��,�O�UhIEQ��=s���O<�K.�$��~m�������@�p������M6���,�O���K�.�|�,�$�>����s^��(�~����:���I��~n�#����<����{��=jX�r����]�$EQ�(��e����.�z�J����$y�����I�xoeqh�����E�J�/�2eYf�����W^�.]�������?'U�����n���@��Xu��1j���`�p�
����r������oCCCz������g�-������m���%"@�3�����o���d�V�x���/��vQ�5f�������P���~�����@��xQr�%�s�JV[��<�o
����+�����=~s2�������&�_c�����N�]o��&iY��O�u�]�{��7�'O��Y�2w��.�*�"���?WQJ:��/��="�e5Yh�:TVG��O�s��\����d������,�E�B���^x(y������H�H�����:��.�,��G3o���e�$
���������l�w5Y�:m��9sr�����_�k��m��&�
�,��7����:*�-J�Z�UY��",������Y?���.��7h	���Q����g�}�6^{����W����7o^N>���}��Y�pam���!�rH~���d��!�4���x��Y�hQ���[�n=zt=��l���0`@z���������4Y���qc�d�C��@����~�����SNI�466f��IK-�Z�hQ��w��r�-)�������\~�����[r�M7e�
7\��_7n���7�V~5t��\s�5�t�M[-������W��m~@��_5y�8�}�����Z��!��!C�,u������|��)��V6����/��B=���������*��$w�yg��,�E����7���Na�����Y�W��%y��d���s�}��,t,��k�������SE���C]���_~9?��������wg��v��/��K.�$�f�JY�y����_�2'�xb�<���Sk��
�{���V9�J��'���L��$,��;%��:AC��c��	Y�`A��j���Z��K.�$�g�N�E�SO=5c���w��������������Z�V���_��U�!I�w�^�5t��V;�J�����������Q���I�&��W_}�2d�k/���$IY�<xpN;������o|��2�x S�LY��n�
6�]��3�U����k�N���}2l��Su�����5V�9^/�*�"�^��E���oLQI���������y����'?����$�}���u�Yg$���w�;���Y�hQ�x����;7={�\��T����'o���x�d��+��;Xc�d�}����;4[�.�z��Wj�}��]�����/s��I�ZY����u}����������'I�|���������/�8����%�\�c�9�U�n-eY��'���q���3�d������{�Xc�l����q���G�=s���������#�d��Y���g�
�]w�u��i+c��	����3e��455e��9rd���w�����1���@���?��Mo��'|)����L@�i�-6eY��.\��u7�|s��k���y����v����Y�f�@��s���������9s��/})���_�Zk�V;Ux���r����������������K]��k�t�A��g>�=���Y�>����W���.�(,x��EQd�=�������5j��)�2��sN������GY���S��T���/�w��+}VG|&:���o4J�@�E�	`�5T�9V[m�$���<���K]w���'y�$h�vH����������~s���������C�v����{.���O|��V;��}�����k����������Y~��V`v���g�=�����W�|���.���#s�,�(*y��u��1�s�=��/|a���g������?�w�R���d�����7�����*&LX�s���Ltn3&'�������_M���k�u��]O�2%��M{���s�����K�M�{���2�|���j�}��i�������5�\�A�e��	�n��r����/�K�}�����E��~��v��%���n��~�l��V����������w�}3g��:���/��G�W_}�n~����n����������J����������
�3w���������k���u��M6�$[n�ez��]���I���^{��������������,@5�u���n�$)�"eY��.x��?��y��WS�e�d���Z�~.�3�<S+Zg�uVA�e�c�=r���g���?~~���������C��g�t��e��[��j��W��'�����*/��R�~���u�]����3}��\���}�������;r���.��?�x����-�/��m���������S�������O?�|0��������~�K/�t����g?�;���6nhh�����<���y�����d��9��s��k��M�6-Gyd���:�3@�8�xM���}����	��v]�5t��l��VI��,s�i�e�������������o������s�=�������`��ZY�Fm���/�����l���y���j�^�������s��g������~��x�����o��.]�d�=����_�N8���?����������/��y��Wj�w�1c��}[����n�K.��mg}�s���E�����z(������.���|��_�+����[�=���x��Y}��k���{o�?��N�L�������F�_M�:��+IN<���e��(2g�����^�b�-��6�d�w��i�j�w�qil\��_{�������g��7o�G����>��|�#y��gk�UEQ��V���oi_����������K��=�q}�.]����<;��C���g����N�0!^xam��[��w�yYm�����(����?��o\�{���s�9���Y��vZ���j�c�9&G}�R�o��9��3������e����<�#>$��k���Om���@�U��7-�SeYf��w�-����(���y}n���?~|V_}�����N;����JQ�m��2v��U��
��{n>���'y���,�444d���0`@z���R{_��-�sU����s��G����/���{N:����?��?�������{��~���������w�i��~��K]��K/e��AY�hQ����{��l���<g����`�
��SO���������}o�z�Um��	9rdm<~��l�������O�:$Y��s�2����eh�lhH����x =����Dt6��}i\U�ZKQ��_��C9$7�tS�|Y�)�2k��V����e�_�w�}���$�w�}Wu�����|�K_J�F�-��"_���s�A�w�����j���{�x���y��W�Y�u��W���\�,GuT����+����o��y��y���2x��%�����jEQI���{�cQT�444��������~�6w���/�,�#>L����*E2b���j�:@KX}��3v��\x��9��#���[g��7��{��o}�[�8qb��~�e�q��g&I�4��Cm��I�o�1�?�|�|k�=���w��#�<�S�_%�k�����_~y��~��<��c�q�������.�Yo][�e�������k��������B�����K]��	�d�5����%}U��Vc�Z�G�#�8b����/~����g�q�~�Z*�;7n\�������Yg��=z���m���>���,u�}��W7�i�����������[������������*I��~�t��=���O�<��s�6mZ���t�g�W_J���~n���d��Pu���o�����_��5���+�����g�M6i����o��n<l��t��m��|������o�B��u�[�{�����c���Y��w��n�\gu�g����,nzc��=�d���S������K�.���K����k��$)�"l�~��o��������?�p�x���[��������n��IY�hQm��g����������L0����F��n���T���M�TY�-����Ck�3f�h�}�����o;vl������{�N�Z7^w�uW��!C����M��\�����9��{.m�#<��������|�j�m��6`��wO���3c��L�4)��M�������f���O|�us�vXv�i�e�7g���q���W����_�pa���������9K���{��Ym��V���S�Z��4�=�X��
@�{���q���������e�	`�)�j�v���}�c���~��,s�Yg��_�r��Z�������~4�<�Lm�_�~��O~�����p�G�+tv��=���;�E��9K:ky�:�3�����������"{P�rq2��s#�M��:������N;-��
KY�9���s��7W���r�)����^7��_�2����;�;o���q�n�V����B%���s[��%���sZ����Lt^����~�~n���d�XmD�~�r�5�d��a�;wn��������u���:�*����$?����>�������Z��{��Q7^�`�
�?��w��%�Y�YK:�%�j��@�5�������AW���+���rk�:�;vl���3��)���'�|2���'��o;�~x��~�8p�
�F���q[����|�3���;��cs���/�}�����7o�2��;��l�s�t���i����3��O<1Gq�
���c����k��h�'�\_?���~�P��f����)��[�EQ�,�<��S������E�E��D�����5�G�NY�������9�������[�^y���������K,k�9K�gy�:�3��A�e��A-�P�Y/$���L��$Ti��d���T$#��,��(�jc���@����EQ����_�#�8���k�}�����t��e��zkI�3�<�B�?���u��.�9o�oe�ZZ�SG|&�s)'W|1��H�Ihk�n���#% IC�x��%WeY��������s�!�d��y��]w�5�]vY�u����m���u���'���o]��f�-q�l���7������i�����:�3���w(�b�F�_u��h|�%���N;����<������3gNmn�m���������{��|k����W��|p����k���p�
�������{,�9�����I������L@�r��U'�-Zk�d�}�N�
����^����g�}��K/�T�1bD�������o���f�m��w�yg-Z�������������[_{sY�-����eQw�}w���_���:4h�R�y���L@�1��d���s[����<�
�$�vL�U�h+`��=��S�g�}2u��������k��6l���m�Y6�p�<���I�W^y%��rKF�������+���7�}QE>����?���s�����^{m���/.W�k���n����o�k;�3����')�w����I��U%�-j�:��)S����'�<�Lmn��!��?��!C����rH��7���r�w��f��9��;����/u�����7:����I�&��9eY��s���;��C�yOG|&��[8/�����)���`����1#���o������s���f���o�s>����(���O�S|��e�3o���~��us�w�2����;����,�|��_}�|���o���O����
�>����{:�3�C�%�f��m}x5Yh�`�J��=;p@&L�P�[}�����##F�h��F��#�<�6^�`AF��Y�f-q}Y���g>�G}�6������;����}-

o�c����.����~���9��������/�[�n�<�#>���er������+Yc�j���)�b�8��Cr��w��}�����/�����n��^z��w<����fz��U�y��5jT��S���G�?��������?�����k�w<g��7�������}���W�����.�����w����9sfm~������������L@����d���s�~��,�}EY�e�!������w�}�$EQ�����DmOQ-����_�=������O��?����[z���:th�N��g�y�m����g~���,w�W_}5{��G������n��e���O���3i����3���5�\37�|s6�d��>�#>��2a���9�6?~|��b�
@�r�W���{c�op��?&
]*���oy_��������s�Zsz_WU(VL�.��7�����E�V��m��>���e���;.s����O�6-��M[�='�|r�8��:�W�^���kr�G�_��Wm~��y����x����s��W�pQTG|&����b����s���
��k�:�)�r�}u&G}t���������R��5*c�������oi5^������^�_��W�h�����K_�R���-��r��I:�3���$���7vK�8��<�}E���Z�?�������I��(����w�����E�B�UK+9z�-��=�5kVn���<����={vz����C�f��v��!CZ��q����{���)S����d���y�����������L�0!#G������-����D�94-J~�����o��<8���e�������|�����{lhE��}i\U�:���g���-���Q��Zh�4���j�M��'�|2��X���^6�`������j9��[��-��2[n��*?�#>��=vC}�U�l��j��~(�Z	#F��9����{�3f���>}z���?��3���O?��S���SO����r`	���~<x�d�M��@��Pu�o�����?�q��e���������O~2?��O��@6��������y%Qhg`u ���Z.����1"eY���r�]wU���K����'��YI��v_���K�����[��6�(�y�{���>W^ye����~����W�|��H�,^�8��rJ������J&��~n�C�.]��@������l��E�e����4iR���3�<3�~x�[o�|���nEXtPz����,3v��<��SUG�����d��7�
]���.�Kc�ZBQ)��v�4eY���o�����?�|���/���.�e�]�u�]�����w������'&In���6��T�^��,��
6.�y�Jo�
�^VY�2������F%}�\E������Q�F�����<��3u�X���>|xV_}�t��=�f���)S���/&y���(�����ill��9s2c��<��SY�xq���,s��w����M7���}�V����w������~��$��O.�\2��������@�	hO��\c�����_����//��B��Hccc�?���p�
�={vy���q����s���g���y�������4#G�LY�)�2�g������y��y�����K/���.��{���,keY���������|��{��������;/P~����a2d��S�����$9���r���f��E1bDx��������������/��!C���O�����o��I�q�����~w{��$I��}s��������/~��E��(R�e~�����g�i�g\��w_�}��Z���k�Yq"��,���wY�)hi���LVD�/����+���0eYf�����7��M7�t��ohh�����q�)�2S�N�QG��,��}���i��V�_�pa���?�����y������t���n���UF�y�����U���t��l��d��U'��i�:@s�z��I��(r��gf�5�X�}>�����������s�}����s>�������>������:uj�d��1������=@���k���>����HY�:th��f����,�{.���}r��V��E��6nW�����")��G�P�v]�5q���?>I��w�z��+�WQ���>T+�����V���{�z�����~U;��|��_������^x!<�@^z���eY+�*�"_���[,#@s<so2������L�U��=+����,������J�Zy������k�f���f��m���i��jX��Oo�yov����h�G���N������c�9���Z����W_7�`�j��j�:@sL�2�v��{�f����k/^�e���%�8p`�z��Y�>���^|U�ez���3�<3���/*N����&��T?����]��
XY�Uh������e���'7{�7���k�e���Q��R��\�{����.x`>������-��y��s�7�(�[�d������������u����k�/��b�������N+��_�����:����53f��]���o��z�'�xb��)�"=z��j���=z�X��4��d�_���<8����<@��u��;����"�$���?����~������s�5���ZZ����kg6l��Z����-�pU���7�EC����T������Fe�m�I��e��c���c���E�Vh�;��#GqD��HY�I���:j�ko������#V.8@'��)����s�;�7��<@������;��N����W��w��V[m�K.�$,X���>�h>���d��w��3�$EQd�]w�����S�L�M7���(�$���k�?@2��d���s�YM��h�:@s����9�������V���C����J�����v�e�����_�u��9s�����������{,I�
�����7K<���������$


9��Z�9��{.��$�u5Y����`%�O���e�_��)�"�k�Vs����7��o��m��e�$)��V~��Zk��k��&�l��sf�����G'I�!C���'h��>�<}O��vG$�����XI����,���O��?�#S�LI�Z����(+I>����G?�Q�����{~���`b���������H6}O5Y����`%�����:(_|q~�����[o�������(�l��F9��Cr���g�M6i���>�����}���o~��U�7����R��u�s[�4v�&��t��$���[>����#�H����?�g�}63g�������_����?#F�����^u��s�=7EQ���eY*�*q�I��7�]�&[VY���pXoVE6�l�l��fUGY�����t���Z� �������Iz��&��t�����%V+�����,���ee�L"�;��$�i3�V��yn\�����m��&�6)�j#�x�����W_��i�r��w��/�]w���(��F�7��M��
�@��%W|1y��������&Yk��St0e��DXI��k����3gN�����}�V�m�
�R��1"�F��I'��K/�4�|��}��������f��pR����*�jo�;��@[�Pu�Ua������~����h����k�����Yw�u�����k���h����8���/3k���#������������G�<��s9��;��@��}9���U�`E�14�p��SmMc�Z��Y������9��s2w��$IY�o[����I�&��'���^��N:)�{l���o�_�~��E����9�����o|#O=�TN;�����?�:��[�I������z%QV���:A�Ys�d��$
]�N�It�_B��+�%5D�C7�pC>��������^��?���v����\����k�f]��L��!C�$Iz���i���g����Uk��	9rdm<~��l��&Z��'��F'e�s��'9�k�E������.��P�����>bDE���������B�����:x`�L���,k�WeY�,����7��
���o�a���o������������)Sr�A���{���l���N�_�$���s3v���@�������.��Q��.+��`=��s���>��s��(�Z���{����;/O=�Tf���I�&e��q�4iRf���'�|2��w^��{�ZiVQ�7o^�>��<��sU?Z�8�v��CU������'n�����d����@�����O>9�f��_
80W_}u����s�1Yo���x���Cs�1���������������g���On�GX%���S�~��W+L��xQ2�������tL5yh�v]�5k��\v�e���5�X#7�|s��o��g����M7���W_���e�]�Y�f�������3��#��(�$����^m h���L�~n���n�*�@h�Xc������S�e���w���l���+��Fm��O?=eY&I,X�����%���3�8#�-�=����_q"X9�f'7�]?7p�d��V�������~���u�=���Y�}�#I��=SE���g�i�~�m���9������~����w�{�Qq2X9����{�~n��L�T����Xu���5kV��(��������W�����W�_�L�81EQ��o
c��]������^x!��{o.���<���)�2�k.�w\z����Q�U��Lr�%�s����]5yh9�������=z���o�g�5�h�=���{���(����������n����-Z���%��1nhLF}��<����4���#��V�4y��������]o���-���(�r����
������n�k���UK���L�'y����m?���n5yhY��k��w����$��O��7��w,���c3}��E�5�\3���KK�\n�Y����_���?�w��a���`:h���1?����z���J��
4V�9�t���~������$9���r����K�.+���E�r�I'��'�tRZ����N[�{��H�=��j�e��a�n����Zk��t��%c~���\�IX�2iZX?��qI����������������/���[r��w����������{��x��W��}(w�}w�d��v�+�j
+S�����br����yU'ay
X?��}U��6�,�N��Pu��jll�UW]�}��'eY�������n�_����9s�2��9sf�:��l��������$�o��r�UW�K�.����v�����=�#ih��������|��_O����.y��G��SO������'�������V[m��#Gf�����W^}������?~|�������f����g��w����>�+_��*y.Z������:+b������:-�(_oj�R�����X+���jjjZ�{��3a���9�6?~|��b�
�]{F���o��tM�f��wu�X�>���NmS������6x��t�l���5�������O�Tj���������@���l2����-I�n_M��:DVY�UGh��s����/��w�e�l���+��#�<��n��6>�����k�����vn����qc��]�T:�v_�u���W�E���	'��$���[&M��R����''�pB.\�$���k�>���	�M*�xM����O��YM���}�{�Qu�q����,�E�~��Yg�uVj���������?��U�tv��6)�1��3��#�������$/��rn���E�$9��#����>������c3w��f���M{<y���s�}0��F5yXm�}�������e�$5jT���c�=jeZ,�}�������-��w���pt5Y��(�jy������C��_�f���_����z���?�����J[?��QI�����FV0s��$IQYs�5[d����g���"{�77��~�c�d�#���AV�x���uY�-�����?~��	��<7>y����?�t�]M�
���5�\3�k�U�?�|����/���Xc���=�����^k$�~��,@=Xm��A�j�S�L���������������(����<}O2������I���&P���$�z��jeUI����>_��Wz�.� IR�e����;������,��4-�:�k�����yg7�]?��f����dX%�v����
���A�e�-���q�R�e�8���=:�^���}��|�{�KQ)�2�n�i�[o�U�:��&95y�����'��]����U�^�Pu^s�	'�,�E��_~9p@�N��B{���9�����/��:��VQb����<y��(��@V[;����So���8���3t��$IQ?~|F����;/.\��.�����-��2'NLQI�u�]7'�x�*���g�q�:-m�c�.]�N�
�����4V��t��5�����{g��)�"/��b>�����SN��{��v�!�
J�>}2g��L�:5w�uW���e���)�2EQ�,����#����[��
����M7U�����%���d��U'�JV��.���s���������^|��\|�������x_Y�IR[��{��w�y�u�][3>�k��L&^S?����w}��8mZ{�`��=�n��N,��6�C�P6�p�y��y���R���d�]�YQ�5eYf�
7��^������2@Gp�o�r���=�]�-��Fu�:����v;��c~���u�Y�l��R������^9rd�>��L�8Q�����&�\_?����V����d��u�	'��N8!�>�ln���<����1cFf����}�����x������g�u��:2�[7��~��O����d�`�C���>���c@����d�-�s;���[M�����U�������'�QI�NC�iM����7{�1I�^���,`�RY&7��~����V�U�SQ�tJO��L_?���I�����T�����??�����/���3gf���+���>��U���rqr���s��IFTM��FV�����w��]�9���{��Y�hQ��S���!��H��.O�t�&@g���������~4�=�\��,����(��e��(Z2�{����S?�X2b�j��JY���@[��
��������/�/~[y����Z������,W�8�e+�d����)U'iY��_'M}$��d����%
]*��))�j#�L����>:MMM�B�
6� GqD�_�|�����r�)�p�
3c��L�0!7�pC�y�����o�y>����K��hi��8����S��n�l�g�):Xm���������������~��t��5I��O|��v�����{�]�e�+��"'�|r&M��|0\pA.������j�� ���T~����I�Pu
h��~uh���
(�2��sN��j��v��~��Z��;)�"�vX�������>)�27�pC>�����������_u
Z����
v�:@��Xu�������^J�Z���������w�����+���[���������u�Y��'?��q:��L�=#�7�~~�!I�V*���5���*�A'{�W;���(�j��W�nll�������MMMK}�g�������#�<2eY�{���,�fU2����M�J���$X
U �>}z��(�����������oz'���s����������+I���O�l�b^~.����s��'�9I��,Xm����k�k�������;eY&If������w���������w_�3tF����o'��G����^�W	:Xm@���k�.\���}����~��w��O�>������:�{.N���~n�����U:Xm���k��f�Z���C�������w�s��)�����f����?��������N���J�@���
1bD��,�<���Y�x���l����5c����E�����>���~:EQ$I�
Rt\M���3iZP?���������6`��7O����$,��?��5{��W�z��i��/~������)��R�N������#th�����P���G%�mWM�h`���w�.��R_{��o[s�!��o��)��Vru�g���_��y���r����o�[��H������q�W�Ct/<��~^�\���n'T:������:(c��I�\q��������{���/}�K�����(�`��|��_�����f���Y�`A^z�����,SE>�����A��'/?������U'����,nzc\tI�{j��{u���Q��F|�C��>���e�1c�����#���t�I��?�����>EQ�,�455������)�������"-�m{�����J^�^u^�����7�:�[�e�	�Y��k�����/w�yg��������o[�������*�G�����*I��LQ9��s�%��Jv�e�e��3�_�%km��k�;�VLc�x��[n��kz���s�9'���gr�E���n�/���,���kg�]w�G?��l�����hI��<~c�)x]�>�{OM��7h���}���z�����[Wh!��O��Q�\�����WE��J6�3Yc���,��(���M@������J�Z?�����v�&���Pu����K�������@�W@�������{��T`���g���]+������`�;��C��j�|������?_u�4-J����iA����t�SM&����
�0aB>���e�������.�(����:���~^����s�����<�EVS�e���r�5�������k��O~�����[�����Ln;�~�������&@kR��F������(��V����/����uv�}�l��&�������'Wh�'�FR6�1WtI����k��r���������>�'O�y���.� �>�h��2��{,_��Wr�i�e��Q9��c��| �{��2:mPY&�U������Ko���yt��f��hmEY�e�!x�[o�5��w^.�����93�keX��u�^���W�|���>������U���M�0!#G������-����DP�'oO���d��������,9�����r�S�`A���nn�GI��7�(�Qsz_VU(�g�]v�Yg����>^xa:��t��%��WeY��W^��~������6lX���/��G�2:z����/*�jO�%�=U���(�j��u��#�8"��_��������~��z��e������������l��f�u�]��_�*/��r��hEs^L��B�hA�IX�20���KV;2p������O����<����g?���Zk�eX��~{>��Oe�u��22�d����/�V�E�1��d�V�������@{�XuV���#s��g��3��?����{�����+3o���"����W��U�,�|'y����u�I��\��7�6��jI�~U����v���!p@8����5+g�}vN=�T�W���K��~�����o)X�mR���e�k��6��~.��r�W���7$7��~�[�����_�v)�j�&N����;/����3e��$��aEQq2Z��G���-�Er�W�57�"P)�5�Q�������������??��{o��J���(�EQ����=zteYXu^��\��d����Q�J6���L��`�.��W^���??W_}u-Z�����,��z���c��������W��Ua�����Mf�P?����GW�	V��6���n�����/�03g�L�����K�z���|�=zt��k�EQaj��L{,ydL�pn�I:�i�'�����e�����K@{����<yr~��������c�=��������$�c�=2z��|��L�>}*��V������d����t}�J�V����$�|`���sN�?���x��)�r��WeYf�
7��>��|�c��a�*N
�v��ZWc��������N�OVq�q�������^���j9��#3z�����n'X���_��"9������+FV�z�UQ�w�}3z��~�����G�������+�P~5t���Z�dZEQu����#�t�d�m�N+NVR�eF����G���h\u$������-L��BR4T�h�`�����3z�����UGX!����
X1
�������_�V��7'W���+`�x+2+��������
Xq�UXU^������'��U�Y>�$f�d����*S��w���)�:���&�g2gj�I:�W��R�,���?�;��#�<�L,X�5�X#�m�Yv�u������xK5���"�W�j���>��
X>
���������o|#��s�_���O�=���v�iYs�5[9����\r�%��_��-���sr����$�\QT���,�f���9�������~�������������s�%�d��Q��`�^���W/���8���
U������jk'�6n�3��O�$Y�xq�:��\q�u�]�t���C��_�<��y���k�M�6-�}�{s�u�e�]vi��uf=�Z������n����g�Jb�
U���}�{o+���'?���'g��I���{3c��\z��:thm�����#�<�����z>��?�YS��n�|�G���X@�O��o}�[us���w��_�"���544����-���������y����?h��uf��\�_��o)�Zs���?Nz�^I,����@��8����=�65jT>���/u��!Cr��gg�}������?���e���4+�W�%^i�3��u����Y�_L^~�~~�
�#~��
��R������s�9���}��_MQ���=�yOv�}��x��I���g���.��>��U����&��8y��d����t�'G�8��F�IX�������[2m���x�
6��{��\�w�qu��/���@�7cr����W)�j-��'G�D�@[�:�����n�����(���w�}���3&���J�e���������x��$�G�a��?Nz��:	�Dtr��w_�x�]w]�{������,���[(�O����s����,��j��&9��I�U'`y4V���>X7�|��W���7�<O>�d�~;��cKD�vg�+���L����
�09��UT�T��=W���`�.�I��-�/��,��������'������MVF�IDATz+��[�?����������_Lf<���6}O���4��`A'���/�,���k��4h�
�1d������S[$��,�����y�����I���T+�M�u�.M{,��w����
���Lv8:)�j��*���������1������I[���6��}I[������%m��M�"���E�/i���WuhX����3�n��W�+����w�e��2�N��i����=�=�X��m-��}>�|���c$iM,e�s���4l��x���m��KKi+9�W���t���{�g��iJ���Ru4������q�I���[3��KY��?���������/�9�}�U�y�{���u�k�v��v���-s{�����[��]fnw����&2����7i����E+�y�koy�v��^��W���7i���%R���[��z����{���s�{������������}�������U�`���������k��YPuh�`A'6o���q�n�Vx�����������L���3�����O��W��t"E�ni\{��c�rS��X�=��,X�=�����=���5��������U�:��{���w���w�Q`�)��N�O�>u�y����s��]��+��O�G�B�<��c9����}vk�E����[����*����k%�8���������e3������*����o9��W��eC��466��qQ������M�qC�:�������n��W�y-xVQ�)�QIF��y�����������TB�$zK E�RBG�jA������u� 
.��]���D� JX���^�@H$)I �42�?�9��63�d2��uy]{N�9�3��ys���w����n��v����?�n�?����_I��~U�����n����3��~��N�n����3��~��N�n����3��~%������n����3��~%����d����j����p��&\.�������3����?�pU���+��%\6���w9\�g�j���+�mv�p�[����2��v�x�~�z�kG�j�T�Z����*�VR�����6��P���d2�l6K����u��U�^��5�����*\���ih�����>�N���K�:0E�p���S�z�t��iK��3g�*�u��C�I�&��=��=kh2�L�w��g��u��6��(��pqyV����5���cE�@^��p�Z�2��o�n����d%$$X����j����v�]y����h����vdd��f�L&������3�{���
*8|�������/_ni��[W���e�kbcc5d�K{���j��a�mp��@��K�C.
�4P<��@��K����L�={�������s)���:u����`]�tI����(������y����.�=�"00�L��D��
��y����v����!���\(ri�x����!�.�[�.�<����������
}3g���l.r��
�u�VK�b��z���Jc������W_U�
,���7k�����OJJ��q�}'NTppp��p��k�����)S�h��	:w���/77W��/W�N����`��U��^~�egm��(�@�����j����O?�T���SXX�Z�n�*U������3g,c����d�:y�wE,�$}���>|�����[����������f�Y�*U�f�u����;�;
`�(W�����-]�T�Z�*t����&L����u���i����z\�#�<�GyD������VRR������M��s��*W�\Yo��(��P
6T��
�z���GYow
`��(���*�
���j���>}��
�:ri�x����!���\(ri�x�����l6��z�sx��pg���Xp*
`��(�����Xp*
`��(�����Xp*
`��(���*�
@q�:uJ�v�Rbb�����&M��S�N*W��Cbdddh������_���*��SG:tP�
���q$��������g�g�%''+--M���
T�F���MU�X�!q�#))I�VBB���������� ����C��y4����������'���*I
Phh����n��[��wX������lVBB�>���D������WAAAj�����k��3
�������w����u��-U�REw�}�:t� //��KOO��m�t��	]�zU~~~�_��:u��Z�j9,/++K����������tegg�R�J�R��Z�h��M�����Dq._��_�Ug����t��uyzz*00P�k�V�6mT�fM}���x��>�S�N)55Uf�YAAA�S��:v����+;4^NN����u��]�|Y����Y����i����;4p;�����#5<���������7���}�
�y�
4z�hM�>]�����q��E��9S,������MM�6M�.V��r�u���Z����322�������>����Z�8���O'NT��}��c����k��U����
6(11����������&N��A��(.y4��!))I�v�Rtt�v���={�(==������+!!�a��n����{Ok��QVVV��j������_/����5k����1b�}������\ri��������������u���B�z{{���z����[7��$$$(44�D{5��%�oo�����=['N�(pL�*U�������^����c�����7���%K
�7��dR�n�4s�L���;k��������m�����*''���1b�&N��&M�����KZ�p��n��]�v���sV�4o�\c���3�<������$����v�Z�^�Z6lPlll�cM&���k���^��/QA�k���������~������u�]z��W5z�h�L�b�@�p�����,8p�r�d��]:y����sDD�F���];g<��3fh�����?j�(-X���9��?R��l���<�������c�j���6��Z���.]j�����(
:�������Oj��9����+Nq9�:H�-`�3��h��E�*��#4w��R;$9k�,���(�&PQ��������Q������m��m�������h�9���+W4a�}���v����O5~���/��~�������.����������s�,�Z�'�|R����U�R%���S���4=��cZ�~�M�4h��+W�y��v�Z�d����7nXk2�4y�d��5���\@�:u���d�<oooM�:U��O���EFF�O�>��_hh����Ku���X�m�`����KJMM�{n�v��x�b5j���������o�����_�}���������
�&M��-[t��A���]�g<�g�.����#5<\�GYo������a�������Thh�Z�j�����/����;l���/������"00P��{�BBB���i����5b���t�u�\�Z�:g���V��=,~U�~}�o�^-[�,���o��F,�Q���wo���L&�j���V�Z��{�-����?��.]�(99������o���Z�l���W�����N�:X��z��j�����k��
��
��v��=���[�\��EGGx����Su��Q�6m��E�_�p�����k��9c�Ns��M�����_����q�����{���o�Y\\�z�����X�b}���1bD��WU�VU���U�NCA�����g���^��S�Y��+����]�vj���������Uvv�f���q��;Npp��7o��;�E�


�7&>>^}����u����#G�Z��Z�j���{��M��Y3��w���N�:���cv�<~��z�����U�
��E5j�H������]�V<��222�������
s������K��si���������p����}�]�X���7~�x�9sFqqq���RRR���?�^�z�17n��c�=�+W�X�����a�����������k���JII��}����=��3��?������~J��q$�������[�n��'�0@�����I�������EGG���JMM�����}{�7n������O[4???=������t��E�;wN�����}�t�����;�[�N�:���+77������
*8t��W��_�~�����i����������u��A���K'O������s�N���
s�^���+�())I��=�o/ri��K``�&L����W+55Ug����={t��A]�|Y�6mR��]
sv�����G+^��}�~�z��s��^zI�v���=<<4m�4�?^����C�������C���/�����[�l�s��)�3�p/�e����q�.\���{�����:v��~�a��>�@?��c	?)�V�Zz�����W_)66V��_�����k�.���G			�|�������S�0w��������d2�C��6m���[���/����:r��v����*%%EG����?ox�&##C#G�����%�����zH�/VRR�~��7:tH{����s�t��1�3�0���K���_����������C
��r�����/��������:��^�uyx����;vh������(U�<�P///���:|]G�����?�i��[���C�H
bv��%s����,���5�����������7�x�j�)S���������
����0>  ����R��hg]�����sF��t�R�xI�o����9YYY�����0�b������b}��<��#��U���������l���[o��L����i.y4�����������w7���+��������`��i�!��_�~�b�;��^�n���.]�innn�955�D��k��Mf��d�d���0���;%�.����M�6������s�7n��:>''�����5����7Z�o�3j�(|�:v��������������G�1����#���kg�r�J�csss�]���0svvv�>'�������\������[�nm��j��i�u�V�s.^�hNLL�k_���3����L�<��5l���/�+V�h�6m�����6�Y�p��^��g�?��s���� ���G�x�b�x///��'l������
f��dn����/����>0o���|��Ms�n��FDD��g*�x� ��O7�i�6m*�8��?R�����U���y����[����z��W_�vm��;�������������x����������Z�j:g��)
���\�������/)g\�=��sF������>�a���/ooo��3G^^^����tm����y���3�(..N/���l��������2���.!��}8PG�UZZ�6m��w�yG�>�������8QQQ�?����];�Y�FU�T�i��dR``�C�d��7oj��q2������^���+�z�����3g����;v����������'�|��m��m���O��[�nY�O<��F�Q�������ig������"�=zT�}�������/��R�*U*p��d��~�F�Y�N�:����"��t�h�B&����AAAZ�h�aNrr��m�V����`��]��}���G/����o���v�a�!C�(..N��������4��'��/�`��7o��yYYYz���}���?��Y�B��9R�?�������3f��O8���6�\�R))):q��-Z��'�S�N*W����\*8�����#5<\������|��f��a�K�^�z�k���vzz��,YR��o��V��]�������W�"c�L&M�>��7�|�
!Gr�u�\�Z�:g����7�~�a��W�n]�o���k�\{���G*T�{��)S��;w����E�!��}����Y�f��(���^z�%K������s��|�����M��S�NI������!!{�K����/��xzzj������k�:r[e"55U?����m2�lz0~��1����O�Vddd�s������\K{���j��i�s��+��^{��w���4m�Tm��1�;v��q�\�I���������8]�tQpp���^}�U�y���$9r��9k�����g-����3�j��go���{]�r��=��9�lCxxx�����8������#5<\�����������v�
��{w���;��^�|y�cW�XQ������C���������s�N����Y�Ar�k���?����u���y����3����l�[���m+???K;77W���E�!��=v������[�C�Q�-�pG���{�>��K���?.V��?#�����@�$]�|Y7n�(��8�������ciw��]
4�:���#�C���x�\����5�6l����-���w���s6���3�/]�T�1$Y}��3U�^]�76��9s��9y�K�3��M����[�n�vvv���Yc�n��q��q�e���Gjx�
`pY�W�6����c�������(]�~=��k��i��-���}���d2�w����U�V�4����{\X���1  ���y���{�;�8o�,-&�)�g+��������y�����vb���l�;V�n��$
:T(����

��W��Xw����9���}Q9����ki����S�N6��;�l6��7\_FF��X�1J+NI��w��S8+g�����w��5w����z(��e8p������$��UK!!!�vVV�bbb��;z�����-���P��Q��8�;w6���9����L&�			E�q�u��-P:��?�j�����{�M1�fs������:/oeS<{egg��KR�*U
O
{������Gq�Id��Y:|����n����J�7ri$%%��+�~��EEE����)�=�6m������>w�\�����i������l�E>
��
:{��M�����6��4i����[�b��,X����!��+��7�o������[����j�������\[i�mp&�x�vA
��!�����c�����5�k~��y�sV��r���Z�:g�u��
3�������4����W:w�����u�|�������-o<�~?�X�^�B��G����Wbb�����I���'""B}��UHH�|}}U�jU�s�=?~�V�^-����=��������={�l��x-�4�n�jh��__>>>�Z������{��n���G�Z8�4egg+66��gO�������0Cg<P�����^4i������#77W�f�2��5��1J*>>�p�]�5jT���yo��
��7H�<:66V9996�@�)��
��3(���L;vL��������7nk-w����z(��%��ySg��1���[��5��?~�x�1y�J��������k��8�:��j��93�������ki_�pA�o��V��+W����>ki{{{���?�k�m����v��=U�\�B��G��w�6�4h I����]w����zJ�����������K�.���#����5`��k�N�v�r�~sss5v�XeeeI��v����~�!k�K ���|��5��[�Z�j�^�zj������u��w�Z�j


��1c�c�Gm�Hqqq������l�eu���8p=_~��&L�`i{xx�?���L&��b���i�����y���I�&�8q��b8��/�h���BCC_�<�j���3$YYY����k
8^i�mp'��@q=��s
T�f���kWu��Q�5R@@�:v���3g��"2W�������zP�K�.�����V�j��Z�v���������W�N�bT�^]^^^������|�r������PP��]X���Q�/^�=z���#��_~�E�5������sgU�VMYYY������+�e������k��E����]�+M�����
}�G�.ry4�khW�TI�-��O>i���w�^u��M_��z������G}��;wJ�|||��_8�!*ri�;��5k��%��c���\���`�-X�@={�TDD����gw[��q���:��G�8�T@�:q�������l������#Z�b�bbb,?���m�^����y�fegg[�7n�Prr�v���e�����+��5n�X?���������/99Y|������xHR�Z�gX�Q�Fv��)��
��3(�?�w����EGG+::Z�g���I�4}�tyzz�������pM����]�fh�/_��.���E�YP_�9��L&���)==��8����PP��]X���Q�����s�NM�2E����������9s�h��9������?�7�|��fffj����u����u��z��G��G
{����'O���q�,_���SG�?��Z�j%%&&j��UZ�z�eNFF�������M�6�����x������L��&M�8l}ri�;WJJ��y�C��!C��}�R��q�F�{��Z�l����K%FIs��������������)___����}��'����c2���_?��5K-[�,V����\$  @&L���SU�B�b�)
f�Y������W-}�k��s�=W�<g��p��>��.8���v��M������u�~���"��z�H
�D,.)�_�����{��o��Vq���#$$�P
�g]G��~y�*g������G}��������.�������{���W��������M��������4g�yxx9�<��[������=z�h}���*_��a�����i�&=�����YYY1b�bbb��U��}����������~��$�I�&�:uj��)�4��)77W�?��-}�����Z�N�:8p�z������[5k������\����xm��I�}�����,sRRR4x�`������w�~������5)�������o�.~e�J�*i���3f����JgS����~[k��1�}��'V*�s5(]�}���8�g2�L�������o�^M�6U���������/k��}Z�j����KeddX�EEEi���Z�b�<==\���u'��E?�	e���%�����5���y�f��).g�����+��.>>^C�Q�.]�������J;vT���u��9��W�����/�0����[j��������Ga_88P����W��=z���+ZO�<�%K���>������HI����_+�-
�4����W^���_C�����u��4?  @+W�������'���GU�&M ///U�REm���+���'Nh����<:--M�?�x��t���xT��|�},Y�D]�tQxx�bccK%���W����+44T�������J%��V�X����������k��AV�r_�����
��3�W��}����j��m�:u�z�����k���O����U����>�L'O�T���
�W�^�O>����]=t����rw����V.,������E���8��������u���6m��V�Zi�����z���%K����3�����+Wt����=[�k���]�f���m��'O��GGZ�l�^x�C��a�4y�d���G��z^^^����e2����'�|������#$''k��I���q���kW��!���|��Gz���}�'O��a�l^#((H4�*����f���/���{���?��V�t�#o��b��>����f�7n����g�j�*�;��V��[��]�v��g��q���,1rss����#G�h��9���2335{�l���?��:��s�N�9R������]���>�i>��n�:���8�������7nl��:u�(22R��w��������7
�����;���'����T�BC�8_���\�wMg�).g�����sfNw��q
8PW�^�$yxxh��9������CU�n]����R�Jj���&O���������Frr�Xf$���4b�����}�j���V���<�((��������k�������vttt��-�s�=���4IR�5��;�8t�?�K�Y����|/#=z��~��R�=q�Du������W_9<�;��(�m�������Ou��Q���5w�\:tH�Z���<--MC����-�����5o�\����/���E��*��_~���d�=�����j���~��'�>��}i�����6�:�x���+�������w���[������?���{b�;
`pIy���q���f�]k\�~��5��;�����_��u
�w�k���?�?�0��7���q��\�R�J���t�]wY��?��>���=:��={4h� C����O?���|||l^�<�((��� ~Q��k'???K;##C�v��$������e�,�?�P���[������V���Q���~�a��;����T��7n������(i�[���:��w����m��P��M��
�~�z���������:4�_��}�����O?�T��wh[����o��JII��5j�Hk��U@@���83g@�q��W�8S��
5h� C���\-���k��l8�����.��FRR��]�Z�|c��%&&����~3����Ppp�]k�Y���~W���Y���C�ei��W^�i����k��i��9s�����:z��������tK_��-�f������y4�Q�z�|}�7�y�������}���E�s^��=��c[;/ri�;��M�4t�PC���O}��7���t�>z��i�������d��������ng����j��v�@�
���3
},px�a��)<<��6��Z�p������s������;g��[��"##��^�������5P��y���q����W/C��&�z�H
�D,.���O���3��9s��5��o��I�1w�u�Cc��_��o�t�u�\�Z�:g��6l0�{������������D�����0�N�R�>}t��eK_����n��b���<�h��i��J�*��F�����%������Y�����e2�����G��O��7����b�K�����5h� eddX�:u��e�������{���WPP���������AyyyY�7o��;FY��(,\�C=d8{q��9�>}��q~�aC{����Q�K�.�w�������U�VM���������y�������Q�
��J��g\g<�lu��5�;���#5<\���������5���cE���%��=����u������
���P�b�{�(o���p��Y����Pl�^�z���,�9��`�f��������k�??\#��b���\��v��!=���v�����{���5k���_&{���6�����~XX����<733��`��.00P�+W6��?��q����� W�\����o�]�n�:5n��Xk��{O�:���,��������Ep���� �~���Gjx�
`pY�Z�2��ycPrr�,moo�,j����mBB��axk�m�fh���#8�:H�q-`�3�����0_�^�n��{
{\�pA�{�6���F���aC���� ��=�T����A����]k\�p!����\��u��q���G������M�j���
(�=����������U�:<NI������p��f�����!o���w+''��X�����g1�5�����������W�B����U��-��n�5T�F
K;33S{���y>y4�T�����	���p������MpY����-���H��f�L&�s��[gh���C*T�7�b��
��
,}�����O>i5��lVdd��o���V����Ar�k���?�}����sv�133�)�!55U}����',}�+W������a��M
{
4H���,��{���?J��JLL4��M�Y�bE�oc*���5i�$K�z��Z�h�aLAy7�4�����������pkhh���__������s��@������wG0`����;K{����2e�Ms��_oh��6i�Daaa:u����l��]���V�\�~];v���M&�`��:������b��^������Ec���2335d��C=�����+��c������7��^�~����>�������8�l�+�����_~1����[�8w����z(��eu��I����t��$)..NQQQ�������bR�\��A�~a��7��_�6mR||��]�zuu����<{9�:H�-`�3����C;**��<��y�f��F����]��Ms�u��5=��:t����R�JZ�v����n�� ��=z�!C��������������K�.5��6m�����u�f�//������S���m�K.
p{INNV�^�E[k���
6��=`[���}�}��|����������r<**Jqqqj��A���f�,X`��������oi��7��X�}���]�fi�m�V�j��:�e���2���v��UU�fM�������-Z8<�rrr��c����������={:$��A��>�����i���y9u��6o�l���>��=�>�>���8�gJKK�?�`����W��]=�����~������F�m��9s�����l��A[�n��+V���{�����������e�m����f�Y3g�4��3������� ����u�����:s���,Yb���f��~�mC_�.]���k�|{dddh��A��������i��Uj������G���u�]w�ei�9sF_~���y7n�����/C��{���\������>}����S���U�j���


-���^�����2�
2�TbU�\����l��3���?�,����[}�����2<��������cE�����w�~���V��r��MM�>��7`���'��q���]k��� Oq���j���Z�r�����C�-������W�:u,���EDDX�7c����GyD���8�pg�4i����,m=����w�������dn����*T�`io��Y�g�.t|RR���g��8q�����S�Z5�����}�����s�
�3k�,m�����+��R��?$$$�d2�����8�:H��(=��?����c����g�}V�*r_f�YS�L��M���F�*r��|ytTTT��srr4t�PC,-[�L]�v����������z�-C��/��}��:���[;v��->���z�����U�{��B.
p{HOOW�~�t��QK_``���[��M�:,���������l��Q?��n��e��Y����ounTTT�|�3g�48������7�:>&&F�&M2�M�6M>>>E�����
�(���4j�(]�z���f�Y/���N�<i�k����z��"���L�<Y�w��kNJJ�
�'NX�<==���/8�����:u�RRR���e�=��#��:�t�"$$��G/X������{N�/��M&������A������_7�M�4I111�������h�"K���3��G@Iq�����ok���6������/��y�������5k:��C.m
`pi����:u��o��)�0a��/���\-_�\�:u2�2�U��^~�e�q&O��5jX��������V�\i���������������_W�����x6s�u�\�Z�:g��o����a���T�w�}z��7u��y����\m��M<�@��@��s��������z����j��|}�����������d����n��m+0/��eoFFF�9dQ�H���>�n��Y�W�\Q�=����{X}��=�������[C�{���*U�����=ri�7h��|����K�t����cSSS�������zJ!!!z���i�&]�r%��[�n)::Z�F�R�>}kzxx���?V���w�h��Y���?���x�
�^����`�u������-Z���Iz����e���
���'N��G���n�������m�'���[�N���W���{��������7�l6��_��o�����K������������{
�q��M��5Ku�������t�R�={������9r��w�n�S}}}����\�3g��g�}f�{��GT�n]��Mg5���c��ysK;55U]�v���
wSRR4m�4=�����<��7n\�O
w���l�=����B�fdd��'p�x����Ym��U���������#�����+���o��];���{�������7�����Gjx����W\Pnn����uOOO��__���7|�*I~~~Z�~�:w�lS�-[������w3)00P���JKK��3go����k��e6}�������PC_||�BBB��u�u��s-P���?��=[���Z�?		Q�j��������B�Z��v���
X��7���i��w�^�����>}�������������#��=8"�5j��7�'''�s�����7����(,,L���JLL�W`V����_|au%�'m���(������_���o %�po�������`��3&_���U�re�������:s���]�V�>?��C=���6�%o�+I���q���u��={��}||*___�����gpp��m�f����~��F��ooU�VU�z�t��%&&�����?��>���8p�V�Z�����>��][������Qzz���=�����5j����/����~���{�������T�Z5(''Giii:}�t��������-[�x�����>��s��w����mZ�����k��V�;vL]�tQJJ���B�

���7�� Y���%???���Q��
����������3t?���Wu��Q@@�<==u��e%$$(777��5jh��-j���M����?��E+�[p!����5|�pC��[��������Q�J�Y���_���Z�zu���iii���������9r����;���p�u�\�Z�:g������>��3��������]�v�����j���~����_��h��f����e���mk������c��g��|��<<<4c���_�ri�DRR�>��;w*&&���W5k����km.~UR������k��gOCVV��?�C���gHH�6n�hW�+I>|�/^����/j���:{�l��W�&M��~hW8GVV������~EGG+&&���W�*U�'�|����B�_%55U����]��o�>���X��m����s�����E��M�q�F��_����5<xP'N��W��w��Z�v-��pG����'33S�N���}��{�n���X������m.~%�~�H
�A,n�\�r���o�t�R�j���q����0a�bbb
}#hQz�����=���>���{��W?���/^,___����������9#|��g�I�&�j��E�5�Lj���"""�c���q���G�:u�c���?�QXXX��|}}��C�����>}�w�<����g���9s��w���+Z������[���>Sll������]�O����~�z}��j��a���N������{�)V�#F���#9r�������(����w��HW��7�h�������*U�du��dR�-����*66V�>�����y����������M-Z������8~~~<x��/_��;wy����l�R���)ST��F�i��9Z�n���A�Eq��}����?~��7on���
*h�����y�V�^�j������Gjx��9����
���*::ZIII���R``��6m���;�\�r�q��Mm��]��SZZ�|||T�vmu���������� ����u��?��f�<yR�����K�t��y{{+00P���S����<0x�!����9�������s���Upp�����.]��%���\���f�:uJ���:{��������!�n��j���ME�������o����u��-U�REw�}�:t�Pd�*{]�zU����N�<���t�+WN���S���U�vm���c������������3gt��Uegg�b��
PHH�Z�n]����������S�t��]�vM
PPP��7o�f�������$;;[���:r��._�,OOO��YS�[�.v�Z�N��u��
���(!!A����v��rss��� 5k�L��s�C��C�H
��A,8�GYow
`��(�����Xp*
`��(�����Xp*
`��(�����Xp*
`��(�����Xp*
`��(��������X��a_IEND�B`�
#46Andres Freund
andres@anarazel.de
In reply to: Melanie Plageman (#44)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Hi,

On 2025-01-29 14:12:52 -0500, Melanie Plageman wrote:

From 71f32189aad510b73d221fb0478ffd916e5e5dde Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 27 Jan 2025 12:23:00 -0500
Subject: [PATCH v14] Eagerly scan all-visible pages to amortize aggressive
vacuum

Amortize the cost of an aggressive vacuum by eagerly scanning some
all-visible but not all-frozen pages during normal vacuums.

I think it'd be good to explain the problem this is trying to address a bit
more (i.e. the goal is to avoid the situation which a lot of work is deferred
until an aggressive vacuum, which is then very expensive).

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
counted as successful eager freezes and those not frozen are considered
failed eager freezes.

I don't really understand this sentence. "Because the goal is to freeze these
all-visible pages" doesn't really relate with the rest of the sentence.

+     <varlistentry id="guc-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+      <term><varname>vacuum_max_eager_freeze_failure_rate</varname> (<type>floating point</type>)
+      <indexterm>
+       <primary><varname>vacuum_max_eager_freeze_failure_rate</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum fraction of pages that
+        <command>VACUUM</command> may scan and <emphasis>fail</emphasis> to set
+        all-frozen in the visibility map before disabling eager scanning. A
+        value of <literal>0</literal> disables eager scanning altogether. The
+        default is <literal>0.03</literal> (3%).
+       </para>

Fraction of what?

+       <para>
+        Note that when eager scanning is enabled, successful page freezes
+        do not count against this limit, although they are internally
+        capped at 20% of the all-visible but not all-frozen pages in the
+        relation. Capping successful page freezes helps amortize the
+        overhead across multiple normal vacuums.
+       </para>

What does it mean that they are not counted, but are capped?

+   <para>
+    If a table is building up a backlog of all-visible but not all-frozen
+    pages, a normal vacuum may choose to scan skippable pages in an effort to
+    freeze them. Doing so decreases the number of pages the next aggressive
+    vacuum must scan. These are referred to as <firstterm>eagerly
+    scanned</firstterm> pages. Eager scanning can be tuned to attempt
+    to freeze more all-visible pages by increasing
+    <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>. Even if eager
+    scanning has kept the number of all-visible but not all-frozen pages to a
+    minimum, most tables still require periodic aggressive vacuuming.
+   </para>

Maybe mention that the aggressive vacuuming will often be cheaper than without
eager freezing, even if necessary?

+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.

Maybe some more punctuation would make this more readable? Or a slight
rephrasing?

+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager freezes to
+ * MAX_EAGER_FREEZE_SUCCESS_RATE of the number of all-visible but not
+ * all-frozen pages at the beginning of the vacuum. Once the success cap has
+ * been hit, eager scanning is disabled for the remainder of the vacuum of the
+ * relation.

It also caps the maximum "downside" of freezing eagerly, right? Seems worth
mentioning.

+	/*
+	 * Now calculate the eager scan start block. Start at a random spot
+	 * somewhere within the first eager scan region. This avoids eager
+	 * scanning and failing to freeze the exact same blocks each vacuum of the
+	 * relation.
+	 */

If I understand correctly, we're not really choosing a spot inside the first
eager scan region, we determine the bounds of the first region?

@@ -930,16 +1188,21 @@ lazy_scan_heap(LVRelState *vacrel)
vacrel->current_block = InvalidBlockNumber;
vacrel->next_unskippable_block = InvalidBlockNumber;
vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
vacrel->next_unskippable_vmbuffer = InvalidBuffer;
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))

Pedantic^3: Is past tense really appropriate? We *will* be scanning that page
in the body of the loop, right?

@@ -1064,7 +1327,45 @@ lazy_scan_heap(LVRelState *vacrel)
if (got_cleanup_lock)
lazy_scan_prune(vacrel, buf, blkno, page,
vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)

Hm - how should pages be counted that we couldn't get a lock on? I think
right now they'll be counted as a failure, but that doesn't seem quite right.

diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..32a1b8c46a1 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,12 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
tab->at_params.is_wraparound = wraparound;
tab->at_params.log_min_duration = log_min_duration;
tab->at_params.toast_parent = InvalidOid;
+
+		/*
+		 * Later we check reloptions for vacuum_max_eager_freeze_failure_rate
+		 * override
+		 */
+		tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
tab->at_storage_param_vac_cost_limit = avopts ?
avopts->vacuum_cost_limit : 0;
tab->at_storage_param_vac_cost_delay = avopts ?

I'd mention where that is, so that a reader of that comment doesn't have to
search around...

I think this is pretty close!

Greetings,

Andres Freund

#47Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#46)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Mon, Feb 3, 2025 at 9:09 PM Andres Freund <andres@anarazel.de> wrote:

+     <varlistentry id="guc-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+      <term><varname>vacuum_max_eager_freeze_failure_rate</varname> (<type>floating point</type>)
+      <indexterm>
+       <primary><varname>vacuum_max_eager_freeze_failure_rate</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum fraction of pages that
+        <command>VACUUM</command> may scan and <emphasis>fail</emphasis> to set
+        all-frozen in the visibility map before disabling eager scanning. A
+        value of <literal>0</literal> disables eager scanning altogether. The
+        default is <literal>0.03</literal> (3%).
+       </para>

Fraction of what?

"pages", according to the text.

I'm not really sure what you think is wrong with this. There may be an
even better way to explain this but this doesn't seem bad to me.

--
Robert Haas
EDB: http://www.enterprisedb.com

#48Melanie Plageman
melanieplageman@gmail.com
In reply to: Andres Freund (#46)
1 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Thanks for the review!

On Mon, Feb 3, 2025 at 9:09 PM Andres Freund <andres@anarazel.de> wrote:

On 2025-01-29 14:12:52 -0500, Melanie Plageman wrote:

From 71f32189aad510b73d221fb0478ffd916e5e5dde Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 27 Jan 2025 12:23:00 -0500
Subject: [PATCH v14] Eagerly scan all-visible pages to amortize aggressive
vacuum

Amortize the cost of an aggressive vacuum by eagerly scanning some
all-visible but not all-frozen pages during normal vacuums.

I think it'd be good to explain the problem this is trying to address a bit
more (i.e. the goal is to avoid the situation which a lot of work is deferred
until an aggressive vacuum, which is then very expensive).

Attached v15 does this.

Because the goal is to freeze these all-visible pages, all-visible pages
that are eagerly scanned and set all-frozen in the visibility map are
counted as successful eager freezes and those not frozen are considered
failed eager freezes.

I don't really understand this sentence. "Because the goal is to freeze these
all-visible pages" doesn't really relate with the rest of the sentence.

The idea was to motivate why we consider them successes and failures.
Anyway, I removed it.

+     <varlistentry id="guc-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+      <term><varname>vacuum_max_eager_freeze_failure_rate</varname> (<type>floating point</type>)
+      <indexterm>
+       <primary><varname>vacuum_max_eager_freeze_failure_rate</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum fraction of pages that
+        <command>VACUUM</command> may scan and <emphasis>fail</emphasis> to set
+        all-frozen in the visibility map before disabling eager scanning. A
+        value of <literal>0</literal> disables eager scanning altogether. The
+        default is <literal>0.03</literal> (3%).
+       </para>

Fraction of what?

So, as Robert said downthread, it is a fraction of pages. I've changed
the wording of instance of this description to:

"maximum number of pages (as a fraction of total pages in the relation)"

However, I will note that this "fraction of pages" wording appears in
almost every other comment explaining this. v15 does not change these
other occurrences. Do you think I should change them?

+       <para>
+        Note that when eager scanning is enabled, successful page freezes
+        do not count against this limit, although they are internally
+        capped at 20% of the all-visible but not all-frozen pages in the
+        relation. Capping successful page freezes helps amortize the
+        overhead across multiple normal vacuums.
+       </para>

What does it mean that they are not counted, but are capped?

They are not counted toward the failure cap but they are counted
towards an internally hard-coded success cap. I took a stab at
clarifying this in attached v15.

+   <para>
+    If a table is building up a backlog of all-visible but not all-frozen
+    pages, a normal vacuum may choose to scan skippable pages in an effort to
+    freeze them. Doing so decreases the number of pages the next aggressive
+    vacuum must scan. These are referred to as <firstterm>eagerly
+    scanned</firstterm> pages. Eager scanning can be tuned to attempt
+    to freeze more all-visible pages by increasing
+    <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>. Even if eager
+    scanning has kept the number of all-visible but not all-frozen pages to a
+    minimum, most tables still require periodic aggressive vacuuming.
+   </para>

Maybe mention that the aggressive vacuuming will often be cheaper than without
eager freezing, even if necessary?

Done.

+ * Normal vacuums count all-visible pages eagerly scanned as a success when
+ * they are able to set them all-frozen in the VM and as a failure when they
+ * are not able to set them all-frozen.

Maybe some more punctuation would make this more readable? Or a slight
rephrasing?

Done.

+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager freezes to
+ * MAX_EAGER_FREEZE_SUCCESS_RATE of the number of all-visible but not
+ * all-frozen pages at the beginning of the vacuum. Once the success cap has
+ * been hit, eager scanning is disabled for the remainder of the vacuum of the
+ * relation.

It also caps the maximum "downside" of freezing eagerly, right? Seems worth
mentioning.

Done here and one other place (in docs).

+     /*
+      * Now calculate the eager scan start block. Start at a random spot
+      * somewhere within the first eager scan region. This avoids eager
+      * scanning and failing to freeze the exact same blocks each vacuum of the
+      * relation.
+      */

If I understand correctly, we're not really choosing a spot inside the first
eager scan region, we determine the bounds of the first region?

I'm not sure I understand how those are different, but I updated the
comment a bit. Maybe you can elaborate what you mean?

@@ -930,16 +1188,21 @@ lazy_scan_heap(LVRelState *vacrel)
vacrel->current_block = InvalidBlockNumber;
vacrel->next_unskippable_block = InvalidBlockNumber;
vacrel->next_unskippable_allvis = false;
+     vacrel->next_unskippable_eager_scanned = false;
vacrel->next_unskippable_vmbuffer = InvalidBuffer;
-     while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+     while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+                                                                     &was_eager_scanned))

Pedantic^3: Is past tense really appropriate? We *will* be scanning that page
in the body of the loop, right?

I thought about this. I chose was_eager_scanned because 1) by the time
we use it, it has been eager scanned and I thought calling it
do_eager_scan might make that less clear and 2) the eager_scanned
logging member of LVRelState is incremented before it is actually
scanned, so I thought that was already set as a precedent.

I haven't changed it in this version, but I am open to renaming it if
you think doing so makes it more clear (especially where the variable
is used [not set]). What do you suggest?

@@ -1064,7 +1327,45 @@ lazy_scan_heap(LVRelState *vacrel)
if (got_cleanup_lock)
lazy_scan_prune(vacrel, buf, blkno, page,
vmbuffer, all_visible_according_to_vm,
-                                                     &has_lpdead_items);
+                                                     &has_lpdead_items, &vm_page_frozen);
+
+             /*
+              * Count an eagerly scanned page as a failure or a success.
+              */
+             if (was_eager_scanned)

Hm - how should pages be counted that we couldn't get a lock on? I think
right now they'll be counted as a failure, but that doesn't seem quite right.

Yea, I thought that counting them as failures made sense because we
did fail to freeze them. However, now that you mention it, we didn't
fail to freeze them because of age, so maybe we don't want to count
them as failures. I don't expect us to have a bunch of contended
all-visible pages, so I think the question is about what makes it more
clear in the code. What do you think? Should I reset was_eager_scanned
to false if we don't get the cleanup lock?

diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..32a1b8c46a1 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,12 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
tab->at_params.is_wraparound = wraparound;
tab->at_params.log_min_duration = log_min_duration;
tab->at_params.toast_parent = InvalidOid;
+
+             /*
+              * Later we check reloptions for vacuum_max_eager_freeze_failure_rate
+              * override
+              */
+             tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
tab->at_storage_param_vac_cost_limit = avopts ?
avopts->vacuum_cost_limit : 0;
tab->at_storage_param_vac_cost_delay = avopts ?

I'd mention where that is, so that a reader of that comment doesn't have to
search around...

Done.

- Melanie

Attachments:

v15-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchtext/x-patch; charset=US-ASCII; name=v15-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchDownload
From e738725a97dad797eedf264dfa0a58c7375d4de8 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 27 Jan 2025 12:23:00 -0500
Subject: [PATCH v15] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Aggressive vacuums must scan every unfrozen tuple in order to advance
the relfrozenxid/relminmxid. Because data is often vacuumed before it is
old enough to require freezing, relations may build up a large backlog
of pages that are set all-visible but not all-frozen in the visibility
map. When an aggressive vacuum is triggered, all of these pages must be
scanned. These pages have often been evicted from shared buffers and
even from the kernel buffer cache. Thus, aggressive vacuums often incur
large amounts of extra I/O at the expense of foreground workloads.

To amortize the cost of aggressive vacuums, eagerly scan some
all-visible but not all-frozen pages during normal vacuums.

All-visible pages that are eagerly scanned and set all-frozen in the
visibility map are counted as successful eager freezes and those not
frozen are counted as failed eager freezes.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager frozen,
eager scanning is disabled for the remainder of the vacuum of the
relation.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Robert Treat <rob@xzilla.net>
Reviewed-by: Bilal Yavuz <byavuz81@gmail.com>
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  39 ++
 doc/src/sgml/maintenance.sgml                 |  33 +-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  14 +-
 src/backend/access/heap/vacuumlazy.c          | 423 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  15 +
 src/backend/postmaster/autovacuum.c           |   6 +
 src/backend/utils/misc/guc_tables.c           |  10 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/bin/psql/tab-complete.in.c                |   2 +
 src/include/commands/vacuum.h                 |  17 +
 src/include/utils/rel.h                       |   6 +
 12 files changed, 540 insertions(+), 41 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index a782f109982..38cb34b696e 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9117,6 +9117,45 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+      <term><varname>vacuum_max_eager_freeze_failure_rate</varname> (<type>floating point</type>)
+      <indexterm>
+       <primary><varname>vacuum_max_eager_freeze_failure_rate</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum number of pages (as a fraction of total pages in
+        the relation) that <command>VACUUM</command> may scan and
+        <emphasis>fail</emphasis> to set all-frozen in the visibility map
+        before disabling eager scanning. A value of <literal>0</literal>
+        disables eager scanning altogether. The default is
+        <literal>0.03</literal> (3%).
+       </para>
+
+       <para>
+        Note that when eager scanning is enabled, successful page freezes do
+        not count against the cap on eager freeze failures. Successful page
+        freezes are capped internally at 20% of the all-visible but not
+        all-frozen pages in the relation. Capping successful page freezes helps
+        amortize the overhead across multiple normal vacuums and limits the
+        potential downside of wasted eager freezes of pages that are modified
+        again before the next aggressive vacuum.
+       </para>
+
+       <para>
+        This parameter can only be set in the
+        <filename>postgresql.conf</filename> file or on the server command
+        line; but the setting can be overridden for individual tables by
+        changing the
+        <link linkend="reloption-vacuum-max-eager-freeze-failure-rate">
+        corresponding table storage parameter</link>.
+        For more information on tuning vacuum's freezing behavior,
+        see <xref linkend="vacuum-for-wraparound"/>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 0be90bdc7ef..f57cabbe05d 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -496,9 +496,25 @@
     When that happens, <command>VACUUM</command> will eventually need to perform an
     <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
     XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+   </para>
+
+   <para>
+    If a table is building up a backlog of all-visible but not all-frozen
+    pages, a normal vacuum may choose to scan skippable pages in an effort to
+    freeze them. Doing so decreases the number of pages the next aggressive
+    vacuum must scan. These are referred to as <firstterm>eagerly
+    scanned</firstterm> pages. Eager scanning can be tuned to attempt to freeze
+    more all-visible pages by increasing <xref
+    linkend="guc-vacuum-max-eager-freeze-failure-rate"/>. Even if eager
+    scanning has kept the number of all-visible but not all-frozen pages to a
+    minimum, most tables still require periodic aggressive vacuuming. However,
+    any pages successfully eager frozen may be skipped during an aggressive
+    vacuum, so eager freezing may minimize the overhead of aggressive vacuums.
+   </para>
+
+   <para>
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
+    controls when a table is aggressively vacuumed. All all-visible but not all-frozen
     pages are scanned if the number of transactions that have passed since the
     last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
@@ -626,10 +642,12 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    While <command>VACUUM</command> scans mostly pages that have been
+    modified since the last vacuum, it may also eagerly scan some
+    all-visible but not all-frozen pages in an attempt to freeze them, but
+    the <structfield>relfrozenxid</structfield> will only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.
+    This happens when
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
     <command>VACUUM</command>'s <literal>FREEZE</literal> option is used, or when all
@@ -929,8 +947,7 @@ vacuum insert threshold = vacuum base insert threshold + vacuum insert scale fac
     If the <structfield>relfrozenxid</structfield> value of the table
     is more than <varname>vacuum_freeze_table_age</varname> transactions old,
     an aggressive vacuum is performed to freeze old tuples and advance
-    <structfield>relfrozenxid</structfield>; otherwise, only pages that have been modified
-    since the last vacuum are scanned.
+    <structfield>relfrozenxid</structfield>.
    </para>
 
    <para>
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2237321cb4f..7e2deeebfad 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1931,6 +1931,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+    <term><literal>vacuum_max_eager_freeze_failure_rate</literal>, <literal>toast.vacuum_max_eager_freeze_failure_rate</literal> (<type>floating point</type>)
+    <indexterm>
+     <primary><varname>vacuum_max_eager_freeze_failure_rate</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..31a8212faf1 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -423,6 +423,16 @@ static relopt_real realRelOpts[] =
 		},
 		-1, 0.0, 100.0
 	},
+	{
+		{
+			"vacuum_max_eager_freeze_failure_rate",
+			"Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning.",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		},
+		-1, 0.0, 1.0
+	},
+
 	{
 		{
 			"seq_page_cost",
@@ -1880,7 +1890,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_max_eager_freeze_failure_rate", RELOPT_TYPE_REAL,
+		offsetof(StdRdOptions, vacuum_max_eager_freeze_failure_rate)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 075af385cd1..4c477b6d254 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -17,9 +17,9 @@
  * failsafe mechanism has triggered (to avoid transaction ID wraparound),
  * vacuum may skip phases II and III.
  *
- * If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
- * phases II and II, cleaning up the dead tuples referenced in the current TID
- * store. This empties the TID store resumes phase I.
+ * If the TID store fills up in phase I, vacuum suspends phase I and proceeds
+ * to phases II and III, cleaning up the dead tuples referenced in the current
+ * TID store. This empties the TID store, allowing vacuum to resume phase I.
  *
  * In a way, the phases are more like states in a state machine, but they have
  * been referred to colloquially as phases for so long that they are referred
@@ -41,9 +41,53 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and various other requirements.
  *
- * When page skipping is not disabled, a non-aggressive vacuum may scan pages
- * that are marked all-visible (and even all-frozen) in the visibility map if
- * the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Eagerly scanned pages that are set all-frozen in the VM are successful
+ * eager freezes and those not set all-frozen in the VM are failed eager
+ * freezes.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager freezes to
+ * MAX_EAGER_FREEZE_SUCCESS_RATE of the number of all-visible but not
+ * all-frozen pages at the beginning of the vacuum. Since eagerly frozen pages
+ * may be unfrozen before the next aggressive vacuum, capping the number of
+ * successful eager freezes also caps the downside of eager freezing:
+ * potentially wasted work.
+ *
+ * Once the success cap has been hit, eager scanning is disabled for the
+ * remainder of the vacuum of the relation.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager freeze failure
+ * cap. The failure count is reset for each region of the table -- comprised
+ * of EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE failures
+ * before suspending eager scanning until the end of the region.
+ * vacuum_max_eager_freeze_failure_rate is configurable both globally and per
+ * table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -100,6 +144,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -185,6 +230,24 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out freezing overhead across multiple normal
+ * vacuums, we limit the number of successful eager page freezes. The maximum
+ * number of eager page freezes is calculated as a ratio of the all-visible
+ * but not all-frozen pages at the beginning of the vacuum.
+ */
+#define MAX_EAGER_FREEZE_SUCCESS_RATE 0.2
+
+/*
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once vacuum fails to freeze
+ * vacuum_max_eager_freeze_failure_rate of the blocks in a region of size
+ * EAGER_SCAN_REGION_SIZE, it suspends eager scanning until it has progressed
+ * to another region of the table with potentially older data.
+ */
+#define EAGER_SCAN_REGION_SIZE 4096
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -241,6 +304,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -282,9 +352,57 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eagerly scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a region suspends eager scanning.
+	 * next_eager_scan_region_start is the block number of the first block
+	 * eligible for resumed eager scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success cap,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning when it is successful. When eager scanning is enabled, this is
+	 * initialized to MAX_EAGER_FREEZE_SUCCESS_RATE of the total number of
+	 * all-visible but not all-frozen pages. For each eager freeze success,
+	 * this is decremented. Once it hits 0, eager scanning is permanently
+	 * disabled. It is initialized to 0 if eager scanning starts out disabled
+	 * (including for aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The maximum number of blocks which may be eagerly scanned and not
+	 * frozen before eager scanning is temporarily suspended. This is
+	 * configurable both globally, via the
+	 * vacuum_max_eager_freeze_failure_rate GUC, and per table, with a table
+	 * storage parameter of the same name. It is calculated as
+	 * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE blocks.
+	 * It is 0 when eager scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * eager_scan_max_fails_per_region each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -296,8 +414,11 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel,
+										 VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -305,7 +426,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -347,6 +468,129 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_before_cutoff = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->max_eager_freeze_failure_rate == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * Aggressively vacuuming a small relation shouldn't take long, so it
+	 * isn't worth amortizing. We use two times the region size as the size
+	 * cutoff because the eager scan start block is a random spot somewhere in
+	 * the first region, making the second region the first to be eager
+	 * scanned normally.
+	 */
+	if (vacrel->rel_pages < 2 * EAGER_SCAN_REGION_SIZE)
+		return;
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation.
+	 *
+	 * Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
+	 * are technically freezable, but we won't freeze them unless the criteria
+	 * for opportunistic freezing is met. Only tuples with XIDs/MXIDs older
+	 * than the the FreezeLimit/MultiXactCutoff are frozen in the common case.
+	 *
+	 * So, as a heuristic, we wait until the FreezeLimit has advanced past the
+	 * relfrozenxid or the MultiXactCutoff has advanced past the relminmxid to
+	 * enable eager scanning.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedes(vacrel->cutoffs.relfrozenxid,
+							  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedes(vacrel->cutoffs.relminmxid,
+							vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is MAX_EAGER_FREEZE_SUCCESS_RATE of the number of
+	 * all-visible but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (MAX_EAGER_FREEZE_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If every all-visible page is frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the bounds of the first eager scan region. The start
+	 * block will be a random spot somewhere within the first eager scan
+	 * region. This avoids eager scanning and failing to freeze the exact same
+	 * blocks each vacuum of the relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed % EAGER_SCAN_REGION_SIZE;
+
+	Assert(params->max_eager_freeze_failure_rate > 0 &&
+		   params->max_eager_freeze_failure_rate <= 1);
+
+	vacrel->eager_scan_max_fails_per_region =
+		params->max_eager_freeze_failure_rate *
+		EAGER_SCAN_REGION_SIZE;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager freeze failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails =
+		vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -477,6 +721,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -502,6 +747,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -520,11 +766,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -539,6 +790,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -734,12 +992,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eagerly scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -910,8 +1170,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -930,16 +1192,21 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
+		if (was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 
 		/* Report as block scanned, update error traceback information */
 		pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
@@ -1064,7 +1331,45 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 */
+		if (was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success cap, permanently disable eager
+					 * scanning by setting the other eager scan management
+					 * fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(vacrel->verbose ? INFO : DEBUG2,
+							(errmsg("disabling eager scanning after freezing %u eagerly scanned blocks of \"%s.%s.%s\"",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1164,7 +1469,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eagerly scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1174,13 +1481,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1253,6 +1563,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
 		return true;
 	}
 }
@@ -1276,11 +1587,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1288,6 +1600,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1316,28 +1641,41 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 			break;
 
 		/*
-		 * Aggressive VACUUM caller can't skip pages just because they are
-		 * all-visible.  They may still skip all-frozen pages, which can't
-		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
+		 * All-frozen pages cannot contain XIDs < OldestXmin (XIDs that aren't
+		 * already frozen by now), so this page can be skipped.
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) != 0)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip any all-visible pages that are not
+		 * also all-frozen.
+		 */
+		if (vacrel->aggressive)
+			break;
+
+		/*
+		 * Normal vacuums with eager scanning enabled only skip all-visible
+		 * but not all-frozen pages if they have hit the failure limit for the
+		 * current eager scan region.
+		 */
+		if (vacrel->eager_scan_remaining_fails > 0)
+		{
+			next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1368,6 +1706,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like that passed to lazy_scan_prune())
+ * is passed here because neither empty nor new pages can be eagerly frozen.
+ * New pages are never frozen. Empty pages are always set frozen in the VM at
+ * the same time that they are set all-visible, and we don't eagerly scan
+ * frozen pages.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1507,6 +1851,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1515,7 +1863,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1667,11 +2016,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1759,6 +2114,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1766,7 +2122,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..a13a2d7f222 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+double		vacuum_max_eager_freeze_failure_rate;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,11 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/*
+	 * Later, in vacuum_rel(), we check if a reloption override was specified.
+	 */
+	params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2171,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_max_eager_freeze_failure_rate table storage
+	 * parameter was specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0)
+		params->max_eager_freeze_failure_rate =
+			((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..31eaeb77b98 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,12 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+
+		/*
+		 * Later, in vacuum_rel(), we check reloptions for any
+		 * vacuum_max_eager_freeze_failure_rate override.
+		 */
+		tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index 71448bb4fdd..41b93827cfb 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -4024,6 +4024,16 @@ struct config_real ConfigureNamesReal[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"vacuum_max_eager_freeze_failure_rate", PGC_USERSET, VACUUM_FREEZING,
+			gettext_noop("Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning."),
+			gettext_noop("A value of 0.0 disables eager scanning and a value of 1.0 will eagerly scan up to 100 percent of the all-visible pages in the relation. If vacuum successfully freezes these pages, the cap is lower than 100 percent, because the goal is to amortize page freezing across multiple vacuums.")
+		},
+		&vacuum_max_eager_freeze_failure_rate,
+		0.03, 0.0, 1.0,
+		NULL, NULL, NULL
+	},
+
 	/* End-of-list marker */
 	{
 		{NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL, NULL
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 079efa1baa7..48f8b1cedc5 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -698,6 +698,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_max_eager_freeze_failure_rate = 0.03 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c
index 81cbf10aa28..dc122ed1837 100644
--- a/src/bin/psql/tab-complete.in.c
+++ b/src/bin/psql/tab-complete.in.c
@@ -1388,10 +1388,12 @@ static const char *const table_storage_parameters[] = {
 	"toast.autovacuum_vacuum_threshold",
 	"toast.log_autovacuum_min_duration",
 	"toast.vacuum_index_cleanup",
+	"toast.vacuum_max_eager_freeze_failure_rate",
 	"toast.vacuum_truncate",
 	"toast_tuple_target",
 	"user_catalog_table",
 	"vacuum_index_cleanup",
+	"vacuum_max_eager_freeze_failure_rate",
 	"vacuum_truncate",
 	NULL
 };
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..7dad14319a1 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,13 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail
+	 * to freeze. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	double		max_eager_freeze_failure_rate;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +304,16 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may
+ * eagerly scan some all-visible but not all-frozen pages. Since the goal
+ * is to freeze these pages, an eager scan that fails to set the page
+ * all-frozen in the VM is considered to have "failed". This is the
+ * fraction of pages in the relation vacuum may scan and fail to freeze
+ * before disabling eager scanning.
+ */
+extern PGDLLIMPORT double vacuum_max_eager_freeze_failure_rate;
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..3453fbe1c41 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,12 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail
+	 * to freeze. 0 if disabled, -1 if unspecified.
+	 */
+	double		vacuum_max_eager_freeze_failure_rate;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.34.1

#49Robert Treat
rob@xzilla.net
In reply to: Melanie Plageman (#48)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Tue, Feb 4, 2025 at 12:44 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

On Mon, Feb 3, 2025 at 9:09 PM Andres Freund <andres@anarazel.de> wrote:

On 2025-01-29 14:12:52 -0500, Melanie Plageman wrote:

From 71f32189aad510b73d221fb0478ffd916e5e5dde Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>

@@ -1064,7 +1327,45 @@ lazy_scan_heap(LVRelState *vacrel)
if (got_cleanup_lock)
lazy_scan_prune(vacrel, buf, blkno, page,
vmbuffer, all_visible_according_to_vm,
-                                                     &has_lpdead_items);
+                                                     &has_lpdead_items, &vm_page_frozen);
+
+             /*
+              * Count an eagerly scanned page as a failure or a success.
+              */
+             if (was_eager_scanned)

Hm - how should pages be counted that we couldn't get a lock on? I think
right now they'll be counted as a failure, but that doesn't seem quite right.

Yea, I thought that counting them as failures made sense because we
did fail to freeze them. However, now that you mention it, we didn't
fail to freeze them because of age, so maybe we don't want to count
them as failures. I don't expect us to have a bunch of contended
all-visible pages, so I think the question is about what makes it more
clear in the code. What do you think? Should I reset was_eager_scanned
to false if we don't get the cleanup lock?

I feel like if we are making the trade-off in resources to attempt
eager scanning, and we weren't making progress for whatever reason
(and in the lock failure cases, wouldn't some of those be things that
would prevent us from freezing?) then it would generally be ok to bias
towards bailing sooner rather than later.

Robert Treat
https://xzilla.net

#50Robert Haas
robertmhaas@gmail.com
In reply to: Robert Treat (#49)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Tue, Feb 4, 2025 at 2:57 PM Robert Treat <rob@xzilla.net> wrote:

Yea, I thought that counting them as failures made sense because we
did fail to freeze them. However, now that you mention it, we didn't
fail to freeze them because of age, so maybe we don't want to count
them as failures. I don't expect us to have a bunch of contended
all-visible pages, so I think the question is about what makes it more
clear in the code. What do you think? Should I reset was_eager_scanned
to false if we don't get the cleanup lock?

I feel like if we are making the trade-off in resources to attempt
eager scanning, and we weren't making progress for whatever reason
(and in the lock failure cases, wouldn't some of those be things that
would prevent us from freezing?) then it would generally be ok to bias
towards bailing sooner rather than later.

Failures to acquire cleanup locks are, hopefully, rare, so it may not
matter that much. Having said that, if we skip a page because we can't
acquire a cleanup lock on it, I think that means that it was already
present in shared_buffers, which means that we didn't have to do an
I/O to get it. Since I think the point of the failure cap is mostly to
limit wasted I/O, I would lean toward NOT counting such cases as
failures.

--
Robert Haas
EDB: http://www.enterprisedb.com

#51Melanie Plageman
melanieplageman@gmail.com
In reply to: Robert Haas (#50)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Tue, Feb 4, 2025 at 3:55 PM Robert Haas <robertmhaas@gmail.com> wrote:

On Tue, Feb 4, 2025 at 2:57 PM Robert Treat <rob@xzilla.net> wrote:

Yea, I thought that counting them as failures made sense because we
did fail to freeze them. However, now that you mention it, we didn't
fail to freeze them because of age, so maybe we don't want to count
them as failures. I don't expect us to have a bunch of contended
all-visible pages, so I think the question is about what makes it more
clear in the code. What do you think? Should I reset was_eager_scanned
to false if we don't get the cleanup lock?

I feel like if we are making the trade-off in resources to attempt
eager scanning, and we weren't making progress for whatever reason
(and in the lock failure cases, wouldn't some of those be things that
would prevent us from freezing?) then it would generally be ok to bias
towards bailing sooner rather than later.

Failures to acquire cleanup locks are, hopefully, rare, so it may not
matter that much. Having said that, if we skip a page because we can't
acquire a cleanup lock on it, I think that means that it was already
present in shared_buffers, which means that we didn't have to do an
I/O to get it. Since I think the point of the failure cap is mostly to
limit wasted I/O, I would lean toward NOT counting such cases as
failures.

I think I misspoke when I said we are unlikely to have contended
all-visible pages. I suppose it is trivial to concoct a scenario where
there are many pinned all-visible pages.

Initially I agreed with you that we shouldn't count eagerly scanned
pages we failed to freeze because we didn't get the cleanup lock as
failures. If the page is pinned in shared buffers, it is necessarily
not going to cost us a read -- which is the main overhead of failed
eager freezes.

However, if we don't count an eagerly scanned page as a failure when
we don't get the cleanup lock because we won't have incurred a read,
then why would we count any eagerly scanned page in shared buffers as
a failure? In the case that we actually tried freezing the page and
failed because it was too new, that is giving us information about
whether or not we should keep trying to freeze. So, it is not just
about doing the read but also about what the failure indicates about
the data.

Interestingly, we call heap_tuple_should_freeze() in
lazy_scan_noprune(), so we actually could tell whether or not there
are some tuples on the page old enough to trigger freezing if we had
gotten the cleanup lock. One option would be to add a new output
parameter to lazy_scan_noprune() that indicates whether or not there
were tuples with xids older than the FreezeLimit, and only if there
were not, count it as a failed eager scan.

- Melanie

#52Robert Haas
robertmhaas@gmail.com
In reply to: Melanie Plageman (#51)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Tue, Feb 4, 2025 at 5:34 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

I think I misspoke when I said we are unlikely to have contended
all-visible pages. I suppose it is trivial to concoct a scenario where
there are many pinned all-visible pages.

It's hard to keep heap pages pinned for a really long time, so there
aren't likely to be a lot of them at once. Maybe async I/O will change
that somewhat, but the word in this sentence that I would emphasize is
"concoct". I don't think it's normal for there to be lots of pinned
pages just hanging around.

(It's a bit easier to have index pages that stay pinned for a long
time because an index scan can, or at least could last I checked, hold
onto a pin while the cursor was open even if we're not currently
executing the query. But for a heap page that doesn't happen, AFAIK.)

However, if we don't count an eagerly scanned page as a failure when
we don't get the cleanup lock because we won't have incurred a read,
then why would we count any eagerly scanned page in shared buffers as
a failure? In the case that we actually tried freezing the page and
failed because it was too new, that is giving us information about
whether or not we should keep trying to freeze. So, it is not just
about doing the read but also about what the failure indicates about
the data.

That's a good point, but failure to get a tuple lock isn't a judgement
either way on whether the XIDs in the page are old or new.

Interestingly, we call heap_tuple_should_freeze() in
lazy_scan_noprune(), so we actually could tell whether or not there
are some tuples on the page old enough to trigger freezing if we had
gotten the cleanup lock. One option would be to add a new output
parameter to lazy_scan_noprune() that indicates whether or not there
were tuples with xids older than the FreezeLimit, and only if there
were not, count it as a failed eager scan.

Yeah, that could be done, and it doesn't sound like a bad idea.
However, I'm also unsure whether we need to add additional logic for
this case. My intuition is that it just won't happen very often. I'm
not quite confident that I'm correct about that, but if I had to
guess, my guess would be "rare scenario".

--
Robert Haas
EDB: http://www.enterprisedb.com

#53Melanie Plageman
melanieplageman@gmail.com
In reply to: Robert Haas (#52)
1 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Attached v16 implements the logic to not count pages we failed to
freeze because of cleanup lock contention as eager freeze failures.

Re the code: I didn't put it in the same if statement block as
lazy_scan_prune() because I wanted to avoid another level of
indentation, but I am open to changing it if people hate it.

On Wed, Feb 5, 2025 at 11:47 AM Robert Haas <robertmhaas@gmail.com> wrote:

On Tue, Feb 4, 2025 at 5:34 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

I think I misspoke when I said we are unlikely to have contended
all-visible pages. I suppose it is trivial to concoct a scenario where
there are many pinned all-visible pages.

It's hard to keep heap pages pinned for a really long time, so there
aren't likely to be a lot of them at once. Maybe async I/O will change
that somewhat, but the word in this sentence that I would emphasize is
"concoct". I don't think it's normal for there to be lots of pinned
pages just hanging around.

(It's a bit easier to have index pages that stay pinned for a long
time because an index scan can, or at least could last I checked, hold
onto a pin while the cursor was open even if we're not currently
executing the query. But for a heap page that doesn't happen, AFAIK.)

I started getting worried thinking about this. If you have a cursor
for select * from a table and fetch forward far enough, couldn't
vacuum fail to get cleanup locks on a whole range of blocks? If those
are all-visible and we don't count them as failures, we could end up
doing the overhead of lazy_scan_noprune() on all of those blocks. Even
though we wouldn't end up doing extra read I/O, I wonder if the extra
CPU overhead is going to be noticeable.

However, if we don't count an eagerly scanned page as a failure when
we don't get the cleanup lock because we won't have incurred a read,
then why would we count any eagerly scanned page in shared buffers as
a failure? In the case that we actually tried freezing the page and
failed because it was too new, that is giving us information about
whether or not we should keep trying to freeze. So, it is not just
about doing the read but also about what the failure indicates about
the data.

That's a good point, but failure to get a tuple lock isn't a judgement
either way on whether the XIDs in the page are old or new.

Yea, I guess that means the freeze limit caps wasted read I/O -- but
you could end up doing no read I/O and still hitting the freeze fail
limit because it is trying to detect when data is too new to be worth
eager scanning. But that's probably the behavior we want.

Interestingly, we call heap_tuple_should_freeze() in
lazy_scan_noprune(), so we actually could tell whether or not there
are some tuples on the page old enough to trigger freezing if we had
gotten the cleanup lock. One option would be to add a new output
parameter to lazy_scan_noprune() that indicates whether or not there
were tuples with xids older than the FreezeLimit, and only if there
were not, count it as a failed eager scan.

Yeah, that could be done, and it doesn't sound like a bad idea.
However, I'm also unsure whether we need to add additional logic for
this case. My intuition is that it just won't happen very often. I'm
not quite confident that I'm correct about that, but if I had to
guess, my guess would be "rare scenario".

I've not done this in the attached v16. I have added a comment about it.
I think not doing it is a judgment call and not a bug, right?

- Melanie

Attachments:

v16-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchtext/x-patch; charset=US-ASCII; name=v16-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchDownload
From 8bfe510f260066de91f77d704b4eb8c01d67de40 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 27 Jan 2025 12:23:00 -0500
Subject: [PATCH v16] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Aggressive vacuums must scan every unfrozen tuple in order to advance
the relfrozenxid/relminmxid. Because data is often vacuumed before it is
old enough to require freezing, relations may build up a large backlog
of pages that are set all-visible but not all-frozen in the visibility
map. When an aggressive vacuum is triggered, all of these pages must be
scanned. These pages have often been evicted from shared buffers and
even from the kernel buffer cache. Thus, aggressive vacuums often incur
large amounts of extra I/O at the expense of foreground workloads.

To amortize the cost of aggressive vacuums, eagerly scan some
all-visible but not all-frozen pages during normal vacuums.

All-visible pages that are eagerly scanned and set all-frozen in the
visibility map are counted as successful eager freezes and those not
frozen are counted as failed eager freezes.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager frozen,
eager scanning is disabled for the remainder of the vacuum of the
relation.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Robert Treat <rob@xzilla.net>
Reviewed-by: Bilal Yavuz <byavuz81@gmail.com>
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  39 ++
 doc/src/sgml/maintenance.sgml                 |  33 +-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  14 +-
 src/backend/access/heap/vacuumlazy.c          | 434 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  15 +
 src/backend/postmaster/autovacuum.c           |   6 +
 src/backend/utils/misc/guc_tables.c           |  10 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/bin/psql/tab-complete.in.c                |   2 +
 src/include/commands/vacuum.h                 |  17 +
 src/include/utils/rel.h                       |   6 +
 12 files changed, 551 insertions(+), 41 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index a782f109982..38cb34b696e 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9117,6 +9117,45 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+      <term><varname>vacuum_max_eager_freeze_failure_rate</varname> (<type>floating point</type>)
+      <indexterm>
+       <primary><varname>vacuum_max_eager_freeze_failure_rate</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum number of pages (as a fraction of total pages in
+        the relation) that <command>VACUUM</command> may scan and
+        <emphasis>fail</emphasis> to set all-frozen in the visibility map
+        before disabling eager scanning. A value of <literal>0</literal>
+        disables eager scanning altogether. The default is
+        <literal>0.03</literal> (3%).
+       </para>
+
+       <para>
+        Note that when eager scanning is enabled, successful page freezes do
+        not count against the cap on eager freeze failures. Successful page
+        freezes are capped internally at 20% of the all-visible but not
+        all-frozen pages in the relation. Capping successful page freezes helps
+        amortize the overhead across multiple normal vacuums and limits the
+        potential downside of wasted eager freezes of pages that are modified
+        again before the next aggressive vacuum.
+       </para>
+
+       <para>
+        This parameter can only be set in the
+        <filename>postgresql.conf</filename> file or on the server command
+        line; but the setting can be overridden for individual tables by
+        changing the
+        <link linkend="reloption-vacuum-max-eager-freeze-failure-rate">
+        corresponding table storage parameter</link>.
+        For more information on tuning vacuum's freezing behavior,
+        see <xref linkend="vacuum-for-wraparound"/>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index 0be90bdc7ef..f57cabbe05d 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -496,9 +496,25 @@
     When that happens, <command>VACUUM</command> will eventually need to perform an
     <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
     XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+   </para>
+
+   <para>
+    If a table is building up a backlog of all-visible but not all-frozen
+    pages, a normal vacuum may choose to scan skippable pages in an effort to
+    freeze them. Doing so decreases the number of pages the next aggressive
+    vacuum must scan. These are referred to as <firstterm>eagerly
+    scanned</firstterm> pages. Eager scanning can be tuned to attempt to freeze
+    more all-visible pages by increasing <xref
+    linkend="guc-vacuum-max-eager-freeze-failure-rate"/>. Even if eager
+    scanning has kept the number of all-visible but not all-frozen pages to a
+    minimum, most tables still require periodic aggressive vacuuming. However,
+    any pages successfully eager frozen may be skipped during an aggressive
+    vacuum, so eager freezing may minimize the overhead of aggressive vacuums.
+   </para>
+
+   <para>
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
+    controls when a table is aggressively vacuumed. All all-visible but not all-frozen
     pages are scanned if the number of transactions that have passed since the
     last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
@@ -626,10 +642,12 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    While <command>VACUUM</command> scans mostly pages that have been
+    modified since the last vacuum, it may also eagerly scan some
+    all-visible but not all-frozen pages in an attempt to freeze them, but
+    the <structfield>relfrozenxid</structfield> will only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.
+    This happens when
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
     <command>VACUUM</command>'s <literal>FREEZE</literal> option is used, or when all
@@ -929,8 +947,7 @@ vacuum insert threshold = vacuum base insert threshold + vacuum insert scale fac
     If the <structfield>relfrozenxid</structfield> value of the table
     is more than <varname>vacuum_freeze_table_age</varname> transactions old,
     an aggressive vacuum is performed to freeze old tuples and advance
-    <structfield>relfrozenxid</structfield>; otherwise, only pages that have been modified
-    since the last vacuum are scanned.
+    <structfield>relfrozenxid</structfield>.
    </para>
 
    <para>
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 2237321cb4f..7e2deeebfad 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1931,6 +1931,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+    <term><literal>vacuum_max_eager_freeze_failure_rate</literal>, <literal>toast.vacuum_max_eager_freeze_failure_rate</literal> (<type>floating point</type>)
+    <indexterm>
+     <primary><varname>vacuum_max_eager_freeze_failure_rate</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index e587abd9990..31a8212faf1 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -423,6 +423,16 @@ static relopt_real realRelOpts[] =
 		},
 		-1, 0.0, 100.0
 	},
+	{
+		{
+			"vacuum_max_eager_freeze_failure_rate",
+			"Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning.",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		},
+		-1, 0.0, 1.0
+	},
+
 	{
 		{
 			"seq_page_cost",
@@ -1880,7 +1890,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_max_eager_freeze_failure_rate", RELOPT_TYPE_REAL,
+		offsetof(StdRdOptions, vacuum_max_eager_freeze_failure_rate)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 075af385cd1..dfeefd77a8a 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -17,9 +17,9 @@
  * failsafe mechanism has triggered (to avoid transaction ID wraparound),
  * vacuum may skip phases II and III.
  *
- * If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
- * phases II and II, cleaning up the dead tuples referenced in the current TID
- * store. This empties the TID store resumes phase I.
+ * If the TID store fills up in phase I, vacuum suspends phase I and proceeds
+ * to phases II and III, cleaning up the dead tuples referenced in the current
+ * TID store. This empties the TID store, allowing vacuum to resume phase I.
  *
  * In a way, the phases are more like states in a state machine, but they have
  * been referred to colloquially as phases for so long that they are referred
@@ -41,9 +41,53 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and various other requirements.
  *
- * When page skipping is not disabled, a non-aggressive vacuum may scan pages
- * that are marked all-visible (and even all-frozen) in the visibility map if
- * the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Eagerly scanned pages that are set all-frozen in the VM are successful
+ * eager freezes and those not set all-frozen in the VM are failed eager
+ * freezes.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager freezes to
+ * MAX_EAGER_FREEZE_SUCCESS_RATE of the number of all-visible but not
+ * all-frozen pages at the beginning of the vacuum. Since eagerly frozen pages
+ * may be unfrozen before the next aggressive vacuum, capping the number of
+ * successful eager freezes also caps the downside of eager freezing:
+ * potentially wasted work.
+ *
+ * Once the success cap has been hit, eager scanning is disabled for the
+ * remainder of the vacuum of the relation.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager freeze failure
+ * cap. The failure count is reset for each region of the table -- comprised
+ * of EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE failures
+ * before suspending eager scanning until the end of the region.
+ * vacuum_max_eager_freeze_failure_rate is configurable both globally and per
+ * table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -100,6 +144,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -185,6 +230,24 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out freezing overhead across multiple normal
+ * vacuums, we limit the number of successful eager page freezes. The maximum
+ * number of eager page freezes is calculated as a ratio of the all-visible
+ * but not all-frozen pages at the beginning of the vacuum.
+ */
+#define MAX_EAGER_FREEZE_SUCCESS_RATE 0.2
+
+/*
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once vacuum fails to freeze
+ * vacuum_max_eager_freeze_failure_rate of the blocks in a region of size
+ * EAGER_SCAN_REGION_SIZE, it suspends eager scanning until it has progressed
+ * to another region of the table with potentially older data.
+ */
+#define EAGER_SCAN_REGION_SIZE 4096
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -241,6 +304,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -282,9 +352,57 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eagerly scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a region suspends eager scanning.
+	 * next_eager_scan_region_start is the block number of the first block
+	 * eligible for resumed eager scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success cap,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning when it is successful. When eager scanning is enabled, this is
+	 * initialized to MAX_EAGER_FREEZE_SUCCESS_RATE of the total number of
+	 * all-visible but not all-frozen pages. For each eager freeze success,
+	 * this is decremented. Once it hits 0, eager scanning is permanently
+	 * disabled. It is initialized to 0 if eager scanning starts out disabled
+	 * (including for aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The maximum number of blocks which may be eagerly scanned and not
+	 * frozen before eager scanning is temporarily suspended. This is
+	 * configurable both globally, via the
+	 * vacuum_max_eager_freeze_failure_rate GUC, and per table, with a table
+	 * storage parameter of the same name. It is calculated as
+	 * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE blocks.
+	 * It is 0 when eager scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * eager_scan_max_fails_per_region each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -296,8 +414,11 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel,
+										 VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -305,7 +426,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -347,6 +468,129 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_before_cutoff = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->max_eager_freeze_failure_rate == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * Aggressively vacuuming a small relation shouldn't take long, so it
+	 * isn't worth amortizing. We use two times the region size as the size
+	 * cutoff because the eager scan start block is a random spot somewhere in
+	 * the first region, making the second region the first to be eager
+	 * scanned normally.
+	 */
+	if (vacrel->rel_pages < 2 * EAGER_SCAN_REGION_SIZE)
+		return;
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation.
+	 *
+	 * Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
+	 * are technically freezable, but we won't freeze them unless the criteria
+	 * for opportunistic freezing is met. Only tuples with XIDs/MXIDs older
+	 * than the the FreezeLimit/MultiXactCutoff are frozen in the common case.
+	 *
+	 * So, as a heuristic, we wait until the FreezeLimit has advanced past the
+	 * relfrozenxid or the MultiXactCutoff has advanced past the relminmxid to
+	 * enable eager scanning.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedes(vacrel->cutoffs.relfrozenxid,
+							  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedes(vacrel->cutoffs.relminmxid,
+							vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is MAX_EAGER_FREEZE_SUCCESS_RATE of the number of
+	 * all-visible but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (MAX_EAGER_FREEZE_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If every all-visible page is frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the bounds of the first eager scan region. The start
+	 * block will be a random spot somewhere within the first eager scan
+	 * region. This avoids eager scanning and failing to freeze the exact same
+	 * blocks each vacuum of the relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed % EAGER_SCAN_REGION_SIZE;
+
+	Assert(params->max_eager_freeze_failure_rate > 0 &&
+		   params->max_eager_freeze_failure_rate <= 1);
+
+	vacrel->eager_scan_max_fails_per_region =
+		params->max_eager_freeze_failure_rate *
+		EAGER_SCAN_REGION_SIZE;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager freeze failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails =
+		vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -477,6 +721,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -502,6 +747,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -520,11 +766,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -539,6 +790,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -734,12 +992,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eagerly scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -910,8 +1170,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -930,16 +1192,21 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
+		if (was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 
 		/* Report as block scanned, update error traceback information */
 		pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
@@ -1064,7 +1331,56 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 *
+		 * If we didn't get the cleanup lock, we can't have frozen the page.
+		 * However, we only count pages that were too new to require freezing
+		 * as eager freeze failures.
+		 *
+		 * We could gather more information from lazy_scan_noprune() about
+		 * whether or not there were tuples with XIDs or MXIDs older than the
+		 * FreezeLimit or MultiXactCutoff and use this to determine whether or
+		 * not to count it as a failed freeze. However, for simplicity, we
+		 * simply exclude pages skipped due to cleanup lock contention from
+		 * eager freeze algorithm caps.
+		 */
+		if (got_cleanup_lock && was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success cap, permanently disable eager
+					 * scanning by setting the other eager scan management
+					 * fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(vacrel->verbose ? INFO : DEBUG2,
+							(errmsg("disabling eager scanning after freezing %u eagerly scanned blocks of \"%s.%s.%s\"",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1164,7 +1480,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eagerly scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1174,13 +1492,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1253,6 +1574,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
 		return true;
 	}
 }
@@ -1276,11 +1598,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1288,6 +1611,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1316,28 +1652,41 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 			break;
 
 		/*
-		 * Aggressive VACUUM caller can't skip pages just because they are
-		 * all-visible.  They may still skip all-frozen pages, which can't
-		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
+		 * All-frozen pages cannot contain XIDs < OldestXmin (XIDs that aren't
+		 * already frozen by now), so this page can be skipped.
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) != 0)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip any all-visible pages that are not
+		 * also all-frozen.
+		 */
+		if (vacrel->aggressive)
+			break;
+
+		/*
+		 * Normal vacuums with eager scanning enabled only skip all-visible
+		 * but not all-frozen pages if they have hit the failure limit for the
+		 * current eager scan region.
+		 */
+		if (vacrel->eager_scan_remaining_fails > 0)
+		{
+			next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1368,6 +1717,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like that passed to lazy_scan_prune())
+ * is passed here because neither empty nor new pages can be eagerly frozen.
+ * New pages are never frozen. Empty pages are always set frozen in the VM at
+ * the same time that they are set all-visible, and we don't eagerly scan
+ * frozen pages.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1507,6 +1862,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1515,7 +1874,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1667,11 +2027,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1759,6 +2125,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1766,7 +2133,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..a13a2d7f222 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+double		vacuum_max_eager_freeze_failure_rate;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,11 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/*
+	 * Later, in vacuum_rel(), we check if a reloption override was specified.
+	 */
+	params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2171,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_max_eager_freeze_failure_rate table storage
+	 * parameter was specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0)
+		params->max_eager_freeze_failure_rate =
+			((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 0ab921a169b..31eaeb77b98 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2826,6 +2826,12 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+
+		/*
+		 * Later, in vacuum_rel(), we check reloptions for any
+		 * vacuum_max_eager_freeze_failure_rate override.
+		 */
+		tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index 71448bb4fdd..41b93827cfb 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -4024,6 +4024,16 @@ struct config_real ConfigureNamesReal[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"vacuum_max_eager_freeze_failure_rate", PGC_USERSET, VACUUM_FREEZING,
+			gettext_noop("Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning."),
+			gettext_noop("A value of 0.0 disables eager scanning and a value of 1.0 will eagerly scan up to 100 percent of the all-visible pages in the relation. If vacuum successfully freezes these pages, the cap is lower than 100 percent, because the goal is to amortize page freezing across multiple vacuums.")
+		},
+		&vacuum_max_eager_freeze_failure_rate,
+		0.03, 0.0, 1.0,
+		NULL, NULL, NULL
+	},
+
 	/* End-of-list marker */
 	{
 		{NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL, NULL
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 079efa1baa7..48f8b1cedc5 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -698,6 +698,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_max_eager_freeze_failure_rate = 0.03 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c
index 81cbf10aa28..dc122ed1837 100644
--- a/src/bin/psql/tab-complete.in.c
+++ b/src/bin/psql/tab-complete.in.c
@@ -1388,10 +1388,12 @@ static const char *const table_storage_parameters[] = {
 	"toast.autovacuum_vacuum_threshold",
 	"toast.log_autovacuum_min_duration",
 	"toast.vacuum_index_cleanup",
+	"toast.vacuum_max_eager_freeze_failure_rate",
 	"toast.vacuum_truncate",
 	"toast_tuple_target",
 	"user_catalog_table",
 	"vacuum_index_cleanup",
+	"vacuum_max_eager_freeze_failure_rate",
 	"vacuum_truncate",
 	NULL
 };
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..7dad14319a1 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,13 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail
+	 * to freeze. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	double		max_eager_freeze_failure_rate;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +304,16 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may
+ * eagerly scan some all-visible but not all-frozen pages. Since the goal
+ * is to freeze these pages, an eager scan that fails to set the page
+ * all-frozen in the VM is considered to have "failed". This is the
+ * fraction of pages in the relation vacuum may scan and fail to freeze
+ * before disabling eager scanning.
+ */
+extern PGDLLIMPORT double vacuum_max_eager_freeze_failure_rate;
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 33d1e4a4e2e..3453fbe1c41 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -343,6 +343,12 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail
+	 * to freeze. 0 if disabled, -1 if unspecified.
+	 */
+	double		vacuum_max_eager_freeze_failure_rate;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.34.1

#54Robert Haas
robertmhaas@gmail.com
In reply to: Melanie Plageman (#53)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Wed, Feb 5, 2025 at 12:23 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

I started getting worried thinking about this. If you have a cursor
for select * from a table and fetch forward far enough, couldn't
vacuum fail to get cleanup locks on a whole range of blocks?

I don't think so. A given scan holds at most 1 heap pin at a time, so
I don't see how a cursor doing a FETCH FORWARD would make anything
happen that wouldn't otherwise. I do think it's theoretically possible
that a running query and a running VACUUM could be going at exactly
the same speed so that the VACUUM always tries to pin every page at
the exact same moment the SELECT has it pinned, but in practice I
think it is very unlikely that the timing will work out like that.
Like win-the-lottery kind of unlikely.

Yea, I guess that means the freeze limit caps wasted read I/O -- but
you could end up doing no read I/O and still hitting the freeze fail
limit because it is trying to detect when data is too new to be worth
eager scanning. But that's probably the behavior we want.

The too-new case is very scary, I think. It's already a problem that
when there are long-running transactions in play, autovacuum commands
a VACUUM which finds nothing it can usefully clean up. It would be
very valuable for someone to figure out a way to prevent that, but the
relevance to this patch is that we need to try hard to avoid making
that problem substantially worse than it is already. Even if the whole
database is memory-resident, the too-new case allows for wasting a
bunch of effort that we would rather not waste; the cap here tries to
make sure that isn't any worse than it needs to be.

Interestingly, we call heap_tuple_should_freeze() in
lazy_scan_noprune(), so we actually could tell whether or not there
are some tuples on the page old enough to trigger freezing if we had
gotten the cleanup lock. One option would be to add a new output
parameter to lazy_scan_noprune() that indicates whether or not there
were tuples with xids older than the FreezeLimit, and only if there
were not, count it as a failed eager scan.

Yeah, that could be done, and it doesn't sound like a bad idea.
However, I'm also unsure whether we need to add additional logic for
this case. My intuition is that it just won't happen very often. I'm
not quite confident that I'm correct about that, but if I had to
guess, my guess would be "rare scenario".

I've not done this in the attached v16. I have added a comment about it.
I think not doing it is a judgment call and not a bug, right?

As of this writing, I do not believe that this is an essential part of
this patch, but it is always possible that with the benefit of
hindsight it will seem otherwise. That's just life, though. If I knew
in advance which of my decisions would later seem like mistakes, I
would make very few mistakes.

--
Robert Haas
EDB: http://www.enterprisedb.com

#55Andres Freund
andres@anarazel.de
In reply to: Melanie Plageman (#48)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Hi,

On 2025-02-04 12:44:22 -0500, Melanie Plageman wrote:

On Mon, Feb 3, 2025 at 9:09 PM Andres Freund <andres@anarazel.de> wrote:

+     /*
+      * Now calculate the eager scan start block. Start at a random spot
+      * somewhere within the first eager scan region. This avoids eager
+      * scanning and failing to freeze the exact same blocks each vacuum of the
+      * relation.
+      */

If I understand correctly, we're not really choosing a spot inside the first
eager scan region, we determine the bounds of the first region?

I'm not sure I understand how those are different, but I updated the
comment a bit. Maybe you can elaborate what you mean?

Let's assume that we use regions of 512 pages. Without randomness we'd do:

[0 .. 512) [512 .. 1024) ...

IMO, if we were to choose a spot inside the first region, we'd do:

[random(0, 512) .. 512) [512 .. 1024)

If we choose the bounds of the first region we'd do:

[0, random(0, 512)) [$prior bound .. $prior_bound + 512)

or something like that.

Greetings,

Andres Freund

PS: planning to respond to cleanup lock stuff downthread, after a bit of
exercise or tomorrow morning

#56Melanie Plageman
melanieplageman@gmail.com
In reply to: Andres Freund (#55)
1 attachment(s)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Mon, Feb 10, 2025 at 8:06 PM Andres Freund <andres@anarazel.de> wrote:

On 2025-02-04 12:44:22 -0500, Melanie Plageman wrote:

On Mon, Feb 3, 2025 at 9:09 PM Andres Freund <andres@anarazel.de> wrote:

+     /*
+      * Now calculate the eager scan start block. Start at a random spot
+      * somewhere within the first eager scan region. This avoids eager
+      * scanning and failing to freeze the exact same blocks each vacuum of the
+      * relation.
+      */

If I understand correctly, we're not really choosing a spot inside the first
eager scan region, we determine the bounds of the first region?

I'm not sure I understand how those are different, but I updated the
comment a bit. Maybe you can elaborate what you mean?

Let's assume that we use regions of 512 pages. Without randomness we'd do:

[0 .. 512) [512 .. 1024) ...

IMO, if we were to choose a spot inside the first region, we'd do:

[random(0, 512) .. 512) [512 .. 1024)

If we choose the bounds of the first region we'd do:

[0, random(0, 512)) [$prior bound .. $prior_bound + 512)

or something like that.

Ah, that's true. I guess I meant the start block of the second region.
Anyway, I've updated the comment to be more correct I think.

- Melanie

Attachments:

v17-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchtext/x-patch; charset=US-ASCII; name=v17-0001-Eagerly-scan-all-visible-pages-to-amortize-aggre.patchDownload
From f713f7b3ca33e3cf5825706b86740c5f8f1e5ad6 Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Mon, 27 Jan 2025 12:23:00 -0500
Subject: [PATCH v17] Eagerly scan all-visible pages to amortize aggressive
 vacuum

Aggressive vacuums must scan every unfrozen tuple in order to advance
the relfrozenxid/relminmxid. Because data is often vacuumed before it is
old enough to require freezing, relations may build up a large backlog
of pages that are set all-visible but not all-frozen in the visibility
map. When an aggressive vacuum is triggered, all of these pages must be
scanned. These pages have often been evicted from shared buffers and
even from the kernel buffer cache. Thus, aggressive vacuums often incur
large amounts of extra I/O at the expense of foreground workloads.

To amortize the cost of aggressive vacuums, eagerly scan some
all-visible but not all-frozen pages during normal vacuums.

All-visible pages that are eagerly scanned and set all-frozen in the
visibility map are counted as successful eager freezes and those not
frozen are counted as failed eager freezes.

If too many eager scans fail in a row, eager scanning is temporarily
suspended until a later portion of the relation. The number of failures
tolerated is configurable globally and per table. To effectively
amortize aggressive vacuums, we cap the number of successes as well.
Once we reach the maximum number of blocks successfully eager frozen,
eager scanning is disabled for the remainder of the vacuum of the
relation.

Original design idea from Robert Haas, with enhancements from
Andres Freund, Tomas Vondra, and me

Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Robert Treat <rob@xzilla.net>
Reviewed-by: Bilal Yavuz <byavuz81@gmail.com>
Discussion: https://postgr.es/m/flat/CAAKRu_ZF_KCzZuOrPrOqjGVe8iRVWEAJSpzMgRQs%3D5-v84cXUg%40mail.gmail.com
---
 doc/src/sgml/config.sgml                      |  39 ++
 doc/src/sgml/maintenance.sgml                 |  33 +-
 doc/src/sgml/ref/create_table.sgml            |  15 +
 src/backend/access/common/reloptions.c        |  14 +-
 src/backend/access/heap/vacuumlazy.c          | 435 ++++++++++++++++--
 src/backend/commands/vacuum.c                 |  15 +
 src/backend/postmaster/autovacuum.c           |   6 +
 src/backend/utils/misc/guc_tables.c           |  10 +
 src/backend/utils/misc/postgresql.conf.sample |   1 +
 src/bin/psql/tab-complete.in.c                |   2 +
 src/include/commands/vacuum.h                 |  17 +
 src/include/utils/rel.h                       |   6 +
 12 files changed, 552 insertions(+), 41 deletions(-)

diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 38244409e3c..804b8d0cd7f 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -9141,6 +9141,45 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
        </listitem>
       </varlistentry>
 
+     <varlistentry id="guc-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+      <term><varname>vacuum_max_eager_freeze_failure_rate</varname> (<type>floating point</type>)
+      <indexterm>
+       <primary><varname>vacuum_max_eager_freeze_failure_rate</varname> configuration parameter</primary>
+      </indexterm>
+      </term>
+      <listitem>
+       <para>
+        Specifies the maximum number of pages (as a fraction of total pages in
+        the relation) that <command>VACUUM</command> may scan and
+        <emphasis>fail</emphasis> to set all-frozen in the visibility map
+        before disabling eager scanning. A value of <literal>0</literal>
+        disables eager scanning altogether. The default is
+        <literal>0.03</literal> (3%).
+       </para>
+
+       <para>
+        Note that when eager scanning is enabled, successful page freezes do
+        not count against the cap on eager freeze failures. Successful page
+        freezes are capped internally at 20% of the all-visible but not
+        all-frozen pages in the relation. Capping successful page freezes helps
+        amortize the overhead across multiple normal vacuums and limits the
+        potential downside of wasted eager freezes of pages that are modified
+        again before the next aggressive vacuum.
+       </para>
+
+       <para>
+        This parameter can only be set in the
+        <filename>postgresql.conf</filename> file or on the server command
+        line; but the setting can be overridden for individual tables by
+        changing the
+        <link linkend="reloption-vacuum-max-eager-freeze-failure-rate">
+        corresponding table storage parameter</link>.
+        For more information on tuning vacuum's freezing behavior,
+        see <xref linkend="vacuum-for-wraparound"/>.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml
index f84ad7557d9..b5b9da7f8a9 100644
--- a/doc/src/sgml/maintenance.sgml
+++ b/doc/src/sgml/maintenance.sgml
@@ -496,9 +496,25 @@
     When that happens, <command>VACUUM</command> will eventually need to perform an
     <firstterm>aggressive vacuum</firstterm>, which will freeze all eligible unfrozen
     XID and MXID values, including those from all-visible but not all-frozen pages.
-    In practice most tables require periodic aggressive vacuuming.
+   </para>
+
+   <para>
+    If a table is building up a backlog of all-visible but not all-frozen
+    pages, a normal vacuum may choose to scan skippable pages in an effort to
+    freeze them. Doing so decreases the number of pages the next aggressive
+    vacuum must scan. These are referred to as <firstterm>eagerly
+    scanned</firstterm> pages. Eager scanning can be tuned to attempt to freeze
+    more all-visible pages by increasing <xref
+    linkend="guc-vacuum-max-eager-freeze-failure-rate"/>. Even if eager
+    scanning has kept the number of all-visible but not all-frozen pages to a
+    minimum, most tables still require periodic aggressive vacuuming. However,
+    any pages successfully eager frozen may be skipped during an aggressive
+    vacuum, so eager freezing may minimize the overhead of aggressive vacuums.
+   </para>
+
+   <para>
     <xref linkend="guc-vacuum-freeze-table-age"/>
-    controls when <command>VACUUM</command> does that: all-visible but not all-frozen
+    controls when a table is aggressively vacuumed. All all-visible but not all-frozen
     pages are scanned if the number of transactions that have passed since the
     last such scan is greater than <varname>vacuum_freeze_table_age</varname> minus
     <varname>vacuum_freeze_min_age</varname>. Setting
@@ -626,10 +642,12 @@ SELECT datname, age(datfrozenxid) FROM pg_database;
    </tip>
 
    <para>
-    <command>VACUUM</command> normally only scans pages that have been modified
-    since the last vacuum, but <structfield>relfrozenxid</structfield> can only be
-    advanced when every page of the table
-    that might contain unfrozen XIDs is scanned.  This happens when
+    While <command>VACUUM</command> scans mostly pages that have been
+    modified since the last vacuum, it may also eagerly scan some
+    all-visible but not all-frozen pages in an attempt to freeze them, but
+    the <structfield>relfrozenxid</structfield> will only be advanced when
+    every page of the table that might contain unfrozen XIDs is scanned.
+    This happens when
     <structfield>relfrozenxid</structfield> is more than
     <varname>vacuum_freeze_table_age</varname> transactions old, when
     <command>VACUUM</command>'s <literal>FREEZE</literal> option is used, or when all
@@ -931,8 +949,7 @@ vacuum insert threshold = vacuum base insert threshold + vacuum insert scale fac
     If the <structfield>relfrozenxid</structfield> value of the table
     is more than <varname>vacuum_freeze_table_age</varname> transactions old,
     an aggressive vacuum is performed to freeze old tuples and advance
-    <structfield>relfrozenxid</structfield>; otherwise, only pages that have been modified
-    since the last vacuum are scanned.
+    <structfield>relfrozenxid</structfield>.
    </para>
 
    <para>
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 9acbc4dd34d..0a3e520f215 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -1950,6 +1950,21 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
     </listitem>
    </varlistentry>
 
+   <varlistentry id="reloption-vacuum-max-eager-freeze-failure-rate" xreflabel="vacuum_max_eager_freeze_failure_rate">
+    <term><literal>vacuum_max_eager_freeze_failure_rate</literal>, <literal>toast.vacuum_max_eager_freeze_failure_rate</literal> (<type>floating point</type>)
+    <indexterm>
+     <primary><varname>vacuum_max_eager_freeze_failure_rate</varname></primary>
+     <secondary>storage parameter</secondary>
+    </indexterm>
+    </term>
+    <listitem>
+     <para>
+      Per-table value for <xref linkend="guc-vacuum-max-eager-freeze-failure-rate"/>
+      parameter.
+     </para>
+    </listitem>
+   </varlistentry>
+
    <varlistentry id="reloption-user-catalog-table" xreflabel="user_catalog_table">
     <term><literal>user_catalog_table</literal> (<type>boolean</type>)
     <indexterm>
diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c
index 5731cf42f54..59fb53e7707 100644
--- a/src/backend/access/common/reloptions.c
+++ b/src/backend/access/common/reloptions.c
@@ -432,6 +432,16 @@ static relopt_real realRelOpts[] =
 		},
 		-1, 0.0, 100.0
 	},
+	{
+		{
+			"vacuum_max_eager_freeze_failure_rate",
+			"Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning.",
+			RELOPT_KIND_HEAP | RELOPT_KIND_TOAST,
+			ShareUpdateExclusiveLock
+		},
+		-1, 0.0, 1.0
+	},
+
 	{
 		{
 			"seq_page_cost",
@@ -1891,7 +1901,9 @@ default_reloptions(Datum reloptions, bool validate, relopt_kind kind)
 		{"vacuum_index_cleanup", RELOPT_TYPE_ENUM,
 		offsetof(StdRdOptions, vacuum_index_cleanup)},
 		{"vacuum_truncate", RELOPT_TYPE_BOOL,
-		offsetof(StdRdOptions, vacuum_truncate)}
+		offsetof(StdRdOptions, vacuum_truncate)},
+		{"vacuum_max_eager_freeze_failure_rate", RELOPT_TYPE_REAL,
+		offsetof(StdRdOptions, vacuum_max_eager_freeze_failure_rate)}
 	};
 
 	return (bytea *) build_reloptions(reloptions, validate, kind,
diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c
index 075af385cd1..8c387ae557e 100644
--- a/src/backend/access/heap/vacuumlazy.c
+++ b/src/backend/access/heap/vacuumlazy.c
@@ -17,9 +17,9 @@
  * failsafe mechanism has triggered (to avoid transaction ID wraparound),
  * vacuum may skip phases II and III.
  *
- * If the TID store fills up in phase I, vacuum suspends phase I, proceeds to
- * phases II and II, cleaning up the dead tuples referenced in the current TID
- * store. This empties the TID store resumes phase I.
+ * If the TID store fills up in phase I, vacuum suspends phase I and proceeds
+ * to phases II and III, cleaning up the dead tuples referenced in the current
+ * TID store. This empties the TID store, allowing vacuum to resume phase I.
  *
  * In a way, the phases are more like states in a state machine, but they have
  * been referred to colloquially as phases for so long that they are referred
@@ -41,9 +41,53 @@
  * to the end, skipping pages as permitted by their visibility status, vacuum
  * options, and various other requirements.
  *
- * When page skipping is not disabled, a non-aggressive vacuum may scan pages
- * that are marked all-visible (and even all-frozen) in the visibility map if
- * the range of skippable pages is below SKIP_PAGES_THRESHOLD.
+ * Vacuums are either aggressive or normal. Aggressive vacuums must scan every
+ * unfrozen tuple in order to advance relfrozenxid and avoid transaction ID
+ * wraparound. Normal vacuums may scan otherwise skippable pages for one of
+ * two reasons:
+ *
+ * When page skipping is not disabled, a normal vacuum may scan pages that are
+ * marked all-visible (and even all-frozen) in the visibility map if the range
+ * of skippable pages is below SKIP_PAGES_THRESHOLD. This is primarily for the
+ * benefit of kernel readahead (see comment in heap_vac_scan_next_block()).
+ *
+ * A normal vacuum may also scan skippable pages in an effort to freeze them
+ * and decrease the backlog of all-visible but not all-frozen pages that have
+ * to be processed by the next aggressive vacuum. These are referred to as
+ * eagerly scanned pages. Pages scanned due to SKIP_PAGES_THRESHOLD do not
+ * count as eagerly scanned pages.
+ *
+ * Eagerly scanned pages that are set all-frozen in the VM are successful
+ * eager freezes and those not set all-frozen in the VM are failed eager
+ * freezes.
+ *
+ * Because we want to amortize the overhead of freezing pages over multiple
+ * vacuums, normal vacuums cap the number of successful eager freezes to
+ * MAX_EAGER_FREEZE_SUCCESS_RATE of the number of all-visible but not
+ * all-frozen pages at the beginning of the vacuum. Since eagerly frozen pages
+ * may be unfrozen before the next aggressive vacuum, capping the number of
+ * successful eager freezes also caps the downside of eager freezing:
+ * potentially wasted work.
+ *
+ * Once the success cap has been hit, eager scanning is disabled for the
+ * remainder of the vacuum of the relation.
+ *
+ * Success is capped globally because we don't want to limit our successes if
+ * old data happens to be concentrated in a particular part of the table. This
+ * is especially likely to happen for append-mostly workloads where the oldest
+ * data is at the beginning of the unfrozen portion of the relation.
+ *
+ * On the assumption that different regions of the table are likely to contain
+ * similarly aged data, normal vacuums use a localized eager freeze failure
+ * cap. The failure count is reset for each region of the table -- comprised
+ * of EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
+ * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE failures
+ * before suspending eager scanning until the end of the region.
+ * vacuum_max_eager_freeze_failure_rate is configurable both globally and per
+ * table.
+ *
+ * Aggressive vacuums must examine every unfrozen tuple and thus are not
+ * subject to any of the limits imposed by the eager scanning algorithm.
  *
  * Once vacuum has decided to scan a given block, it must read the block and
  * obtain a cleanup lock to prune tuples on the page. A non-aggressive vacuum
@@ -100,6 +144,7 @@
 #include "commands/progress.h"
 #include "commands/vacuum.h"
 #include "common/int.h"
+#include "common/pg_prng.h"
 #include "executor/instrument.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -185,6 +230,24 @@ typedef enum
 	VACUUM_ERRCB_PHASE_TRUNCATE,
 } VacErrPhase;
 
+/*
+ * An eager scan of a page that is set all-frozen in the VM is considered
+ * "successful". To spread out freezing overhead across multiple normal
+ * vacuums, we limit the number of successful eager page freezes. The maximum
+ * number of eager page freezes is calculated as a ratio of the all-visible
+ * but not all-frozen pages at the beginning of the vacuum.
+ */
+#define MAX_EAGER_FREEZE_SUCCESS_RATE 0.2
+
+/*
+ * On the assumption that different regions of the table tend to have
+ * similarly aged data, once vacuum fails to freeze
+ * vacuum_max_eager_freeze_failure_rate of the blocks in a region of size
+ * EAGER_SCAN_REGION_SIZE, it suspends eager scanning until it has progressed
+ * to another region of the table with potentially older data.
+ */
+#define EAGER_SCAN_REGION_SIZE 4096
+
 typedef struct LVRelState
 {
 	/* Target heap relation and its indexes */
@@ -241,6 +304,13 @@ typedef struct LVRelState
 
 	BlockNumber rel_pages;		/* total number of pages */
 	BlockNumber scanned_pages;	/* # pages examined (not skipped via VM) */
+
+	/*
+	 * Count of all-visible blocks eagerly scanned (for logging only). This
+	 * does not include skippable blocks scanned due to SKIP_PAGES_THRESHOLD.
+	 */
+	BlockNumber eager_scanned_pages;
+
 	BlockNumber removed_pages;	/* # pages removed by relation truncation */
 	BlockNumber new_frozen_tuple_pages; /* # pages with newly frozen tuples */
 
@@ -282,9 +352,57 @@ typedef struct LVRelState
 	BlockNumber current_block;	/* last block returned */
 	BlockNumber next_unskippable_block; /* next unskippable block */
 	bool		next_unskippable_allvis;	/* its visibility status */
+	bool		next_unskippable_eager_scanned; /* if it was eagerly scanned */
 	Buffer		next_unskippable_vmbuffer;	/* buffer containing its VM bit */
+
+	/* State related to managing eager scanning of all-visible pages */
+
+	/*
+	 * A normal vacuum that has failed to freeze too many eagerly scanned
+	 * blocks in a region suspends eager scanning.
+	 * next_eager_scan_region_start is the block number of the first block
+	 * eligible for resumed eager scanning.
+	 *
+	 * When eager scanning is permanently disabled, either initially
+	 * (including for aggressive vacuum) or due to hitting the success cap,
+	 * this is set to InvalidBlockNumber.
+	 */
+	BlockNumber next_eager_scan_region_start;
+
+	/*
+	 * The remaining number of blocks a normal vacuum will consider eager
+	 * scanning when it is successful. When eager scanning is enabled, this is
+	 * initialized to MAX_EAGER_FREEZE_SUCCESS_RATE of the total number of
+	 * all-visible but not all-frozen pages. For each eager freeze success,
+	 * this is decremented. Once it hits 0, eager scanning is permanently
+	 * disabled. It is initialized to 0 if eager scanning starts out disabled
+	 * (including for aggressive vacuum).
+	 */
+	BlockNumber eager_scan_remaining_successes;
+
+	/*
+	 * The maximum number of blocks which may be eagerly scanned and not
+	 * frozen before eager scanning is temporarily suspended. This is
+	 * configurable both globally, via the
+	 * vacuum_max_eager_freeze_failure_rate GUC, and per table, with a table
+	 * storage parameter of the same name. It is calculated as
+	 * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE blocks.
+	 * It is 0 when eager scanning is disabled.
+	 */
+	BlockNumber eager_scan_max_fails_per_region;
+
+	/*
+	 * The number of eagerly scanned blocks vacuum failed to freeze (due to
+	 * age) in the current eager scan region. Vacuum resets it to
+	 * eager_scan_max_fails_per_region each time it enters a new region of the
+	 * relation. If eager_scan_remaining_fails hits 0, eager scanning is
+	 * suspended until the next region. It is also 0 if eager scanning has
+	 * been permanently disabled.
+	 */
+	BlockNumber eager_scan_remaining_fails;
 } LVRelState;
 
+
 /* Struct for saving and restoring vacuum error information. */
 typedef struct LVSavedErrInfo
 {
@@ -296,8 +414,11 @@ typedef struct LVSavedErrInfo
 
 /* non-export function prototypes */
 static void lazy_scan_heap(LVRelState *vacrel);
+static void heap_vacuum_eager_scan_setup(LVRelState *vacrel,
+										 VacuumParams *params);
 static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-									 bool *all_visible_according_to_vm);
+									 bool *all_visible_according_to_vm,
+									 bool *was_eager_scanned);
 static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
 static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 								   BlockNumber blkno, Page page,
@@ -305,7 +426,7 @@ static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
 static void lazy_scan_prune(LVRelState *vacrel, Buffer buf,
 							BlockNumber blkno, Page page,
 							Buffer vmbuffer, bool all_visible_according_to_vm,
-							bool *has_lpdead_items);
+							bool *has_lpdead_items, bool *vm_page_frozen);
 static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf,
 							  BlockNumber blkno, Page page,
 							  bool *has_lpdead_items);
@@ -347,6 +468,130 @@ static void restore_vacuum_error_info(LVRelState *vacrel,
 									  const LVSavedErrInfo *saved_vacrel);
 
 
+
+/*
+ * Helper to set up the eager scanning state for vacuuming a single relation.
+ * Initializes the eager scan management related members of the LVRelState.
+ *
+ * Caller provides whether or not an aggressive vacuum is required due to
+ * vacuum options or for relfrozenxid/relminmxid advancement.
+ */
+static void
+heap_vacuum_eager_scan_setup(LVRelState *vacrel, VacuumParams *params)
+{
+	uint32		randseed;
+	BlockNumber allvisible;
+	BlockNumber allfrozen;
+	float		first_region_ratio;
+	bool		oldest_unfrozen_before_cutoff = false;
+
+	/*
+	 * Initialize eager scan management fields to their disabled values.
+	 * Aggressive vacuums, normal vacuums of small tables, and normal vacuums
+	 * of tables without sufficiently old tuples disable eager scanning.
+	 */
+	vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+	vacrel->eager_scan_max_fails_per_region = 0;
+	vacrel->eager_scan_remaining_fails = 0;
+	vacrel->eager_scan_remaining_successes = 0;
+
+	/* If eager scanning is explicitly disabled, just return. */
+	if (params->max_eager_freeze_failure_rate == 0)
+		return;
+
+	/*
+	 * The caller will have determined whether or not an aggressive vacuum is
+	 * required by either the vacuum parameters or the relative age of the
+	 * oldest unfrozen transaction IDs. An aggressive vacuum must scan every
+	 * all-visible page to safely advance the relfrozenxid and/or relminmxid,
+	 * so scans of all-visible pages are not considered eager.
+	 */
+	if (vacrel->aggressive)
+		return;
+
+	/*
+	 * Aggressively vacuuming a small relation shouldn't take long, so it
+	 * isn't worth amortizing. We use two times the region size as the size
+	 * cutoff because the eager scan start block is a random spot somewhere in
+	 * the first region, making the second region the first to be eager
+	 * scanned normally.
+	 */
+	if (vacrel->rel_pages < 2 * EAGER_SCAN_REGION_SIZE)
+		return;
+
+	/*
+	 * We only want to enable eager scanning if we are likely to be able to
+	 * freeze some of the pages in the relation.
+	 *
+	 * Tuples with XIDs older than OldestXmin or MXIDs older than OldestMxact
+	 * are technically freezable, but we won't freeze them unless the criteria
+	 * for opportunistic freezing is met. Only tuples with XIDs/MXIDs older
+	 * than the the FreezeLimit/MultiXactCutoff are frozen in the common case.
+	 *
+	 * So, as a heuristic, we wait until the FreezeLimit has advanced past the
+	 * relfrozenxid or the MultiXactCutoff has advanced past the relminmxid to
+	 * enable eager scanning.
+	 */
+	if (TransactionIdIsNormal(vacrel->cutoffs.relfrozenxid) &&
+		TransactionIdPrecedes(vacrel->cutoffs.relfrozenxid,
+							  vacrel->cutoffs.FreezeLimit))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff &&
+		MultiXactIdIsValid(vacrel->cutoffs.relminmxid) &&
+		MultiXactIdPrecedes(vacrel->cutoffs.relminmxid,
+							vacrel->cutoffs.MultiXactCutoff))
+		oldest_unfrozen_before_cutoff = true;
+
+	if (!oldest_unfrozen_before_cutoff)
+		return;
+
+	/* We have met the criteria to eagerly scan some pages. */
+
+	/*
+	 * Our success cap is MAX_EAGER_FREEZE_SUCCESS_RATE of the number of
+	 * all-visible but not all-frozen blocks in the relation.
+	 */
+	visibilitymap_count(vacrel->rel, &allvisible, &allfrozen);
+
+	vacrel->eager_scan_remaining_successes =
+		(BlockNumber) (MAX_EAGER_FREEZE_SUCCESS_RATE *
+					   (allvisible - allfrozen));
+
+	/* If every all-visible page is frozen, eager scanning is disabled. */
+	if (vacrel->eager_scan_remaining_successes == 0)
+		return;
+
+	/*
+	 * Now calculate the bounds of the first eager scan region. Its end block
+	 * will be a random spot somewhere in the first EAGER_SCAN_REGION_SIZE
+	 * blocks. This affects the bounds of all subsequent regions and avoids
+	 * eager scanning and failing to freeze the same blocks each vacuum of the
+	 * relation.
+	 */
+	randseed = pg_prng_uint32(&pg_global_prng_state);
+
+	vacrel->next_eager_scan_region_start = randseed % EAGER_SCAN_REGION_SIZE;
+
+	Assert(params->max_eager_freeze_failure_rate > 0 &&
+		   params->max_eager_freeze_failure_rate <= 1);
+
+	vacrel->eager_scan_max_fails_per_region =
+		params->max_eager_freeze_failure_rate *
+		EAGER_SCAN_REGION_SIZE;
+
+	/*
+	 * The first region will be smaller than subsequent regions. As such,
+	 * adjust the eager freeze failures tolerated for this region.
+	 */
+	first_region_ratio = 1 - (float) vacrel->next_eager_scan_region_start /
+		EAGER_SCAN_REGION_SIZE;
+
+	vacrel->eager_scan_remaining_fails =
+		vacrel->eager_scan_max_fails_per_region *
+		first_region_ratio;
+}
+
 /*
  *	heap_vacuum_rel() -- perform VACUUM for one heap relation
  *
@@ -477,6 +722,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	/* Initialize page counters explicitly (be tidy) */
 	vacrel->scanned_pages = 0;
+	vacrel->eager_scanned_pages = 0;
 	vacrel->removed_pages = 0;
 	vacrel->new_frozen_tuple_pages = 0;
 	vacrel->lpdead_item_pages = 0;
@@ -502,6 +748,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	vacrel->vm_new_visible_pages = 0;
 	vacrel->vm_new_visible_frozen_pages = 0;
 	vacrel->vm_new_frozen_pages = 0;
+	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 
 	/*
 	 * Get cutoffs that determine which deleted tuples are considered DEAD,
@@ -520,11 +767,16 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 	 * to increase the number of dead tuples it can prune away.)
 	 */
 	vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs);
-	vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel);
 	vacrel->vistest = GlobalVisTestFor(rel);
 	/* Initialize state used to track oldest extant XID/MXID */
 	vacrel->NewRelfrozenXid = vacrel->cutoffs.OldestXmin;
 	vacrel->NewRelminMxid = vacrel->cutoffs.OldestMxact;
+
+	/*
+	 * Initialize state related to tracking all-visible page skipping. This is
+	 * very important to determine whether or not it is safe to advance the
+	 * relfrozenxid/relminmxid.
+	 */
 	vacrel->skippedallvis = false;
 	skipwithvm = true;
 	if (params->options & VACOPT_DISABLE_PAGE_SKIPPING)
@@ -539,6 +791,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 
 	vacrel->skipwithvm = skipwithvm;
 
+	/*
+	 * Set up eager scan tracking state. This must happen after determining
+	 * whether or not the vacuum must be aggressive, because only normal
+	 * vacuums use the eager scan algorithm.
+	 */
+	heap_vacuum_eager_scan_setup(vacrel, params);
+
 	if (verbose)
 	{
 		if (vacrel->aggressive)
@@ -734,12 +993,14 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
 							 vacrel->relnamespace,
 							 vacrel->relname,
 							 vacrel->num_index_scans);
-			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n"),
+			appendStringInfo(&buf, _("pages: %u removed, %u remain, %u scanned (%.2f%% of total), %u eagerly scanned\n"),
 							 vacrel->removed_pages,
 							 new_rel_pages,
 							 vacrel->scanned_pages,
 							 orig_rel_pages == 0 ? 100.0 :
-							 100.0 * vacrel->scanned_pages / orig_rel_pages);
+							 100.0 * vacrel->scanned_pages /
+							 orig_rel_pages,
+							 vacrel->eager_scanned_pages);
 			appendStringInfo(&buf,
 							 _("tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n"),
 							 (long long) vacrel->tuples_deleted,
@@ -910,8 +1171,10 @@ lazy_scan_heap(LVRelState *vacrel)
 	BlockNumber rel_pages = vacrel->rel_pages,
 				blkno,
 				next_fsm_block_to_vacuum = 0;
-	bool		all_visible_according_to_vm;
-
+	bool		all_visible_according_to_vm,
+				was_eager_scanned = false;
+	BlockNumber orig_eager_scan_success_limit =
+		vacrel->eager_scan_remaining_successes; /* for logging */
 	Buffer		vmbuffer = InvalidBuffer;
 	const int	initprog_index[] = {
 		PROGRESS_VACUUM_PHASE,
@@ -930,16 +1193,21 @@ lazy_scan_heap(LVRelState *vacrel)
 	vacrel->current_block = InvalidBlockNumber;
 	vacrel->next_unskippable_block = InvalidBlockNumber;
 	vacrel->next_unskippable_allvis = false;
+	vacrel->next_unskippable_eager_scanned = false;
 	vacrel->next_unskippable_vmbuffer = InvalidBuffer;
 
-	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm))
+	while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
+									&was_eager_scanned))
 	{
 		Buffer		buf;
 		Page		page;
 		bool		has_lpdead_items;
+		bool		vm_page_frozen = false;
 		bool		got_cleanup_lock = false;
 
 		vacrel->scanned_pages++;
+		if (was_eager_scanned)
+			vacrel->eager_scanned_pages++;
 
 		/* Report as block scanned, update error traceback information */
 		pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_SCANNED, blkno);
@@ -1064,7 +1332,56 @@ lazy_scan_heap(LVRelState *vacrel)
 		if (got_cleanup_lock)
 			lazy_scan_prune(vacrel, buf, blkno, page,
 							vmbuffer, all_visible_according_to_vm,
-							&has_lpdead_items);
+							&has_lpdead_items, &vm_page_frozen);
+
+		/*
+		 * Count an eagerly scanned page as a failure or a success.
+		 *
+		 * Only lazy_scan_prune() freezes pages, so if we didn't get the
+		 * cleanup lock, we won't have frozen the page. However, we only count
+		 * pages that were too new to require freezing as eager freeze
+		 * failures.
+		 *
+		 * We could gather more information from lazy_scan_noprune() about
+		 * whether or not there were tuples with XIDs or MXIDs older than the
+		 * FreezeLimit or MultiXactCutoff. However, for simplicity, we simply
+		 * exclude pages skipped due to cleanup lock contention from eager
+		 * freeze algorithm caps.
+		 */
+		if (got_cleanup_lock && was_eager_scanned)
+		{
+			/* Aggressive vacuums do not eager scan. */
+			Assert(!vacrel->aggressive);
+
+			if (vm_page_frozen)
+			{
+				Assert(vacrel->eager_scan_remaining_successes > 0);
+				vacrel->eager_scan_remaining_successes--;
+
+				if (vacrel->eager_scan_remaining_successes == 0)
+				{
+					/*
+					 * If we hit our success cap, permanently disable eager
+					 * scanning by setting the other eager scan management
+					 * fields to their disabled values.
+					 */
+					vacrel->eager_scan_remaining_fails = 0;
+					vacrel->next_eager_scan_region_start = InvalidBlockNumber;
+					vacrel->eager_scan_max_fails_per_region = 0;
+
+					ereport(vacrel->verbose ? INFO : DEBUG2,
+							(errmsg("disabling eager scanning after freezing %u eagerly scanned blocks of \"%s.%s.%s\"",
+									orig_eager_scan_success_limit,
+									vacrel->dbname, vacrel->relnamespace,
+									vacrel->relname)));
+				}
+			}
+			else
+			{
+				Assert(vacrel->eager_scan_remaining_fails > 0);
+				vacrel->eager_scan_remaining_fails--;
+			}
+		}
 
 		/*
 		 * Now drop the buffer lock and, potentially, update the FSM.
@@ -1164,7 +1481,9 @@ lazy_scan_heap(LVRelState *vacrel)
  *
  * The block number and visibility status of the next block to process are set
  * in *blkno and *all_visible_according_to_vm.  The return value is false if
- * there are no further blocks to process.
+ * there are no further blocks to process. If the block is being eagerly
+ * scanned, was_eager_scanned is set so that the caller can count whether or
+ * not an eagerly scanned page is successfully frozen.
  *
  * vacrel is an in/out parameter here.  Vacuum options and information about
  * the relation are read.  vacrel->skippedallvis is set if we skip a block
@@ -1174,13 +1493,16 @@ lazy_scan_heap(LVRelState *vacrel)
  */
 static bool
 heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
-						 bool *all_visible_according_to_vm)
+						 bool *all_visible_according_to_vm,
+						 bool *was_eager_scanned)
 {
 	BlockNumber next_block;
 
 	/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
 	next_block = vacrel->current_block + 1;
 
+	*was_eager_scanned = false;
+
 	/* Have we reached the end of the relation? */
 	if (next_block >= vacrel->rel_pages)
 	{
@@ -1253,6 +1575,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
 
 		*blkno = vacrel->current_block = next_block;
 		*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
+		*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
 		return true;
 	}
 }
@@ -1276,11 +1599,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 	BlockNumber rel_pages = vacrel->rel_pages;
 	BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1;
 	Buffer		next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer;
+	bool		next_unskippable_eager_scanned = false;
 	bool		next_unskippable_allvis;
 
 	*skipsallvis = false;
 
-	for (;;)
+	for (;; next_unskippable_block++)
 	{
 		uint8		mapbits = visibilitymap_get_status(vacrel->rel,
 													   next_unskippable_block,
@@ -1288,6 +1612,19 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 
 		next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0;
 
+		/*
+		 * At the start of each eager scan region, normal vacuums with eager
+		 * scanning enabled reset the failure counter, allowing vacuum to
+		 * resume eager scanning if it had been suspended in the previous
+		 * region.
+		 */
+		if (next_unskippable_block >= vacrel->next_eager_scan_region_start)
+		{
+			vacrel->eager_scan_remaining_fails =
+				vacrel->eager_scan_max_fails_per_region;
+			vacrel->next_eager_scan_region_start += EAGER_SCAN_REGION_SIZE;
+		}
+
 		/*
 		 * A block is unskippable if it is not all visible according to the
 		 * visibility map.
@@ -1316,28 +1653,41 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
 			break;
 
 		/*
-		 * Aggressive VACUUM caller can't skip pages just because they are
-		 * all-visible.  They may still skip all-frozen pages, which can't
-		 * contain XIDs < OldestXmin (XIDs that aren't already frozen by now).
+		 * All-frozen pages cannot contain XIDs < OldestXmin (XIDs that aren't
+		 * already frozen by now), so this page can be skipped.
 		 */
-		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0)
-		{
-			if (vacrel->aggressive)
-				break;
+		if ((mapbits & VISIBILITYMAP_ALL_FROZEN) != 0)
+			continue;
 
-			/*
-			 * All-visible block is safe to skip in non-aggressive case.  But
-			 * remember that the final range contains such a block for later.
-			 */
-			*skipsallvis = true;
+		/*
+		 * Aggressive vacuums cannot skip any all-visible pages that are not
+		 * also all-frozen.
+		 */
+		if (vacrel->aggressive)
+			break;
+
+		/*
+		 * Normal vacuums with eager scanning enabled only skip all-visible
+		 * but not all-frozen pages if they have hit the failure limit for the
+		 * current eager scan region.
+		 */
+		if (vacrel->eager_scan_remaining_fails > 0)
+		{
+			next_unskippable_eager_scanned = true;
+			break;
 		}
 
-		next_unskippable_block++;
+		/*
+		 * All-visible blocks are safe to skip in a normal vacuum. But
+		 * remember that the final range contains such a block for later.
+		 */
+		*skipsallvis = true;
 	}
 
 	/* write the local variables back to vacrel */
 	vacrel->next_unskippable_block = next_unskippable_block;
 	vacrel->next_unskippable_allvis = next_unskippable_allvis;
+	vacrel->next_unskippable_eager_scanned = next_unskippable_eager_scanned;
 	vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer;
 }
 
@@ -1368,6 +1718,12 @@ find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis)
  * lazy_scan_prune (or lazy_scan_noprune).  Otherwise returns true, indicating
  * that lazy_scan_heap is done processing the page, releasing lock on caller's
  * behalf.
+ *
+ * No vm_page_frozen output parameter (like that passed to lazy_scan_prune())
+ * is passed here because neither empty nor new pages can be eagerly frozen.
+ * New pages are never frozen. Empty pages are always set frozen in the VM at
+ * the same time that they are set all-visible, and we don't eagerly scan
+ * frozen pages.
  */
 static bool
 lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno,
@@ -1507,6 +1863,10 @@ cmpOffsetNumbers(const void *a, const void *b)
  *
  * *has_lpdead_items is set to true or false depending on whether, upon return
  * from this function, any LP_DEAD items are still present on the page.
+ *
+ * *vm_page_frozen is set to true if the page is newly set all-frozen in the
+ * VM. The caller currently only uses this for determining whether an eagerly
+ * scanned page was successfully set all-frozen.
  */
 static void
 lazy_scan_prune(LVRelState *vacrel,
@@ -1515,7 +1875,8 @@ lazy_scan_prune(LVRelState *vacrel,
 				Page page,
 				Buffer vmbuffer,
 				bool all_visible_according_to_vm,
-				bool *has_lpdead_items)
+				bool *has_lpdead_items,
+				bool *vm_page_frozen)
 {
 	Relation	rel = vacrel->rel;
 	PruneFreezeResult presult;
@@ -1667,11 +2028,17 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			if (presult.all_frozen)
+			{
 				vacrel->vm_new_visible_frozen_pages++;
+				*vm_page_frozen = true;
+			}
 		}
 		else if ((old_vmbits & VISIBILITYMAP_ALL_FROZEN) == 0 &&
 				 presult.all_frozen)
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 
 	/*
@@ -1759,6 +2126,7 @@ lazy_scan_prune(LVRelState *vacrel,
 		{
 			vacrel->vm_new_visible_pages++;
 			vacrel->vm_new_visible_frozen_pages++;
+			*vm_page_frozen = true;
 		}
 
 		/*
@@ -1766,7 +2134,10 @@ lazy_scan_prune(LVRelState *vacrel,
 		 * above, so we don't need to test the value of old_vmbits.
 		 */
 		else
+		{
 			vacrel->vm_new_frozen_pages++;
+			*vm_page_frozen = true;
+		}
 	}
 }
 
diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c
index e6745e6145c..a13a2d7f222 100644
--- a/src/backend/commands/vacuum.c
+++ b/src/backend/commands/vacuum.c
@@ -69,6 +69,7 @@ int			vacuum_multixact_freeze_min_age;
 int			vacuum_multixact_freeze_table_age;
 int			vacuum_failsafe_age;
 int			vacuum_multixact_failsafe_age;
+double		vacuum_max_eager_freeze_failure_rate;
 
 /*
  * Variables for cost-based vacuum delay. The defaults differ between
@@ -405,6 +406,11 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
 	/* user-invoked vacuum uses VACOPT_VERBOSE instead of log_min_duration */
 	params.log_min_duration = -1;
 
+	/*
+	 * Later, in vacuum_rel(), we check if a reloption override was specified.
+	 */
+	params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Create special memory context for cross-transaction storage.
 	 *
@@ -2165,6 +2171,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params,
 		}
 	}
 
+	/*
+	 * Check if the vacuum_max_eager_freeze_failure_rate table storage
+	 * parameter was specified. This overrides the GUC value.
+	 */
+	if (rel->rd_options != NULL &&
+		((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate >= 0)
+		params->max_eager_freeze_failure_rate =
+			((StdRdOptions *) rel->rd_options)->vacuum_max_eager_freeze_failure_rate;
+
 	/*
 	 * Set truncate option based on truncate reloption if it wasn't specified
 	 * in VACUUM command, or when running in an autovacuum worker
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 09ec9bb6990..ade2708b59e 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2827,6 +2827,12 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map,
 		tab->at_params.is_wraparound = wraparound;
 		tab->at_params.log_min_duration = log_min_duration;
 		tab->at_params.toast_parent = InvalidOid;
+
+		/*
+		 * Later, in vacuum_rel(), we check reloptions for any
+		 * vacuum_max_eager_freeze_failure_rate override.
+		 */
+		tab->at_params.max_eager_freeze_failure_rate = vacuum_max_eager_freeze_failure_rate;
 		tab->at_storage_param_vac_cost_limit = avopts ?
 			avopts->vacuum_cost_limit : 0;
 		tab->at_storage_param_vac_cost_delay = avopts ?
diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c
index ce7534d4d23..e285c4946d8 100644
--- a/src/backend/utils/misc/guc_tables.c
+++ b/src/backend/utils/misc/guc_tables.c
@@ -4033,6 +4033,16 @@ struct config_real ConfigureNamesReal[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"vacuum_max_eager_freeze_failure_rate", PGC_USERSET, VACUUM_FREEZING,
+			gettext_noop("Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning."),
+			gettext_noop("A value of 0.0 disables eager scanning and a value of 1.0 will eagerly scan up to 100 percent of the all-visible pages in the relation. If vacuum successfully freezes these pages, the cap is lower than 100 percent, because the goal is to amortize page freezing across multiple vacuums.")
+		},
+		&vacuum_max_eager_freeze_failure_rate,
+		0.03, 0.0, 1.0,
+		NULL, NULL, NULL
+	},
+
 	/* End-of-list marker */
 	{
 		{NULL, 0, 0, NULL, NULL}, NULL, 0.0, 0.0, 0.0, NULL, NULL, NULL
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index c40b7a3121e..7de95b0b2a0 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -701,6 +701,7 @@ autovacuum_worker_slots = 16	# autovacuum worker slots to allocate
 #vacuum_multixact_freeze_table_age = 150000000
 #vacuum_multixact_freeze_min_age = 5000000
 #vacuum_multixact_failsafe_age = 1600000000
+#vacuum_max_eager_freeze_failure_rate = 0.03 # 0 disables eager scanning
 
 #------------------------------------------------------------------------------
 # CLIENT CONNECTION DEFAULTS
diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c
index 5f6897c8486..a9a81ab3c14 100644
--- a/src/bin/psql/tab-complete.in.c
+++ b/src/bin/psql/tab-complete.in.c
@@ -1390,10 +1390,12 @@ static const char *const table_storage_parameters[] = {
 	"toast.autovacuum_vacuum_threshold",
 	"toast.log_autovacuum_min_duration",
 	"toast.vacuum_index_cleanup",
+	"toast.vacuum_max_eager_freeze_failure_rate",
 	"toast.vacuum_truncate",
 	"toast_tuple_target",
 	"user_catalog_table",
 	"vacuum_index_cleanup",
+	"vacuum_max_eager_freeze_failure_rate",
 	"vacuum_truncate",
 	NULL
 };
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 12d0b61950d..7dad14319a1 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -231,6 +231,13 @@ typedef struct VacuumParams
 	VacOptValue truncate;		/* Truncate empty pages at the end */
 	Oid			toast_parent;	/* for privilege checks when recursing */
 
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail
+	 * to freeze. Only applicable for table AMs using visibility maps. Derived
+	 * from GUC or table storage parameter. 0 if disabled.
+	 */
+	double		max_eager_freeze_failure_rate;
+
 	/*
 	 * The number of parallel vacuum workers.  0 by default which means choose
 	 * based on the number of indexes.  -1 indicates parallel vacuum is
@@ -297,6 +304,16 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age;
 extern PGDLLIMPORT int vacuum_failsafe_age;
 extern PGDLLIMPORT int vacuum_multixact_failsafe_age;
 
+/*
+ * Relevant for vacuums implementing eager scanning. Normal vacuums may
+ * eagerly scan some all-visible but not all-frozen pages. Since the goal
+ * is to freeze these pages, an eager scan that fails to set the page
+ * all-frozen in the VM is considered to have "failed". This is the
+ * fraction of pages in the relation vacuum may scan and fail to freeze
+ * before disabling eager scanning.
+ */
+extern PGDLLIMPORT double vacuum_max_eager_freeze_failure_rate;
+
 /*
  * Maximum value for default_statistics_target and per-column statistics
  * targets.  This is fairly arbitrary, mainly to prevent users from creating
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 48b95f211f3..db3e504c3d2 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -344,6 +344,12 @@ typedef struct StdRdOptions
 	int			parallel_workers;	/* max number of parallel workers */
 	StdRdOptIndexCleanup vacuum_index_cleanup;	/* controls index vacuuming */
 	bool		vacuum_truncate;	/* enables vacuum to truncate a relation */
+
+	/*
+	 * Fraction of pages in a relation that vacuum can eagerly scan and fail
+	 * to freeze. 0 if disabled, -1 if unspecified.
+	 */
+	double		vacuum_max_eager_freeze_failure_rate;
 } StdRdOptions;
 
 #define HEAP_MIN_FILLFACTOR			10
-- 
2.34.1

#57Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#54)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Hi,

On 2025-02-10 14:30:15 -0500, Robert Haas wrote:

On Wed, Feb 5, 2025 at 12:23 PM Melanie Plageman
<melanieplageman@gmail.com> wrote:

I started getting worried thinking about this. If you have a cursor
for select * from a table and fetch forward far enough, couldn't
vacuum fail to get cleanup locks on a whole range of blocks?

I don't think so. A given scan holds at most 1 heap pin at a time, so
I don't see how a cursor doing a FETCH FORWARD would make anything
happen that wouldn't otherwise. I do think it's theoretically possible
that a running query and a running VACUUM could be going at exactly
the same speed so that the VACUUM always tries to pin every page at
the exact same moment the SELECT has it pinned, but in practice I
think it is very unlikely that the timing will work out like that.
Like win-the-lottery kind of unlikely.

I think the most common way to get a range of pages pinned is to have a bunch
of backends doing index nested loop joins to a fairly narrow value range in a
table. You can sometimes see (via pg_buffercache) that there are some pages
that are rather heavily pinned, but just about no other page in the table is.

Yea, I guess that means the freeze limit caps wasted read I/O -- but
you could end up doing no read I/O and still hitting the freeze fail
limit because it is trying to detect when data is too new to be worth
eager scanning. But that's probably the behavior we want.

The too-new case is very scary, I think. It's already a problem that
when there are long-running transactions in play, autovacuum commands
a VACUUM which finds nothing it can usefully clean up. It would be
very valuable for someone to figure out a way to prevent that, but the
relevance to this patch is that we need to try hard to avoid making
that problem substantially worse than it is already. Even if the whole
database is memory-resident, the too-new case allows for wasting a
bunch of effort that we would rather not waste; the cap here tries to
make sure that isn't any worse than it needs to be.

IME the most common way for this issue is anti-wraparound vacuums that can't
actually clean up anything, due to some old transaction. We'll just fire those
off over and over again, without taking into account that we still can't make
progress.

That scenario doesn't apply the same way to this patch, because by the time
you get to an anti-wrap vacuum, this patch doesn't do anything.

Of course it's possible that the dead tuple trigger causes repeated vacuums
that each can't clean up anything, but that's much less common IME.

Interestingly, we call heap_tuple_should_freeze() in
lazy_scan_noprune(), so we actually could tell whether or not there
are some tuples on the page old enough to trigger freezing if we had
gotten the cleanup lock. One option would be to add a new output
parameter to lazy_scan_noprune() that indicates whether or not there
were tuples with xids older than the FreezeLimit, and only if there
were not, count it as a failed eager scan.

Yeah, that could be done, and it doesn't sound like a bad idea.
However, I'm also unsure whether we need to add additional logic for
this case. My intuition is that it just won't happen very often. I'm
not quite confident that I'm correct about that, but if I had to
guess, my guess would be "rare scenario".

I've not done this in the attached v16. I have added a comment about it.
I think not doing it is a judgment call and not a bug, right?

As of this writing, I do not believe that this is an essential part of
this patch, but it is always possible that with the benefit of
hindsight it will seem otherwise. That's just life, though. If I knew
in advance which of my decisions would later seem like mistakes, I
would make very few mistakes.

I agree that we can disregard this for now.

Greetings,

Andres Freund

#58Andres Freund
andres@anarazel.de
In reply to: Melanie Plageman (#53)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On 2025-02-05 12:23:29 -0500, Melanie Plageman wrote:

Attached v16 implements the logic to not count pages we failed to
freeze because of cleanup lock contention as eager freeze failures.

That looks good to me.

#59Melanie Plageman
melanieplageman@gmail.com
In reply to: Andres Freund (#58)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Tue, Feb 11, 2025 at 11:31 AM Andres Freund <andres@anarazel.de> wrote:

On 2025-02-05 12:23:29 -0500, Melanie Plageman wrote:

Attached v16 implements the logic to not count pages we failed to
freeze because of cleanup lock contention as eager freeze failures.

That looks good to me.

Cool. Committed and marked as such in the cf app.

- Melanie

#60Pavel Luzanov
p.luzanov@postgrespro.ru
In reply to: Melanie Plageman (#59)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

Hello,

I have a question about the documentation.

From description of the vacuum_max_eager_freeze_failure_rate [1]

"Specifies the maximum number of pages (as a fraction of total pages in
the relation) that VACUUM may scan and fail to set all-frozen in the
visibility map before disabling eager scanning."

It seems that after reaching the vacuum_max_eager_freeze_failure_rate,
the eager scanning of this table will be stopped. But in the source code
[2]:  * cap. The failure count is reset for each region of the table -- comprised  * of EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate  * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE failures  * before suspending eager scanning until the end of the region.

 * cap. The failure count is reset for each region of the table --
comprised
 * of EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
 * vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE failures
 * before suspending eager scanning until the end of the region.

From this description, vacuum_max_eager_freeze_failure_rate limit
applies to a region of EAGER_SCAN_REGION_SIZE pages, but not to the
whole table.

Which one is correct? May be I'm missing something?
Do we need any clarifications in the documentation?

1.
https://www.postgresql.org/docs/devel/runtime-config-vacuum.html#GUC-VACUUM-MAX-EAGER-FREEZE-FAILURE-RATE
2.
https://github.com/postgres/postgres/blob/3357471cf9f5e470dfed0c7919bcf31c7efaf2b9/src/backend/access/heap/vacuumlazy.c#L82-L85

--
Pavel Luzanov
Postgres Professional: https://postgrespro.com

#61Melanie Plageman
melanieplageman@gmail.com
In reply to: Pavel Luzanov (#60)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On Thu, Jul 31, 2025 at 7:05 AM Pavel Luzanov <p.luzanov@postgrespro.ru> wrote:

I have a question about the documentation.

From description of the vacuum_max_eager_freeze_failure_rate [1]

"Specifies the maximum number of pages (as a fraction of total pages in
the relation) that VACUUM may scan and fail to set all-frozen in the
visibility map before disabling eager scanning."

It seems that after reaching the vacuum_max_eager_freeze_failure_rate,
the eager scanning of this table will be stopped. But in the source code
[2]:

* cap. The failure count is reset for each region of the table --
comprised
* of EAGER_SCAN_REGION_SIZE blocks. In each region, we tolerate
* vacuum_max_eager_freeze_failure_rate of EAGER_SCAN_REGION_SIZE failures
* before suspending eager scanning until the end of the region.

From this description, vacuum_max_eager_freeze_failure_rate limit
applies to a region of EAGER_SCAN_REGION_SIZE pages, but not to the
whole table.

Right, I looked at the fact that it is temporarily disabled per region
and then re-enabled as an implementation detail that would be more
confusing to document. If you eager scan and fail to freeze 3% of each
region, you'll have eager scanned and failed to freeze 3% of the
blocks in the table -- so the total cap is the same. You don't see the
eager scan counts until the end of vacuuming, so from the user's
perspective it's the same.

Documenting it means exposing more about the algorithm than seems
useful or actionable to the user.

Is there something you would do differently from a user perspective if
you knew that it was being temporarily disabled and reenabled for
specific regions of the table?

- Melanie

#62Pavel Luzanov
p.luzanov@postgrespro.ru
In reply to: Melanie Plageman (#61)
Re: Eagerly scan all-visible pages to amortize aggressive vacuum

On 31.07.2025 16:31, Melanie Plageman wrote:

If you eager scan and fail to freeze 3% of each
region, you'll have eager scanned and failed to freeze 3% of the
blocks in the table -- so the total cap is the same.

OhmyGod!Whata stupidmistakeI made. Imultipliedthe numberof regionsby3%:-)

Documenting it means exposing more about the algorithm than seems
useful or actionable to the user.

Of course, you are right.
Thank you very much for clarifications.

--
Pavel Luzanov
Postgres Professional:https://postgrespro.com